diff options
author | Tony Crisci <tony@dubstepdish.com> | 2017-09-13 08:44:32 -0400 |
---|---|---|
committer | Tony Crisci <tony@dubstepdish.com> | 2017-09-13 08:44:32 -0400 |
commit | 353629b034654c686d0bf28c765a9e0160672310 (patch) | |
tree | 95d9ed1051063cb2f5b39edd2f3321626708b692 | |
parent | 2fd5c7999b1ecb93700ab6e61ae54f65e147518b (diff) |
xdg-surface geometry
-rw-r--r-- | include/wlr/types/wlr_xdg_shell_v6.h | 5 | ||||
-rw-r--r-- | types/wlr_xdg_shell_v6.c | 33 |
2 files changed, 36 insertions, 2 deletions
diff --git a/include/wlr/types/wlr_xdg_shell_v6.h b/include/wlr/types/wlr_xdg_shell_v6.h index a6e62628..0a060444 100644 --- a/include/wlr/types/wlr_xdg_shell_v6.h +++ b/include/wlr/types/wlr_xdg_shell_v6.h @@ -1,5 +1,6 @@ #ifndef _WLR_XDG_SHELL_V6_H #define _WLR_XDG_SHELL_V6_H +#include <wlr/types/wlr_box.h> #include <wayland-server.h> struct wlr_xdg_shell_v6 { @@ -25,6 +26,10 @@ struct wlr_xdg_surface_v6 { char *title; char *app_id; + bool has_next_geometry; + struct wlr_box *next_geometry; + struct wlr_box *geometry; + struct wl_listener surface_destroy_listener; struct wl_listener surface_commit_listener; diff --git a/types/wlr_xdg_shell_v6.c b/types/wlr_xdg_shell_v6.c index 3ed41ff3..487ede3d 100644 --- a/types/wlr_xdg_shell_v6.c +++ b/types/wlr_xdg_shell_v6.c @@ -127,6 +127,8 @@ static void xdg_surface_destroy(struct wlr_xdg_surface_v6 *surface) { wl_list_remove(&surface->link); wl_list_remove(&surface->surface_destroy_listener.link); wl_list_remove(&surface->surface_commit_listener.link); + free(surface->geometry); + free(surface->next_geometry); free(surface); } @@ -172,7 +174,12 @@ static void xdg_surface_ack_configure(struct wl_client *client, static void xdg_surface_set_window_geometry(struct wl_client *client, struct wl_resource *resource, int32_t x, int32_t y, int32_t width, int32_t height) { - wlr_log(L_DEBUG, "TODO xdg surface set window geometry"); + struct wlr_xdg_surface_v6 *surface = wl_resource_get_user_data(resource); + surface->has_next_geometry = true; + surface->next_geometry->height = height; + surface->next_geometry->width = width; + surface->next_geometry->x = x; + surface->next_geometry->y = y; } static const struct zxdg_surface_v6_interface zxdg_surface_v6_implementation = { @@ -197,7 +204,17 @@ static void handle_wlr_surface_destroyed(struct wl_listener *listener, static void handle_wlr_surface_committed(struct wl_listener *listener, void *data) { - wlr_log(L_DEBUG, "TODO: handle wlr surface committed"); + + struct wlr_xdg_surface_v6 *surface = + wl_container_of(listener, surface, surface_commit_listener); + + if (surface->has_next_geometry) { + surface->has_next_geometry = false; + surface->geometry->x = surface->next_geometry->x; + surface->geometry->y = surface->next_geometry->y; + surface->geometry->width = surface->next_geometry->width; + surface->geometry->height = surface->next_geometry->height; + } } static void xdg_shell_get_xdg_surface(struct wl_client *client, @@ -208,6 +225,18 @@ static void xdg_shell_get_xdg_surface(struct wl_client *client, if (!(surface = calloc(1, sizeof(struct wlr_xdg_surface_v6)))) { return; } + + if (!(surface->geometry = calloc(1, sizeof(struct wlr_box)))) { + free(surface); + return; + } + + if (!(surface->next_geometry = calloc(1, sizeof(struct wlr_box)))) { + free(surface->geometry); + free(surface); + return; + } + surface->role = WLR_XDG_SURFACE_V6_ROLE_NONE; surface->surface = wl_resource_get_user_data(_surface); surface->resource = wl_resource_create(client, |