Compare commits

..

13 Commits

Author SHA1 Message Date
Allen Webster 4d9d8d1081 [digesting_libdecor] eliminate the frame init logic, just require frames be made after the context is setup 2026-02-26 20:29:09 -08:00
Allen Webster 2bce6b183c [digesting_libdecor] eliminate a bunch of getters/setters for frame 2026-02-26 19:21:30 -08:00
Allen Webster c1f41242ec [digesting_libdecor] clean up the property changing code, eliminate notify_on_property_change 2026-02-26 18:46:28 -08:00
Allen Webster 785b014580 [digesting_libdecor] move libdecor_frame_gtk fields to libdecor_frame, eliminate 'gtk' frame and replace pass-throughts with regular frames 2026-02-26 18:06:56 -08:00
Allen Webster babb2ccb59 [digesting_libdecor] move libdecor_frame_private fields to libdecor_frame, eliminate 'private' frame 2026-02-26 16:27:42 -08:00
Allen Webster 617f855443 [digesting_libdecor] convert 'private' pointer in libdecor_frame to in-memory 'private' field 2026-02-26 16:22:26 -08:00
Allen Webster fb76c306cd [digesting_libdecor] eliminate libdecor_decorate 2026-02-26 15:50:10 -08:00
Allen Webster eb54b56ee6 [digesting_libdecor] eliminate my implementation functions for libdecor's event callbacks 2026-02-26 15:39:02 -08:00
Allen Webster 405b88268c remove redundant strcmp wrappers 2026-02-26 15:14:34 -08:00
Allen Webster af182961cc [digesting_libdecor] eliminate libdecor_plugin,libdecor_plugin_gtk, and the functions from the fallback plugin 2026-02-26 14:59:41 -08:00
Allen Webster 6c6f116885 [digesting_libdecor] eliminate the allocation and pass-through of the plugin completely 2026-02-26 14:51:02 -08:00
Allen Webster 6fed08cea3 [digesting_libdecor] move plugin_gtk fields into my context 2026-02-26 14:34:29 -08:00
Allen Webster edb01d0014 [digesting_libdecor] port over the frame commit workaround 2026-02-26 13:33:20 -08:00
3 changed files with 1145 additions and 2235 deletions

View File

@ -1,2 +1,2 @@
#!/bin/bash
./wayland_libdecor_egl__frame_commit_workaround.c
./digesting_libdecor.c

File diff suppressed because it is too large Load Diff

View File

