fix: avoid use unmananged client as root_client

This commit is contained in:
DreamMaoMao 2025-04-06 13:44:09 +08:00
parent e7a6e85569
commit 43a3c2426a

View file

@ -1694,7 +1694,7 @@ Client *center_select(Monitor* m) {
int dirx,diry; int dirx,diry;
long int distance; long int distance;
wl_list_for_each(c, &clients, link) { wl_list_for_each(c, &clients, link) {
if (c && VISIBLEON(c, m) && client_surface(c)->mapped && !c->isfloating) { if (c && VISIBLEON(c, m) && client_surface(c)->mapped && !c->isfloating && !client_is_unmanaged(c)) {
dirx = c->geom.x + c->geom.width / 2 - (m->w.x + m->w.width / 2); dirx = c->geom.x + c->geom.width / 2 - (m->w.x + m->w.width / 2);
diry = c->geom.y + c->geom.height / 2 - (m->w.y + m->w.height / 2); diry = c->geom.y + c->geom.height / 2 - (m->w.y + m->w.height / 2);
distance = dirx * dirx + diry * diry; distance = dirx * dirx + diry * diry;
@ -3943,18 +3943,19 @@ mapnotify(struct wl_listener *listener, void *data) {
c->scroller_proportion = scroller_default_proportion; c->scroller_proportion = scroller_default_proportion;
c->need_scale_first_frame = true; c->need_scale_first_frame = true;
// nop // nop
if (new_is_master && if (new_is_master &&
strcmp(selmon->pertag->ltidxs[selmon->pertag->curtag]->name, strcmp(selmon->pertag->ltidxs[selmon->pertag->curtag]->name,
"scroller") != 0) "scroller") != 0)
// tile at the top // tile at the top
wl_list_insert(&clients, &c->link); // 新窗口是master,头部入栈 wl_list_insert(&clients, &c->link); // 新窗口是master,头部入栈
else if (strcmp(selmon->pertag->ltidxs[selmon->pertag->curtag]->name, else if (strcmp(selmon->pertag->ltidxs[selmon->pertag->curtag]->name,
"scroller") == 0 && "scroller") == 0 && center_select(selmon)) {
selmon->sel && ISTILED(selmon->sel)) { Client *at_client = center_select(selmon);
selmon->sel->link.next->prev = &c->link; at_client->link.next->prev = &c->link;
c->link.prev = &selmon->sel->link; c->link.prev = &at_client->link;
c->link.next = selmon->sel->link.next; c->link.next = at_client->link.next;
selmon->sel->link.next = &c->link; at_client->link.next = &c->link;
} else } else
wl_list_insert(clients.prev, &c->link); // 尾部入栈 wl_list_insert(clients.prev, &c->link); // 尾部入栈
wl_list_insert(&fstack, &c->flink); wl_list_insert(&fstack, &c->flink);
@ -5905,7 +5906,7 @@ void scroller(Monitor *m, unsigned int gappo, unsigned int gappi) {
// 第一次遍历,计算 n 的值 // 第一次遍历,计算 n 的值
wl_list_for_each(c, &clients, link) { wl_list_for_each(c, &clients, link) {
if (VISIBLEON(c, c->mon) && !c->isfloating && !c->isfullscreen && if (VISIBLEON(c, c->mon) && !client_is_unmanaged(c) && !c->isfloating && !c->isfullscreen &&
!c->ismaxmizescreen && !c->iskilling && !c->animation.tagouting && !c->ismaxmizescreen && !c->iskilling && !c->animation.tagouting &&
c->mon == m) { c->mon == m) {
n++; n++;
@ -5926,7 +5927,7 @@ void scroller(Monitor *m, unsigned int gappo, unsigned int gappi) {
// 第二次遍历,填充 tempClients // 第二次遍历,填充 tempClients
n = 0; n = 0;
wl_list_for_each(c, &clients, link) { wl_list_for_each(c, &clients, link) {
if (VISIBLEON(c, c->mon) && !c->isfloating && !c->isfullscreen && if (VISIBLEON(c, c->mon) && !client_is_unmanaged(c) && !c->isfloating && !c->isfullscreen &&
!c->ismaxmizescreen && !c->iskilling && !c->animation.tagouting && !c->ismaxmizescreen && !c->iskilling && !c->animation.tagouting &&
c->mon == m) { c->mon == m) {
tempClients[n] = c; tempClients[n] = c;
@ -5945,10 +5946,10 @@ void scroller(Monitor *m, unsigned int gappo, unsigned int gappi) {
return; return;
} }
if (m->sel && !m->sel->isfloating && !m->sel->ismaxmizescreen && if (m->sel && !client_is_unmanaged(m->sel) && !m->sel->isfloating && !m->sel->ismaxmizescreen &&
!m->sel->isfullscreen) { !m->sel->isfullscreen) {
root_client = m->sel; root_client = m->sel;
} else if (m->prevsel && !m->prevsel->isfloating && } else if (m->prevsel && !client_is_unmanaged(m->prevsel) && !m->prevsel->isfloating &&
!m->prevsel->ismaxmizescreen && !m->prevsel->isfullscreen) { !m->prevsel->ismaxmizescreen && !m->prevsel->isfullscreen) {
root_client = m->prevsel; root_client = m->prevsel;
} else { } else {