2019-11-19 21:00:26 +00:00
|
|
|
#ifndef LABWC_H
|
|
|
|
|
#define LABWC_H
|
|
|
|
|
|
|
|
|
|
#define _POSIX_C_SOURCE 200112L
|
|
|
|
|
#include <getopt.h>
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <time.h>
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
#include <wayland-server-core.h>
|
|
|
|
|
#include <wlr/backend.h>
|
|
|
|
|
#include <wlr/render/wlr_renderer.h>
|
|
|
|
|
#include <wlr/types/wlr_cursor.h>
|
|
|
|
|
#include <wlr/types/wlr_compositor.h>
|
|
|
|
|
#include <wlr/types/wlr_data_device.h>
|
|
|
|
|
#include <wlr/types/wlr_input_device.h>
|
|
|
|
|
#include <wlr/types/wlr_keyboard.h>
|
|
|
|
|
#include <wlr/types/wlr_matrix.h>
|
|
|
|
|
#include <wlr/types/wlr_output.h>
|
|
|
|
|
#include <wlr/types/wlr_output_layout.h>
|
|
|
|
|
#include <wlr/types/wlr_pointer.h>
|
|
|
|
|
#include <wlr/types/wlr_seat.h>
|
|
|
|
|
#include <wlr/types/wlr_xcursor_manager.h>
|
|
|
|
|
#include <wlr/types/wlr_xdg_shell.h>
|
2020-05-13 20:51:13 +01:00
|
|
|
#include <wlr/types/wlr_server_decoration.h>
|
|
|
|
|
#include <wlr/types/wlr_xdg_decoration_v1.h>
|
2019-11-19 21:00:26 +00:00
|
|
|
#include <wlr/util/log.h>
|
|
|
|
|
#include <wlr/xwayland.h>
|
|
|
|
|
#include <xkbcommon/xkbcommon.h>
|
|
|
|
|
|
|
|
|
|
#define XCURSOR_DEFAULT "left_ptr"
|
|
|
|
|
#define XCURSOR_SIZE 24
|
|
|
|
|
#define XCURSOR_MOVE "grabbing"
|
|
|
|
|
#define XWL_TITLEBAR_HEIGHT (10)
|
|
|
|
|
#define XWL_WINDOW_BORDER (3)
|
2020-05-13 20:51:13 +01:00
|
|
|
#define LAB_DISABLE_CSD (1)
|
2019-11-19 21:00:26 +00:00
|
|
|
|
2019-12-27 20:48:58 +00:00
|
|
|
enum cursor_mode {
|
2019-11-19 21:00:26 +00:00
|
|
|
TINYWL_CURSOR_PASSTHROUGH,
|
|
|
|
|
TINYWL_CURSOR_MOVE,
|
|
|
|
|
TINYWL_CURSOR_RESIZE,
|
|
|
|
|
};
|
|
|
|
|
|
2019-12-27 20:48:58 +00:00
|
|
|
struct server {
|
2019-11-19 21:00:26 +00:00
|
|
|
struct wl_display *wl_display;
|
|
|
|
|
struct wlr_backend *backend;
|
|
|
|
|
struct wlr_renderer *renderer;
|
|
|
|
|
struct wlr_compositor *compositor;
|
|
|
|
|
|
|
|
|
|
struct wlr_xdg_shell *xdg_shell;
|
|
|
|
|
struct wl_listener new_xdg_surface;
|
2020-05-13 20:51:13 +01:00
|
|
|
struct wl_listener xdg_toplevel_decoration;
|
2019-11-19 21:00:26 +00:00
|
|
|
struct wlr_xwayland *xwayland;
|
|
|
|
|
struct wl_listener new_xwayland_surface;
|
|
|
|
|
struct wl_list views;
|
|
|
|
|
|
|
|
|
|
struct wlr_cursor *cursor;
|
|
|
|
|
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 wlr_seat *seat;
|
|
|
|
|
struct wl_listener new_input;
|
|
|
|
|
struct wl_listener request_cursor;
|
2020-05-12 21:00:33 +01:00
|
|
|
struct wl_listener request_set_selection;
|
2019-11-19 21:00:26 +00:00
|
|
|
struct wl_list keyboards;
|
2019-12-27 20:48:58 +00:00
|
|
|
enum cursor_mode cursor_mode;
|
|
|
|
|
struct view *grabbed_view;
|
2019-11-19 21:00:26 +00:00
|
|
|
double grab_x, grab_y;
|
2020-05-12 20:37:05 +01:00
|
|
|
struct wlr_box grab_box;
|
2019-11-19 21:00:26 +00:00
|
|
|
uint32_t resize_edges;
|
|
|
|
|
|
|
|
|
|
struct wlr_output_layout *output_layout;
|
|
|
|
|
struct wl_list outputs;
|
|
|
|
|
struct wl_listener new_output;
|
|
|
|
|
};
|
|
|
|
|
|
2019-12-27 20:48:58 +00:00
|
|
|
struct output {
|
2019-11-19 21:00:26 +00:00
|
|
|
struct wl_list link;
|
2019-12-27 20:48:58 +00:00
|
|
|
struct server *server;
|
2019-11-19 21:00:26 +00:00
|
|
|
struct wlr_output *wlr_output;
|
|
|
|
|
struct wl_listener frame;
|
|
|
|
|
};
|
|
|
|
|
|
2019-12-27 21:22:45 +00:00
|
|
|
enum view_type { LAB_XDG_SHELL_VIEW, LAB_XWAYLAND_VIEW };
|
2019-11-19 21:00:26 +00:00
|
|
|
|
2020-05-12 22:24:18 +01:00
|
|
|
enum deco_part { LAB_DECO_NONE, LAB_DECO_PART_TOP, LAB_DECO_PART_LEFT };
|
2020-05-04 22:21:30 +01:00
|
|
|
|
2019-12-27 20:48:58 +00:00
|
|
|
struct view {
|
2019-11-19 21:00:26 +00:00
|
|
|
enum view_type type;
|
|
|
|
|
struct wl_list link;
|
2019-12-27 20:48:58 +00:00
|
|
|
struct server *server;
|
2019-11-19 21:00:26 +00:00
|
|
|
struct wlr_xdg_surface *xdg_surface;
|
|
|
|
|
struct wlr_xwayland_surface *xwayland_surface;
|
|
|
|
|
struct wlr_surface *surface;
|
|
|
|
|
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_configure;
|
|
|
|
|
|
|
|
|
|
bool mapped;
|
|
|
|
|
/*
|
|
|
|
|
* Some X11 windows appear to create additional top levels windows
|
|
|
|
|
* which we want to ignore. These are never mapped, so we can track
|
|
|
|
|
* them that way
|
|
|
|
|
*/
|
|
|
|
|
bool been_mapped;
|
|
|
|
|
int x, y;
|
|
|
|
|
};
|
|
|
|
|
|
2019-12-27 20:48:58 +00:00
|
|
|
struct keyboard {
|
2019-11-19 21:00:26 +00:00
|
|
|
struct wl_list link;
|
2019-12-27 20:48:58 +00:00
|
|
|
struct server *server;
|
2019-11-19 21:00:26 +00:00
|
|
|
struct wlr_input_device *device;
|
|
|
|
|
|
|
|
|
|
struct wl_listener modifiers;
|
|
|
|
|
struct wl_listener key;
|
|
|
|
|
};
|
|
|
|
|
|
2020-05-13 20:51:13 +01:00
|
|
|
void xdg_toplevel_decoration(struct wl_listener *listener, void *data);
|
2019-12-26 21:37:31 +00:00
|
|
|
void xdg_surface_map(struct wl_listener *listener, void *data);
|
|
|
|
|
void xdg_surface_unmap(struct wl_listener *listener, void *data);
|
|
|
|
|
void xdg_surface_destroy(struct wl_listener *listener, void *data);
|
|
|
|
|
void xdg_toplevel_request_move(struct wl_listener *listener, void *data);
|
|
|
|
|
void xdg_toplevel_request_resize(struct wl_listener *listener, void *data);
|
|
|
|
|
void xdg_surface_new(struct wl_listener *listener, void *data);
|
|
|
|
|
|
2019-12-27 20:48:58 +00:00
|
|
|
int xwl_nr_parents(struct view *view);
|
2019-12-26 21:37:31 +00:00
|
|
|
void xwl_surface_map(struct wl_listener *listener, void *data);
|
|
|
|
|
void xwl_surface_unmap(struct wl_listener *listener, void *data);
|
|
|
|
|
void xwl_surface_destroy(struct wl_listener *listener, void *data);
|
|
|
|
|
void xwl_surface_configure(struct wl_listener *listener, void *data);
|
|
|
|
|
void xwl_surface_new(struct wl_listener *listener, void *data);
|
|
|
|
|
|
2020-05-04 22:21:30 +01:00
|
|
|
bool view_want_deco(struct view *view);
|
2019-12-27 22:34:00 +00:00
|
|
|
void view_focus_last_toplevel(struct server *server);
|
2020-05-16 12:18:00 +01:00
|
|
|
void view_focus(struct view *view);
|
2020-05-16 12:04:12 +01:00
|
|
|
void view_focus_next_toplevel(struct view *current);
|
2019-12-27 21:22:45 +00:00
|
|
|
void begin_interactive(struct view *view, enum cursor_mode mode,
|
|
|
|
|
uint32_t edges);
|
2019-12-27 20:48:58 +00:00
|
|
|
bool is_toplevel(struct view *view);
|
2020-05-16 12:04:12 +01:00
|
|
|
struct view *view_at(struct server *server, double lx, double ly,
|
|
|
|
|
struct wlr_surface **surface, double *sx, double *sy,
|
|
|
|
|
int *view_area);
|
2019-12-26 21:37:31 +00:00
|
|
|
|
|
|
|
|
/* TODO: try to refactor to remove from header file */
|
2019-12-27 20:48:58 +00:00
|
|
|
struct view *first_toplevel(struct server *server);
|
2019-12-26 21:37:31 +00:00
|
|
|
|
2019-12-27 22:34:00 +00:00
|
|
|
void server_new_input(struct wl_listener *listener, void *data);
|
|
|
|
|
void seat_request_cursor(struct wl_listener *listener, void *data);
|
2020-05-12 21:00:33 +01:00
|
|
|
void seat_request_set_selection(struct wl_listener *listener, void *data);
|
2019-12-27 20:26:26 +00:00
|
|
|
void server_cursor_motion(struct wl_listener *listener, void *data);
|
|
|
|
|
void server_cursor_motion_absolute(struct wl_listener *listener, void *data);
|
|
|
|
|
void server_cursor_button(struct wl_listener *listener, void *data);
|
|
|
|
|
void server_cursor_axis(struct wl_listener *listener, void *data);
|
|
|
|
|
void server_cursor_frame(struct wl_listener *listener, void *data);
|
2019-12-26 21:37:31 +00:00
|
|
|
void server_new_output(struct wl_listener *listener, void *data);
|
|
|
|
|
|
|
|
|
|
void output_frame(struct wl_listener *listener, void *data);
|
|
|
|
|
|
2020-05-12 22:24:18 +01:00
|
|
|
void dbg_show_one_view(struct view *view);
|
2019-12-27 21:45:00 +00:00
|
|
|
void dbg_show_views(struct server *server);
|
|
|
|
|
|
2020-05-04 22:21:30 +01:00
|
|
|
struct wlr_box deco_max_extents(struct view *view);
|
|
|
|
|
struct wlr_box deco_box(struct view *view, enum deco_part deco_part);
|
|
|
|
|
enum deco_part deco_at(struct view *view, double lx, double ly);
|
|
|
|
|
|
2019-11-19 21:00:26 +00:00
|
|
|
#endif /* LABWC_H */
|