feat: add support layershell protocol
This commit is contained in:
234
diyac.h
234
diyac.h
@ -4,116 +4,194 @@
|
||||
#include <wlr/backend.h>
|
||||
#include <wlr/types/wlr_xdg_shell.h>
|
||||
#include <wlr/types/wlr_layer_shell_v1.h>
|
||||
#include <wlr/types/wlr_scene.h>
|
||||
#include <wlr/types/wlr_cursor.h>
|
||||
#include <wlr/types/wlr_xcursor_manager.h>
|
||||
#include <wlr/render/allocator.h>
|
||||
#include <wlr/types/wlr_compositor.h>
|
||||
#include <wlr/types/wlr_subcompositor.h>
|
||||
#include <wlr/types/wlr_data_device.h>
|
||||
#include <wlr/types/wlr_output_layout.h>
|
||||
|
||||
#define LAYER_TREE_SZ 4
|
||||
/* For brevity's sake, struct members are annotated where they are used. */
|
||||
enum diyac_cursor_mode
|
||||
{
|
||||
DIYAC_CURSOR_PASSTHROUGH,
|
||||
DIYAC_CURSOR_MOVE,
|
||||
DIYAC_CURSOR_RESIZE,
|
||||
DIYAC_CURSOR_PASSTHROUGH,
|
||||
DIYAC_CURSOR_MOVE,
|
||||
DIYAC_CURSOR_RESIZE,
|
||||
};
|
||||
|
||||
struct diyac_seat {
|
||||
struct wlr_seat* wlr_seat;
|
||||
struct diyac_server *server;
|
||||
enum diyac_node_descriptor_type
|
||||
{
|
||||
DIYAC_NODE_NONE = 0,
|
||||
DIYAC_NODE_VIEW,
|
||||
DIYAC_NODE_XDG_POPUP,
|
||||
DIYAC_NODE_LAYER_SURFACE,
|
||||
DIYAC_NODE_LAYER_POPUP,
|
||||
DIYAC_NODE_TREE,
|
||||
// DIYAC_NODE_MENUITEM,
|
||||
// LAB_NODE_TREE,
|
||||
// LAB_NODE_SSD_BUTTON,
|
||||
};
|
||||
enum diyac_view_state
|
||||
{
|
||||
DIYAC_VIEW_NORMAL = 0,
|
||||
DIYAC_VIEW_MAXIMIZE,
|
||||
DIYAC_VIEW_MINIMIZE,
|
||||
DIYAC_VIEW_FULL_SCREEN,
|
||||
};
|
||||
|
||||
struct wlr_cursor *cursor;
|
||||
enum diyac_cursor_mode cursor_mode;
|
||||
struct wlr_xcursor_manager *cursor_mgr;
|
||||
struct wl_listener cursor_motion;
|
||||
struct wl_listener cursor_motion_absolute;
|
||||
struct wl_listener cursor_button;
|
||||
struct wl_listener cursor_axis;
|
||||
struct wl_listener cursor_frame;
|
||||
struct diyac_seat
|
||||
{
|
||||
struct wlr_seat *wlr_seat;
|
||||
struct diyac_server *server;
|
||||
|
||||
struct wl_listener new_input;
|
||||
struct wl_listener request_cursor;
|
||||
struct wl_listener request_set_selection;
|
||||
struct wl_list keyboards;
|
||||
struct wlr_cursor *cursor;
|
||||
enum diyac_cursor_mode cursor_mode;
|
||||
struct wlr_xcursor_manager *cursor_mgr;
|
||||
|
||||
struct wlr_layer_surface_v1 *focused_layer;
|
||||
|
||||
struct wl_listener cursor_motion;
|
||||
struct wl_listener cursor_motion_absolute;
|
||||
struct wl_listener cursor_button;
|
||||
struct wl_listener cursor_axis;
|
||||
struct wl_listener cursor_frame;
|
||||
struct wl_listener new_input;
|
||||
struct wl_listener request_cursor;
|
||||
struct wl_listener request_set_selection;
|
||||
struct wl_list keyboards;
|
||||
};
|
||||
|
||||
struct diyac_popup
|
||||
{
|
||||
struct wlr_xdg_popup *wlr_popup;
|
||||
struct wlr_scene_tree *scene_tree;
|
||||
struct wl_listener commit;
|
||||
struct wl_listener destroy;
|
||||
struct wl_listener new_popup;
|
||||
struct wlr_box output_toplevel_sx_box;
|
||||
void *parent;
|
||||
};
|
||||
|
||||
struct diyac_layer_scenes
|
||||
{
|
||||
struct wlr_scene_tree *background;
|
||||
struct wlr_scene_tree *bottom;
|
||||
struct wlr_scene_tree *top;
|
||||
struct wlr_scene_tree *overlay;
|
||||
struct wlr_scene_tree *popup;
|
||||
struct wlr_scene_tree *session;
|
||||
};
|
||||
|
||||
struct diyac_node_descriptor
|
||||
{
|
||||
enum diyac_node_descriptor_type type;
|
||||
void *data;
|
||||
struct wl_listener destroy;
|
||||
};
|
||||
|
||||
struct diyac_server
|
||||
{
|
||||
struct wl_display *wl_display;
|
||||
struct wlr_backend *backend;
|
||||
struct wlr_renderer *renderer;
|
||||
struct wlr_allocator *allocator;
|
||||
struct wlr_scene *scene;
|
||||
struct wlr_scene_output_layout *scene_layout;
|
||||
struct wl_display *wl_display;
|
||||
struct wlr_backend *backend;
|
||||
struct wlr_renderer *renderer;
|
||||
struct wlr_allocator *allocator;
|
||||
struct wlr_scene *scene;
|
||||
struct wlr_scene_output_layout *scene_layout;
|
||||
|
||||
struct wlr_xdg_shell *xdg_shell;
|
||||
struct wlr_layer_shell_v1 *layer_shell;
|
||||
struct wl_listener new_xdg_surface;
|
||||
struct wl_listener new_layer_surface;
|
||||
struct wl_list toplevels;
|
||||
struct wlr_xdg_shell *xdg_shell;
|
||||
struct wlr_layer_shell_v1 *layer_shell;
|
||||
struct wl_listener new_xdg_surface;
|
||||
struct wl_listener new_layer_surface;
|
||||
struct wl_list views;
|
||||
/*
|
||||
* Popups need to be rendered above always-on-top views, so we reparent
|
||||
* them to this dedicated tree
|
||||
*/
|
||||
struct wlr_scene_tree *xdg_popup_tree;
|
||||
struct wlr_scene_tree *view_tree;
|
||||
|
||||
struct diyac_seat seat;
|
||||
struct diyac_seat seat;
|
||||
|
||||
struct diyac_toplevel *grabbed_toplevel;
|
||||
double grab_x, grab_y;
|
||||
struct wlr_box grab_geobox;
|
||||
uint32_t resize_edges;
|
||||
struct diyac_view *grabbed_view;
|
||||
double grab_x, grab_y;
|
||||
struct wlr_box grab_geobox;
|
||||
uint32_t resize_edges;
|
||||
|
||||
struct wlr_output_layout *output_layout;
|
||||
struct wl_list outputs;
|
||||
struct wl_listener new_output;
|
||||
struct wlr_output_layout *output_layout;
|
||||
struct wl_list outputs;
|
||||
struct wl_listener new_output;
|
||||
};
|
||||
|
||||
struct diyac_layer_surface
|
||||
{
|
||||
struct wlr_scene_layer_surface_v1 *scene_layer_surface;
|
||||
struct diyac_server *server;
|
||||
bool mapped;
|
||||
struct wl_listener map;
|
||||
struct wl_listener unmap;
|
||||
struct wl_listener surface_commit;
|
||||
struct wl_listener output_destroy;
|
||||
struct wl_listener node_destroy;
|
||||
struct wl_listener new_popup;
|
||||
struct wlr_scene_layer_surface_v1 *scene_layer_surface;
|
||||
struct diyac_server *server;
|
||||
bool mapped;
|
||||
struct wl_listener map;
|
||||
struct wl_listener unmap;
|
||||
struct wl_listener surface_commit;
|
||||
struct wl_listener output_destroy;
|
||||
struct wl_listener node_destroy;
|
||||
struct wl_listener new_popup;
|
||||
};
|
||||
|
||||
struct diyac_output
|
||||
{
|
||||
struct wl_list link;
|
||||
struct diyac_server *server;
|
||||
struct wlr_output *wlr_output;
|
||||
struct wl_listener frame;
|
||||
struct wl_listener request_state;
|
||||
struct wl_listener destroy;
|
||||
struct wl_list link;
|
||||
struct diyac_server *server;
|
||||
struct wlr_output *wlr_output;
|
||||
struct wl_listener frame;
|
||||
struct wl_listener request_state;
|
||||
struct wl_listener destroy;
|
||||
struct wlr_box usable_area;
|
||||
|
||||
// layer output
|
||||
struct wlr_scene_tree *layer_tree[4];
|
||||
// layer output
|
||||
struct diyac_layer_scenes scenes;
|
||||
// alias to diyac_layer_scenes elements
|
||||
struct wlr_scene_tree *layer_tree[LAYER_TREE_SZ];
|
||||
};
|
||||
|
||||
struct diyac_toplevel
|
||||
struct diyac_view
|
||||
{
|
||||
struct wl_list link;
|
||||
struct diyac_server *server;
|
||||
struct wlr_xdg_toplevel *xdg_toplevel;
|
||||
struct wlr_scene_tree *scene_tree;
|
||||
struct wlr_output *output;
|
||||
struct wl_listener map;
|
||||
struct wl_listener unmap;
|
||||
struct wl_listener destroy;
|
||||
struct wl_listener request_move;
|
||||
struct wl_listener request_resize;
|
||||
struct wl_listener request_maximize;
|
||||
struct wl_listener request_fullscreen;
|
||||
struct wl_list link;
|
||||
struct diyac_server *server;
|
||||
struct wlr_xdg_surface *xdg_surface;
|
||||
struct wlr_xdg_toplevel *xdg_toplevel;
|
||||
struct wlr_scene_tree *scene_tree;
|
||||
enum diyac_view_state state;
|
||||
/*
|
||||
* Geometry of the wlr_surface contained within the view, as
|
||||
* currently displayed. Should be kept in sync with the
|
||||
* scene-graph at all times.
|
||||
*/
|
||||
struct wlr_box current;
|
||||
|
||||
struct diyac_output* output;
|
||||
|
||||
struct wl_listener map;
|
||||
struct wl_listener unmap;
|
||||
struct wl_listener destroy;
|
||||
struct wl_listener request_move;
|
||||
struct wl_listener request_resize;
|
||||
struct wl_listener request_maximize;
|
||||
struct wl_listener request_fullscreen;
|
||||
|
||||
struct wl_listener set_app_id;
|
||||
struct wl_listener new_popup;
|
||||
};
|
||||
|
||||
struct diyac_keyboard
|
||||
{
|
||||
struct wl_list link;
|
||||
struct diyac_server *server;
|
||||
struct wlr_keyboard *wlr_keyboard;
|
||||
struct wl_list link;
|
||||
struct diyac_server *server;
|
||||
struct wlr_keyboard *wlr_keyboard;
|
||||
|
||||
struct wl_listener modifiers;
|
||||
struct wl_listener key;
|
||||
struct wl_listener destroy;
|
||||
struct wl_listener modifiers;
|
||||
struct wl_listener key;
|
||||
struct wl_listener destroy;
|
||||
};
|
||||
|
||||
void diyac_focus_toplevel(struct diyac_toplevel *toplevel, struct wlr_surface *surface);
|
||||
struct diyac_toplevel *diyac_toplevel_at(
|
||||
struct diyac_server *server, double lx, double ly,
|
||||
struct wlr_surface **surface, double *sx, double *sy);
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user