mirror of
https://github.com/DreamMaoMao/maomaowm.git
synced 2026-07-03 00:06:47 -04:00
fix: fix group cross monitor
This commit is contained in:
parent
7a93414f36
commit
a766994a8e
3 changed files with 59 additions and 32 deletions
|
|
@ -140,9 +140,6 @@ void client_focus_group_member(Client *c) {
|
||||||
if (c->isgroupfocusing)
|
if (c->isgroupfocusing)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (c->mon->isoverview)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Client *head = c;
|
Client *head = c;
|
||||||
while (head->group_prev)
|
while (head->group_prev)
|
||||||
head = head->group_prev;
|
head = head->group_prev;
|
||||||
|
|
@ -156,12 +153,16 @@ void client_focus_group_member(Client *c) {
|
||||||
head = head->group_next;
|
head = head->group_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cur_focusing) {
|
if (!cur_focusing || !cur_focusing->mon)
|
||||||
cur_focusing->isgroupfocusing = false;
|
return;
|
||||||
c->mon = cur_focusing->mon;
|
|
||||||
client_replace(c, cur_focusing, true);
|
if (cur_focusing && cur_focusing->mon->isoverview)
|
||||||
mango_group_bar_set_focus(cur_focusing->group_bar, false);
|
return;
|
||||||
}
|
|
||||||
|
cur_focusing->isgroupfocusing = false;
|
||||||
|
c->mon = cur_focusing->mon;
|
||||||
|
client_replace(c, cur_focusing, true);
|
||||||
|
mango_group_bar_set_focus(cur_focusing->group_bar, false);
|
||||||
|
|
||||||
c->isgroupfocusing = true;
|
c->isgroupfocusing = true;
|
||||||
mango_group_bar_set_focus(c->group_bar, true);
|
mango_group_bar_set_focus(c->group_bar, true);
|
||||||
|
|
@ -255,4 +256,16 @@ void client_handle_decorate_click(MangoGroupBar *gb) {
|
||||||
Client *c = gb->node_data;
|
Client *c = gb->node_data;
|
||||||
client_focus_group_member(c);
|
client_focus_group_member(c);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void client_set_group_mon(Client *c, Monitor *m) {
|
||||||
|
Client *head = c;
|
||||||
|
while (head->group_prev)
|
||||||
|
head = head->group_prev;
|
||||||
|
|
||||||
|
Client *cur = head;
|
||||||
|
while (cur) {
|
||||||
|
cur->mon = m;
|
||||||
|
cur = cur->group_next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -162,38 +162,50 @@ int32_t groupjoin(const Arg *arg) {
|
||||||
if (!selmon)
|
if (!selmon)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
Client *need_join_client = arg->tc ? arg->tc : selmon->sel;
|
Monitor *oldmon = NULL;
|
||||||
if (!need_join_client)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (need_join_client->group_next || need_join_client->group_prev) {
|
Client *need_join_client = arg->tc ? arg->tc : selmon->sel;
|
||||||
|
if (!need_join_client || !need_join_client->mon)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
Client *need_replace_client = NULL;
|
Client *need_replace_client = NULL;
|
||||||
need_replace_client = direction_select(arg);
|
need_replace_client = direction_select(arg);
|
||||||
|
|
||||||
if (!need_replace_client ||
|
if (!need_replace_client || !need_replace_client->mon)
|
||||||
need_replace_client->mon != need_join_client->mon)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!need_join_client->group_next && !need_join_client->group_prev) {
|
if (need_join_client == need_replace_client)
|
||||||
|
|
||||||
if (!need_replace_client->group_prev &&
|
|
||||||
!need_replace_client->group_next) {
|
|
||||||
need_replace_client->isgroupfocusing = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
need_join_client->group_next = need_replace_client;
|
|
||||||
if (need_replace_client->group_prev) {
|
|
||||||
need_replace_client->group_prev->group_next = need_join_client;
|
|
||||||
}
|
|
||||||
need_join_client->group_prev = need_replace_client->group_prev;
|
|
||||||
need_replace_client->group_prev = need_join_client;
|
|
||||||
|
|
||||||
client_focus_group_member(need_join_client);
|
|
||||||
arrange(need_join_client->mon, false, false);
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (need_join_client->group_next || need_join_client->group_prev) {
|
||||||
|
groupleave(&(Arg){.tc = need_join_client});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (need_join_client->mon != need_replace_client->mon) {
|
||||||
|
oldmon = need_join_client->mon;
|
||||||
|
need_join_client->mon = need_replace_client->mon;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!need_replace_client->group_prev && !need_replace_client->group_next) {
|
||||||
|
need_replace_client->isgroupfocusing = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
need_join_client->group_next = need_replace_client;
|
||||||
|
|
||||||
|
if (need_replace_client->group_prev) {
|
||||||
|
need_replace_client->group_prev->group_next = need_join_client;
|
||||||
|
}
|
||||||
|
|
||||||
|
need_join_client->group_prev = need_replace_client->group_prev;
|
||||||
|
|
||||||
|
need_replace_client->group_prev = need_join_client;
|
||||||
|
|
||||||
|
client_focus_group_member(need_join_client);
|
||||||
|
arrange(need_join_client->mon, false, false);
|
||||||
|
|
||||||
|
// oldmon可能已经死掉了
|
||||||
|
if (oldmon) {
|
||||||
|
arrange(oldmon, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -2761,8 +2761,10 @@ void closemon(Monitor *m) {
|
||||||
}
|
}
|
||||||
|
|
||||||
c->mon = NULL;
|
c->mon = NULL;
|
||||||
|
client_set_group_mon(c, NULL);
|
||||||
} else {
|
} else {
|
||||||
client_change_mon(c, selmon);
|
client_change_mon(c, selmon);
|
||||||
|
client_set_group_mon(c, selmon);
|
||||||
}
|
}
|
||||||
// record the oldmonname which is used to restore
|
// record the oldmonname which is used to restore
|
||||||
if (c->oldmonname[0] == '\0') {
|
if (c->oldmonname[0] == '\0') {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue