moving window on commit
This commit is contained in:
+18
-6
@@ -1,6 +1,7 @@
|
||||
#include <wayland-server-core.h>
|
||||
|
||||
#include "types.h"
|
||||
#include "xdg-toplevel.h"
|
||||
|
||||
struct absinthe_toplevel *absinthe_toplevel_at(struct absinthe_server *server, double lx, double ly, struct wlr_surface **surface, double *sx, double *sy)
|
||||
{
|
||||
@@ -30,6 +31,10 @@ void absinthe_toplevel_set_position(struct absinthe_toplevel *toplevel, int32_t
|
||||
|
||||
void absinthe_toplevel_set_size(struct absinthe_toplevel *toplevel, int32_t width, int32_t height)
|
||||
{
|
||||
if (width < 0 || height < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (width == toplevel->xdg_toplevel->current.width && height == toplevel->xdg_toplevel->current.height) {
|
||||
return;
|
||||
}
|
||||
@@ -37,24 +42,31 @@ void absinthe_toplevel_set_size(struct absinthe_toplevel *toplevel, int32_t widt
|
||||
toplevel->geometry.width = width;
|
||||
toplevel->geometry.height = height;
|
||||
|
||||
int bw = ABSINTHE_BORDER_WIDTH;
|
||||
|
||||
wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, width, height);
|
||||
wlr_xdg_surface_schedule_configure(toplevel->xdg_toplevel->base);
|
||||
}
|
||||
|
||||
void absinthe_toplevel_update_border_geometry(struct absinthe_toplevel *toplevel)
|
||||
{
|
||||
int bw = ABSINTHE_BORDER_WIDTH;
|
||||
|
||||
if (toplevel->geometry.width - 2 * bw < 0 || toplevel->geometry.height - 2 * bw < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
wlr_scene_node_set_position(&toplevel->scene_surface->node, bw, bw);
|
||||
|
||||
wlr_scene_rect_set_size(toplevel->border[0], toplevel->geometry.width - 2 * bw, bw);
|
||||
wlr_scene_rect_set_size(toplevel->border[1], toplevel->geometry.width - 2 * bw, bw);
|
||||
wlr_scene_rect_set_size(toplevel->border[2], bw, toplevel->geometry.height);
|
||||
wlr_scene_rect_set_size(toplevel->border[3], bw, toplevel->geometry.height);
|
||||
|
||||
wlr_scene_node_set_position(&toplevel->border[0]->node, 0, -bw);
|
||||
wlr_scene_node_set_position(&toplevel->border[1]->node, 0, toplevel->geometry.height - 2 * bw);
|
||||
wlr_scene_node_set_position(&toplevel->border[2]->node, -bw, -bw);
|
||||
wlr_scene_node_set_position(&toplevel->border[3]->node, toplevel->geometry.width - 2 * bw, -bw);
|
||||
|
||||
absinthe_toplevel_set_size(toplevel, toplevel->geometry.width - 2 * bw, toplevel->geometry.height - 2 * bw);
|
||||
wlr_scene_node_set_position(&toplevel->border[0]->node, bw, 0);
|
||||
wlr_scene_node_set_position(&toplevel->border[1]->node, bw, toplevel->geometry.height - bw);
|
||||
wlr_scene_node_set_position(&toplevel->border[2]->node, 0, 0);
|
||||
wlr_scene_node_set_position(&toplevel->border[3]->node, toplevel->geometry.width - bw, 0);
|
||||
}
|
||||
|
||||
void absinthe_toplevel_set_border_color(struct absinthe_toplevel *toplevel, const float color[4])
|
||||
|
||||
+3
-3
@@ -58,10 +58,10 @@ static void process_cursor_resize(struct absinthe_server *server) {
|
||||
}
|
||||
|
||||
if (new_width > 0 && new_height > 0) {
|
||||
wlr_scene_node_set_position(&toplevel->scene_tree->node, new_x, new_y);
|
||||
absinthe_toplevel_set_size(toplevel, new_width, new_height);
|
||||
toplevel->geometry.x = new_x;
|
||||
toplevel->geometry.y = new_y;
|
||||
|
||||
absinthe_toplevel_update_border_geometry(toplevel);
|
||||
absinthe_toplevel_set_size(toplevel, new_width, new_height);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -98,7 +98,6 @@ int main(int argc, char **argv)
|
||||
|
||||
server.cursor_mgr = wlr_xcursor_manager_create(NULL, 24);
|
||||
|
||||
server.last_pointer_motion_time_msec = 0;
|
||||
server.cursor_mode = ABSINTHE_CURSOR_PASSTHROUGH;
|
||||
server.cursor_motion.notify = server_cursor_motion;
|
||||
wl_signal_add(&server.cursor->events.motion, &server.cursor_motion);
|
||||
|
||||
+6
-11
@@ -58,8 +58,9 @@ void server_new_xdg_toplevel(struct wl_listener *listener, void *data)
|
||||
struct absinthe_toplevel *toplevel = calloc(1, sizeof(*toplevel));
|
||||
toplevel->server = server;
|
||||
toplevel->xdg_toplevel = xdg_toplevel;
|
||||
toplevel->scene_tree = wlr_scene_xdg_surface_create(&toplevel->server->scene->tree, xdg_toplevel->base);
|
||||
toplevel->scene_tree = wlr_scene_tree_create(&toplevel->server->scene->tree);
|
||||
toplevel->scene_tree->node.data = toplevel;
|
||||
toplevel->scene_surface = wlr_scene_xdg_surface_create(toplevel->scene_tree, xdg_toplevel->base);
|
||||
toplevel->geometry.x = 0;
|
||||
toplevel->geometry.y = 0;
|
||||
toplevel->geometry.width = 100;
|
||||
@@ -124,22 +125,16 @@ void server_cursor_motion(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct absinthe_server *server = wl_container_of(listener, server, cursor_motion);
|
||||
struct wlr_pointer_motion_event *event = data;
|
||||
if (event->time_msec - server->last_pointer_motion_time_msec > 5) {
|
||||
wlr_cursor_move(server->cursor, &event->pointer->base, event->delta_x, event->delta_y);
|
||||
process_cursor_motion(server, event->time_msec);
|
||||
server->last_pointer_motion_time_msec = event->time_msec;
|
||||
}
|
||||
wlr_cursor_move(server->cursor, &event->pointer->base, event->delta_x, event->delta_y);
|
||||
process_cursor_motion(server, event->time_msec);
|
||||
}
|
||||
|
||||
void server_cursor_motion_absolute(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct absinthe_server *server = wl_container_of(listener, server, cursor_motion_absolute);
|
||||
struct wlr_pointer_motion_absolute_event *event = data;
|
||||
if (event->time_msec - server->last_pointer_motion_time_msec > 5) {
|
||||
wlr_cursor_warp_absolute(server->cursor, &event->pointer->base, event->x, event->y);
|
||||
process_cursor_motion(server, event->time_msec);
|
||||
server->last_pointer_motion_time_msec = event->time_msec;
|
||||
}
|
||||
wlr_cursor_warp_absolute(server->cursor, &event->pointer->base, event->x, event->y);
|
||||
process_cursor_motion(server, event->time_msec);
|
||||
}
|
||||
|
||||
void server_cursor_button(struct wl_listener *listener, void *data)
|
||||
|
||||
@@ -14,6 +14,10 @@ void xdg_decoration_destroy(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, decoration_destroy);
|
||||
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
wlr_scene_node_destroy(&toplevel->border[i]->node);
|
||||
}
|
||||
|
||||
wl_list_remove(&toplevel->decoration_request_mode.link);
|
||||
wl_list_remove(&toplevel->decoration_destroy.link);
|
||||
}
|
||||
|
||||
+21
-4
@@ -11,11 +11,16 @@ void xdg_toplevel_commit(struct wl_listener *listener, void *data)
|
||||
struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, commit);
|
||||
|
||||
if (toplevel->xdg_toplevel->base->initial_commit) {
|
||||
wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, 0, 0);
|
||||
int bw = ABSINTHE_BORDER_WIDTH;
|
||||
|
||||
wlr_xdg_toplevel_set_size(toplevel->xdg_toplevel, toplevel->geometry.width - 2 * bw, toplevel->geometry.height - 2 * bw);
|
||||
|
||||
if (toplevel->decoration) {
|
||||
xdg_decoration_request_mode(&toplevel->decoration_request_mode, toplevel->decoration);
|
||||
}
|
||||
} else {
|
||||
absinthe_toplevel_update_border_geometry(toplevel);
|
||||
absinthe_toplevel_set_position(toplevel, toplevel->geometry.x, toplevel->geometry.y);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +37,6 @@ void xdg_toplevel_map(struct wl_listener *listener, void *data)
|
||||
|
||||
absinthe_toplevel_set_border_color(toplevel, bordercolor);
|
||||
|
||||
|
||||
wl_list_insert(&toplevel->server->toplevels, &toplevel->link);
|
||||
}
|
||||
|
||||
@@ -59,8 +63,21 @@ void xdg_toplevel_destroy(struct wl_listener *listener, void *data)
|
||||
free(toplevel);
|
||||
}
|
||||
|
||||
void xdg_toplevel_request_move(struct wl_listener *listener, void *data) {}
|
||||
void xdg_toplevel_request_resize(struct wl_listener *listener, void *data) {}
|
||||
void xdg_toplevel_request_move(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, request_maximize);
|
||||
if (toplevel->xdg_toplevel->base->initialized) {
|
||||
wlr_xdg_surface_schedule_configure(toplevel->xdg_toplevel->base);
|
||||
}
|
||||
}
|
||||
|
||||
void xdg_toplevel_request_resize(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct absinthe_toplevel *toplevel = wl_container_of(listener, toplevel, request_maximize);
|
||||
if (toplevel->xdg_toplevel->base->initialized) {
|
||||
wlr_xdg_surface_schedule_configure(toplevel->xdg_toplevel->base);
|
||||
}
|
||||
}
|
||||
|
||||
void xdg_toplevel_request_maximize(struct wl_listener *listener, void *data)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user