From 9adcbabea47fbd0502673d410eb718ee3401f3b1 Mon Sep 17 00:00:00 2001 From: emersion Date: Sat, 23 Feb 2019 15:24:28 +0100 Subject: rootston: make roots_view embedded and remove unions --- include/rootston/view.h | 183 ++++++++++++++++++++++++------------------------ 1 file changed, 90 insertions(+), 93 deletions(-) (limited to 'include/rootston/view.h') diff --git a/include/rootston/view.h b/include/rootston/view.h index ce8f4268..f8a969c4 100644 --- a/include/rootston/view.h +++ b/include/rootston/view.h @@ -9,8 +9,77 @@ #include #include +struct roots_view; + +struct roots_view_interface { + void (*activate)(struct roots_view *view, bool active); + void (*move)(struct roots_view *view, double x, double y); + void (*resize)(struct roots_view *view, uint32_t width, uint32_t height); + void (*move_resize)(struct roots_view *view, double x, double y, + uint32_t width, uint32_t height); + void (*maximize)(struct roots_view *view, bool maximized); + void (*set_fullscreen)(struct roots_view *view, bool fullscreen); + void (*close)(struct roots_view *view); + void (*destroy)(struct roots_view *view); +}; + +enum roots_view_type { + ROOTS_WL_SHELL_VIEW, + ROOTS_XDG_SHELL_V6_VIEW, + ROOTS_XDG_SHELL_VIEW, +#if WLR_HAS_XWAYLAND + ROOTS_XWAYLAND_VIEW, +#endif +}; + +struct roots_view { + enum roots_view_type type; + const struct roots_view_interface *impl; + struct roots_desktop *desktop; + struct wl_list link; // roots_desktop::views + + struct wlr_box box; + float rotation; + float alpha; + + bool decorated; + int border_width; + int titlebar_height; + + bool maximized; + struct roots_output *fullscreen_output; + struct { + double x, y; + uint32_t width, height; + float rotation; + } saved; + + struct { + bool update_x, update_y; + double x, y; + uint32_t width, height; + } pending_move_resize; + + struct wlr_surface *wlr_surface; + struct wl_list children; // roots_view_child::link + + struct wlr_foreign_toplevel_handle_v1 *toplevel_handle; + struct wl_listener toplevel_handle_request_maximize; + struct wl_listener toplevel_handle_request_activate; + struct wl_listener toplevel_handle_request_close; + + struct wl_listener new_subsurface; + + struct { + struct wl_signal unmap; + struct wl_signal destroy; + } events; +}; + struct roots_wl_shell_surface { - struct roots_view *view; + struct roots_view view; + + struct wlr_wl_shell_surface *wl_shell_surface; struct wl_listener destroy; struct wl_listener new_popup; @@ -26,7 +95,9 @@ struct roots_wl_shell_surface { }; struct roots_xdg_surface_v6 { - struct roots_view *view; + struct roots_view view; + + struct wlr_xdg_surface_v6 *xdg_surface_v6; struct wl_listener destroy; struct wl_listener new_popup; @@ -47,7 +118,9 @@ struct roots_xdg_surface_v6 { struct roots_xdg_toplevel_decoration; struct roots_xdg_surface { - struct roots_view *view; + struct roots_view view; + + struct wlr_xdg_surface *xdg_surface; struct wl_listener destroy; struct wl_listener new_popup; @@ -60,7 +133,6 @@ struct roots_xdg_surface { struct wl_listener set_title; struct wl_listener set_app_id; - struct wl_listener surface_commit; uint32_t pending_move_resize_configure_serial; @@ -68,8 +140,11 @@ struct roots_xdg_surface { struct roots_xdg_toplevel_decoration *xdg_toplevel_decoration; }; +#if WLR_HAS_XWAYLAND struct roots_xwayland_surface { - struct roots_view *view; + struct roots_view view; + + struct wlr_xwayland_surface *xwayland_surface; struct wl_listener destroy; struct wl_listener request_configure; @@ -84,91 +159,7 @@ struct roots_xwayland_surface { struct wl_listener surface_commit; }; - -enum roots_view_type { - ROOTS_WL_SHELL_VIEW, - ROOTS_XDG_SHELL_V6_VIEW, - ROOTS_XDG_SHELL_VIEW, -#if WLR_HAS_XWAYLAND - ROOTS_XWAYLAND_VIEW, #endif -}; - -struct roots_view; - -struct roots_view_interface { - void (*activate)(struct roots_view *view, bool active); - void (*move)(struct roots_view *view, double x, double y); - void (*resize)(struct roots_view *view, uint32_t width, uint32_t height); - void (*move_resize)(struct roots_view *view, double x, double y, - uint32_t width, uint32_t height); - void (*maximize)(struct roots_view *view, bool maximized); - void (*set_fullscreen)(struct roots_view *view, bool fullscreen); - void (*close)(struct roots_view *view); - void (*destroy)(struct roots_view *view); -}; - -struct roots_view { - const struct roots_view_interface *impl; - struct roots_desktop *desktop; - struct wl_list link; // roots_desktop::views - - struct wlr_box box; - float rotation; - float alpha; - - bool decorated; - int border_width; - int titlebar_height; - - bool maximized; - struct roots_output *fullscreen_output; - struct { - double x, y; - uint32_t width, height; - float rotation; - } saved; - - struct { - bool update_x, update_y; - double x, y; - uint32_t width, height; - } pending_move_resize; - - // TODO: Something for roots-enforced width/height - enum roots_view_type type; - union { - struct wlr_wl_shell_surface *wl_shell_surface; - struct wlr_xdg_surface_v6 *xdg_surface_v6; - struct wlr_xdg_surface *xdg_surface; -#if WLR_HAS_XWAYLAND - struct wlr_xwayland_surface *xwayland_surface; -#endif - }; - union { - struct roots_wl_shell_surface *roots_wl_shell_surface; - struct roots_xdg_surface_v6 *roots_xdg_surface_v6; - struct roots_xdg_surface *roots_xdg_surface; -#if WLR_HAS_XWAYLAND - struct roots_xwayland_surface *roots_xwayland_surface; -#endif - }; - - struct wlr_surface *wlr_surface; - struct wl_list children; // roots_view_child::link - - struct wlr_foreign_toplevel_handle_v1 *toplevel_handle; - struct wl_listener toplevel_handle_request_maximize; - struct wl_listener toplevel_handle_request_activate; - struct wl_listener toplevel_handle_request_close; - - struct wl_listener new_subsurface; - - struct { - struct wl_signal unmap; - struct wl_signal destroy; - } events; -}; struct roots_view_child; @@ -228,8 +219,8 @@ struct roots_xdg_toplevel_decoration { struct wl_listener surface_commit; }; -struct roots_view *view_create(struct roots_desktop *desktop, - const struct roots_view_interface *impl); +void view_init(struct roots_view *view, const struct roots_view_interface *impl, + enum roots_view_type type, struct roots_desktop *desktop); void view_destroy(struct roots_view *view); void view_activate(struct roots_view *view, bool activate); void view_apply_damage(struct roots_view *view); @@ -256,13 +247,19 @@ void view_close(struct roots_view *view); bool view_center(struct roots_view *view); void view_setup(struct roots_view *view); void view_teardown(struct roots_view *view); - void view_set_title(struct roots_view *view, const char *title); void view_set_app_id(struct roots_view *view, const char *app_id); void view_create_foreign_toplevel_handle(struct roots_view *view); - void view_get_deco_box(const struct roots_view *view, struct wlr_box *box); +struct roots_wl_shell_surface *roots_wl_shell_surface_from_view( + struct roots_view *view); +struct roots_xdg_surface *roots_xdg_surface_from_view(struct roots_view *view); +struct roots_xdg_surface_v6 *roots_xdg_surface_v6_from_view( + struct roots_view *view); +struct roots_xwayland_surface *roots_xwayland_surface_from_view( + struct roots_view *view); + enum roots_deco_part { ROOTS_DECO_PART_NONE = 0, ROOTS_DECO_PART_TOP_BORDER = (1 << 0), -- cgit v1.2.3