resize fix

This commit is contained in:
2026-05-22 16:59:05 +07:00
parent d00ac09a9b
commit 58ac1fb881
6 changed files with 24 additions and 11 deletions
+1
View File
@@ -1,4 +1,5 @@
#include <stdnoreturn.h> #include <stdnoreturn.h>
#include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <wayland-server-core.h> #include <wayland-server-core.h>
#include <wlr/util/log.h> #include <wlr/util/log.h>
+1
View File
@@ -1,4 +1,5 @@
#include <wlr/types/wlr_layer_shell_v1.h> #include <wlr/types/wlr_layer_shell_v1.h>
#include <stdlib.h>
#include "focus.h" #include "focus.h"
#include "layers.h" #include "layers.h"
+7 -7
View File
@@ -259,10 +259,10 @@ void cursor_button(struct wl_listener *listener, void *data)
server->grab_x = server->cursor->x; server->grab_x = server->cursor->x;
server->grab_y = server->cursor->y; server->grab_y = server->cursor->y;
int32_t nx, ny; int32_t tx, ty;
wlr_scene_node_coords(&toplevel->scene_tree->node, &nx, &ny); wlr_scene_node_coords(&toplevel->scene_tree->node, &tx, &ty);
server->grab_geom.x = nx; server->grab_geom.x = tx;
server->grab_geom.y = ny; server->grab_geom.y = ty;
server->grab_geom.width = toplevel->geom.width; server->grab_geom.width = toplevel->geom.width;
server->grab_geom.height = toplevel->geom.height; server->grab_geom.height = toplevel->geom.height;
@@ -273,13 +273,13 @@ void cursor_button(struct wl_listener *listener, void *data)
int32_t width = toplevel->xdg->base->geometry.width; int32_t width = toplevel->xdg->base->geometry.width;
int32_t height = toplevel->xdg->base->geometry.height; int32_t height = toplevel->xdg->base->geometry.height;
if (server->grab_x > (x + width / 2) && server->grab_y > (y + height / 2)) { if (server->grab_x > (tx + width / 2) && server->grab_y > (ty + height / 2)) {
server->resize_corner = BOTTOM_RIGHT; server->resize_corner = BOTTOM_RIGHT;
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "se-resize"); wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "se-resize");
} else if (server->grab_x < (x + width / 2) && server->grab_y > (y + height / 2)) { } else if (server->grab_x < (tx + width / 2) && server->grab_y > (ty + height / 2)) {
server->resize_corner = BOTTOM_LEFT; server->resize_corner = BOTTOM_LEFT;
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "sw-resize"); wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "sw-resize");
} else if (server->grab_x > (x + width / 2) && server->grab_y < (y + height / 2)) { } else if (server->grab_x > (tx + width / 2) && server->grab_y < (ty + height / 2)) {
server->resize_corner = TOP_RIGHT; server->resize_corner = TOP_RIGHT;
wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "ne-resize"); wlr_cursor_set_xcursor(server->cursor, server->cursor_mgr, "ne-resize");
} else { } else {
+6 -2
View File
@@ -23,8 +23,6 @@ void toplevel_map(struct wl_listener *listener, void *data)
wlr_xdg_toplevel_set_maximized(toplevel->xdg, true); wlr_xdg_toplevel_set_maximized(toplevel->xdg, true);
} }
toplevel->bw = toplevel_is_unmanaged(toplevel) ? 0 : TOPLEVEL_BW;
#ifdef XWAYLAND #ifdef XWAYLAND
if (toplevel->type == TOPLEVEL_X11) { if (toplevel->type == TOPLEVEL_X11) {
toplevel->scene_surface = wlr_scene_subsurface_tree_create(toplevel->scene_tree, toplevel->xw->surface); toplevel->scene_surface = wlr_scene_subsurface_tree_create(toplevel->scene_tree, toplevel->xw->surface);
@@ -38,6 +36,12 @@ void toplevel_map(struct wl_listener *listener, void *data)
toplevel_get_geom(toplevel); toplevel_get_geom(toplevel);
toplevel->bw = toplevel_is_unmanaged(toplevel) ? 0 : TOPLEVEL_BW; toplevel->bw = toplevel_is_unmanaged(toplevel) ? 0 : TOPLEVEL_BW;
#ifdef XWAYLAND
if (toplevel->type == TOPLEVEL_X11) {
toplevel->xw->surface->data = toplevel;
}
#endif
for (int i = 0; i < 4; ++i) { for (int i = 0; i < 4; ++i) {
toplevel->border[i] = wlr_scene_rect_create(toplevel->scene_tree, 0, 0, unfocused_bc); toplevel->border[i] = wlr_scene_rect_create(toplevel->scene_tree, 0, 0, unfocused_bc);
toplevel->border[i]->node.data = toplevel; toplevel->border[i]->node.data = toplevel;
+7 -2
View File
@@ -1,6 +1,7 @@
#include <wayland-server-core.h> #include <wayland-server-core.h>
#include "config.h" #include "config.h"
#include "layers.h"
#include "layout.h" #include "layout.h"
#include "toplevel.h" #include "toplevel.h"
#include "types.h" #include "types.h"
@@ -96,7 +97,7 @@ void toplevel_set_size(absn_toplevel *toplevel, int32_t width, int32_t height)
wlr_xwayland_surface_configure(toplevel->xw, toplevel->geom.x, toplevel->geom.y, width - 2 * bw, height - 2 * toplevel->bw); wlr_xwayland_surface_configure(toplevel->xw, toplevel->geom.x, toplevel->geom.y, width - 2 * bw, height - 2 * toplevel->bw);
/* manually update position */ /* manually update position */
toplevel_set_pos(toplevel, toplevel->geom.x, toplevel->geom.y); toplevel_set_pos(toplevel, toplevel->geom.x, toplevel->geom.y);
} } else
#endif #endif
wlr_scene_subsurface_tree_set_clip(&toplevel->scene_surface->node, &clip); wlr_scene_subsurface_tree_set_clip(&toplevel->scene_surface->node, &clip);
@@ -133,7 +134,9 @@ void toplevel_set_fullscreen(absn_toplevel *toplevel, bool fullscreen)
absn_output *output = toplevel->server->focused_output; absn_output *output = toplevel->server->focused_output;
toplevel->fullscreen = fullscreen; toplevel->fullscreen = fullscreen;
wlr_xdg_toplevel_set_fullscreen(toplevel->xdg, fullscreen); if (toplevel->type == TOPLEVEL_XDG) {
wlr_xdg_toplevel_set_fullscreen(toplevel->xdg, fullscreen);
}
if (fullscreen) { if (fullscreen) {
toplevel->prev_geom = toplevel->geom; toplevel->prev_geom = toplevel->geom;
@@ -154,6 +157,7 @@ void toplevel_set_fullscreen(absn_toplevel *toplevel, bool fullscreen)
toplevel_update_borders_geom(toplevel); toplevel_update_borders_geom(toplevel);
layout_arrange(toplevel->output); layout_arrange(toplevel->output);
layers_arrange(toplevel->output);
} }
void toplevel_set_border_color(absn_toplevel *toplevel, const float color[4]) void toplevel_set_border_color(absn_toplevel *toplevel, const float color[4])
@@ -161,6 +165,7 @@ void toplevel_set_border_color(absn_toplevel *toplevel, const float color[4])
if (!toplevel) { if (!toplevel) {
return; return;
} }
for (int i = 0; i < 4; ++i) { for (int i = 0; i < 4; ++i) {
wlr_scene_rect_set_color(toplevel->border[i], color); wlr_scene_rect_set_color(toplevel->border[i], color);
} }
+2
View File
@@ -1,3 +1,5 @@
#include <stdlib.h>
#include "types.h" #include "types.h"
void xdg_popup_commit(struct wl_listener *listener, void *data) void xdg_popup_commit(struct wl_listener *listener, void *data)