From: Johan Malm Date: Wed, 2 Sep 2020 19:20:52 +0000 (+0100) Subject: Add struct view_impl X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=c56fe23b2ed10d828ae65be97d34ff992ee22400;p=proto%2Flabwc.git Add struct view_impl Support .configure --- diff --git a/include/labwc.h b/include/labwc.h index 4fa67c78..cbcabafd 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -104,12 +104,20 @@ enum deco_part { /* Keep LAB_DECO_NONE last as iteration end-marker */ }; +struct view_impl { + void (*configure)(struct view *view, struct wlr_box geo); +}; + struct view { + struct server *server; enum view_type type; + const struct view_impl *impl; struct wl_list link; - struct server *server; - struct wlr_xdg_surface *xdg_surface; - struct wlr_xwayland_surface *xwayland_surface; + + union { + struct wlr_xdg_surface *xdg_surface; + struct wlr_xwayland_surface *xwayland_surface; + }; struct wlr_surface *surface; bool mapped; diff --git a/src/view.c b/src/view.c index 5809b9ec..8974ad9e 100644 --- a/src/view.c +++ b/src/view.c @@ -73,19 +73,13 @@ struct wlr_box view_geometry(struct view *view) void view_resize(struct view *view, struct wlr_box geo) { struct wlr_box border = view_get_surface_geometry(view); - switch (view->type) { - case LAB_XDG_SHELL_VIEW: - wlr_xdg_toplevel_set_size(view->xdg_surface, - geo.width - 2 * border.x, - geo.height - 2 * border.y); - break; - case LAB_XWAYLAND_VIEW: - wlr_xwayland_surface_configure(view->xwayland_surface, view->x, - view->y, geo.width, geo.height); - break; - default: - break; - } + struct wlr_box box = { + .x = view->x, + .y = view->y, + .width = geo.width - 2 * border.x, + .height = geo.height - 2 * border.y, + }; + view->impl->configure(view, box); } static void move_to_front(struct view *view) diff --git a/src/xdg.c b/src/xdg.c index e728f038..5129c1a6 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -131,6 +131,16 @@ void xdg_toplevel_request_resize(struct wl_listener *listener, void *data) interactive_begin(view, LAB_CURSOR_RESIZE, event->edges); } +static void xdg_toplevel_view_configure(struct view *view, struct wlr_box geo) +{ + wlr_xdg_toplevel_set_size(view->xdg_surface, (uint32_t)geo.width, + (uint32_t)geo.height); +} + +static const struct view_impl xdg_toplevel_view_impl = { + .configure = xdg_toplevel_view_configure, +}; + void xdg_surface_new(struct wl_listener *listener, void *data) { struct server *server = @@ -143,6 +153,7 @@ void xdg_surface_new(struct wl_listener *listener, void *data) struct view *view = calloc(1, sizeof(struct view)); view->server = server; view->type = LAB_XDG_SHELL_VIEW; + view->impl = &xdg_toplevel_view_impl; view->xdg_surface = xdg_surface; view->map.notify = xdg_surface_map; diff --git a/src/xwl.c b/src/xwl.c index db950c38..91925446 100644 --- a/src/xwl.c +++ b/src/xwl.c @@ -80,6 +80,18 @@ void xwl_surface_configure(struct wl_listener *listener, void *data) event->y, event->width, event->height); } +static void xwl_view_configure(struct view *view, struct wlr_box geo) +{ + return wlr_xwayland_surface_configure(view->xwayland_surface, + (int16_t)geo.x, (int16_t)geo.y, + (uint16_t)geo.width, + (uint16_t)geo.height); +} + +static const struct view_impl xwl_view_impl = { + .configure = xwl_view_configure, +}; + void xwl_surface_new(struct wl_listener *listener, void *data) { struct server *server = @@ -90,6 +102,7 @@ void xwl_surface_new(struct wl_listener *listener, void *data) struct view *view = calloc(1, sizeof(struct view)); view->server = server; view->type = LAB_XWAYLAND_VIEW; + view->impl = &xwl_view_impl; view->xwayland_surface = xwayland_surface; view->map.notify = xwl_surface_map;