diff --git a/digesting_libdecor.c b/digesting_libdecor.c index e8858f7..bd36675 100755 --- a/digesting_libdecor.c +++ b/digesting_libdecor.c @@ -178,9 +178,9 @@ const struct wl_seat_listener seat_listener = { }; static void -wl_registry_global(void *data, struct wl_registry *wl_registry, - uint32_t name, const char *interface, - uint32_t version){ +registry_global(void *data, struct wl_registry *wl_registry, + uint32_t name, const char *interface, + uint32_t version){ if (strcmp(interface, "wl_compositor") == 0){ ctx.wl_compositor = (struct wl_compositor*) wl_registry_bind(wl_registry, name, &wl_compositor_interface, MIN(version, 4)); @@ -232,23 +232,22 @@ wl_registry_global(void *data, struct wl_registry *wl_registry, } static void -wl_registry_global_remove(void *data, struct wl_registry *registry, - uint32_t name){} +registry_global_remove(void *data, struct wl_registry *registry, + uint32_t name){} -const struct wl_registry_listener wl_registry_listener = { - wl_registry_global, - wl_registry_global_remove, +const struct wl_registry_listener registry_listener = { + registry_global, + registry_global_remove, }; static void -xdg_surface_configure(void *user_data, struct xdg_surface *xdg_surface, uint32_t serial){ +xdg_surface_configure(void *user_data, struct xdg_surface *xdg_surface, + uint32_t serial){ ctx.has_cached_config = 1; ctx.cached_config.serial = serial; } -const struct xdg_surface_listener xdg_surface_listener = { - xdg_surface_configure, -}; +const struct xdg_surface_listener xdg_surface_listener = { xdg_surface_configure, }; static void xdg_toplevel_configure(void *user_data, struct xdg_toplevel *xdg_toplevel, @@ -343,7 +342,48 @@ xdg_toplevel_decoration_configure(void *data, struct zxdg_toplevel_decoration_v1 const struct zxdg_toplevel_decoration_v1_listener xdg_toplevel_decoration_listener = { xdg_toplevel_decoration_configure }; -static GtkWidget* find_widget_by_type(GtkWidget *root, enum header_element type); + + +struct find_widget_variables{ + char *name; + GtkWidget *widget; +} find_widget_variables; + +static void +fill_widget_from_name(GtkWidget *widget, void *data){ + struct find_widget_variables *vars = data; + if (vars->widget == 0){ + bool match = false; + if (GTK_IS_WIDGET(widget)){ + GtkStyleContext *style_context = gtk_widget_get_style_context(widget); + char *style_str = gtk_style_context_to_string(style_context, GTK_STYLE_CONTEXT_PRINT_SHOW_STYLE); + if (strstr(style_str, vars->name) != 0){ + vars->widget = widget; + match = true; + } + free(style_str); + } + + if (!match && GTK_IS_CONTAINER(widget)){ + gtk_container_forall(GTK_CONTAINER(widget), &fill_widget_from_name, data); + } + } +} + +static GtkWidget* +find_widget_by_type(GtkWidget *root, enum header_element type){ + struct find_widget_variables vars = {0}; + switch (type){ + case HEADER_FULL: vars.name = "headerbar.titlebar:"; break; + case HEADER_TITLE: vars.name = "label.title:"; break; + case HEADER_MIN: vars.name = ".minimize"; break; + case HEADER_MAX: vars.name = ".maximize"; break; + case HEADER_CLOSE: vars.name = ".close"; break; + default:break; + } + fill_widget_from_name(root, &vars); + return(vars.widget); +} static void border_component_reallocate(struct border_component *component, int w, int h){ @@ -382,6 +422,7 @@ border_component_reallocate(struct border_component *component, int w, int h){ } } + int main(){ /* get desktop settings */ ctx.color_scheme = desktop_settings_get_color_scheme(); @@ -431,7 +472,7 @@ int main(){ } if (ctx.wl_registry != 0){ - wl_registry_add_listener(ctx.wl_registry, &wl_registry_listener, 0); + wl_registry_add_listener(ctx.wl_registry, ®istry_listener, 0); wl_display_flush(ctx.wl_display); wl_display_dispatch(ctx.wl_display); @@ -1001,12 +1042,6 @@ int main(){ extent.h = csd_size.y[0] + ctx.h + 2*SHADOW_MARGIN; } - struct wl_region *input_region = wl_compositor_create_region(ctx.wl_compositor); - wl_region_add(input_region, 0, 0, extent.w, extent.h); - wl_region_subtract(input_region, -extent.x, -extent.y, ctx.w, ctx.h); - wl_surface_set_input_region(cmpnt->wl_surface, input_region); - wl_region_destroy(input_region); - border_component_reallocate(cmpnt, extent.w, extent.h); memset(cmpnt->data, 0, cmpnt->data_size); { @@ -1149,11 +1184,9 @@ int main(){ xdg_toplevel_set_max_size(ctx.xdg_toplevel, ctx.w, ctx.h); } else{ - int csd_added_w = csd_size.x[0] + csd_size.x[1]; - int csd_added_h = csd_size.y[0] + csd_size.y[1]; for (int i = 0; i < 2; i += 1){ - int mw = true_size_bounds.x[i] + csd_added_w; - int mh = true_size_bounds.y[i] + csd_added_h; + int mw = true_size_bounds.x[i] + csd_w; + int mh = true_size_bounds.y[i] + csd_h; if (i == 0){ xdg_toplevel_set_min_size(ctx.xdg_toplevel, mw, mh); } @@ -1163,25 +1196,9 @@ int main(){ } } - { - Extent2D extent = {0}; - extent.w = ctx.w; - extent.h = ctx.h; - if (csd){ - extent.x = -csd_size.x[0]; - extent.y = -csd_size.y[0]; - extent.w += csd_size.x[0] + csd_size.x[1]; - extent.h += csd_size.y[0] + csd_size.y[1]; - } - xdg_surface_set_window_geometry(ctx.xdg_surface, extent.x, extent.y, extent.w, extent.h); - } - - wl_surface_commit(ctx.wl_surface); - if (ctx.has_cached_config){ - ctx.has_cached_config = 0; - memset(&ctx.cached_config, 0, sizeof ctx.cached_config); - xdg_surface_ack_configure(ctx.xdg_surface, ctx.cached_config.serial); - } + xdg_surface_set_window_geometry(ctx.xdg_surface, + -csd_size.x[0], -csd_size.y[0], + ctx.w + csd_w, ctx.h + csd_h); wl_egl_window_resize(ctx.wl_egl_window, ctx.w, ctx.h, 0, 0); } @@ -1225,6 +1242,14 @@ int main(){ if (!swap_success){ printf("eglSwapBuffers failed\n"); } + + if (ctx.has_cached_config){ + ctx.has_cached_config = 0; + memset(&ctx.cached_config, 0, sizeof ctx.cached_config); + xdg_surface_ack_configure(ctx.xdg_surface, ctx.cached_config.serial); + } + wl_surface_commit(ctx.wl_surface); + } return(0); @@ -1262,33 +1287,6 @@ int main(){ * SOFTWARE. */ -//#include "libdecor.c" - -static Extent2D -extent2d_from_component_slot(enum component_slot slot, int title_height){ - Extent2D result = {0}; - - switch (slot){ - default: case COMPONENT_SLOT_NONE: break; - - case COMPONENT_SLOT_SHADOW: { - result.x = -(int)SHADOW_MARGIN; - result.y = -(int)(SHADOW_MARGIN + title_height); - result.w = ctx.w + 2*SHADOW_MARGIN; - result.h = title_height + ctx.h + 2*SHADOW_MARGIN; - }break; - - case COMPONENT_SLOT_HEADER: { - result.x = 0; - result.y = -title_height; - result.w = ctx.w; - result.h = title_height; - }break; - } - - return(result); -} - //#include "libdecor-cairo-blur.c" int blur_surface(cairo_surface_t *surface, int margin){ @@ -1617,56 +1615,6 @@ int os_create_anonymous_file(off_t size){ //#include "plugins/gtk/libdecor-gtk.c" -struct find_widget_variables{ - char *name; - GtkWidget *widget; -} find_widget_variables; - -static void -fill_widget_from_name(GtkWidget *widget, void *data){ - struct find_widget_variables *vars = data; - if (vars->widget == 0){ - bool match = false; - if (GTK_IS_WIDGET(widget)){ - GtkStyleContext *style_context = gtk_widget_get_style_context(widget); - char *style_str = gtk_style_context_to_string(style_context, GTK_STYLE_CONTEXT_PRINT_SHOW_STYLE); - if (strstr(style_str, vars->name) != 0){ - vars->widget = widget; - match = true; - } - free(style_str); - } - - if (!match && GTK_IS_CONTAINER(widget)){ - gtk_container_forall(GTK_CONTAINER(widget), &fill_widget_from_name, data); - } - } -} - -static GtkWidget* -find_widget_by_type(GtkWidget *root, enum header_element type){ - struct find_widget_variables vars = {0}; - switch (type){ - case HEADER_FULL: vars.name = "headerbar.titlebar:"; break; - case HEADER_TITLE: vars.name = "label.title:"; break; - case HEADER_MIN: vars.name = ".minimize"; break; - case HEADER_MAX: vars.name = ".maximize"; break; - case HEADER_CLOSE: vars.name = ".close"; break; - default:break; - } - fill_widget_from_name(root, &vars); - return(vars.widget); -} - -static bool -own_proxy(void *proxy){ - bool result = false; - if (proxy != 0){ - result = (wl_proxy_get_tag((struct wl_proxy*)proxy) == &libdecor_gtk_proxy_tag); - } - return(result); -} - static void toggle_maximized(void){ if (ctx.frame_window_state & LIBDECOR_WINDOW_STATE_MAXIMIZED){ @@ -1839,17 +1787,15 @@ edge_from_pos(int x, int y){ //#include "desktop-settings.c" -static bool +static int get_cursor_settings_from_env(char **theme, int *size){ char *env_xtheme = getenv("XCURSOR_THEME"); char *env_xsize = getenv("XCURSOR_SIZE"); - bool got_theme = (env_xtheme != 0 && env_xsize != 0); - + int got_theme = (env_xtheme != 0 && env_xsize != 0); if (got_theme){ *theme = strdup(env_xtheme); *size = atoi(env_xsize); } - return(got_theme); } @@ -1915,10 +1861,8 @@ desktop_settings_get_cursor_settings(char **theme, int *size){ const char *value_theme = 0; DBusError error; - DBusConnection *connection; - dbus_error_init(&error); - connection = dbus_bus_get(DBUS_BUS_SESSION, &error); + DBusConnection *connection = dbus_bus_get(DBUS_BUS_SESSION, &error); if (!dbus_error_is_set(&error)){ DBusMessage *reply = get_setting_sync(connection, name, key_theme); @@ -1954,14 +1898,11 @@ desktop_settings_get_color_scheme(){ uint32_t color = 0; DBusError error; - DBusConnection *connection; - DBusMessage *reply; - dbus_error_init(&error); - connection = dbus_bus_get(DBUS_BUS_SESSION, &error); + DBusConnection *connection = dbus_bus_get(DBUS_BUS_SESSION, &error); if (!dbus_error_is_set(&error)){ - reply = get_setting_sync(connection, name, key_color_scheme); + DBusMessage *reply = get_setting_sync(connection, name, key_color_scheme); if (reply){ if (!parse_type(reply, DBUS_TYPE_UINT32, &color)) { color = 0; @@ -1969,7 +1910,6 @@ desktop_settings_get_color_scheme(){ dbus_message_unref(reply); } } - return(color); } diff --git a/digesting_libdecor.h b/digesting_libdecor.h index d6b8216..b09dee5 100644 --- a/digesting_libdecor.h +++ b/digesting_libdecor.h @@ -244,29 +244,8 @@ bool desktop_settings_get_cursor_settings(char **theme, in enum libdecor_color_scheme desktop_settings_get_color_scheme(); // #include "os-compatibility.h" - int os_create_anonymous_file(off_t size); -// #include "libdecor.c" - -static void init_shell_surface(void); - -static void do_map(void); - -// #include "plugins/gtk/libdecor-gtk.c" - -static const char *libdecor_gtk_proxy_tag = "libdecor-gtk"; - -static struct wl_cursor* wl_cursor_from_pos(int x, int y); -static void draw_header_button(cairo_t *cr, cairo_surface_t *surface, enum header_element button_type); - -static bool own_proxy(void *proxy); -static struct header_element_data get_header_focus(const GtkHeaderBar *header_bar, int x, int y); -static void draw_title_bar(void); -static enum libdecor_resize_edge edge_from_pos(int x, int y); -static void toggle_maximized(void); -static void update_touch_focus(struct seat *seat, wl_fixed_t x, wl_fixed_t y); - // digesting_libdecor typedef struct Ctx{ @@ -365,4 +344,10 @@ typedef struct Ctx{ int csd_show_title_from_state(enum libdecor_window_state state); int csd_show_shadow_from_state(enum libdecor_window_state state); +static const char *libdecor_gtk_proxy_tag = "libdecor-gtk"; + +static void draw_header_button(cairo_t *cr, cairo_surface_t *surface, enum header_element button_type); +static enum libdecor_resize_edge edge_from_pos(int x, int y); +static void toggle_maximized(void); + #endif //DIGESTING_LIBDECOR_H