diff options
Diffstat (limited to 'include/rootston')
-rw-r--r-- | include/rootston/desktop.h | 13 | ||||
-rw-r--r-- | include/rootston/view.h | 196 |
2 files changed, 108 insertions, 101 deletions
diff --git a/include/rootston/desktop.h b/include/rootston/desktop.h index d8fc53e2..81faba81 100644 --- a/include/rootston/desktop.h +++ b/include/rootston/desktop.h @@ -100,19 +100,6 @@ struct wlr_surface *desktop_surface_at(struct roots_desktop *desktop, double lx, double ly, double *sx, double *sy, struct roots_view **view); -struct roots_view *view_create(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); -void view_damage_whole(struct roots_view *view); -void view_update_position(struct roots_view *view, int x, int y); -void view_update_size(struct roots_view *view, int width, int height); -void view_update_decorated(struct roots_view *view, bool decorated); -void view_initial_focus(struct roots_view *view); -void view_map(struct roots_view *view, struct wlr_surface *surface); -void view_unmap(struct roots_view *view); -void view_arrange_maximized(struct roots_view *view); - void handle_xdg_shell_v6_surface(struct wl_listener *listener, void *data); void handle_xdg_shell_surface(struct wl_listener *listener, void *data); void handle_xdg_toplevel_decoration(struct wl_listener *listener, void *data); diff --git a/include/rootston/view.h b/include/rootston/view.h index 0174e4f3..f8a969c4 100644 --- a/include/rootston/view.h +++ b/include/rootston/view.h @@ -9,8 +9,77 @@ #include <wlr/types/wlr_xdg_shell_v6.h> #include <wlr/types/wlr_xdg_shell.h> +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,97 +159,22 @@ 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_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 roots_view_child; - 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; - - // TODO: this should follow the typical type/impl pattern we use elsewhere - 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_child_interface { + void (*destroy)(struct roots_view_child *child); }; struct roots_view_child { struct roots_view *view; + const struct roots_view_child_interface *impl; struct wlr_surface *wlr_surface; struct wl_list link; struct wl_listener commit; struct wl_listener new_subsurface; - - void (*destroy)(struct roots_view_child *child); }; struct roots_subsurface { @@ -219,6 +219,19 @@ struct roots_xdg_toplevel_decoration { struct wl_listener surface_commit; }; +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); +void view_damage_whole(struct roots_view *view); +void view_update_position(struct roots_view *view, int x, int y); +void view_update_size(struct roots_view *view, int width, int height); +void view_update_decorated(struct roots_view *view, bool decorated); +void view_initial_focus(struct roots_view *view); +void view_map(struct roots_view *view, struct wlr_surface *surface); +void view_unmap(struct roots_view *view); +void view_arrange_maximized(struct roots_view *view); void view_get_box(const struct roots_view *view, struct wlr_box *box); void view_activate(struct roots_view *view, bool active); void view_move(struct roots_view *view, double x, double y); @@ -234,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), @@ -252,9 +271,10 @@ enum roots_deco_part { enum roots_deco_part view_get_deco_part(struct roots_view *view, double sx, double sy); -void view_child_init(struct roots_view_child *child, struct roots_view *view, +void view_child_init(struct roots_view_child *child, + const struct roots_view_child_interface *impl, struct roots_view *view, struct wlr_surface *wlr_surface); -void view_child_finish(struct roots_view_child *child); +void view_child_destroy(struct roots_view_child *child); struct roots_subsurface *subsurface_create(struct roots_view *view, struct wlr_subsurface *wlr_subsurface); |