mirror of
https://github.com/wizbright/waybox.git
synced 2025-10-29 05:40:20 -04:00
Merge branch 'master' of https://github.com/wizbright/waybox
This commit is contained in:
commit
428484959c
3 changed files with 46 additions and 28 deletions
|
|
@ -42,7 +42,7 @@ struct wb_server {
|
|||
|
||||
struct wb_view *grabbed_view;
|
||||
double grab_x, grab_y;
|
||||
int grab_width, grab_height;
|
||||
struct wlr_box grab_geo_box;
|
||||
uint32_t resize_edges;
|
||||
|
||||
struct wlr_xdg_shell *xdg_shell;
|
||||
|
|
|
|||
|
|
@ -10,33 +10,44 @@ static void process_cursor_move(struct wb_server *server) {
|
|||
|
||||
static void process_cursor_resize(struct wb_server *server) {
|
||||
struct wb_view *view = server->grabbed_view;
|
||||
double dx = server->cursor->cursor->x - server->grab_x;
|
||||
double dy = server->cursor->cursor->y - server->grab_y;
|
||||
double x = view->x;
|
||||
double y = view->y;
|
||||
int width = server->grab_width;
|
||||
int height = server->grab_height;
|
||||
double border_x = server->cursor->cursor->x - server->grab_x;
|
||||
double border_y = server->cursor->cursor->y - server->grab_y;
|
||||
int new_left = server->grab_geo_box.x;
|
||||
int new_right = server->grab_geo_box.x + server->grab_geo_box.width;
|
||||
int new_top = server->grab_geo_box.y;
|
||||
int new_bottom = server->grab_geo_box.y + server->grab_geo_box.height;
|
||||
|
||||
if (server->resize_edges & WLR_EDGE_TOP) {
|
||||
y = server->grab_y + dy;
|
||||
height -= dy;
|
||||
if (height < 1) {
|
||||
y += height;
|
||||
new_top = border_y;
|
||||
if (new_top >= new_bottom) {
|
||||
new_top = new_bottom - 1;
|
||||
}
|
||||
} else if (server->resize_edges & WLR_EDGE_BOTTOM) {
|
||||
height += dy;
|
||||
new_bottom = border_y;
|
||||
if (new_bottom <= new_top) {
|
||||
new_bottom = new_top + 1;
|
||||
}
|
||||
}
|
||||
if (server->resize_edges & WLR_EDGE_LEFT) {
|
||||
x = server->grab_x + dx;
|
||||
width -= dx;
|
||||
if (width < 1) {
|
||||
x += width;
|
||||
new_left = border_x;
|
||||
if (new_left >= new_right) {
|
||||
new_left = new_right - 1;
|
||||
}
|
||||
} else if (server->resize_edges & WLR_EDGE_RIGHT) {
|
||||
width += dx;
|
||||
new_right = border_x;
|
||||
if (new_right <= new_left) {
|
||||
new_right = new_left + 1;
|
||||
}
|
||||
}
|
||||
view->x = x;
|
||||
view->y = y;
|
||||
wlr_xdg_toplevel_set_size(view->xdg_surface, width, height);
|
||||
|
||||
struct wlr_box geo_box;
|
||||
wlr_xdg_surface_get_geometry(view->xdg_surface, &geo_box);
|
||||
view->x = new_left - geo_box.x;
|
||||
view->y = new_top - geo_box.y;
|
||||
|
||||
int new_width = new_right - new_left;
|
||||
int new_height = new_bottom - new_top;
|
||||
wlr_xdg_toplevel_set_size(view->xdg_surface, new_width, new_height);
|
||||
}
|
||||
|
||||
static void process_cursor_motion(struct wb_server *server, uint32_t time) {
|
||||
|
|
|
|||
|
|
@ -90,18 +90,25 @@ static void begin_interactive(struct wb_view *view,
|
|||
}
|
||||
server->grabbed_view = view;
|
||||
server->cursor->cursor_mode = mode;
|
||||
struct wlr_box geo_box;
|
||||
wlr_xdg_surface_get_geometry(view->xdg_surface, &geo_box);
|
||||
|
||||
if (mode == WB_CURSOR_MOVE) {
|
||||
server->grab_x = server->cursor->cursor->x - view->x;
|
||||
server->grab_y = server->cursor->cursor->y - view->y;
|
||||
} else {
|
||||
server->grab_x = server->cursor->cursor->x + geo_box.x;
|
||||
server->grab_y = server->cursor->cursor->y + geo_box.y;
|
||||
} else if (mode == WB_CURSOR_RESIZE) {
|
||||
struct wlr_box geo_box;
|
||||
wlr_xdg_surface_get_geometry(view->xdg_surface, &geo_box);
|
||||
|
||||
double border_x = (view->x + geo_box.x) + ((edges & WLR_EDGE_RIGHT) ? geo_box.width : 0);
|
||||
double border_y = (view->y + geo_box.y) + ((edges & WLR_EDGE_BOTTOM) ? geo_box.height : 0);
|
||||
server->grab_x = server->cursor->cursor->x - border_x;
|
||||
server->grab_y = server->cursor->cursor->y - border_y;
|
||||
|
||||
server->grab_geo_box = geo_box;
|
||||
server->grab_geo_box.x += view->x;
|
||||
server->grab_geo_box.y += view->y;
|
||||
|
||||
server->resize_edges = edges;
|
||||
}
|
||||
server->grab_width = geo_box.width;
|
||||
server->grab_height = geo_box.height;
|
||||
server->resize_edges = edges;
|
||||
}
|
||||
|
||||
static void xdg_toplevel_request_move(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue