mirror of
https://github.com/DreamMaoMao/maomaowm.git
synced 2026-06-15 14:33:34 -04:00
opt: optimize drop tile client when cross monitor
This commit is contained in:
parent
792bfac475
commit
7e178369ff
2 changed files with 78 additions and 41 deletions
|
|
@ -699,17 +699,6 @@ void client_set_drop_area(Client *c) {
|
||||||
bool dwindle_familiar =
|
bool dwindle_familiar =
|
||||||
cur_layout->id == DWINDLE && config.dwindle_drop_simple_split;
|
cur_layout->id == DWINDLE && config.dwindle_drop_simple_split;
|
||||||
|
|
||||||
uint32_t nmaster = c->mon->pertag->nmasters[c->mon->pertag->curtag];
|
|
||||||
|
|
||||||
bool should_swap =
|
|
||||||
(cur_layout->id == DECK || cur_layout->id == VERTICAL_DECK ||
|
|
||||||
cur_layout->id == MONOCLE || cur_layout->id == GRID ||
|
|
||||||
cur_layout->id == FAIR || cur_layout->id == VERTICAL_FAIR ||
|
|
||||||
cur_layout->id == VERTICAL_GRID) ||
|
|
||||||
((cur_layout->id == TILE || cur_layout->id == VERTICAL_TILE ||
|
|
||||||
cur_layout->id == CENTER_TILE || cur_layout->id == RIGHT_TILE) &&
|
|
||||||
nmaster == 1 && c->ismaster);
|
|
||||||
|
|
||||||
if (dwindle_familiar) {
|
if (dwindle_familiar) {
|
||||||
bool split_h = c->geom.width >= c->geom.height;
|
bool split_h = c->geom.width >= c->geom.height;
|
||||||
float ratio = config.dwindle_split_ratio;
|
float ratio = config.dwindle_split_ratio;
|
||||||
|
|
@ -743,42 +732,87 @@ void client_set_drop_area(Client *c) {
|
||||||
client_height - (int32_t)(client_height * ratio);
|
client_height - (int32_t)(client_height * ratio);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (should_swap) {
|
|
||||||
drop_box.x = bw;
|
|
||||||
drop_box.y = bw;
|
|
||||||
drop_box.width = client_width;
|
|
||||||
drop_box.height = client_height;
|
|
||||||
drop_direction = UNDIR;
|
|
||||||
} else if (cur_layout->id == TILE || cur_layout->id == DECK ||
|
} else if (cur_layout->id == TILE || cur_layout->id == DECK ||
|
||||||
cur_layout->id == CENTER_TILE || cur_layout->id == RIGHT_TILE) {
|
cur_layout->id == CENTER_TILE || cur_layout->id == RIGHT_TILE) {
|
||||||
if (rel_y < client_height * 0.5) {
|
|
||||||
drop_direction = UP;
|
if (c->ismaster) {
|
||||||
drop_box.x = bw;
|
if (c->mon->visible_tiling_clients == 1) {
|
||||||
drop_box.y = bw;
|
if (rel_x < client_width * 0.5) {
|
||||||
drop_box.width = client_width;
|
drop_direction = LEFT;
|
||||||
drop_box.height = client_height / 2;
|
drop_box.x = bw;
|
||||||
|
drop_box.y = bw;
|
||||||
|
drop_box.width = client_width / 2;
|
||||||
|
drop_box.height = client_height;
|
||||||
|
} else {
|
||||||
|
drop_direction = RIGHT;
|
||||||
|
drop_box.x = bw + client_width / 2;
|
||||||
|
drop_box.y = bw;
|
||||||
|
drop_box.width = client_width / 2;
|
||||||
|
drop_box.height = client_height;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
drop_box.x = bw;
|
||||||
|
drop_box.y = bw;
|
||||||
|
drop_box.width = client_width;
|
||||||
|
drop_box.height = client_height;
|
||||||
|
drop_direction = UNDIR;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
drop_direction = DOWN;
|
if (rel_y < client_height * 0.5) {
|
||||||
drop_box.x = bw;
|
drop_direction = UP;
|
||||||
drop_box.y = bw + client_height / 2;
|
drop_box.x = bw;
|
||||||
drop_box.width = client_width;
|
drop_box.y = bw;
|
||||||
drop_box.height = client_height / 2;
|
drop_box.width = client_width;
|
||||||
|
drop_box.height = client_height / 2;
|
||||||
|
} else {
|
||||||
|
drop_direction = DOWN;
|
||||||
|
drop_box.x = bw;
|
||||||
|
drop_box.y = bw + client_height / 2;
|
||||||
|
drop_box.width = client_width;
|
||||||
|
drop_box.height = client_height / 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if (cur_layout->id == VERTICAL_TILE ||
|
} else if (cur_layout->id == VERTICAL_TILE ||
|
||||||
cur_layout->id == VERTICAL_DECK) {
|
cur_layout->id == VERTICAL_DECK) {
|
||||||
if (rel_x < client_width * 0.5) {
|
if (c->ismaster) {
|
||||||
drop_direction = LEFT;
|
if (c->mon->visible_tiling_clients == 1) {
|
||||||
drop_box.x = bw;
|
if (rel_y < client_height * 0.5) {
|
||||||
drop_box.y = bw;
|
drop_direction = UP;
|
||||||
drop_box.width = client_width / 2;
|
drop_box.x = bw;
|
||||||
drop_box.height = client_height;
|
drop_box.y = bw;
|
||||||
|
drop_box.width = client_width;
|
||||||
|
drop_box.height = client_height / 2;
|
||||||
|
} else {
|
||||||
|
drop_direction = DOWN;
|
||||||
|
drop_box.x = bw;
|
||||||
|
drop_box.y = bw + client_height / 2;
|
||||||
|
drop_box.width = client_width;
|
||||||
|
drop_box.height = client_height / 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
drop_box.x = bw;
|
||||||
|
drop_box.y = bw;
|
||||||
|
drop_box.width = client_width;
|
||||||
|
drop_box.height = client_height;
|
||||||
|
drop_direction = UNDIR;
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
drop_direction = RIGHT;
|
if (rel_x < client_width * 0.5) {
|
||||||
drop_box.x = bw + client_width / 2;
|
drop_direction = LEFT;
|
||||||
drop_box.y = bw;
|
drop_box.x = bw;
|
||||||
drop_box.width = client_width / 2;
|
drop_box.y = bw;
|
||||||
drop_box.height = client_height;
|
drop_box.width = client_width / 2;
|
||||||
|
drop_box.height = client_height;
|
||||||
|
} else {
|
||||||
|
drop_direction = RIGHT;
|
||||||
|
drop_box.x = bw + client_width / 2;
|
||||||
|
drop_box.y = bw;
|
||||||
|
drop_box.width = client_width / 2;
|
||||||
|
drop_box.height = client_height;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
double dist_left = rel_x;
|
double dist_left = rel_x;
|
||||||
double dist_right = client_width - rel_x;
|
double dist_right = client_width - rel_x;
|
||||||
|
|
|
||||||
|
|
@ -2202,9 +2202,10 @@ void hold_end(struct wl_listener *listener, void *data) {
|
||||||
Client *find_closest_tiled_client(Client *c) {
|
Client *find_closest_tiled_client(Client *c) {
|
||||||
Client *tc, *closest = NULL;
|
Client *tc, *closest = NULL;
|
||||||
long min_dist = LONG_MAX;
|
long min_dist = LONG_MAX;
|
||||||
|
Monitor *cursor_mon = xytomon(cursor->x, cursor->y);
|
||||||
|
|
||||||
wl_list_for_each(tc, &clients, link) {
|
wl_list_for_each(tc, &clients, link) {
|
||||||
if (tc == c || !ISTILED(tc) || !VISIBLEON(tc, c->mon))
|
if (tc == c || !ISTILED(tc) || !VISIBLEON(tc, cursor_mon))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (cursor->x >= tc->geom.x &&
|
if (cursor->x >= tc->geom.x &&
|
||||||
|
|
@ -2236,7 +2237,9 @@ void place_drag_tile_client(Client *c) {
|
||||||
|
|
||||||
if (closest->drop_direction == UNDIR) {
|
if (closest->drop_direction == UNDIR) {
|
||||||
setfloating(c, 0);
|
setfloating(c, 0);
|
||||||
exchange_two_client(c, closest);
|
wl_list_remove(&c->link);
|
||||||
|
wl_list_insert(closest->link.prev, &c->link);
|
||||||
|
arrange(closest->mon, false, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue