aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/render/gles2.h1
-rw-r--r--include/rootston/desktop.h5
-rw-r--r--include/rootston/layers.h25
-rw-r--r--include/rootston/output.h8
-rw-r--r--include/rootston/view.h5
-rw-r--r--include/wlr/render/egl.h4
-rw-r--r--include/wlr/types/wlr_cursor.h25
-rw-r--r--include/wlr/types/wlr_layer_shell.h100
-rw-r--r--include/wlr/types/wlr_xdg_shell.h30
-rw-r--r--include/wlr/types/wlr_xdg_shell_v6.h30
-rw-r--r--include/xwayland/xwm.h1
11 files changed, 207 insertions, 27 deletions
diff --git a/include/render/gles2.h b/include/render/gles2.h
index 09295415..32cb3221 100644
--- a/include/render/gles2.h
+++ b/include/render/gles2.h
@@ -28,6 +28,7 @@ struct wlr_gles2_renderer {
struct wlr_renderer wlr_renderer;
struct wlr_egl *egl;
+ const char *exts_str;
struct {
GLuint quad;
diff --git a/include/rootston/desktop.h b/include/rootston/desktop.h
index 5986c96f..5714aa0a 100644
--- a/include/rootston/desktop.h
+++ b/include/rootston/desktop.h
@@ -7,6 +7,7 @@
#include <wlr/types/wlr_compositor.h>
#include <wlr/types/wlr_gamma_control.h>
#include <wlr/types/wlr_idle.h>
+#include <wlr/types/wlr_layer_shell.h>
#include <wlr/types/wlr_linux_dmabuf.h>
#include <wlr/types/wlr_list.h>
#include <wlr/types/wlr_output_layout.h>
@@ -48,12 +49,14 @@ struct roots_desktop {
struct wlr_idle *idle;
struct wlr_idle_inhibit_manager_v1 *idle_inhibit;
struct wlr_linux_dmabuf *linux_dmabuf;
+ struct wlr_layer_shell *layer_shell;
struct wl_listener new_output;
struct wl_listener layout_change;
struct wl_listener xdg_shell_v6_surface;
struct wl_listener xdg_shell_surface;
struct wl_listener wl_shell_surface;
+ struct wl_listener layer_shell_surface;
struct wl_listener decoration_new;
#ifdef WLR_HAS_XWAYLAND
@@ -83,10 +86,12 @@ void view_update_size(struct roots_view *view, uint32_t width, uint32_t height);
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_wl_shell_surface(struct wl_listener *listener, void *data);
+void handle_layer_shell_surface(struct wl_listener *listener, void *data);
void handle_xwayland_surface(struct wl_listener *listener, void *data);
#endif
diff --git a/include/rootston/layers.h b/include/rootston/layers.h
new file mode 100644
index 00000000..35f5399e
--- /dev/null
+++ b/include/rootston/layers.h
@@ -0,0 +1,25 @@
+#ifndef ROOTSTON_LAYERS_H
+#define ROOTSTON_LAYERS_H
+#include <stdbool.h>
+#include <wlr/config.h>
+#include <wlr/types/wlr_box.h>
+#include <wlr/types/wlr_surface.h>
+#include <wlr/types/wlr_layer_shell.h>
+
+struct roots_layer_surface {
+ struct wlr_layer_surface *layer_surface;
+ struct wl_list link;
+
+ struct wl_listener destroy;
+ struct wl_listener map;
+ struct wl_listener unmap;
+ struct wl_listener surface_commit;
+ struct wl_listener output_destroy;
+ struct wl_listener output_mode;
+ struct wl_listener output_transform;
+
+ bool configured;
+ struct wlr_box geo;
+};
+
+#endif
diff --git a/include/rootston/output.h b/include/rootston/output.h
index a852a204..e40ad776 100644
--- a/include/rootston/output.h
+++ b/include/rootston/output.h
@@ -4,6 +4,7 @@
#include <pixman.h>
#include <time.h>
#include <wayland-server.h>
+#include <wlr/types/wlr_box.h>
#include <wlr/types/wlr_output_damage.h>
struct roots_desktop;
@@ -14,10 +15,13 @@ struct roots_output {
struct wl_list link; // roots_desktop:outputs
struct roots_view *fullscreen_view;
+ struct wl_list layers[4]; // layer_surface::link
struct timespec last_frame;
struct wlr_output_damage *damage;
+ struct wlr_box usable_area;
+
struct wl_listener destroy;
struct wl_listener damage_frame;
struct wl_listener damage_destroy;
@@ -35,5 +39,9 @@ void output_damage_from_view(struct roots_output *output,
struct roots_view *view);
void output_damage_whole_drag_icon(struct roots_output *output,
struct roots_drag_icon *icon);
+void output_damage_from_local_surface(struct roots_output *output,
+ struct wlr_surface *surface, double ox, double oy, float rotation);
+void output_damage_whole_local_surface(struct roots_output *output,
+ struct wlr_surface *surface, double ox, double oy, float rotation);
#endif
diff --git a/include/rootston/view.h b/include/rootston/view.h
index 775f3d11..6e746e8c 100644
--- a/include/rootston/view.h
+++ b/include/rootston/view.h
@@ -1,6 +1,5 @@
#ifndef ROOTSTON_VIEW_H
#define ROOTSTON_VIEW_H
-
#include <stdbool.h>
#include <wlr/config.h>
#include <wlr/types/wlr_box.h>
@@ -177,6 +176,8 @@ struct roots_xdg_popup_v6 {
struct roots_view_child view_child;
struct wlr_xdg_popup_v6 *wlr_popup;
struct wl_listener destroy;
+ struct wl_listener map;
+ struct wl_listener unmap;
struct wl_listener new_popup;
};
@@ -184,6 +185,8 @@ struct roots_xdg_popup {
struct roots_view_child view_child;
struct wlr_xdg_popup *wlr_popup;
struct wl_listener destroy;
+ struct wl_listener map;
+ struct wl_listener unmap;
struct wl_listener new_popup;
};
diff --git a/include/wlr/render/egl.h b/include/wlr/render/egl.h
index c214f127..20127e38 100644
--- a/include/wlr/render/egl.h
+++ b/include/wlr/render/egl.h
@@ -13,14 +13,14 @@ struct wlr_egl {
EGLConfig config;
EGLContext context;
- const char *egl_exts_str;
- const char *gl_exts_str;
+ const char *exts_str;
struct {
bool buffer_age;
bool swap_buffers_with_damage;
bool dmabuf_import;
bool dmabuf_import_modifiers;
+ bool bind_wayland_display;
} egl_exts;
struct wl_display *wl_display;
diff --git a/include/wlr/types/wlr_cursor.h b/include/wlr/types/wlr_cursor.h
index da010972..70dca9f7 100644
--- a/include/wlr/types/wlr_cursor.h
+++ b/include/wlr/types/wlr_cursor.h
@@ -7,12 +7,37 @@
#include <wlr/types/wlr_output_layout.h>
#include <wlr/types/wlr_output.h>
+/**
+ * wlr_cursor implements the behavior of the "cursor", that is, the image on the
+ * screen typically moved about with a mouse or so. It provides tracking for
+ * this in global coordinates, and integrates with wlr_output,
+ * wlr_output_layout, and wlr_input_device. You can use it to abstract multiple
+ * input devices over a single cursor, constrain cursor movement to the usable
+ * area of a wlr_output_layout and communicate position updates to the hardware
+ * cursor, constrain specific input devices to specific outputs or regions of
+ * the screen, and so on.
+ */
+
struct wlr_cursor_state;
struct wlr_cursor {
struct wlr_cursor_state *state;
double x, y;
+ /**
+ * The interpretation of these signals is the responsibility of the
+ * compositor, but some helpers are provided for your benefit. If you
+ * receive a relative motion event, for example, you may want to call
+ * wlr_cursor_move. If you receive an absolute event, call
+ * wlr_cursor_warp_absolute. If you pass an input device into these
+ * functions, it will apply the region/output constraints associated with
+ * that device to the resulting cursor motion. If an output layout is
+ * attached, these functions will constrain the resulting cursor motion to
+ * within the usable space of the output layout.
+ *
+ * Re-broadcasting these signals to, for example, a wlr_seat, is also your
+ * responsibility.
+ */
struct {
struct wl_signal motion;
struct wl_signal motion_absolute;
diff --git a/include/wlr/types/wlr_layer_shell.h b/include/wlr/types/wlr_layer_shell.h
new file mode 100644
index 00000000..8cc7782f
--- /dev/null
+++ b/include/wlr/types/wlr_layer_shell.h
@@ -0,0 +1,100 @@
+#ifndef WLR_TYPES_WLR_LAYER_SHELL_H
+#define WLR_TYPES_WLR_LAYER_SHELL_H
+#include <stdbool.h>
+#include <stdint.h>
+#include <wayland-server.h>
+#include <wlr/types/wlr_box.h>
+#include <wlr/types/wlr_surface.h>
+#include "wlr-layer-shell-unstable-v1-protocol.h"
+
+/**
+ * wlr_layer_shell allows clients to arrange themselves in "layers" on the
+ * desktop in accordance with the wlr-layer-shell protocol. When a client is
+ * added, the new_surface signal will be raised and passed a reference to our
+ * wlr_layer_surface. At this time, the client will have configured the surface
+ * as it desires, including information like desired anchors and margins. The
+ * compositor should use this information to decide how to arrange the layer
+ * on-screen, then determine the dimensions of the layer and call
+ * wlr_layer_surface_configure. The client will then attach a buffer and commit
+ * the surface, at which point the wlr_layer_surface map signal is raised and
+ * the compositor should begin rendering the surface.
+ */
+struct wlr_layer_shell {
+ struct wl_global *wl_global;
+ struct wl_list client_resources; // wl_resource
+
+ struct wl_listener display_destroy;
+
+ struct {
+ struct wl_signal new_surface;
+ } events;
+
+ void *data;
+};
+
+struct wlr_layer_surface_state {
+ uint32_t anchor;
+ int32_t exclusive_zone;
+ struct {
+ uint32_t top, right, bottom, left;
+ } margin;
+ bool keyboard_interactive;
+ uint32_t desired_width, desired_height;
+ uint32_t actual_width, actual_height;
+};
+
+struct wlr_layer_surface_configure {
+ struct wl_list link; // wlr_layer_surface::configure_list
+ uint32_t serial;
+ struct wlr_layer_surface_state state;
+};
+
+struct wlr_layer_surface {
+ struct wlr_surface *surface;
+ struct wlr_output *output;
+ struct wl_resource *resource;
+ struct wlr_layer_shell *shell;
+
+ const char *namespace;
+ enum zwlr_layer_shell_v1_layer layer;
+
+ bool added, configured, mapped, closed;
+ uint32_t configure_serial;
+ struct wl_event_source *configure_idle;
+ uint32_t configure_next_serial;
+ struct wl_list configure_list;
+
+ struct wlr_layer_surface_configure *acked_configure;
+
+ struct wlr_layer_surface_state client_pending;
+ struct wlr_layer_surface_state server_pending;
+ struct wlr_layer_surface_state current;
+
+ struct wl_listener surface_destroy_listener;
+
+ struct {
+ struct wl_signal destroy;
+ struct wl_signal map;
+ struct wl_signal unmap;
+ } events;
+
+ void *data;
+};
+
+struct wlr_layer_shell *wlr_layer_shell_create(struct wl_display *display);
+void wlr_layer_shell_destroy(struct wlr_layer_shell *layer_shell);
+
+/**
+ * Notifies the layer surface to configure itself with this width/height. The
+ * layer_surface will signal its map event when the surface is ready to assume
+ * this size.
+ */
+void wlr_layer_surface_configure(struct wlr_layer_surface *surface,
+ uint32_t width, uint32_t height);
+
+/**
+ * Unmaps this layer surface and notifies the client that it has been closed.
+ */
+void wlr_layer_surface_close(struct wlr_layer_surface *surface);
+
+#endif
diff --git a/include/wlr/types/wlr_xdg_shell.h b/include/wlr/types/wlr_xdg_shell.h
index 410663f7..9938f4b1 100644
--- a/include/wlr/types/wlr_xdg_shell.h
+++ b/include/wlr/types/wlr_xdg_shell.h
@@ -40,6 +40,9 @@ struct wlr_xdg_popup {
bool committed;
struct wlr_xdg_surface *parent;
struct wlr_seat *seat;
+
+ // Position of the popup relative to the upper left corner of the window
+ // geometry of the parent surface
struct wlr_box geometry;
struct wl_list grab_link; // wlr_xdg_popup_grab::popups
@@ -74,9 +77,22 @@ struct wlr_xdg_toplevel {
struct wlr_xdg_surface *base;
struct wlr_xdg_surface *parent;
bool added;
- struct wlr_xdg_toplevel_state next; // client protocol requests
- struct wlr_xdg_toplevel_state pending; // user configure requests
+
+ struct wlr_xdg_toplevel_state client_pending;
+ struct wlr_xdg_toplevel_state server_pending;
struct wlr_xdg_toplevel_state current;
+
+ char *title;
+ char *app_id;
+
+ struct {
+ struct wl_signal request_maximize;
+ struct wl_signal request_fullscreen;
+ struct wl_signal request_minimize;
+ struct wl_signal request_move;
+ struct wl_signal request_resize;
+ struct wl_signal request_show_window_menu;
+ } events;
};
struct wlr_xdg_surface_configure {
@@ -106,9 +122,6 @@ struct wlr_xdg_surface {
uint32_t configure_next_serial;
struct wl_list configure_list;
- char *title;
- char *app_id;
-
bool has_next_geometry;
struct wlr_box next_geometry;
struct wlr_box geometry;
@@ -121,13 +134,6 @@ struct wlr_xdg_surface {
struct wl_signal new_popup;
struct wl_signal map;
struct wl_signal unmap;
-
- struct wl_signal request_maximize;
- struct wl_signal request_fullscreen;
- struct wl_signal request_minimize;
- struct wl_signal request_move;
- struct wl_signal request_resize;
- struct wl_signal request_show_window_menu;
} events;
void *data;
diff --git a/include/wlr/types/wlr_xdg_shell_v6.h b/include/wlr/types/wlr_xdg_shell_v6.h
index 3bfb97a4..0867b2f6 100644
--- a/include/wlr/types/wlr_xdg_shell_v6.h
+++ b/include/wlr/types/wlr_xdg_shell_v6.h
@@ -40,6 +40,9 @@ struct wlr_xdg_popup_v6 {
bool committed;
struct wlr_xdg_surface_v6 *parent;
struct wlr_seat *seat;
+
+ // Position of the popup relative to the upper left corner of the window
+ // geometry of the parent surface
struct wlr_box geometry;
struct wl_list grab_link; // wlr_xdg_popup_grab_v6::popups
@@ -74,9 +77,22 @@ struct wlr_xdg_toplevel_v6 {
struct wlr_xdg_surface_v6 *base;
struct wlr_xdg_surface_v6 *parent;
bool added;
- struct wlr_xdg_toplevel_v6_state next; // client protocol requests
- struct wlr_xdg_toplevel_v6_state pending; // user configure requests
+
+ struct wlr_xdg_toplevel_v6_state client_pending;
+ struct wlr_xdg_toplevel_v6_state server_pending;
struct wlr_xdg_toplevel_v6_state current;
+
+ char *title;
+ char *app_id;
+
+ struct {
+ struct wl_signal request_maximize;
+ struct wl_signal request_fullscreen;
+ struct wl_signal request_minimize;
+ struct wl_signal request_move;
+ struct wl_signal request_resize;
+ struct wl_signal request_show_window_menu;
+ } events;
};
struct wlr_xdg_surface_v6_configure {
@@ -106,9 +122,6 @@ struct wlr_xdg_surface_v6 {
uint32_t configure_next_serial;
struct wl_list configure_list;
- char *title;
- char *app_id;
-
bool has_next_geometry;
struct wlr_box next_geometry;
struct wlr_box geometry;
@@ -121,13 +134,6 @@ struct wlr_xdg_surface_v6 {
struct wl_signal new_popup;
struct wl_signal map;
struct wl_signal unmap;
-
- struct wl_signal request_maximize;
- struct wl_signal request_fullscreen;
- struct wl_signal request_minimize;
- struct wl_signal request_move;
- struct wl_signal request_resize;
- struct wl_signal request_show_window_menu;
} events;
void *data;
diff --git a/include/xwayland/xwm.h b/include/xwayland/xwm.h
index 4b15cc84..9e21ea3a 100644
--- a/include/xwayland/xwm.h
+++ b/include/xwayland/xwm.h
@@ -2,6 +2,7 @@
#define XWAYLAND_XWM_H
#include <wayland-server-core.h>
+#include <wlr/config.h>
#include <wlr/xwayland.h>
#include <xcb/render.h>