Add struct view_impl

Support .configure
This commit is contained in:
Johan Malm 2020-09-02 20:20:52 +01:00
parent 8fb56a94ba
commit c56fe23b2e
4 changed files with 43 additions and 17 deletions

View file

@ -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 {
enum view_type type;
struct wl_list link;
struct server *server;
struct wlr_xdg_surface *xdg_surface;
struct wlr_xwayland_surface *xwayland_surface;
enum view_type type;
const struct view_impl *impl;
struct wl_list link;
union {
struct wlr_xdg_surface *xdg_surface;
struct wlr_xwayland_surface *xwayland_surface;
};
struct wlr_surface *surface;
bool mapped;

View file

@ -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)

View file

@ -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;

View file

@ -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;