@ -33,15 +33,6 @@
// config.h
/* Version number of package */
#define VERSION "0.2.2"
/* Plugin directiory path */
#define LIBDECOR_PLUGIN_DIR "/usr/local/lib/x86_64-linux-gnu/libdecor/plugins-1"
/* Plugin API version */
#define LIBDECOR_PLUGIN_API_VERSION 1
#define HAS_DBUS
/* #undef HAVE_MKOSTEMP */
@ -56,9 +47,11 @@
#define ARRAY_LENGTH(a) (sizeof (a) / sizeof (a)[0])
#define STREQL(a,b) (((a)==0 && (b)==0) || \
((a)!=0 && (b)!=0 && strcmp((a),(b))==0))
// libdecor.h
struct libdecor_frame;
struct libdecor_configuration;
struct libdecor_state;
@ -113,72 +106,6 @@ enum libdecor_wm_capabilities {
// libdecor-plugin.h
struct libdecor_frame_private;
struct libdecor_frame {
struct libdecor_frame_private *priv;
struct wl_list link;
};
struct libdecor_plugin_private;
struct libdecor_plugin {
struct libdecor_plugin_private *priv;
};
#define LIBDECOR_PLUGIN_PRIORITY_HIGH 1000
#define LIBDECOR_PLUGIN_PRIORITY_MEDIUM 100
#define LIBDECOR_PLUGIN_PRIORITY_LOW 0
struct libdecor_plugin_priority {
const char *desktop;
int priority;
};
struct libdecor_plugin_interface {
void (* destroy)(struct libdecor_plugin *plugin);
int (* get_fd)(struct libdecor_plugin *plugin);
int (* dispatch)(struct libdecor_plugin *plugin,
int timeout);
void (* set_handle_application_cursor)(struct libdecor_plugin *plugin,
bool handle_cursor);
struct libdecor_frame * (* frame_new)(struct libdecor_plugin *plugin);
void (* frame_free)(struct libdecor_plugin *plugin,
struct libdecor_frame *frame);
void (* frame_commit)(struct libdecor_plugin *plugin,
struct libdecor_frame *frame,
struct libdecor_state *state,
struct libdecor_configuration *configuration);
void (*frame_property_changed)(struct libdecor_plugin *plugin,
struct libdecor_frame *frame);
void (* frame_popup_grab)(struct libdecor_plugin *plugin,
struct libdecor_frame *frame,
const char *seat_name);
void (* frame_popup_ungrab)(struct libdecor_plugin *plugin,
struct libdecor_frame *frame,
const char *seat_name);
bool (* frame_get_border_size)(struct libdecor_plugin *plugin,
struct libdecor_frame *frame,
struct libdecor_configuration *configuration,
int *left,
int *right,
int *top,
int *bottom);
};
// #include "libdecor.c"
struct libdecor_state {
enum libdecor_window_state window_state;
int content_width;
int content_height;
};
struct libdecor_limits {
int min_width;
int min_height;
@ -186,90 +113,6 @@ struct libdecor_limits {
int max_height;
};
struct libdecor_configuration {
uint32_t serial;
bool has_window_state;
enum libdecor_window_state window_state;
bool has_size;
int window_width;
int window_height;
};
struct libdecor_frame_private {
int ref_count;
struct wl_surface *wl_surface;
void *user_data;
struct xdg_surface *xdg_surface;
struct xdg_toplevel *xdg_toplevel;
struct zxdg_toplevel_decoration_v1 *toplevel_decoration;
bool pending_map;
struct {
char *app_id;
char *title;
struct libdecor_limits content_limits;
struct xdg_toplevel *parent;
} state;
struct libdecor_configuration *pending_configuration;
int content_width;
int content_height;
enum libdecor_window_state window_state;
bool has_decoration_mode;
enum zxdg_toplevel_decoration_v1_mode decoration_mode;
enum libdecor_capabilities capabilities;
enum libdecor_wm_capabilities wm_capabilities;
/* original limits for interactive resize */
struct libdecor_limits interactive_limits;
bool visible;
};
struct libdecor_plugin_private {
struct libdecor_plugin_interface *iface;
};
// #include "libdecor-fallback.c"
struct libdecor_plugin_fallback {
struct libdecor_plugin plugin;
struct libdecor *context;
};
// #include "desktop-settings.h"
enum libdecor_color_scheme {
LIBDECOR_COLOR_SCHEME_DEFAULT,
LIBDECOR_COLOR_SCHEME_PREFER_DARK,
LIBDECOR_COLOR_SCHEME_PREFER_LIGHT,
};
// #include "plugins/gtk/libdecor-gtk.c"
static const size_t SHADOW_MARGIN = 24;
static const char *cursor_names[] = {
"top_side",
"bottom_side",
"left_side",
"top_left_corner",
"bottom_left_corner",
"right_side",
"top_right_corner",
"bottom_right_corner"
};
enum header_element {
HEADER_NONE,
HEADER_FULL, /* entire header bar */
@ -306,9 +149,143 @@ enum component {
HEADER,
};
struct seat {
struct libdecor_plugin_gtk *plugin_gtk;
struct border_component {
enum component type;
struct wl_surface *wl_surface;
struct wl_subsurface *wl_subsurface;
struct buffer *buffer;
bool opaque;
struct wl_list output_list;
int scale;
struct wl_list child_components; /* border_component::link */
struct wl_list link; /* border_component::child_components */
};
struct libdecor_frame {
//struct libdecor_frame;
struct wl_list frame_link;
//struct libdecor_frame_private;
int ref_count;
struct wl_surface *wl_surface;
void *user_data;
struct xdg_surface *xdg_surface;
struct xdg_toplevel *xdg_toplevel;
struct zxdg_toplevel_decoration_v1 *toplevel_decoration;
bool pending_map;
char *app_id;
char *title;
struct libdecor_limits content_limits;
struct xdg_toplevel *parent;
struct libdecor_configuration *pending_configuration;
int frame_content_width;
int frame_content_height;
enum libdecor_window_state frame_window_state;
bool has_decoration_mode;
enum zxdg_toplevel_decoration_v1_mode decoration_mode;
enum libdecor_capabilities frame_capabilities;
enum libdecor_wm_capabilities wm_capabilities;
/* original limits for interactive resize */
struct libdecor_limits interactive_limits;
bool visible;
//struct libdecor_frame_gtk;
int gtk_content_width;
int gtk_content_height;
enum libdecor_window_state gtk_window_state;
enum decoration_type decoration_type;
enum libdecor_capabilities gtk_capabilities;
struct border_component *active;
struct border_component *touch_active;
struct border_component *focus;
struct border_component *grab;
bool shadow_showing;
struct border_component shadow;
GtkWidget *window; /* offscreen window for rendering */
GtkWidget *header; /* header bar with widgets */
struct border_component headerbar;
struct header_element_data hdr_focus;
/* store pre-processed shadow tile */
cairo_surface_t *shadow_blur;
struct wl_list gtk_link;
struct {
enum titlebar_gesture_state state;
int button_pressed_count;
uint32_t first_pressed_button;
uint32_t first_pressed_time;
double pressed_x;
double pressed_y;
uint32_t pressed_serial;
} titlebar_gesture;
};
// #include "libdecor.c"
struct libdecor_state {
enum libdecor_window_state window_state;
int content_width;
int content_height;
};
struct libdecor_configuration {
uint32_t serial;
bool has_window_state;
enum libdecor_window_state window_state;
bool has_size;
int window_width;
int window_height;
};
// #include "desktop-settings.h"
enum libdecor_color_scheme {
LIBDECOR_COLOR_SCHEME_DEFAULT,
LIBDECOR_COLOR_SCHEME_PREFER_DARK,
LIBDECOR_COLOR_SCHEME_PREFER_LIGHT,
};
// #include "plugins/gtk/libdecor-gtk.c"
static const size_t SHADOW_MARGIN = 24;
static const char *cursor_names[] = {
"top_side",
"bottom_side",
"left_side",
"top_left_corner",
"bottom_left_corner",
"right_side",
"top_right_corner",
"bottom_right_corner"
};
struct seat {
char *name;
struct wl_seat *wl_seat;
@ -340,8 +317,6 @@ struct seat {
};
struct output {
struct libdecor_plugin_gtk *plugin_gtk;
struct wl_output *wl_output;
uint32_t id;
int scale;
@ -363,19 +338,6 @@ struct buffer {
int buffer_height;
};
struct border_component {
enum component type;
struct wl_surface *wl_surface;
struct wl_subsurface *wl_subsurface;
struct buffer *buffer;
bool opaque;
struct wl_list output_list;
int scale;
struct wl_list child_components; /* border_component::link */
struct wl_list link; /* border_component::child_components */
};
struct surface_output {
struct output *output;
struct wl_list link;
@ -386,70 +348,6 @@ struct cursor_output {
struct wl_list link;
};
struct libdecor_frame_gtk {
struct libdecor_frame frame;
struct libdecor_plugin_gtk *plugin_gtk;
int content_width;
int content_height;
enum libdecor_window_state window_state;
enum decoration_type decoration_type;
char *title;
enum libdecor_capabilities capabilities;
struct border_component *active;
struct border_component *touch_active;
struct border_component *focus;
struct border_component *grab;
bool shadow_showing;
struct border_component shadow;
GtkWidget *window; /* offscreen window for rendering */
GtkWidget *header; /* header bar with widgets */
struct border_component headerbar;
struct header_element_data hdr_focus;
/* store pre-processed shadow tile */
cairo_surface_t *shadow_blur;
struct wl_list link;
struct {
enum titlebar_gesture_state state;
int button_pressed_count;
uint32_t first_pressed_button;
uint32_t first_pressed_time;
double pressed_x;
double pressed_y;
uint32_t pressed_serial;
} titlebar_gesture;
};
struct libdecor_plugin_gtk {
struct libdecor_plugin plugin;
struct wl_subcompositor *wl_subcompositor;
struct wl_shm *wl_shm;
bool has_argb;
struct wl_list visible_frame_list;
struct wl_list seat_list;
struct wl_list output_list;
int double_click_time_ms;
int drag_threshold;
bool handle_cursor;
};
enum titlebar_gesture {
TITLEBAR_GESTURE_DOUBLE_CLICK,
TITLEBAR_GESTURE_MIDDLE_CLICK,
@ -460,25 +358,13 @@ enum titlebar_gesture {
// libdecor.h
void libdecor_frame_ref(struct libdecor_frame *frame);
void libdecor_frame_unref(struct libdecor_frame *frame);
void *libdecor_frame_get_user_data(struct libdecor_frame *frame);
void libdecor_frame_set_user_data(struct libdecor_frame *frame, void *user_data);
void libdecor_frame_set_visibility(struct libdecor_frame *frame,
bool visible);
bool libdecor_frame_is_visible(struct libdecor_frame *frame);
void libdecor_frame_set_parent(struct libdecor_frame *frame,
struct libdecor_frame *parent);
void libdecor_frame_set_title(struct libdecor_frame *frame,
const char *title);
const char * libdecor_frame_get_title(struct libdecor_frame *frame);
void libdecor_frame_set_app_id(struct libdecor_frame *frame,
const char *app_id);
void libdecor_frame_set_capabilities(struct libdecor_frame *frame,
enum libdecor_capabilities capabilities);
void libdecor_frame_unset_capabilities(struct libdecor_frame *frame,
enum libdecor_capabilities capabilities);
bool libdecor_frame_has_capability(struct libdecor_frame *frame,
enum libdecor_capabilities capability);
void libdecor_frame_show_window_menu(struct libdecor_frame *frame,
struct wl_seat *wl_seat,
uint32_t serial,
@ -492,18 +378,7 @@ void libdecor_frame_popup_ungrab(struct libdecor_frame *frame,
void libdecor_frame_translate_coordinate(struct libdecor_frame *frame,
int surface_x, int surface_y,
int *frame_x, int *frame_y);
void libdecor_frame_set_min_content_size(struct libdecor_frame *frame,
int content_width,
int content_height);
void libdecor_frame_set_max_content_size(struct libdecor_frame *frame,
int content_width,
int content_height);
void libdecor_frame_get_min_content_size(const struct libdecor_frame *frame,
int *content_width,
int *content_height);
void libdecor_frame_get_max_content_size(const struct libdecor_frame *frame,
int *content_width,
int *content_height);
void libdecor_frame_resize(struct libdecor_frame *frame,
struct wl_seat *wl_seat,
uint32_t serial,
@ -523,9 +398,7 @@ void libdecor_frame_unset_fullscreen(struct libdecor_frame *frame);
bool libdecor_frame_is_floating(struct libdecor_frame *frame);
void libdecor_frame_close(struct libdecor_frame *frame);
void libdecor_frame_map(struct libdecor_frame *frame);
struct xdg_surface * libdecor_frame_get_xdg_surface(struct libdecor_frame *frame);
struct xdg_toplevel * libdecor_frame_get_xdg_toplevel(struct libdecor_frame *frame);
enum libdecor_wm_capabilities libdecor_frame_get_wm_capabilities(struct libdecor_frame *frame);
struct libdecor_state * libdecor_state_new(int width, int height);
void libdecor_state_free(struct libdecor_state *state);
bool libdecor_configuration_get_content_size(struct libdecor_configuration *configuration,
@ -535,46 +408,16 @@ bool libdecor_configuration_get_content_size(struct libdecor_configuration *conf
bool libdecor_configuration_get_window_state(struct libdecor_configuration *configuration,
enum libdecor_window_state *window_state);
struct libdecor_frame* libdecor_decorate(struct wl_surface *wl_surface, void *user_data);
int libdecor_dispatch(int timeout);
// libdecor-plugin.h
struct wl_surface * libdecor_frame_get_wl_surface(struct libdecor_frame *frame);
int libdecor_frame_get_content_width(struct libdecor_frame *frame);
int libdecor_frame_get_content_height(struct libdecor_frame *frame);
enum libdecor_window_state libdecor_frame_get_window_state(struct libdecor_frame *frame);
enum libdecor_capabilities libdecor_frame_get_capabilities(const struct libdecor_frame *frame);
void libdecor_frame_dismiss_popup(struct libdecor_frame *frame,
const char *seat_name);
void libdecor_frame_toplevel_commit(struct libdecor_frame *frame);
void libdecor_notify_plugin_ready(void);
void libdecor_notify_plugin_error(enum libdecor_error error,
const char *__restrict fmt,
...);
int libdecor_state_get_content_width(struct libdecor_state *state);
int libdecor_state_get_content_height(struct libdecor_state *state);
enum libdecor_window_state libdecor_state_get_window_state(struct libdecor_state *state);
int libdecor_plugin_init(struct libdecor_plugin *plugin, struct libdecor_plugin_interface *iface);
void libdecor_plugin_release(struct libdecor_plugin *plugin);
// #include "libdecor-fallback.h"
struct libdecor_plugin * libdecor_fallback_plugin_new(void);
// #include "libdecor-cairo-blur.h"
int blur_surface(cairo_surface_t *surface, int margin);
@ -586,19 +429,20 @@ void render_shadow(cairo_t *cr, cairo_surface_t *surface,
bool libdecor_get_cursor_settings(char **theme, int *size);
enum libdecor_color_scheme libdecor_get_color_scheme();
// #include "os-compatibility.h"
int libdecor_os_create_anonymous_file(off_t size);
// #include "libdecor.c"
static void notify_error(enum libdecor_error error, const char *message);
static void finish_init(void);
static void init_shell_surface(struct libdecor_frame *frame);
static void set_capabilities(struct libdecor_frame *frame, const enum libdecor_capabilities new_capabilities);
static void do_map(struct libdecor_frame *frame);
//#include "plugins/gtk/libdecor-gtk.c"
static void libdecor_plugin_gtk_destroy(struct libdecor_plugin *plugin);
static void init_wl_output( uint32_t id, uint32_t version);
@ -606,6 +450,18 @@ static void output_removed(struct output *output);
static const char *libdecor_gtk_proxy_tag = "libdecor-gtk";
static int libdecor_plugin_gtk_get_fd(void);
static int libdecor_plugin_gtk_get_fd(void);
static int libdecor_plugin_gtk_dispatch(int timeout);
static void libdecor_plugin_gtk_set_handle_application_cursor(bool handle_cursor);
static void libdecor_plugin_gtk_frame_free(struct libdecor_frame *frame);
static void libdecor_plugin_gtk_frame_commit(struct libdecor_frame *frame, struct libdecor_state *state, struct libdecor_configuration *configuration);
static void libdecor_plugin_gtk_frame_popup_grab(struct libdecor_frame *frame, const char *seat_name);
static void libdecor_plugin_gtk_frame_popup_ungrab(struct libdecor_frame *frame, const char *seat_name);
static bool libdecor_plugin_gtk_frame_get_border_size(struct libdecor_frame *frame, struct libdecor_configuration *configuration, int *left, int *right, int *top, int *bottom);
static void draw_decoration(struct libdecor_frame *frame);
// digesting_libdecor
typedef struct Ctx{
@ -618,20 +474,27 @@ typedef struct Ctx{
struct wl_display *wl_display;
struct wl_registry *wl_registry;
struct wl_compositor *wl_compositor;
struct wl_subcompositor *wl_subcompositor;
struct wl_shm *wl_shm;
struct xdg_wm_base *xdg_wm_base;
struct zxdg_decoration_manager_v1 *decoration_manager;
struct wl_callback *wl_callback;
struct wl_list visible_frame_list;
struct wl_list seat_list;
struct wl_list output_list;
struct wl_list frames;
struct wl_callback *wl_callback;
struct libdecor_plugin_gtk *plugin_gtk;
struct libdecor_plugin *plugin;
bool plugin_ready;
bool init_done;
bool has_error;
bool has_argb;
int double_click_time_ms;
int drag_threshold;
bool handle_cursor;
/* window */
struct wl_surface *wl_surface;
struct libdecor_frame *libdecor_frame;
struct libdecor_frame *frame;
struct wl_egl_window *wl_egl_window;
int configured;
int w;
@ -640,6 +503,9 @@ typedef struct Ctx{
EGLDisplay egl_display;
EGLContext egl_context;
EGLSurface egl_surface;
int has_cached_config;
struct libdecor_configuration cached_config;
} Ctx;
#endif //DIGESTING_LIBDECOR_H