/* 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;
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)
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 =
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;
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 =
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;