opt: optimize floating window auto ajust monitor position change

This commit is contained in:
DreamMaoMao 2025-06-15 18:14:05 +08:00
parent ba763332fc
commit 5f688d6e6c

View file

@ -7279,7 +7279,7 @@ void updatemons(struct wl_listener *listener, void *data) {
Client *c; Client *c;
struct wlr_output_configuration_head_v1 *config_head; struct wlr_output_configuration_head_v1 *config_head;
Monitor *m; Monitor *m;
int offset_x = 0, offset_y = 0, oldx, oldy; int mon_pos_offsetx, mon_pos_offsety, oldx, oldy;
/* First remove from the layout the disabled monitors */ /* First remove from the layout the disabled monitors */
wl_list_for_each(m, &mons, link) { wl_list_for_each(m, &mons, link) {
@ -7321,8 +7321,30 @@ void updatemons(struct wl_listener *listener, void *data) {
/* Get the effective monitor geometry to use for surfaces */ /* Get the effective monitor geometry to use for surfaces */
wlr_output_layout_get_box(output_layout, m->wlr_output, &m->m); wlr_output_layout_get_box(output_layout, m->wlr_output, &m->m);
m->w = m->m; m->w = m->m;
offset_x = m->m.x - oldx; mon_pos_offsetx = m->m.x - oldx;
offset_y = m->m.y - oldy; mon_pos_offsety = m->m.y - oldy;
wl_list_for_each(c, &clients, link) {
// floating window position auto adjust the change of monitor
// position
if (c->isfloating && c->mon == m) {
c->geom.x += mon_pos_offsetx;
c->geom.y += mon_pos_offsety;
c->oldgeom = c->geom;
resize(c, c->geom, 1);
}
// restore window to old monitor
if (c->mon && c->mon != m && client_surface(c)->mapped &&
strcmp(c->oldmonname, m->wlr_output->name) == 0) {
client_change_mon(c, m);
}
}
/*
must put it under the floating window position adjustment,
Otherwise, incorrect floating window calculations will occur here.
*/
wlr_scene_output_set_position(m->scene_output, m->m.x, m->m.y); wlr_scene_output_set_position(m->scene_output, m->m.x, m->m.y);
// wlr_scene_node_set_position(&m->fullscreen_bg->node, m->m.x, m->m.y); // wlr_scene_node_set_position(&m->fullscreen_bg->node, m->m.x, m->m.y);
@ -7352,20 +7374,6 @@ void updatemons(struct wl_listener *listener, void *data) {
if (!selmon) if (!selmon)
selmon = m; selmon = m;
wl_list_for_each(c, &clients, link) {
if (c->isfloating && c->mon == m) {
c->geom.x += offset_x;
c->geom.y += offset_y;
c->oldgeom = c->geom;
resize(c, c->geom, 0);
}
if (c->mon && c->mon != m && client_surface(c)->mapped &&
strcmp(c->oldmonname, m->wlr_output->name) == 0) {
client_change_mon(c, m);
}
}
} }
if (selmon && selmon->wlr_output->enabled) { if (selmon && selmon->wlr_output->enabled) {