diff --git a/docs/configuration/miscellaneous.md b/docs/configuration/miscellaneous.md index cd8d167d..1001c4c1 100644 --- a/docs/configuration/miscellaneous.md +++ b/docs/configuration/miscellaneous.md @@ -21,7 +21,6 @@ description: Advanced settings for XWayland, focus behavior, and system integrat | `sloppyfocus` | `1` | Focus follows the mouse cursor. | | `warpcursor` | `1` | Warp the cursor to the center of the window when focus changes via keyboard. | | `cursor_hide_timeout` | `0` | Hide the cursor after `N` seconds of inactivity (`0` to disable). | -| `cursor_hide_on_keypress` | `0` | Hide the cursor on keypress. | | `drag_tile_to_tile` | `0` | Allow dragging a tiled window onto another to swap their positions. | | `drag_tile_small` | `1` | Allow dragging a tiled window temporarily to small size.| | `drag_corner` | `3` | Corner for drag-to-tile detection (0: none, 1–3: corners, 4: auto-detect). | @@ -49,4 +48,4 @@ description: Advanced settings for XWayland, focus behavior, and system integrat | `idleinhibit_ignore_visible` | `0` | Allow invisible clients (e.g., background audio players) to inhibit idle. | | `tag_carousel` | `0` | Enable tag carousel (cycling through tags). | | `drag_tile_refresh_interval` | `8.0` | Interval (1.0–16.0) to refresh tiled window resize during drag. Too small may cause application lag. | -| `drag_floating_refresh_interval` | `8.0` | Interval (1.0–16.0) to refresh floating window resize during drag. Too small may cause application lag. | +| `drag_floating_refresh_interval` | `8.0` | Interval (1.0–16.0) to refresh floating window resize during drag. Too small may cause application lag. | \ No newline at end of file diff --git a/docs/screenshot.md b/docs/screenshot.md index 8c512313..7f85224a 100644 --- a/docs/screenshot.md +++ b/docs/screenshot.md @@ -14,7 +14,7 @@ Instead, compose your own workflow from small Wayland utilities and bind them to | [`slurp`](https://github.com/emersion/slurp) | Interactively select a region for `grim` | | [`wl-copy`](https://github.com/bugaevc/wl-clipboard) | Copy screenshots directly to the clipboard | | [`satty`](https://github.com/gabm/Satty) | Annotate screenshots before saving | -| [`wayfreeze`](https://github.com/Jappie3/wayfreeze) | Freeze the screen before capture | +| [`wayfreeze`](https://github.com/nicbk/wayfreeze) | Freeze the screen before capture | Install the required with your package manager or from source. diff --git a/docs/window-management/rules.md b/docs/window-management/rules.md index 7e221bf1..41b4cc53 100644 --- a/docs/window-management/rules.md +++ b/docs/window-management/rules.md @@ -115,7 +115,7 @@ windowrule=width:1000,height:900,appid:yesplaymusic,title:Demons # Global keybindings for OBS Studio windowrule=globalkeybinding:ctrl+alt-o,appid:com.obsproject.Studio -windowrule=globalkeybinding:ctrl+alt-n,appid:com.obsproject.Studio +windowrule=globalkeybinding:ctrl+alt+n,appid:com.obsproject.Studio windowrule=isopensilent:1,appid:com.obsproject.Studio # Force tearing for games diff --git a/meson.build b/meson.build index 23b59d61..553ba0e1 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('mango', ['c'], - version : '0.14.2', + version : '0.14.1', ) subdir('protocols') diff --git a/src/action/client.h b/src/action/client.h index 1b3c9335..f374ca14 100644 --- a/src/action/client.h +++ b/src/action/client.h @@ -51,7 +51,7 @@ static void finish_exchange_arrange_and_focus(Client *c1, Client *c2, } void client_tile_resize(Client *c, struct wlr_box geo, int32_t interact) { - if (!ISFAKETILED(c)) + if (!ISSCROLLTILED(c)) return; if (!c->isfullscreen && !c->ismaximizescreen) { diff --git a/src/animation/client.h b/src/animation/client.h index f988651e..8aa39050 100644 --- a/src/animation/client.h +++ b/src/animation/client.h @@ -495,7 +495,6 @@ void apply_border(Client *c) { if (c->isfullscreen) { if (c->border->node.enabled) { - wlr_scene_node_set_position(&c->scene_surface->node, 0, 0); wlr_scene_node_set_enabled(&c->border->node, false); } return; diff --git a/src/config/parse_config.h b/src/config/parse_config.h index 72196c5f..5379ddca 100644 --- a/src/config/parse_config.h +++ b/src/config/parse_config.h @@ -261,7 +261,6 @@ typedef struct { int32_t overviewgappi; int32_t overviewgappo; uint32_t cursor_hide_timeout; - uint32_t cursor_hide_on_keypress; uint32_t axis_bind_apply_timeout; uint32_t focus_on_activate; @@ -1715,8 +1714,6 @@ bool parse_option(Config *config, char *key, char *value) { config->overviewgappo = atoi(value); } else if (strcmp(key, "cursor_hide_timeout") == 0) { config->cursor_hide_timeout = atoi(value); - } else if (strcmp(key, "cursor_hide_on_keypress") == 0) { - config->cursor_hide_on_keypress = atoi(value); } else if (strcmp(key, "axis_bind_apply_timeout") == 0) { config->axis_bind_apply_timeout = atoi(value); } else if (strcmp(key, "focus_on_activate") == 0) { @@ -3349,8 +3346,6 @@ void override_config(void) { CLAMP_INT(config.no_radius_when_single, 0, 1); config.cursor_hide_timeout = CLAMP_INT(config.cursor_hide_timeout, 0, 36000); - config.cursor_hide_on_keypress = - CLAMP_INT(config.cursor_hide_on_keypress, 0, 1); config.single_scratchpad = CLAMP_INT(config.single_scratchpad, 0, 1); config.repeat_rate = CLAMP_INT(config.repeat_rate, 1, 1000); config.repeat_delay = CLAMP_INT(config.repeat_delay, 1, 20000); @@ -3512,7 +3507,6 @@ void set_value_default() { config.overviewgappi = 5; config.overviewgappo = 30; config.cursor_hide_timeout = 0; - config.cursor_hide_on_keypress = 0; config.warpcursor = 1; config.drag_corner = 3; diff --git a/src/fetch/client.h b/src/fetch/client.h index 77b2d865..85b296a3 100644 --- a/src/fetch/client.h +++ b/src/fetch/client.h @@ -91,9 +91,9 @@ setclient_coordinate_center(Client *c, Monitor *tm, struct wlr_box geom, if (!m) return geom; - uint32_t cbw = c && check_hit_no_border(c) ? c->bw : 0; + uint32_t cbw = check_hit_no_border(c) ? c->bw : 0; - if ((!c || !c->no_force_center) && m) { + if (!c->no_force_center && m) { tempbox.x = m->w.x + (m->w.width - geom.width) / 2; tempbox.y = m->w.y + (m->w.height - geom.height) / 2; } else { diff --git a/src/layout/arrange.h b/src/layout/arrange.h index eab3ac00..7223b430 100644 --- a/src/layout/arrange.h +++ b/src/layout/arrange.h @@ -751,7 +751,6 @@ void resize_tile_grid_fair(Client *grabc, bool isdrag, int32_t offsetx, void resize_tile_scroller(Client *grabc, bool isdrag, int32_t offsetx, int32_t offsety, uint32_t time, bool isvertical) { - if (!grabc || grabc->isfullscreen || grabc->ismaximizescreen) return; if (grabc->mon->isoverview) @@ -773,7 +772,7 @@ void resize_tile_scroller(Client *grabc, bool isdrag, int32_t offsetx, Client *stack_head_client = headnode->client; - if (m->visible_scroll_tiling_clients == 1 && + if (m->visible_tiling_clients == 1 && !config.scroller_ignore_proportion_single) return; diff --git a/src/layout/horizontal.h b/src/layout/horizontal.h index 419e218a..92980731 100644 --- a/src/layout/horizontal.h +++ b/src/layout/horizontal.h @@ -500,13 +500,16 @@ void deck(Monitor *m) { return; wl_list_for_each(fc, &clients, link) { + if (VISIBLEON(fc, m) && ISFAKETILED(fc)) break; } + // Calculate master width using mfact from pertag mfact = fc->master_mfact_per > 0.0f ? fc->master_mfact_per : m->pertag->mfacts[m->pertag->curtag]; + // Calculate master width including outer gaps if (n > nmasters) mw = nmasters ? round((m->w.width - 2 * cur_gappoh) * mfact) : 0; else @@ -518,15 +521,16 @@ void deck(Monitor *m) { continue; if (i < nmasters) { c->master_mfact_per = mfact; - int32_t h = - (m->w.height - 2 * cur_gappov - my) / (MIN(n, nmasters) - i); - client_tile_resize(c, - (struct wlr_box){.x = m->w.x + cur_gappoh, - .y = m->w.y + cur_gappov + my, - .width = mw, - .height = h}, - 0); - my += h; + // Master area clients + client_tile_resize( + c, + (struct wlr_box){.x = m->w.x + cur_gappoh, + .y = m->w.y + cur_gappov + my, + .width = mw, + .height = (m->w.height - 2 * cur_gappov - my) / + (MIN(n, nmasters) - i)}, + 0); + my += c->geom.height; } else { // Stack area clients c->master_mfact_per = mfact; @@ -584,7 +588,6 @@ void grid(Monitor *m) { int32_t target_gappi = enablegaps ? config.gappih : 0; float single_width_ratio = 0.9; float single_height_ratio = 0.9; - struct wlr_box target_geom; n = m->visible_fake_tiling_clients; @@ -600,11 +603,11 @@ void grid(Monitor *m) { ISFAKETILED(c))) { cw = (m->w.width - 2 * target_gappo) * single_width_ratio; ch = (m->w.height - 2 * target_gappo) * single_height_ratio; - target_geom.x = m->w.x + (m->w.width - cw) / 2; - target_geom.y = m->w.y + (m->w.height - ch) / 2; - target_geom.width = cw; - target_geom.height = ch; - client_tile_resize(c, target_geom, 0); + c->geom.x = m->w.x + (m->w.width - cw) / 2; + c->geom.y = m->w.y + (m->w.height - ch) / 2; + c->geom.width = cw; + c->geom.height = ch; + client_tile_resize(c, c->geom, 0); return; } } @@ -648,16 +651,16 @@ void grid(Monitor *m) { cw = avail_w * (col_pers[i] / sum_col); if (i == 0) { - target_geom.x = m->w.x + target_gappo; + c->geom.x = m->w.x + target_gappo; } else if (i == 1) { // 第二个窗口的 X 坐标紧跟第一个窗口后面 float cw0 = avail_w * (col_pers[0] / sum_col); - target_geom.x = m->w.x + target_gappo + cw0 + target_gappi; + c->geom.x = m->w.x + target_gappo + cw0 + target_gappi; } - target_geom.y = m->w.y + (m->w.height - ch) / 2 + target_gappo; - target_geom.width = cw; - target_geom.height = ch; - client_tile_resize(c, target_geom, 0); + c->geom.y = m->w.y + (m->w.height - ch) / 2 + target_gappo; + c->geom.width = cw; + c->geom.height = ch; + client_tile_resize(c, c->geom, 0); i++; } } @@ -754,11 +757,11 @@ void grid(Monitor *m) { ? (m->w.y + m->w.height - target_gappo - fl_cy) : avail_h * (row_pers[r_idx] / sum_row); - target_geom.x = (int32_t)fl_cx; - target_geom.y = (int32_t)fl_cy; - target_geom.width = (int32_t)fl_cw; - target_geom.height = (int32_t)fl_ch; - client_tile_resize(c, target_geom, 0); + c->geom.x = (int32_t)fl_cx; + c->geom.y = (int32_t)fl_cy; + c->geom.width = (int32_t)fl_cw; + c->geom.height = (int32_t)fl_ch; + client_tile_resize(c, c->geom, 0); i++; } } diff --git a/src/layout/vertical.h b/src/layout/vertical.h index b1de212e..523467f9 100644 --- a/src/layout/vertical.h +++ b/src/layout/vertical.h @@ -137,10 +137,12 @@ void vertical_deck(Monitor *m) { return; wl_list_for_each(fc, &clients, link) { + if (VISIBLEON(fc, m) && ISFAKETILED(fc)) break; } + // Calculate master width using mfact from pertag mfact = fc->master_mfact_per > 0.0f ? fc->master_mfact_per : m->pertag->mfacts[m->pertag->curtag]; @@ -154,18 +156,16 @@ void vertical_deck(Monitor *m) { if (!VISIBLEON(c, m) || !ISFAKETILED(c)) continue; if (i < nmasters) { - c->master_mfact_per = mfact; - int32_t w = - (m->w.width - 2 * cur_gappoh - mx) / (MIN(n, nmasters) - i); - client_tile_resize(c, - (struct wlr_box){.x = m->w.x + cur_gappoh + mx, - .y = m->w.y + cur_gappov, - .width = w, - .height = mh}, - 0); - mx += w; + client_tile_resize( + c, + (struct wlr_box){.x = m->w.x + cur_gappoh + mx, + .y = m->w.y + cur_gappov, + .width = (m->w.width - 2 * cur_gappoh - mx) / + (MIN(n, nmasters) - i), + .height = mh}, + 0); + mx += c->geom.width; } else { - c->master_mfact_per = mfact; client_tile_resize( c, (struct wlr_box){.x = m->w.x + cur_gappoh, @@ -186,13 +186,14 @@ void vertical_grid(Monitor *m) { int32_t cw, ch; int32_t rows, cols, overrows; Client *c = NULL; - int32_t target_gappo = enablegaps ? config.gappov : 0; - int32_t target_gappi = enablegaps ? config.gappiv : 0; - float single_width_ratio = 0.9; - float single_height_ratio = 0.9; - struct wlr_box target_geom; + int32_t target_gappo = + enablegaps ? m->isoverview ? config.overviewgappo : config.gappov : 0; + int32_t target_gappi = + enablegaps ? m->isoverview ? config.overviewgappi : config.gappiv : 0; + float single_width_ratio = m->isoverview ? 0.7 : 0.9; + float single_height_ratio = m->isoverview ? 0.8 : 0.9; - n = m->visible_fake_tiling_clients; + n = m->isoverview ? m->visible_clients : m->visible_fake_tiling_clients; if (n == 0) return; @@ -201,14 +202,15 @@ void vertical_grid(Monitor *m) { if (c->mon != m) continue; if (VISIBLEON(c, m) && !c->isunglobal && - (!client_is_x11_popup(c) || ISFAKETILED(c))) { + ((m->isoverview && !client_is_x11_popup(c)) || + ISFAKETILED(c))) { ch = (m->w.height - 2 * target_gappo) * single_height_ratio; cw = (m->w.width - 2 * target_gappo) * single_width_ratio; - target_geom.x = m->w.x + (m->w.width - cw) / 2; - target_geom.y = m->w.y + (m->w.height - ch) / 2; - target_geom.width = cw; - target_geom.height = ch; - client_tile_resize(c, target_geom, 0); + c->geom.x = m->w.x + (m->w.width - cw) / 2; + c->geom.y = m->w.y + (m->w.height - ch) / 2; + c->geom.width = cw; + c->geom.height = ch; + client_tile_resize(c, c->geom, 0); return; } } @@ -222,7 +224,8 @@ void vertical_grid(Monitor *m) { if (c->mon != m) continue; if (VISIBLEON(c, m) && !c->isunglobal && - (!client_is_x11_popup(c) || ISFAKETILED(c))) { + ((m->isoverview && !client_is_x11_popup(c)) || + ISFAKETILED(c))) { if (i < 2) row_pers[i] = (c->grid_row_per > 0.0f) ? c->grid_row_per : 1.0f; @@ -239,7 +242,8 @@ void vertical_grid(Monitor *m) { if (c->mon != m) continue; if (VISIBLEON(c, m) && !c->isunglobal && - (!client_is_x11_popup(c) || ISFAKETILED(c))) { + ((m->isoverview && !client_is_x11_popup(c)) || + ISFAKETILED(c))) { c->grid_col_idx = 0; c->grid_row_idx = i; c->grid_col_per = 1.0f; @@ -248,17 +252,17 @@ void vertical_grid(Monitor *m) { // 根据分配的权重动态计算当前窗口的高度 ch = avail_h * (row_pers[i] / sum_row); - target_geom.x = m->w.x + (m->w.width - cw) / 2 + target_gappo; + c->geom.x = m->w.x + (m->w.width - cw) / 2 + target_gappo; if (i == 0) { - target_geom.y = m->w.y + target_gappo; + c->geom.y = m->w.y + target_gappo; } else if (i == 1) { // 第二个窗口的 Y 坐标紧跟第一个窗口下面 float ch0 = avail_h * (row_pers[0] / sum_row); - target_geom.y = m->w.y + target_gappo + ch0 + target_gappi; + c->geom.y = m->w.y + target_gappo + ch0 + target_gappi; } - target_geom.width = cw; - target_geom.height = ch; - client_tile_resize(c, target_geom, 0); + c->geom.width = cw; + c->geom.height = ch; + client_tile_resize(c, c->geom, 0); i++; } } @@ -283,7 +287,7 @@ void vertical_grid(Monitor *m) { if (c->mon != m) continue; if (VISIBLEON(c, m) && !c->isunglobal && - (!client_is_x11_popup(c) || ISFAKETILED(c))) { + ((m->isoverview && !client_is_x11_popup(c)) || ISFAKETILED(c))) { int32_t c_idx = i / rows; int32_t r_idx = i % rows; if (r_idx == 0) @@ -310,7 +314,7 @@ void vertical_grid(Monitor *m) { if (c->mon != m) continue; if (VISIBLEON(c, m) && !c->isunglobal && - (!client_is_x11_popup(c) || ISFAKETILED(c))) { + ((m->isoverview && !client_is_x11_popup(c)) || ISFAKETILED(c))) { int32_t c_idx = i / rows; int32_t r_idx = i % rows; @@ -348,11 +352,11 @@ void vertical_grid(Monitor *m) { ? (m->w.x + m->w.width - target_gappo - fl_cx) : avail_w * (col_pers[c_idx] / sum_col); - target_geom.x = (int32_t)fl_cx; - target_geom.y = (int32_t)fl_cy; - target_geom.width = (int32_t)fl_cw; - target_geom.height = (int32_t)fl_ch; - client_tile_resize(c, target_geom, 0); + c->geom.x = (int32_t)fl_cx; + c->geom.y = (int32_t)fl_cy; + c->geom.width = (int32_t)fl_cw; + c->geom.height = (int32_t)fl_ch; + client_tile_resize(c, c->geom, 0); i++; } } diff --git a/src/mango.c b/src/mango.c index 731c0ac3..74d4c196 100644 --- a/src/mango.c +++ b/src/mango.c @@ -1073,7 +1073,7 @@ static struct wl_listener last_cursor_surface_destroy_listener = { .notify = last_cursor_surface_destroy}; #ifdef XWAYLAND -static void fix_xwayland_coordinate(struct wlr_box *geom); +static void fix_xwayland_unmanaged_coordinate(Client *c); static int32_t synckeymap(void *data); static void activatex11(struct wl_listener *listener, void *data); static void configurex11(struct wl_listener *listener, void *data); @@ -1615,7 +1615,7 @@ void applyrules(Client *c) { #ifdef XWAYLAND if (c->isfloating && client_is_x11(c)) { - fix_xwayland_coordinate(&c->geom); + fix_xwayland_unmanaged_coordinate(c); c->float_geom = c->geom; } #endif @@ -3140,6 +3140,7 @@ void createlayersurface(struct wl_listener *listener, void *data) { LISTEN(&l->scene->node.events.destroy, &l->destroy, destroylayernodenotify); wl_list_insert(&l->mon->layers[layer_surface->pending.layer], &l->link); + wlr_surface_send_enter(surface, layer_surface->output); } void createlocksurface(struct wl_listener *listener, void *data) { @@ -4205,11 +4206,6 @@ void keypress(struct wl_listener *listener, void *data) { } } - if (config.cursor_hide_on_keypress && !cursor_hidden && - event->state == WL_KEYBOARD_KEY_STATE_PRESSED) { - hidecursor(NULL); - } - /* On _press_ if there is no active screen locker, * attempt to process a compositor keybinding. */ for (i = 0; i < nsyms; i++) @@ -4473,24 +4469,24 @@ mapnotify(struct wl_listener *listener, void *data) { /* Handle unmanaged clients first so we can return prior create borders */ -#ifdef XWAYLAND if (client_is_unmanaged(c)) { /* Unmanaged clients always are floating */ - fix_xwayland_coordinate(&c->geom); - wlr_scene_node_set_position(&c->scene->node, c->geom.x, c->geom.y); - wlr_xwayland_surface_configure(c->surface.xwayland, c->geom.x, - c->geom.y, c->geom.width, - c->geom.height); - LISTEN(&c->surface.xwayland->events.set_geometry, &c->set_geometry, - setgeometrynotify); +#ifdef XWAYLAND + if (client_is_x11(c)) { + fix_xwayland_unmanaged_coordinate(c); + LISTEN(&c->surface.xwayland->events.set_geometry, &c->set_geometry, + setgeometrynotify); + } +#endif wlr_scene_node_reparent(&c->scene->node, layers[LyrOverlay]); + wlr_scene_node_set_position(&c->scene->node, c->geom.x, c->geom.y); if (client_wants_focus(c)) { focusclient(c, 1); exclusive_focus = c; } return; } -#endif + // extra node for (i = 0; i < 2; i++) { @@ -4812,8 +4808,7 @@ void motionnotify(uint32_t time, struct wlr_input_device *device, double dx, if (!surface && !seat->drag && !cursor_hidden) wlr_cursor_set_xcursor(cursor, cursor_mgr, "default"); - if (c && c->mon && !c->animation.running && - (INSIDEMON(c) || !ISSCROLLTILED(c))) { + if (c && c->mon && !c->animation.running && (INSIDEMON(c) || !ISTILED(c))) { scroller_focus_lock = 0; } @@ -4825,15 +4820,13 @@ void motionnotify(uint32_t time, struct wlr_input_device *device, double dx, } if (!scroller_focus_lock || !(c && c->mon && !INSIDEMON(c))) { - if (c && c->mon && ISSCROLLTILED(c) && is_scroller_layout(c->mon) && - !INSIDEMON(c)) { + if (c && c->mon && is_scroller_layout(c->mon) && !INSIDEMON(c)) { should_lock = true; } if (!((!config.edge_scroller_pointer_focus || speed < config.edge_scroller_focus_allow_speed) && - c && c->mon && ISSCROLLTILED(c) && is_scroller_layout(c->mon) && - !INSIDEMON(c))) { + c && c->mon && is_scroller_layout(c->mon) && !INSIDEMON(c))) { pointerfocus(c, surface, sx, sy, time); } @@ -6832,17 +6825,16 @@ void virtualpointer(struct wl_listener *listener, void *data) { } #ifdef XWAYLAND -void fix_xwayland_coordinate(struct wlr_box *geom) { +void fix_xwayland_unmanaged_coordinate(Client *c) { if (!selmon) return; // 1. 如果窗口已经在当前活动显示器内,直接返回 - if (geom->x >= selmon->m.x && geom->x <= selmon->m.x + selmon->m.width && - geom->y >= selmon->m.y && geom->y <= selmon->m.y + selmon->m.height) + if (c->geom.x >= selmon->m.x && c->geom.x < selmon->m.x + selmon->m.width && + c->geom.y >= selmon->m.y && c->geom.y < selmon->m.y + selmon->m.height) return; - geom->x = selmon->m.x + (selmon->m.width - geom->width) / 2; - geom->y = selmon->m.y + (selmon->m.height - geom->height) / 2; + c->geom = setclient_coordinate_center(c, selmon, c->geom, 0, 0); } int32_t synckeymap(void *data) { @@ -6897,41 +6889,24 @@ void activatex11(struct wl_listener *listener, void *data) { void configurex11(struct wl_listener *listener, void *data) { Client *c = wl_container_of(listener, c, configure); struct wlr_xwayland_surface_configure_event *event = data; - struct wlr_box new_geo; - new_geo.x = event->x; - new_geo.y = event->y; - new_geo.width = event->width; - new_geo.height = event->height; - fix_xwayland_coordinate(&new_geo); - if (!client_surface(c) || !client_surface(c)->mapped) { - - wlr_xwayland_surface_configure(c->surface.xwayland, new_geo.x, - new_geo.y, new_geo.width, - new_geo.height); + wlr_xwayland_surface_configure(c->surface.xwayland, event->x, event->y, + event->width, event->height); return; } - if (client_is_unmanaged(c)) { - wlr_scene_node_set_position(&c->scene->node, new_geo.x, new_geo.y); - wlr_xwayland_surface_configure(c->surface.xwayland, new_geo.x, - new_geo.y, new_geo.width, - new_geo.height); + wlr_scene_node_set_position(&c->scene->node, event->x, event->y); + wlr_xwayland_surface_configure(c->surface.xwayland, event->x, event->y, + event->width, event->height); return; } - - if (c->isfloating && c != grabc) { - new_geo.x = new_geo.x - c->bw; - new_geo.y = new_geo.y - c->bw; - new_geo.width = new_geo.width + c->bw * 2; - new_geo.height = new_geo.height + c->bw * 2; - fix_xwayland_coordinate(&new_geo); - + if ((c->isfloating && c != grabc) || + !c->mon->pertag->ltidxs[c->mon->pertag->curtag]->arrange) { resize(c, - (struct wlr_box){.x = new_geo.x, - .y = new_geo.y, - .width = new_geo.width, - .height = new_geo.height}, + (struct wlr_box){.x = event->x - c->bw, + .y = event->y - c->bw, + .width = event->width + c->bw * 2, + .height = event->height + c->bw * 2}, 0); } else { arrange(c->mon, false, false);