aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/rootston/desktop.h13
-rw-r--r--include/rootston/view.h196
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);