From 785b014580da779c2efbb27816359c286504394c Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Thu, 26 Feb 2026 18:06:56 -0800 Subject: [PATCH] [digesting_libdecor] move libdecor_frame_gtk fields to libdecor_frame, eliminate 'gtk' frame and replace pass-throughts with regular frames --- digesting_libdecor.c | 1188 +++++++++++++++++++----------------------- digesting_libdecor.h | 195 ++++--- 2 files changed, 639 insertions(+), 744 deletions(-) diff --git a/digesting_libdecor.c b/digesting_libdecor.c index 65f0227..03e473c 100755 --- a/digesting_libdecor.c +++ b/digesting_libdecor.c @@ -407,25 +407,24 @@ int main(){ if (ctx.wl_surface != 0){ { - struct libdecor_frame_gtk *frame_gtk = calloc(1, sizeof *frame_gtk); - wl_list_insert(&ctx.visible_frame_list, &frame_gtk->link); + ctx.frame = calloc(1, sizeof *ctx.frame); + wl_list_insert(&ctx.visible_frame_list, &ctx.frame->gtk_link); { static const int size = 128; static const int boundary = 32; cairo_t *cr; - frame_gtk->shadow_blur = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, size, size); - cr = cairo_create(frame_gtk->shadow_blur); + ctx.frame->shadow_blur = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, size, size); + cr = cairo_create(ctx.frame->shadow_blur); cairo_set_operator(cr, CAIRO_OPERATOR_OVER); cairo_set_source_rgba(cr, 0, 0, 0, 1); cairo_rectangle(cr, boundary, boundary, size - 2*boundary, size - 2*boundary); cairo_fill(cr); cairo_destroy(cr); - blur_surface(frame_gtk->shadow_blur, 64); + blur_surface(ctx.frame->shadow_blur, 64); } - ctx.frame = &frame_gtk->frame; } { @@ -437,7 +436,7 @@ int main(){ LIBDECOR_WM_CAPABILITIES_FULLSCREEN | LIBDECOR_WM_CAPABILITIES_MINIMIZE); - wl_list_insert(&ctx.frames, &ctx.frame->link); + wl_list_insert(&ctx.frames, &ctx.frame->frame_link); libdecor_frame_set_capabilities(ctx.frame, LIBDECOR_ACTION_MOVE | @@ -791,7 +790,7 @@ libdecor_configuration_get_content_size(struct libdecor_configuration *configura int left, right, top, bottom; /* Update window state for correct border size calculation */ - frame->window_state = configuration->window_state; + frame->frame_window_state = configuration->window_state; if (!libdecor_plugin_gtk_frame_get_border_size(frame, configuration, &left, &right, &top, &bottom)){ return false; } @@ -1085,7 +1084,7 @@ libdecor_frame_unref(struct libdecor_frame *frame){ frame->toplevel_decoration = NULL; } - wl_list_remove(&frame->link); + wl_list_remove(&frame->frame_link); if (frame->xdg_toplevel) xdg_toplevel_destroy(frame->xdg_toplevel); @@ -1124,8 +1123,8 @@ libdecor_frame_set_visibility(struct libdecor_frame *frame, : ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE); } - if (frame->content_width <= 0 || - frame->content_height <= 0) + if (frame->frame_content_width <= 0 || + frame->frame_content_height <= 0) return; /* enable/disable decorations that are managed by a plugin */ @@ -1138,7 +1137,7 @@ libdecor_frame_set_visibility(struct libdecor_frame *frame, libdecor_plugin_gtk_frame_free(frame); } - frame_set_window_geometry(frame, frame->content_width, frame->content_height); + frame_set_window_geometry(frame, frame->frame_content_width, frame->frame_content_height); libdecor_frame_toplevel_commit(frame); } @@ -1193,11 +1192,11 @@ notify_on_capability_change(struct libdecor_frame *frame, { struct libdecor_state *state; - if (frame->capabilities == old_capabilities) + if (frame->frame_capabilities == old_capabilities) return; - if (frame->content_width == 0 || - frame->content_height == 0) + if (frame->frame_content_width == 0 || + frame->frame_content_height == 0) return; libdecor_plugin_gtk_frame_property_changed(frame); @@ -1206,18 +1205,18 @@ notify_on_capability_change(struct libdecor_frame *frame, frame->interactive_limits = frame->state.content_limits; /* set fixed window size */ libdecor_frame_set_min_content_size(frame, - frame->content_width, - frame->content_height); + frame->frame_content_width, + frame->frame_content_height); libdecor_frame_set_max_content_size(frame, - frame->content_width, - frame->content_height); + frame->frame_content_width, + frame->frame_content_height); } else { /* restore old limits */ frame->state.content_limits = frame->interactive_limits; } - state = libdecor_state_new(frame->content_width, - frame->content_height); + state = libdecor_state_new(frame->frame_content_width, + frame->frame_content_height); libdecor_frame_commit(frame, state, NULL); libdecor_state_free(state); @@ -1228,8 +1227,8 @@ void libdecor_frame_set_capabilities(struct libdecor_frame *frame, enum libdecor_capabilities capabilities) { - const enum libdecor_capabilities old_capabilities = frame->capabilities; - frame->capabilities |= capabilities; + const enum libdecor_capabilities old_capabilities = frame->frame_capabilities; + frame->frame_capabilities |= capabilities; notify_on_capability_change(frame, old_capabilities); } @@ -1237,14 +1236,14 @@ void libdecor_frame_unset_capabilities(struct libdecor_frame *frame, enum libdecor_capabilities capabilities) { - const enum libdecor_capabilities old_capabilities = frame->capabilities; - frame->capabilities &= ~capabilities; + const enum libdecor_capabilities old_capabilities = frame->frame_capabilities; + frame->frame_capabilities &= ~capabilities; notify_on_capability_change(frame, old_capabilities); } bool libdecor_frame_has_capability(struct libdecor_frame *frame, enum libdecor_capabilities capability){ - return frame->capabilities & capability; + return frame->frame_capabilities & capability; } void @@ -1316,7 +1315,7 @@ libdecor_frame_get_max_content_size(const struct libdecor_frame *frame, int *con enum libdecor_capabilities libdecor_frame_get_capabilities(const struct libdecor_frame *frame){ - return frame->capabilities; + return frame->frame_capabilities; } enum xdg_toplevel_resize_edge @@ -1393,7 +1392,7 @@ libdecor_frame_unset_fullscreen(struct libdecor_frame *frame) bool libdecor_frame_is_floating(struct libdecor_frame *frame) { - return state_is_floating(frame->window_state); + return state_is_floating(frame->frame_window_state); } void @@ -1430,11 +1429,11 @@ libdecor_frame_apply_limits(struct libdecor_frame *frame, enum libdecor_window_s * configure event is received, we have to manually set the min/max * limits with the configured content size afterwards. */ if (!libdecor_frame_has_capability(frame, LIBDECOR_ACTION_RESIZE)) { - frame->state.content_limits.min_width = frame->content_width; - frame->state.content_limits.max_width = frame->content_width; + frame->state.content_limits.min_width = frame->frame_content_width; + frame->state.content_limits.max_width = frame->frame_content_width; - frame->state.content_limits.min_height = frame->content_height; - frame->state.content_limits.max_height = frame->content_height; + frame->state.content_limits.min_height = frame->frame_content_height; + frame->state.content_limits.max_height = frame->frame_content_height; } if (frame->state.content_limits.min_width > 0 && @@ -1474,8 +1473,8 @@ libdecor_frame_apply_limits(struct libdecor_frame *frame, enum libdecor_window_s static void libdecor_frame_apply_state(struct libdecor_frame *frame, struct libdecor_state *state){ - frame->content_width = state->content_width; - frame->content_height = state->content_height; + frame->frame_content_width = state->content_width; + frame->frame_content_height = state->content_height; libdecor_frame_apply_limits(frame, state->window_state); } @@ -1488,11 +1487,11 @@ void libdecor_frame_commit(struct libdecor_frame *frame, struct libdecor_state *state, struct libdecor_configuration *configuration){ if (configuration && configuration->has_window_state){ - frame->window_state = configuration->window_state; + frame->frame_window_state = configuration->window_state; state->window_state = configuration->window_state; } else{ - state->window_state = frame->window_state; + state->window_state = frame->frame_window_state; } libdecor_frame_apply_state(frame, state); @@ -1506,7 +1505,7 @@ libdecor_frame_commit(struct libdecor_frame *frame, struct libdecor_state *state libdecor_plugin_gtk_frame_free(frame); } - frame_set_window_geometry(frame, frame->content_width, frame->content_height); + frame_set_window_geometry(frame, frame->frame_content_width, frame->frame_content_height); if (configuration){ xdg_surface_ack_configure(frame->xdg_surface, configuration->serial); @@ -1548,17 +1547,17 @@ libdecor_frame_get_xdg_toplevel(struct libdecor_frame *frame){ int libdecor_frame_get_content_width(struct libdecor_frame *frame){ - return frame->content_width; + return frame->frame_content_width; } int libdecor_frame_get_content_height(struct libdecor_frame *frame){ - return frame->content_height; + return frame->frame_content_height; } enum libdecor_window_state libdecor_frame_get_window_state(struct libdecor_frame *frame){ - return frame->window_state; + return frame->frame_window_state; } enum libdecor_wm_capabilities @@ -1578,7 +1577,7 @@ const struct xdg_wm_base_listener xdg_wm_base_listener = { static void finish_init(void){ struct libdecor_frame *frame; - wl_list_for_each(frame, &ctx.frames, link){ + wl_list_for_each(frame, &ctx.frames, frame_link){ init_shell_surface(frame); } } @@ -2086,35 +2085,11 @@ own_output(struct wl_output *output) return own_proxy((struct wl_proxy *) output); } -static bool -moveable(struct libdecor_frame_gtk *frame_gtk) { - return libdecor_frame_has_capability(&frame_gtk->frame, - LIBDECOR_ACTION_MOVE); -} - -static bool -resizable(struct libdecor_frame_gtk *frame_gtk) { - return libdecor_frame_has_capability(&frame_gtk->frame, - LIBDECOR_ACTION_RESIZE); -} - -static bool -minimizable(struct libdecor_frame_gtk *frame_gtk) { - return libdecor_frame_has_capability(&frame_gtk->frame, - LIBDECOR_ACTION_MINIMIZE); -} - -static bool -closeable(struct libdecor_frame_gtk *frame_gtk) { - return libdecor_frame_has_capability(&frame_gtk->frame, - LIBDECOR_ACTION_CLOSE); -} - static void buffer_free(struct buffer *buffer); static void -draw_border_component(struct libdecor_frame_gtk *frame_gtk, +draw_border_component(struct libdecor_frame *frame, struct border_component *border_component, enum component component); @@ -2129,7 +2104,7 @@ libdecor_plugin_gtk_destroy(void) { struct seat *seat, *seat_tmp; struct output *output, *output_tmp; - struct libdecor_frame_gtk *frame, *frame_tmp; + struct libdecor_frame *frame, *frame_tmp; wl_list_for_each_safe(seat, seat_tmp, &ctx.seat_list, link) { struct cursor_output *cursor_output, *tmp; @@ -2164,8 +2139,8 @@ libdecor_plugin_gtk_destroy(void) } wl_list_for_each_safe(frame, frame_tmp, - &ctx.visible_frame_list, link) { - wl_list_remove(&frame->link); + &ctx.visible_frame_list, gtk_link) { + wl_list_remove(&frame->gtk_link); } if (ctx.wl_shm){ @@ -2225,7 +2200,7 @@ libdecor_plugin_gtk_set_handle_application_cursor(bool handle_cursor){ static void toggle_maximized(struct libdecor_frame *const frame) { - if (!resizable((struct libdecor_frame_gtk *)frame)) + if (!libdecor_frame_has_capability(frame, LIBDECOR_ACTION_RESIZE)) return; if (!(libdecor_frame_get_window_state(frame) & @@ -2341,30 +2316,27 @@ free_border_component(struct border_component *border_component) static void libdecor_plugin_gtk_frame_free(struct libdecor_frame *frame){ - struct libdecor_frame_gtk *frame_gtk = - (struct libdecor_frame_gtk *) frame; + g_clear_pointer (&frame->header, gtk_widget_destroy); + g_clear_pointer (&frame->window, gtk_widget_destroy); - g_clear_pointer (&frame_gtk->header, gtk_widget_destroy); - g_clear_pointer (&frame_gtk->window, gtk_widget_destroy); + free_border_component(&frame->headerbar); + free_border_component(&frame->shadow); + frame->shadow_showing = false; - free_border_component(&frame_gtk->headerbar); - free_border_component(&frame_gtk->shadow); - frame_gtk->shadow_showing = false; + g_clear_pointer (&frame->shadow_blur, cairo_surface_destroy); - g_clear_pointer (&frame_gtk->shadow_blur, cairo_surface_destroy); + g_clear_pointer (&frame->title, free); - g_clear_pointer (&frame_gtk->title, free); + frame->decoration_type = DECORATION_TYPE_NONE; - frame_gtk->decoration_type = DECORATION_TYPE_NONE; - - if (frame_gtk->link.next != NULL) - wl_list_remove(&frame_gtk->link); + if (frame->gtk_link.next != NULL) + wl_list_remove(&frame->gtk_link); } static bool -is_border_surfaces_showing(struct libdecor_frame_gtk *frame_gtk) +is_border_surfaces_showing(struct libdecor_frame *frame) { - return frame_gtk->shadow_showing; + return frame->shadow_showing; } static void @@ -2378,26 +2350,24 @@ hide_border_component(struct border_component *border_component) } static void -hide_border_surfaces(struct libdecor_frame_gtk *frame_gtk) +hide_border_surfaces(struct libdecor_frame *frame) { - hide_border_component(&frame_gtk->shadow); - frame_gtk->shadow_showing = false; + hide_border_component(&frame->shadow); + frame->shadow_showing = false; } static struct border_component * -get_component_for_surface(struct libdecor_frame_gtk *frame_gtk, - const struct wl_surface *surface) +get_component_for_surface(struct libdecor_frame *frame, const struct wl_surface *surface) { - if (frame_gtk->shadow.wl_surface == surface) - return &frame_gtk->shadow; - if (frame_gtk->headerbar.wl_surface == surface) - return &frame_gtk->headerbar; + if (frame->shadow.wl_surface == surface) + return &frame->shadow; + if (frame->headerbar.wl_surface == surface) + return &frame->headerbar; return NULL; } static bool -redraw_scale(struct libdecor_frame_gtk *frame_gtk, - struct border_component *cmpnt) +redraw_scale(struct libdecor_frame *frame, struct border_component *cmpnt) { struct surface_output *surface_output; int scale = 1; @@ -2410,9 +2380,9 @@ redraw_scale(struct libdecor_frame_gtk *frame_gtk, } if (scale != cmpnt->scale) { cmpnt->scale = scale; - if ((frame_gtk->decoration_type != DECORATION_TYPE_NONE) && - ((cmpnt->type != SHADOW) || is_border_surfaces_showing(frame_gtk))) { - draw_border_component(frame_gtk, cmpnt, cmpnt->type); + if ((frame->decoration_type != DECORATION_TYPE_NONE) && + ((cmpnt->type != SHADOW) || is_border_surfaces_showing(frame))) { + draw_border_component(frame, cmpnt, cmpnt->type); return true; } } @@ -2443,21 +2413,21 @@ surface_enter(void *data, struct wl_surface *wl_surface, struct wl_output *wl_output) { - struct libdecor_frame_gtk *frame_gtk = data; + struct libdecor_frame *frame = data; struct border_component *cmpnt; if (!(own_surface(wl_surface) && own_output(wl_output))) return; - cmpnt = get_component_for_surface(frame_gtk, wl_surface); + cmpnt = get_component_for_surface(frame, wl_surface); if (cmpnt == NULL) return; if (!add_surface_output(wl_output, &cmpnt->output_list)) return; - if (redraw_scale(frame_gtk, cmpnt)) - libdecor_frame_toplevel_commit(&frame_gtk->frame); + if (redraw_scale(frame, cmpnt)) + libdecor_frame_toplevel_commit(frame); } static bool @@ -2479,21 +2449,21 @@ surface_leave(void *data, struct wl_surface *wl_surface, struct wl_output *wl_output) { - struct libdecor_frame_gtk *frame_gtk = data; + struct libdecor_frame *frame = data; struct border_component *cmpnt; if (!(own_surface(wl_surface) && own_output(wl_output))) return; - cmpnt = get_component_for_surface(frame_gtk, wl_surface); + cmpnt = get_component_for_surface(frame, wl_surface); if (cmpnt == NULL) return; if (!remove_surface_output(&cmpnt->output_list, wl_output)) return; - if (redraw_scale(frame_gtk, cmpnt)) - libdecor_frame_toplevel_commit(&frame_gtk->frame); + if (redraw_scale(frame, cmpnt)) + libdecor_frame_toplevel_commit(frame); } static struct wl_surface_listener surface_listener = { @@ -2502,11 +2472,10 @@ static struct wl_surface_listener surface_listener = { }; static void -create_surface_subsurface_pair(struct libdecor_frame_gtk *frame_gtk, +create_surface_subsurface_pair(struct libdecor_frame *frame, struct wl_surface **out_wl_surface, struct wl_subsurface **out_wl_subsurface) { - struct libdecor_frame *frame = &frame_gtk->frame; struct wl_compositor *wl_compositor = ctx.wl_compositor; struct wl_surface *wl_surface; struct wl_surface *parent; @@ -2526,40 +2495,35 @@ create_surface_subsurface_pair(struct libdecor_frame_gtk *frame_gtk, } static void -ensure_component(struct libdecor_frame_gtk *frame_gtk, +ensure_component(struct libdecor_frame *frame, struct border_component *cmpnt) { if (!cmpnt->wl_surface) { wl_list_init(&cmpnt->output_list); cmpnt->scale = 1; - create_surface_subsurface_pair(frame_gtk, - &cmpnt->wl_surface, - &cmpnt->wl_subsurface); - wl_surface_add_listener(cmpnt->wl_surface, &surface_listener, - frame_gtk); + create_surface_subsurface_pair(frame, &cmpnt->wl_surface, &cmpnt->wl_subsurface); + wl_surface_add_listener(cmpnt->wl_surface, &surface_listener, frame); } } static void -ensure_border_surfaces(struct libdecor_frame_gtk *frame_gtk) -{ - frame_gtk->shadow.type = SHADOW; - frame_gtk->shadow.opaque = false; - ensure_component(frame_gtk, &frame_gtk->shadow); +ensure_border_surfaces(struct libdecor_frame *frame){ + frame->shadow.type = SHADOW; + frame->shadow.opaque = false; + ensure_component(frame, &frame->shadow); } static void -ensure_title_bar_surfaces(struct libdecor_frame_gtk *frame_gtk) -{ +ensure_title_bar_surfaces(struct libdecor_frame *frame){ GtkStyleContext *context_hdr; - frame_gtk->headerbar.type = HEADER; - frame_gtk->headerbar.opaque = false; - ensure_component(frame_gtk, &frame_gtk->headerbar); + frame->headerbar.type = HEADER; + frame->headerbar.opaque = false; + ensure_component(frame, &frame->headerbar); - if (frame_gtk->shadow.wl_surface) { - wl_subsurface_place_above(frame_gtk->headerbar.wl_subsurface, - frame_gtk->shadow.wl_surface); + if (frame->shadow.wl_surface) { + wl_subsurface_place_above(frame->headerbar.wl_subsurface, + frame->shadow.wl_surface); } /* create an offscreen window with a header bar */ @@ -2568,59 +2532,56 @@ ensure_title_bar_surfaces(struct libdecor_frame_gtk *frame_gtk) * after construction. So we just destroy and re-create them. */ /* avoid warning when restoring previously turned off decoration */ - if (GTK_IS_WIDGET(frame_gtk->header)) { - gtk_widget_destroy(frame_gtk->header); - frame_gtk->header = NULL; + if (GTK_IS_WIDGET(frame->header)) { + gtk_widget_destroy(frame->header); + frame->header = NULL; } /* avoid warning when restoring previously turned off decoration */ - if (GTK_IS_WIDGET(frame_gtk->window)) { - gtk_widget_destroy(frame_gtk->window); - frame_gtk->window = NULL; + if (GTK_IS_WIDGET(frame->window)) { + gtk_widget_destroy(frame->window); + frame->window = NULL; } - frame_gtk->window = gtk_offscreen_window_new(); - frame_gtk->header = gtk_header_bar_new(); + frame->window = gtk_offscreen_window_new(); + frame->header = gtk_header_bar_new(); - g_object_get(gtk_widget_get_settings(frame_gtk->window), + g_object_get(gtk_widget_get_settings(frame->window), "gtk-double-click-time", &ctx.double_click_time_ms, "gtk-dnd-drag-threshold", &ctx.drag_threshold, NULL); /* set as "default" decoration */ - g_object_set(frame_gtk->header, - "title", libdecor_frame_get_title(&frame_gtk->frame), + g_object_set(frame->header, + "title", libdecor_frame_get_title(frame), "has-subtitle", FALSE, "show-close-button", TRUE, NULL); - context_hdr = gtk_widget_get_style_context(frame_gtk->header); + context_hdr = gtk_widget_get_style_context(frame->header); gtk_style_context_add_class(context_hdr, GTK_STYLE_CLASS_TITLEBAR); gtk_style_context_add_class(context_hdr, "default-decoration"); - gtk_window_set_titlebar(GTK_WINDOW(frame_gtk->window), frame_gtk->header); - gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(frame_gtk->header), TRUE); + gtk_window_set_titlebar(GTK_WINDOW(frame->window), frame->header); + gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(frame->header), TRUE); - gtk_window_set_resizable(GTK_WINDOW(frame_gtk->window), resizable(frame_gtk)); + gtk_window_set_resizable(GTK_WINDOW(frame->window), libdecor_frame_has_capability(frame, LIBDECOR_ACTION_RESIZE)); } static void -calculate_component_size(struct libdecor_frame_gtk *frame_gtk, +calculate_component_size(struct libdecor_frame *frame, enum component component, int *component_x, int *component_y, int *component_width, int *component_height) { - struct libdecor_frame *frame = &frame_gtk->frame; int content_width, content_height; content_width = libdecor_frame_get_content_width(frame); content_height = libdecor_frame_get_content_height(frame); /* avoid warning when restoring previously turned off decoration */ - const int title_height = - GTK_IS_WIDGET(frame_gtk->header) - ? gtk_widget_get_allocated_height(frame_gtk->header) : 0; + const int title_height = GTK_IS_WIDGET(frame->header)?gtk_widget_get_allocated_height(frame->header):0; switch (component) { case NONE: @@ -2639,7 +2600,7 @@ calculate_component_size(struct libdecor_frame_gtk *frame_gtk, *component_x = 0; /* reuse product of function call above */ *component_y = - title_height; - *component_width = gtk_widget_get_allocated_width(frame_gtk->header); + *component_width = gtk_widget_get_allocated_width(frame->header); /* reuse product of function call above */ *component_height = title_height; return; @@ -2657,22 +2618,18 @@ array_append(enum header_element **array, size_t *n, enum header_element item) } static void -draw_header_background(struct libdecor_frame_gtk *frame_gtk, - cairo_t *cr) -{ +draw_header_background(struct libdecor_frame *frame, cairo_t *cr){ /* background */ GtkAllocation allocation; GtkStyleContext* style; - gtk_widget_get_allocation(GTK_WIDGET(frame_gtk->header), &allocation); - style = gtk_widget_get_style_context(frame_gtk->header); + gtk_widget_get_allocation(GTK_WIDGET(frame->header), &allocation); + style = gtk_widget_get_style_context(frame->header); gtk_render_background(style, cr, allocation.x, allocation.y, allocation.width, allocation.height); } static void -draw_header_title(struct libdecor_frame_gtk *frame_gtk, - cairo_surface_t *surface) -{ +draw_header_title(struct libdecor_frame *frame_gtk, cairo_surface_t *surface){ /* title */ GtkWidget *label; GtkAllocation allocation; @@ -2695,7 +2652,7 @@ draw_header_title(struct libdecor_frame_gtk *frame_gtk, } static void -draw_header_button(struct libdecor_frame_gtk *frame_gtk, +draw_header_button(struct libdecor_frame *frame, cairo_t *cr, cairo_surface_t *surface, enum header_element button_type, @@ -2728,7 +2685,7 @@ draw_header_button(struct libdecor_frame_gtk *frame_gtk, GtkBorder padding; - elem = find_widget_by_type(frame_gtk->header, button_type); + elem = find_widget_by_type(frame->header, button_type); button = elem.widget; if (!button) return; @@ -2739,9 +2696,9 @@ draw_header_button(struct libdecor_frame_gtk *frame_gtk, if (!(window_state & LIBDECOR_WINDOW_STATE_ACTIVE)) { style_state |= GTK_STATE_FLAG_BACKDROP; } - if (frame_gtk->hdr_focus.widget == button) { + if (frame->hdr_focus.widget == button) { style_state |= GTK_STATE_FLAG_PRELIGHT; - if (frame_gtk->hdr_focus.state & GTK_STATE_FLAG_ACTIVE) { + if (frame->hdr_focus.state & GTK_STATE_FLAG_ACTIVE) { style_state |= GTK_STATE_FLAG_ACTIVE; } } @@ -2836,44 +2793,41 @@ draw_header_button(struct libdecor_frame_gtk *frame_gtk, } static void -draw_header_buttons(struct libdecor_frame_gtk *frame_gtk, - cairo_t *cr, - cairo_surface_t *surface) -{ +draw_header_buttons(struct libdecor_frame *frame, cairo_t *cr, cairo_surface_t *surface){ /* buttons */ enum libdecor_window_state window_state; enum header_element *buttons = NULL; size_t nbuttons = 0; - window_state = libdecor_frame_get_window_state( - (struct libdecor_frame*)frame_gtk); + window_state = libdecor_frame_get_window_state(frame); /* set buttons by capability */ - if (minimizable(frame_gtk)) + if (libdecor_frame_has_capability(frame, LIBDECOR_ACTION_MINIMIZE)){ array_append(&buttons, &nbuttons, HEADER_MIN); - if (resizable(frame_gtk)) + } + if (libdecor_frame_has_capability(frame, LIBDECOR_ACTION_RESIZE)){ array_append(&buttons, &nbuttons, HEADER_MAX); - if (closeable(frame_gtk)) + } + if (libdecor_frame_has_capability(frame, LIBDECOR_ACTION_CLOSE)){ array_append(&buttons, &nbuttons, HEADER_CLOSE); + } for (size_t i = 0; i < nbuttons; i++) { - draw_header_button(frame_gtk, cr, surface, buttons[i], window_state); + draw_header_button(frame, cr, surface, buttons[i], window_state); } /* loop buttons */ free(buttons); } static void -draw_header(struct libdecor_frame_gtk *frame_gtk, - cairo_t *cr, - cairo_surface_t *surface) -{ - draw_header_background(frame_gtk, cr); - draw_header_title(frame_gtk, surface); - draw_header_buttons(frame_gtk, cr, surface); +draw_header(struct libdecor_frame *frame, + cairo_t *cr, cairo_surface_t *surface){ + draw_header_background(frame, cr); + draw_header_title(frame, surface); + draw_header_buttons(frame, cr, surface); } static void -draw_component_content(struct libdecor_frame_gtk *frame_gtk, +draw_component_content(struct libdecor_frame *frame, struct buffer *buffer, int component_width, int component_height, @@ -2885,13 +2839,10 @@ draw_component_content(struct libdecor_frame_gtk *frame_gtk, /* clear buffer */ memset(buffer->data, 0, buffer->data_size); - surface = cairo_image_surface_create_for_data( - buffer->data, CAIRO_FORMAT_ARGB32, + surface = cairo_image_surface_create_for_data(buffer->data, CAIRO_FORMAT_ARGB32, buffer->buffer_width, buffer->buffer_height, - cairo_format_stride_for_width( - CAIRO_FORMAT_ARGB32, - buffer->buffer_width) - ); + cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, + buffer->buffer_width)); cr = cairo_create(surface); @@ -2899,35 +2850,30 @@ draw_component_content(struct libdecor_frame_gtk *frame_gtk, /* background */ switch (component) { - case NONE: - break; - case SHADOW: - render_shadow(cr, - frame_gtk->shadow_blur, - -(int)SHADOW_MARGIN/2, - -(int)SHADOW_MARGIN/2, - buffer->width + SHADOW_MARGIN, - buffer->height + SHADOW_MARGIN, - 64, - 64); - break; - case HEADER: - draw_header(frame_gtk, cr, surface); - break; + case NONE: break; + + case SHADOW: { + render_shadow(cr, frame->shadow_blur, + -(int)SHADOW_MARGIN/2, -(int)SHADOW_MARGIN/2, + buffer->width + SHADOW_MARGIN, buffer->height + SHADOW_MARGIN, + 64, 64); + }break; + + case HEADER: { + draw_header(frame, cr, surface); + }break; } /* mask the toplevel surface */ if (component == SHADOW) { int component_x, component_y, component_width, component_height; - calculate_component_size(frame_gtk, component, + calculate_component_size(frame, component, &component_x, &component_y, &component_width, &component_height); cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR); cairo_rectangle(cr, -component_x, -component_y, - libdecor_frame_get_content_width( - &frame_gtk->frame), - libdecor_frame_get_content_height( - &frame_gtk->frame)); + libdecor_frame_get_content_width(frame), + libdecor_frame_get_content_height(frame)); cairo_fill(cr); } @@ -2936,17 +2882,17 @@ draw_component_content(struct libdecor_frame_gtk *frame_gtk, } static void -set_component_input_region(struct libdecor_frame_gtk *frame_gtk, +set_component_input_region(struct libdecor_frame *frame, struct border_component *border_component) { - if (border_component->type == SHADOW && frame_gtk->shadow_showing) { + if (border_component->type == SHADOW && frame->shadow_showing) { struct wl_region *input_region; int component_x; int component_y; int component_width; int component_height; - calculate_component_size(frame_gtk, border_component->type, + calculate_component_size(frame, border_component->type, &component_x, &component_y, &component_width, &component_height); @@ -2958,8 +2904,8 @@ set_component_input_region(struct libdecor_frame_gtk *frame_gtk, wl_region_add(input_region, 0, 0, component_width, component_height); wl_region_subtract(input_region, -component_x, -component_y, - libdecor_frame_get_content_width(&frame_gtk->frame), - libdecor_frame_get_content_height(&frame_gtk->frame)); + libdecor_frame_get_content_width(frame), + libdecor_frame_get_content_height(frame)); wl_surface_set_input_region(border_component->wl_surface, input_region); wl_region_destroy(input_region); @@ -2967,7 +2913,7 @@ set_component_input_region(struct libdecor_frame_gtk *frame_gtk, } static void -draw_border_component(struct libdecor_frame_gtk *frame_gtk, +draw_border_component(struct libdecor_frame *frame, struct border_component *border_component, enum component component) { @@ -2982,11 +2928,11 @@ draw_border_component(struct libdecor_frame_gtk *frame_gtk, if (border_component->wl_surface == NULL) return; - calculate_component_size(frame_gtk, component, + calculate_component_size(frame, component, &component_x, &component_y, &component_width, &component_height); - set_component_input_region(frame_gtk, border_component); + set_component_input_region(frame, border_component); old_buffer = border_component->buffer; if (old_buffer) { @@ -3006,7 +2952,7 @@ draw_border_component(struct libdecor_frame_gtk *frame_gtk, border_component->opaque, border_component->scale); - draw_component_content(frame_gtk, buffer, + draw_component_content(frame, buffer, component_width, component_height, component); @@ -3024,102 +2970,105 @@ draw_border_component(struct libdecor_frame_gtk *frame_gtk, } static void -draw_border(struct libdecor_frame_gtk *frame_gtk) +draw_border(struct libdecor_frame *frame) { - draw_border_component(frame_gtk, &frame_gtk->shadow, SHADOW); - frame_gtk->shadow_showing = true; + draw_border_component(frame, &frame->shadow, SHADOW); + frame->shadow_showing = true; } static void -draw_title_bar(struct libdecor_frame_gtk *frame_gtk) +draw_title_bar(struct libdecor_frame *frame) { - GtkAllocation allocation = {0, 0, frame_gtk->content_width, 0}; + GtkAllocation allocation = {0, 0, frame->gtk_content_width, 0}; enum libdecor_window_state state; GtkStyleContext *style; int pref_width; int current_min_w, current_min_h, current_max_w, current_max_h, W, H; - state = libdecor_frame_get_window_state((struct libdecor_frame*)frame_gtk); - style = gtk_widget_get_style_context(frame_gtk->window); + state = libdecor_frame_get_window_state(frame); + style = gtk_widget_get_style_context(frame->window); if (!(state & LIBDECOR_WINDOW_STATE_ACTIVE)) { - gtk_widget_set_state_flags(frame_gtk->window, GTK_STATE_FLAG_BACKDROP, true); + gtk_widget_set_state_flags(frame->window, GTK_STATE_FLAG_BACKDROP, true); } else { - gtk_widget_unset_state_flags(frame_gtk->window, GTK_STATE_FLAG_BACKDROP); + gtk_widget_unset_state_flags(frame->window, GTK_STATE_FLAG_BACKDROP); } - if (libdecor_frame_is_floating(&frame_gtk->frame)) { + if (libdecor_frame_is_floating(frame)) { gtk_style_context_remove_class(style, "maximized"); } else { gtk_style_context_add_class(style, "maximized"); } - gtk_widget_show_all(frame_gtk->window); + gtk_widget_show_all(frame->window); /* set default width, using an empty title to estimate its smallest admissible value */ - gtk_header_bar_set_title(GTK_HEADER_BAR(frame_gtk->header), ""); - gtk_widget_get_preferred_width(frame_gtk->header, NULL, &pref_width); - gtk_header_bar_set_title(GTK_HEADER_BAR(frame_gtk->header), - libdecor_frame_get_title(&frame_gtk->frame)); - libdecor_frame_get_min_content_size(&frame_gtk->frame, ¤t_min_w, ¤t_min_h); + gtk_header_bar_set_title(GTK_HEADER_BAR(frame->header), ""); + gtk_widget_get_preferred_width(frame->header, NULL, &pref_width); + gtk_header_bar_set_title(GTK_HEADER_BAR(frame->header), libdecor_frame_get_title(frame)); + libdecor_frame_get_min_content_size(frame, ¤t_min_w, ¤t_min_h); if (current_min_w < pref_width) { current_min_w = pref_width; - libdecor_frame_set_min_content_size(&frame_gtk->frame, current_min_w, current_min_h); + libdecor_frame_set_min_content_size(frame, current_min_w, current_min_h); } - libdecor_frame_get_max_content_size(&frame_gtk->frame, ¤t_max_w, ¤t_max_h); + libdecor_frame_get_max_content_size(frame, ¤t_max_w, ¤t_max_h); if (current_max_w && current_max_w < current_min_w) { - libdecor_frame_set_max_content_size(&frame_gtk->frame, current_min_w, current_max_h); + libdecor_frame_set_max_content_size(frame, current_min_w, current_max_h); } - W = libdecor_frame_get_content_width(&frame_gtk->frame); - H = libdecor_frame_get_content_height(&frame_gtk->frame); + W = libdecor_frame_get_content_width(frame); + H = libdecor_frame_get_content_height(frame); if (W < current_min_w) { W = current_min_w; struct libdecor_state *libdecor_state = libdecor_state_new(W, H); - libdecor_frame_commit(&frame_gtk->frame, libdecor_state, NULL); + libdecor_frame_commit(frame, libdecor_state, NULL); libdecor_state_free(libdecor_state); return; } /* set default height */ - gtk_widget_get_preferred_height(frame_gtk->header, NULL, &allocation.height); + gtk_widget_get_preferred_height(frame->header, NULL, &allocation.height); - gtk_widget_size_allocate(frame_gtk->header, &allocation); + gtk_widget_size_allocate(frame->header, &allocation); - draw_border_component(frame_gtk, &frame_gtk->headerbar, HEADER); + draw_border_component(frame, &frame->headerbar, HEADER); } static void -draw_decoration(struct libdecor_frame_gtk *frame_gtk) +draw_decoration(struct libdecor_frame *frame) { - switch (frame_gtk->decoration_type) { - case DECORATION_TYPE_NONE: - if (frame_gtk->link.next != NULL) - wl_list_remove(&frame_gtk->link); - if (is_border_surfaces_showing(frame_gtk)) - hide_border_surfaces(frame_gtk); - hide_border_component(&frame_gtk->headerbar); - break; + switch (frame->decoration_type) { + case DECORATION_TYPE_NONE: { + if (frame->gtk_link.next != NULL){ + wl_list_remove(&frame->gtk_link); + } + if (is_border_surfaces_showing(frame)){ + hide_border_surfaces(frame); + } + hide_border_component(&frame->headerbar); + }break; + case DECORATION_TYPE_ALL: { /* show borders */ - ensure_border_surfaces(frame_gtk); - draw_border(frame_gtk); + ensure_border_surfaces(frame); + draw_border(frame); /* show title bar */ - ensure_title_bar_surfaces(frame_gtk); - draw_title_bar(frame_gtk); + ensure_title_bar_surfaces(frame); + draw_title_bar(frame); /* link frame */ - if (frame_gtk->link.next == NULL){ - wl_list_insert(&ctx.visible_frame_list, &frame_gtk->link); + if (frame->gtk_link.next == NULL){ + wl_list_insert(&ctx.visible_frame_list, &frame->gtk_link); } }break; - case DECORATION_TYPE_TITLE_ONLY:{ + + case DECORATION_TYPE_TITLE_ONLY: { /* hide borders */ - if (is_border_surfaces_showing(frame_gtk)) - hide_border_surfaces(frame_gtk); + if (is_border_surfaces_showing(frame)) + hide_border_surfaces(frame); /* show title bar */ - ensure_title_bar_surfaces(frame_gtk); - draw_title_bar(frame_gtk); + ensure_title_bar_surfaces(frame); + draw_title_bar(frame); /* link frame */ - if (frame_gtk->link.next == NULL){ - wl_list_insert(&ctx.visible_frame_list, &frame_gtk->link); + if (frame->gtk_link.next == NULL){ + wl_list_insert(&ctx.visible_frame_list, &frame->gtk_link); } }break; } @@ -3147,8 +3096,6 @@ libdecor_plugin_gtk_frame_commit(struct libdecor_frame *frame, struct libdecor_state *state, struct libdecor_configuration *configuration) { - struct libdecor_frame_gtk *frame_gtk = - (struct libdecor_frame_gtk *) frame; enum libdecor_window_state old_window_state; enum libdecor_window_state new_window_state; int old_content_width, old_content_height; @@ -3156,15 +3103,15 @@ libdecor_plugin_gtk_frame_commit(struct libdecor_frame *frame, enum decoration_type old_decoration_type; enum decoration_type new_decoration_type; - old_window_state = frame_gtk->window_state; + old_window_state = frame->gtk_window_state; new_window_state = libdecor_frame_get_window_state(frame); - old_content_width = frame_gtk->content_width; - old_content_height = frame_gtk->content_height; + old_content_width = frame->gtk_content_width; + old_content_height = frame->gtk_content_height; new_content_width = libdecor_frame_get_content_width(frame); new_content_height = libdecor_frame_get_content_height(frame); - old_decoration_type = frame_gtk->decoration_type; + old_decoration_type = frame->decoration_type; new_decoration_type = window_state_to_decoration_type(new_window_state); if (old_decoration_type == new_decoration_type && @@ -3173,29 +3120,27 @@ libdecor_plugin_gtk_frame_commit(struct libdecor_frame *frame, old_window_state == new_window_state) return; - frame_gtk->content_width = new_content_width; - frame_gtk->content_height = new_content_height; - frame_gtk->window_state = new_window_state; - frame_gtk->decoration_type = new_decoration_type; + frame->gtk_content_width = new_content_width; + frame->gtk_content_height = new_content_height; + frame->gtk_window_state = new_window_state; + frame->decoration_type = new_decoration_type; - draw_decoration(frame_gtk); + draw_decoration(frame); /* set fixed window size */ - if (!resizable(frame_gtk)) { + if (!libdecor_frame_has_capability(frame, LIBDECOR_ACTION_RESIZE)){ libdecor_frame_set_min_content_size(frame, - frame_gtk->content_width, - frame_gtk->content_height); + frame->gtk_content_width, + frame->gtk_content_height); libdecor_frame_set_max_content_size(frame, - frame_gtk->content_width, - frame_gtk->content_height); + frame->gtk_content_width, + frame->gtk_content_height); } } static void libdecor_plugin_gtk_frame_property_changed(struct libdecor_frame *frame) { - struct libdecor_frame_gtk *frame_gtk = - (struct libdecor_frame_gtk *) frame; bool redraw_needed = false; const char *new_title; @@ -3203,44 +3148,42 @@ libdecor_plugin_gtk_frame_property_changed(struct libdecor_frame *frame) * when in SSD mode, the window title is not to be managed by GTK; * this is detected by frame_gtk->header not being a proper GTK widget */ - if (!GTK_IS_WIDGET(frame_gtk->header)) return; + if (!GTK_IS_WIDGET(frame->header)) return; new_title = libdecor_frame_get_title(frame); - if (!STREQL(frame_gtk->title, new_title)) + if (!STREQL(frame->title, new_title)) redraw_needed = true; - free(frame_gtk->title); - frame_gtk->title = NULL; - if (new_title) - frame_gtk->title = strdup(new_title); + free(frame->title); + frame->title = NULL; + if (new_title){ + frame->title = strdup(new_title); + } - if (frame_gtk->capabilities != libdecor_frame_get_capabilities(frame)) { - frame_gtk->capabilities = libdecor_frame_get_capabilities(frame); + if (frame->gtk_capabilities != libdecor_frame_get_capabilities(frame)){ + frame->gtk_capabilities = libdecor_frame_get_capabilities(frame); redraw_needed = true; } - if (redraw_needed) { - draw_decoration(frame_gtk); + if (redraw_needed){ + draw_decoration(frame); libdecor_frame_toplevel_commit(frame); } } static void -update_component_focus(struct libdecor_frame_gtk *frame_gtk, - struct wl_surface *surface, - struct seat *seat) -{ +update_component_focus(struct libdecor_frame *frame, struct wl_surface *surface, struct seat *seat){ static struct border_component *border_component; static struct border_component *child_component; static struct border_component *focus_component; - border_component = get_component_for_surface(frame_gtk, surface); + border_component = get_component_for_surface(frame, surface); focus_component = border_component; wl_list_for_each(child_component, &border_component->child_components, link) { int component_x = 0, component_y = 0; int component_width = 0, component_height = 0; - calculate_component_size(frame_gtk, child_component->type, + calculate_component_size(frame, child_component->type, &component_x, &component_y, &component_width, &component_height); if (seat->pointer_x >= component_x && @@ -3252,28 +3195,27 @@ update_component_focus(struct libdecor_frame_gtk *frame_gtk, } } - if (frame_gtk->grab) - frame_gtk->active = frame_gtk->grab; - else - frame_gtk->active = focus_component; - frame_gtk->focus = focus_component; - + if (frame->grab){ + frame->active = frame->grab; + } + else{ + frame->active = focus_component; + } + frame->focus = focus_component; } static void -sync_active_component(struct libdecor_frame_gtk *frame_gtk, - struct seat *seat) -{ +sync_active_component(struct libdecor_frame *frame, struct seat *seat){ struct border_component *old_active; if (!seat->pointer_focus) return; - old_active = frame_gtk->active; - update_component_focus(frame_gtk, seat->pointer_focus, seat); - if (old_active != frame_gtk->active) { - draw_decoration(frame_gtk); - libdecor_frame_toplevel_commit(&frame_gtk->frame); + old_active = frame->active; + update_component_focus(frame, seat->pointer_focus, seat); + if (old_active != frame->active) { + draw_decoration(frame); + libdecor_frame_toplevel_commit(frame); } if (update_local_cursor(seat)) @@ -3284,23 +3226,23 @@ static void synthesize_pointer_enter(struct seat *seat) { struct wl_surface *surface; - struct libdecor_frame_gtk *frame_gtk; + struct libdecor_frame *frame; surface = seat->pointer_focus; if (!surface || !own_surface(surface)) return; - frame_gtk = wl_surface_get_user_data(surface); - if (!frame_gtk) + frame = wl_surface_get_user_data(surface); + if (!frame) return; - update_component_focus(frame_gtk, seat->pointer_focus, seat); - frame_gtk->grab = NULL; + update_component_focus(frame, seat->pointer_focus, seat); + frame->grab = NULL; /* update decorations */ - if (frame_gtk->active) { - draw_decoration(frame_gtk); - libdecor_frame_toplevel_commit(&frame_gtk->frame); + if (frame->active) { + draw_decoration(frame); + libdecor_frame_toplevel_commit(frame); } update_local_cursor(seat); @@ -3310,29 +3252,27 @@ synthesize_pointer_enter(struct seat *seat) static void synthesize_pointer_leave(struct seat *seat){ struct wl_surface *surface; - struct libdecor_frame_gtk *frame_gtk; + struct libdecor_frame *frame; surface = seat->pointer_focus; if (!surface || !own_surface(surface)) return; - frame_gtk = wl_surface_get_user_data(surface); - if (!frame_gtk) + frame = wl_surface_get_user_data(surface); + if (!frame) return; - if (!frame_gtk->active) + if (!frame->active) return; - frame_gtk->active = NULL; - draw_decoration(frame_gtk); - libdecor_frame_toplevel_commit(&frame_gtk->frame); + frame->active = NULL; + draw_decoration(frame); + libdecor_frame_toplevel_commit(frame); update_local_cursor(seat); } static void libdecor_plugin_gtk_frame_popup_grab(struct libdecor_frame *frame, const char *seat_name){ - struct libdecor_frame_gtk *frame_gtk = - (struct libdecor_frame_gtk *) frame; struct seat *seat; wl_list_for_each(seat, &ctx.seat_list, link) { @@ -3351,10 +3291,7 @@ libdecor_plugin_gtk_frame_popup_grab(struct libdecor_frame *frame, const char *s static void libdecor_plugin_gtk_frame_popup_ungrab(struct libdecor_frame *frame, - const char *seat_name) -{ - struct libdecor_frame_gtk *frame_gtk = - (struct libdecor_frame_gtk *) frame; + const char *seat_name){ struct seat *seat; wl_list_for_each(seat, &ctx.seat_list, link) { @@ -3365,7 +3302,7 @@ libdecor_plugin_gtk_frame_popup_ungrab(struct libdecor_frame *frame, } seat->grabbed = false; synthesize_pointer_enter(seat); - sync_active_component(frame_gtk, seat); + sync_active_component(frame, seat); return; } } @@ -3382,8 +3319,6 @@ libdecor_plugin_gtk_frame_get_border_size(struct libdecor_frame *frame, int *top, int *bottom) { - struct libdecor_frame_gtk *frame_gtk = - (struct libdecor_frame_gtk *) frame; enum libdecor_window_state window_state; if (configuration) { @@ -3404,18 +3339,21 @@ libdecor_plugin_gtk_frame_get_border_size(struct libdecor_frame *frame, enum decoration_type type = window_state_to_decoration_type(window_state); switch (type) { - case DECORATION_TYPE_NONE: - *top = 0; - break; - case DECORATION_TYPE_ALL: - ensure_border_surfaces(frame_gtk); - G_GNUC_FALLTHROUGH; - case DECORATION_TYPE_TITLE_ONLY: - if (!frame_gtk->header) - ensure_title_bar_surfaces(frame_gtk); - gtk_widget_show_all(frame_gtk->window); - gtk_widget_get_preferred_height(frame_gtk->header, NULL, top); - break; + case DECORATION_TYPE_NONE: { + *top = 0; + }break; + + case DECORATION_TYPE_ALL:{ + ensure_border_surfaces(frame); + } G_GNUC_FALLTHROUGH; + + case DECORATION_TYPE_TITLE_ONLY: { + if (!frame->header){ + ensure_title_bar_surfaces(frame); + } + gtk_widget_show_all(frame->window); + gtk_widget_get_preferred_height(frame->header, NULL, top); + }break; } } @@ -3561,22 +3499,21 @@ update_local_cursor(struct seat *seat) if (!own_surface(seat->pointer_focus)) return false; - struct libdecor_frame_gtk *frame_gtk = - wl_surface_get_user_data(seat->pointer_focus); + struct libdecor_frame *frame = wl_surface_get_user_data(seat->pointer_focus); struct wl_cursor *wl_cursor = NULL; - if (!frame_gtk || !frame_gtk->active) { + if (!frame || !frame->active) { seat->current_cursor = seat->cursor_left_ptr; return false; } bool theme_updated = ensure_cursor_theme(seat); - if (frame_gtk->active->type == SHADOW && - is_border_surfaces_showing(frame_gtk) && - resizable(frame_gtk)) { + if (frame->active->type == SHADOW && + is_border_surfaces_showing(frame) && + libdecor_frame_has_capability(frame, LIBDECOR_ACTION_RESIZE)) { enum libdecor_resize_edge edge; - edge = component_edge(frame_gtk->active, + edge = component_edge(frame->active, seat->pointer_x, seat->pointer_y, SHADOW_MARGIN); @@ -3629,14 +3566,16 @@ pointer_enter(void *data, return; struct seat *seat = data; - struct libdecor_frame_gtk *frame_gtk = NULL; + struct libdecor_frame *frame = 0; - if (!own_surface(surface)) { + if (!own_surface(surface)){ struct seat *seat = wl_pointer_get_user_data(wl_pointer); - if (!ctx.handle_cursor) + if (!ctx.handle_cursor){ return; - } else { - frame_gtk = wl_surface_get_user_data(surface); + } + } + else{ + frame = wl_surface_get_user_data(surface); } ensure_cursor_surface(seat); @@ -3646,15 +3585,15 @@ pointer_enter(void *data, seat->serial = serial; seat->pointer_focus = surface; - if (!frame_gtk) + if (!frame) return; - frame_gtk->active = get_component_for_surface(frame_gtk, surface); + frame->active = get_component_for_surface(frame, surface); /* update decorations */ - if (frame_gtk->active) { - draw_decoration(frame_gtk); - libdecor_frame_toplevel_commit(&frame_gtk->frame); + if (frame->active) { + draw_decoration(frame); + libdecor_frame_toplevel_commit(frame); } update_local_cursor(seat); @@ -3668,7 +3607,7 @@ pointer_leave(void *data, struct wl_surface *surface) { struct seat *seat = data; - struct libdecor_frame_gtk *frame_gtk; + struct libdecor_frame *frame; seat->pointer_focus = NULL; @@ -3678,18 +3617,17 @@ pointer_leave(void *data, if (!own_surface(surface)) return; - frame_gtk = wl_surface_get_user_data(surface); + frame = wl_surface_get_user_data(surface); - if (frame_gtk) { - frame_gtk->titlebar_gesture.state = - TITLEBAR_GESTURE_STATE_INIT; - frame_gtk->titlebar_gesture.first_pressed_button = 0; + if (frame) { + frame->titlebar_gesture.state = TITLEBAR_GESTURE_STATE_INIT; + frame->titlebar_gesture.first_pressed_button = 0; - frame_gtk->active = NULL; - frame_gtk->hdr_focus.widget = NULL; - frame_gtk->hdr_focus.type = HEADER_NONE; - draw_decoration(frame_gtk); - libdecor_frame_toplevel_commit(&frame_gtk->frame); + frame->active = NULL; + frame->hdr_focus.widget = NULL; + frame->hdr_focus.type = HEADER_NONE; + draw_decoration(frame); + libdecor_frame_toplevel_commit(frame); update_local_cursor(seat); } } @@ -3702,7 +3640,7 @@ pointer_motion(void *data, wl_fixed_t surface_y) { struct seat *seat = data; - struct libdecor_frame_gtk *frame_gtk; + struct libdecor_frame *frame; struct header_element_data new_focus; if (!seat->pointer_focus || !own_surface(seat->pointer_focus)) @@ -3713,36 +3651,35 @@ pointer_motion(void *data, if (update_local_cursor(seat)) send_cursor(seat); - frame_gtk = wl_surface_get_user_data(seat->pointer_focus); + frame = wl_surface_get_user_data(seat->pointer_focus); /* avoid warnings after decoration has been turned off */ - if (!GTK_IS_WIDGET(frame_gtk->header) || frame_gtk->active->type != HEADER) { - frame_gtk->hdr_focus.type = HEADER_NONE; + if (!GTK_IS_WIDGET(frame->header) || frame->active->type != HEADER) { + frame->hdr_focus.type = HEADER_NONE; } - new_focus = get_header_focus(GTK_HEADER_BAR(frame_gtk->header), + new_focus = get_header_focus(GTK_HEADER_BAR(frame->header), seat->pointer_x, seat->pointer_y); /* only update if widget change so that we keep the state */ - if (frame_gtk->hdr_focus.widget != new_focus.widget) { - frame_gtk->hdr_focus = new_focus; + if (frame->hdr_focus.widget != new_focus.widget) { + frame->hdr_focus = new_focus; } - frame_gtk->hdr_focus.state |= GTK_STATE_FLAG_PRELIGHT; + frame->hdr_focus.state |= GTK_STATE_FLAG_PRELIGHT; /* redraw with updated button visuals */ - draw_title_bar(frame_gtk); - libdecor_frame_toplevel_commit(&frame_gtk->frame); + draw_title_bar(frame); + libdecor_frame_toplevel_commit(frame); - switch (frame_gtk->titlebar_gesture.state) { + switch (frame->titlebar_gesture.state) { case TITLEBAR_GESTURE_STATE_BUTTON_PRESSED: - if (frame_gtk->titlebar_gesture.first_pressed_button == BTN_LEFT) { + if (frame->titlebar_gesture.first_pressed_button == BTN_LEFT) { if (ABS ((double) seat->pointer_x - - (double) frame_gtk->titlebar_gesture.pressed_x) > + (double) frame->titlebar_gesture.pressed_x) > ctx.drag_threshold || ABS ((double) seat->pointer_y - - (double) frame_gtk->titlebar_gesture.pressed_y) > + (double) frame->titlebar_gesture.pressed_y) > ctx.drag_threshold) { - libdecor_frame_move(&frame_gtk->frame, - seat->wl_seat, - frame_gtk->titlebar_gesture.pressed_serial); + libdecor_frame_move(frame, seat->wl_seat, + frame->titlebar_gesture.pressed_serial); } } case TITLEBAR_GESTURE_STATE_INIT: @@ -3753,175 +3690,152 @@ pointer_motion(void *data, } static void -handle_button_on_shadow(struct libdecor_frame_gtk *frame_gtk, +handle_button_on_shadow(struct libdecor_frame *frame, struct seat *seat, uint32_t serial, uint32_t time, uint32_t button, - uint32_t state) -{ + uint32_t state){ enum libdecor_resize_edge edge = LIBDECOR_RESIZE_EDGE_NONE; - - edge = component_edge(frame_gtk->active, - seat->pointer_x, - seat->pointer_y, - SHADOW_MARGIN); - - if (edge != LIBDECOR_RESIZE_EDGE_NONE && resizable(frame_gtk)) { - libdecor_frame_resize(&frame_gtk->frame, - seat->wl_seat, - serial, - edge); + edge = component_edge(frame->active, seat->pointer_x, seat->pointer_y, SHADOW_MARGIN); + if (edge != LIBDECOR_RESIZE_EDGE_NONE && + libdecor_frame_has_capability(frame, LIBDECOR_ACTION_RESIZE)) { + libdecor_frame_resize(frame, seat->wl_seat, serial, edge); } } static void -handle_titlebar_gesture(struct libdecor_frame_gtk *frame_gtk, +handle_titlebar_gesture(struct libdecor_frame *frame, struct seat *seat, uint32_t serial, enum titlebar_gesture gesture) { switch (gesture) { - case TITLEBAR_GESTURE_DOUBLE_CLICK: - toggle_maximized(&frame_gtk->frame); - break; - case TITLEBAR_GESTURE_MIDDLE_CLICK: - break; - case TITLEBAR_GESTURE_RIGHT_CLICK: - { - const int title_height = gtk_widget_get_allocated_height(frame_gtk->header); - libdecor_frame_show_window_menu(&frame_gtk->frame, - seat->wl_seat, - serial, - seat->pointer_x, - seat->pointer_y - -title_height); - } - break; + case TITLEBAR_GESTURE_DOUBLE_CLICK: { + toggle_maximized(frame); + }break; + + case TITLEBAR_GESTURE_MIDDLE_CLICK: break; + + case TITLEBAR_GESTURE_RIGHT_CLICK: { + const int title_height = gtk_widget_get_allocated_height(frame->header); + libdecor_frame_show_window_menu(frame, seat->wl_seat, serial, + seat->pointer_x, seat->pointer_y -title_height); + }break; } } static void -handle_button_on_header(struct libdecor_frame_gtk *frame_gtk, - struct seat *seat, - uint32_t serial, - uint32_t time, - uint32_t button, - uint32_t state) -{ - switch (frame_gtk->titlebar_gesture.state) { - case TITLEBAR_GESTURE_STATE_INIT: - if (state != WL_POINTER_BUTTON_STATE_PRESSED) - return; - - if (button == BTN_RIGHT) { - handle_titlebar_gesture(frame_gtk, - seat, - serial, - TITLEBAR_GESTURE_RIGHT_CLICK); - frame_gtk->titlebar_gesture.state = - TITLEBAR_GESTURE_STATE_CONSUMED; - } else { - if (button == BTN_LEFT && - frame_gtk->titlebar_gesture.first_pressed_button == BTN_LEFT && - time - frame_gtk->titlebar_gesture.first_pressed_time < - (uint32_t) ctx.double_click_time_ms) { - handle_titlebar_gesture(frame_gtk, - seat, - serial, - TITLEBAR_GESTURE_DOUBLE_CLICK); - frame_gtk->titlebar_gesture.state = - TITLEBAR_GESTURE_STATE_CONSUMED; - } else { - frame_gtk->titlebar_gesture.first_pressed_button = button; - frame_gtk->titlebar_gesture.first_pressed_time = time; - frame_gtk->titlebar_gesture.pressed_x = seat->pointer_x; - frame_gtk->titlebar_gesture.pressed_y = seat->pointer_y; - frame_gtk->titlebar_gesture.pressed_serial = serial; - frame_gtk->titlebar_gesture.state = - TITLEBAR_GESTURE_STATE_BUTTON_PRESSED; - } - } - - frame_gtk->titlebar_gesture.button_pressed_count = 1; - - switch (frame_gtk->hdr_focus.type) { - case HEADER_MIN: - case HEADER_MAX: - case HEADER_CLOSE: - frame_gtk->hdr_focus.state |= GTK_STATE_FLAG_ACTIVE; - draw_title_bar(frame_gtk); - libdecor_frame_toplevel_commit(&frame_gtk->frame); - break; - default: - break; - } - - break; - case TITLEBAR_GESTURE_STATE_BUTTON_PRESSED: - if (state == WL_POINTER_BUTTON_STATE_PRESSED) { - frame_gtk->titlebar_gesture.state = - TITLEBAR_GESTURE_STATE_DISCARDED; - frame_gtk->titlebar_gesture.button_pressed_count++; - } else { - frame_gtk->titlebar_gesture.button_pressed_count--; +handle_button_on_header(struct libdecor_frame *frame, struct seat *seat, uint32_t serial, + uint32_t time, uint32_t button, uint32_t state){ + switch (frame->titlebar_gesture.state){ + case TITLEBAR_GESTURE_STATE_INIT: { + if (state != WL_POINTER_BUTTON_STATE_PRESSED) + return; - if (frame_gtk->titlebar_gesture.button_pressed_count == 0) { - frame_gtk->titlebar_gesture.state = - TITLEBAR_GESTURE_STATE_INIT; - if (frame_gtk->titlebar_gesture.first_pressed_button == button && - button == BTN_LEFT) { - libdecor_frame_ref(&frame_gtk->frame); - switch (frame_gtk->hdr_focus.type) { - case HEADER_MIN: - if (minimizable(frame_gtk)) - libdecor_frame_set_minimized( - &frame_gtk->frame); - break; - case HEADER_MAX: - toggle_maximized(&frame_gtk->frame); - break; - case HEADER_CLOSE: - if (closeable(frame_gtk)) { - libdecor_frame_close( - &frame_gtk->frame); - seat->pointer_focus = NULL; + if (button == BTN_RIGHT){ + handle_titlebar_gesture(frame, seat, serial, TITLEBAR_GESTURE_RIGHT_CLICK); + frame->titlebar_gesture.state = TITLEBAR_GESTURE_STATE_CONSUMED; + } + else{ + if (button == BTN_LEFT && + frame->titlebar_gesture.first_pressed_button == BTN_LEFT && + time - frame->titlebar_gesture.first_pressed_time < + (uint32_t) ctx.double_click_time_ms){ + handle_titlebar_gesture(frame, seat, serial, TITLEBAR_GESTURE_DOUBLE_CLICK); + frame->titlebar_gesture.state = TITLEBAR_GESTURE_STATE_CONSUMED; + } + else{ + frame->titlebar_gesture.first_pressed_button = button; + frame->titlebar_gesture.first_pressed_time = time; + frame->titlebar_gesture.pressed_x = seat->pointer_x; + frame->titlebar_gesture.pressed_y = seat->pointer_y; + frame->titlebar_gesture.pressed_serial = serial; + frame->titlebar_gesture.state = TITLEBAR_GESTURE_STATE_BUTTON_PRESSED; + } + } + + frame->titlebar_gesture.button_pressed_count = 1; + + switch (frame->hdr_focus.type){ + case HEADER_MIN: + case HEADER_MAX: + case HEADER_CLOSE: { + frame->hdr_focus.state |= GTK_STATE_FLAG_ACTIVE; + draw_title_bar(frame); + libdecor_frame_toplevel_commit(frame); + }break; + + default: break; + } + }break; + + case TITLEBAR_GESTURE_STATE_BUTTON_PRESSED: { + if (state == WL_POINTER_BUTTON_STATE_PRESSED) { + frame->titlebar_gesture.state = TITLEBAR_GESTURE_STATE_DISCARDED; + frame->titlebar_gesture.button_pressed_count++; + } + else{ + frame->titlebar_gesture.button_pressed_count--; + + if (frame->titlebar_gesture.button_pressed_count == 0) { + frame->titlebar_gesture.state = TITLEBAR_GESTURE_STATE_INIT; + if (frame->titlebar_gesture.first_pressed_button == button && + button == BTN_LEFT) { + libdecor_frame_ref(frame); + switch (frame->hdr_focus.type) { + case HEADER_MIN: { + if (libdecor_frame_has_capability(frame, LIBDECOR_ACTION_MINIMIZE)){ + libdecor_frame_set_minimized(frame); + } + }break; + + case HEADER_MAX: { + toggle_maximized(frame); + }break; + + case HEADER_CLOSE: { + if (libdecor_frame_has_capability(frame, LIBDECOR_ACTION_CLOSE)){ + libdecor_frame_close(frame); + seat->pointer_focus = NULL; + } + }break; + + default: break; } - break; - default: - break; + + frame->hdr_focus.state &= ~GTK_STATE_FLAG_ACTIVE; + if (GTK_IS_WIDGET(frame->header)) { + draw_title_bar(frame); + libdecor_frame_toplevel_commit(frame); + } + libdecor_frame_unref(frame); } - - frame_gtk->hdr_focus.state &= ~GTK_STATE_FLAG_ACTIVE; - if (GTK_IS_WIDGET(frame_gtk->header)) { - draw_title_bar(frame_gtk); - libdecor_frame_toplevel_commit(&frame_gtk->frame); + } + else{ + frame->hdr_focus.state &= ~GTK_STATE_FLAG_ACTIVE; + if (GTK_IS_WIDGET(frame->header)) { + draw_title_bar(frame); + libdecor_frame_toplevel_commit(frame); } - libdecor_frame_unref(&frame_gtk->frame); - } - } else { - frame_gtk->hdr_focus.state &= ~GTK_STATE_FLAG_ACTIVE; - if (GTK_IS_WIDGET(frame_gtk->header)) { - draw_title_bar(frame_gtk); - libdecor_frame_toplevel_commit(&frame_gtk->frame); } + } - - } - break; + }break; + case TITLEBAR_GESTURE_STATE_CONSUMED: - case TITLEBAR_GESTURE_STATE_DISCARDED: - if (state == WL_POINTER_BUTTON_STATE_PRESSED) { - frame_gtk->titlebar_gesture.button_pressed_count++; - } else { - frame_gtk->titlebar_gesture.button_pressed_count--; - if (frame_gtk->titlebar_gesture.button_pressed_count == 0) { - frame_gtk->titlebar_gesture.state = - TITLEBAR_GESTURE_STATE_INIT; - frame_gtk->titlebar_gesture.first_pressed_button = 0; + case TITLEBAR_GESTURE_STATE_DISCARDED: { + if (state == WL_POINTER_BUTTON_STATE_PRESSED){ + frame->titlebar_gesture.button_pressed_count++; } - } - break; + else{ + frame->titlebar_gesture.button_pressed_count--; + if (frame->titlebar_gesture.button_pressed_count == 0) { + frame->titlebar_gesture.state = TITLEBAR_GESTURE_STATE_INIT; + frame->titlebar_gesture.first_pressed_button = 0; + } + } + }break; } } @@ -3934,24 +3848,27 @@ pointer_button(void *data, uint32_t state) { struct seat *seat = data; - struct libdecor_frame_gtk *frame_gtk; + struct libdecor_frame *frame; if (!seat->pointer_focus || !own_surface(seat->pointer_focus)) return; - frame_gtk = wl_surface_get_user_data(seat->pointer_focus); - if (!frame_gtk) + frame = wl_surface_get_user_data(seat->pointer_focus); + if (!frame) return; - switch (frame_gtk->active->type) { + switch (frame->active->type) { case SHADOW: - handle_button_on_shadow (frame_gtk, seat, serial, time, button, state); - break; + { + handle_button_on_shadow(frame, seat, serial, time, button, state); + }break; + case HEADER: - handle_button_on_header (frame_gtk, seat, serial, time, button, state); - break; - default: - break; + { + handle_button_on_header(frame, seat, serial, time, button, state); + }break; + + default: break; } } @@ -3973,26 +3890,23 @@ const struct wl_pointer_listener pointer_listener = { }; static void -update_touch_focus(struct seat *seat, - struct libdecor_frame_gtk *frame_gtk, - wl_fixed_t x, - wl_fixed_t y) -{ +update_touch_focus(struct seat *seat, struct libdecor_frame *frame, + wl_fixed_t x, wl_fixed_t y){ /* avoid warnings after decoration has been turned off */ - if (GTK_IS_WIDGET(frame_gtk->header) && frame_gtk->touch_active->type == HEADER) { - struct header_element_data new_focus = get_header_focus( - GTK_HEADER_BAR(frame_gtk->header), + if (GTK_IS_WIDGET(frame->header) && frame->touch_active->type == HEADER){ + struct header_element_data new_focus = get_header_focus(GTK_HEADER_BAR(frame->header), wl_fixed_to_int(x), wl_fixed_to_int(y)); /* only update if widget change so that we keep the state */ - if (frame_gtk->hdr_focus.widget != new_focus.widget) { - frame_gtk->hdr_focus = new_focus; + if (frame->hdr_focus.widget != new_focus.widget){ + frame->hdr_focus = new_focus; } - frame_gtk->hdr_focus.state |= GTK_STATE_FLAG_PRELIGHT; + frame->hdr_focus.state |= GTK_STATE_FLAG_PRELIGHT; /* redraw with updated button visuals */ - draw_title_bar(frame_gtk); - libdecor_frame_toplevel_commit(&frame_gtk->frame); - } else { - frame_gtk->hdr_focus.type = HEADER_NONE; + draw_title_bar(frame); + libdecor_frame_toplevel_commit(frame); + } + else{ + frame->hdr_focus.type = HEADER_NONE; } } @@ -4007,54 +3921,52 @@ touch_down(void *data, wl_fixed_t y) { struct seat *seat = data; - struct libdecor_frame_gtk *frame_gtk; + struct libdecor_frame *frame; if (!surface || !own_surface(surface)) return; - frame_gtk = wl_surface_get_user_data(surface); - if (!frame_gtk) + frame = wl_surface_get_user_data(surface); + if (!frame) return; seat->touch_focus = surface; - frame_gtk->touch_active = get_component_for_surface(frame_gtk, surface); + frame->touch_active = get_component_for_surface(frame, surface); - if (!frame_gtk->touch_active) + if (!frame->touch_active) return; - update_touch_focus(seat, frame_gtk, x, y); + update_touch_focus(seat, frame, x, y); /* update decorations */ - draw_decoration(frame_gtk); - libdecor_frame_toplevel_commit(&frame_gtk->frame); + draw_decoration(frame); + libdecor_frame_toplevel_commit(frame); enum libdecor_resize_edge edge = LIBDECOR_RESIZE_EDGE_NONE; - switch (frame_gtk->touch_active->type) { + switch (frame->touch_active->type) { case SHADOW: { - edge = component_edge(frame_gtk->touch_active, + edge = component_edge(frame->touch_active, wl_fixed_to_int(x), wl_fixed_to_int(y), SHADOW_MARGIN); }break; case HEADER: { - switch (frame_gtk->hdr_focus.type){ + switch (frame->hdr_focus.type){ case HEADER_MIN: case HEADER_MAX: case HEADER_CLOSE: { - frame_gtk->hdr_focus.state |= GTK_STATE_FLAG_ACTIVE; - draw_title_bar(frame_gtk); - libdecor_frame_toplevel_commit(&frame_gtk->frame); + frame->hdr_focus.state |= GTK_STATE_FLAG_ACTIVE; + draw_title_bar(frame); + libdecor_frame_toplevel_commit(frame); }break; default: { if (time - seat->touch_down_time_stamp < (uint32_t)ctx.double_click_time_ms) { - toggle_maximized(&frame_gtk->frame); + toggle_maximized(frame); } - else if (moveable(frame_gtk)) { + else if (libdecor_frame_has_capability(frame, LIBDECOR_ACTION_MOVE)){ seat->touch_down_time_stamp = time; - libdecor_frame_move(&frame_gtk->frame, - seat->wl_seat, - serial); + libdecor_frame_move(frame, seat->wl_seat, serial); } }break; } @@ -4063,104 +3975,88 @@ touch_down(void *data, default: break; } if (edge != LIBDECOR_RESIZE_EDGE_NONE && - resizable(frame_gtk)) { - libdecor_frame_resize( - &frame_gtk->frame, - seat->wl_seat, - serial, - edge); + libdecor_frame_has_capability(frame, LIBDECOR_ACTION_RESIZE)) { + libdecor_frame_resize(frame, seat->wl_seat, serial, edge); } } static void -touch_up(void *data, - struct wl_touch *wl_touch, - uint32_t serial, - uint32_t time, - int32_t id) -{ +touch_up(void *data, struct wl_touch *wl_touch, uint32_t serial, + uint32_t time, int32_t id){ struct seat *seat = data; - struct libdecor_frame_gtk *frame_gtk; + struct libdecor_frame *frame; if (!seat->touch_focus || !own_surface(seat->touch_focus)) return; - frame_gtk = wl_surface_get_user_data(seat->touch_focus); - if (!frame_gtk) + frame = wl_surface_get_user_data(seat->touch_focus); + if (!frame) return; - if (!frame_gtk->touch_active) + if (!frame->touch_active) return; - switch (frame_gtk->touch_active->type) { + switch (frame->touch_active->type) { case HEADER: - libdecor_frame_ref(&frame_gtk->frame); - switch (frame_gtk->hdr_focus.type) { - case HEADER_MIN: - if (minimizable(frame_gtk)) { - libdecor_frame_set_minimized( - &frame_gtk->frame); - } - break; - case HEADER_MAX: - toggle_maximized(&frame_gtk->frame); - break; - case HEADER_CLOSE: - if (closeable(frame_gtk)) { - libdecor_frame_close( - &frame_gtk->frame); - seat->touch_focus = NULL; - } - break; - default: - break; + libdecor_frame_ref(frame); + switch (frame->hdr_focus.type) { + case HEADER_MIN: { + if (libdecor_frame_has_capability(frame, LIBDECOR_ACTION_MINIMIZE)) { + libdecor_frame_set_minimized(frame); + } + }break; + + case HEADER_MAX: { + toggle_maximized(frame); + }break; + + case HEADER_CLOSE: { + if (libdecor_frame_has_capability(frame, LIBDECOR_ACTION_CLOSE)){ + libdecor_frame_close(frame); + seat->touch_focus = NULL; + } + }break; + + default: break; } /* unset active/clicked state once released */ - frame_gtk->hdr_focus.state &= ~GTK_STATE_FLAG_ACTIVE; - if (GTK_IS_WIDGET(frame_gtk->header)) { - draw_title_bar(frame_gtk); - libdecor_frame_toplevel_commit(&frame_gtk->frame); + frame->hdr_focus.state &= ~GTK_STATE_FLAG_ACTIVE; + if (GTK_IS_WIDGET(frame->header)) { + draw_title_bar(frame); + libdecor_frame_toplevel_commit(frame); } - libdecor_frame_unref(&frame_gtk->frame); + libdecor_frame_unref(frame); break; default: break; } seat->touch_focus = NULL; - frame_gtk->touch_active = NULL; - frame_gtk->hdr_focus.widget = NULL; - frame_gtk->hdr_focus.type = HEADER_NONE; - draw_decoration(frame_gtk); - libdecor_frame_toplevel_commit(&frame_gtk->frame); + frame->touch_active = NULL; + frame->hdr_focus.widget = NULL; + frame->hdr_focus.type = HEADER_NONE; + draw_decoration(frame); + libdecor_frame_toplevel_commit(frame); } static void -touch_motion(void *data, - struct wl_touch *wl_touch, - uint32_t time, - int32_t id, - wl_fixed_t x, - wl_fixed_t y) -{ +touch_motion(void *data, struct wl_touch *wl_touch, uint32_t time, + int32_t id, wl_fixed_t x, wl_fixed_t y){ struct seat *seat = data; - struct libdecor_frame_gtk *frame_gtk; + struct libdecor_frame *frame; if (!seat->touch_focus || !own_surface(seat->touch_focus)) return; - frame_gtk = wl_surface_get_user_data(seat->touch_focus); - if (!frame_gtk) + frame = wl_surface_get_user_data(seat->touch_focus); + if (!frame) return; - update_touch_focus(seat, frame_gtk, x, y); + update_touch_focus(seat, frame, x, y); } static void -touch_frame(void *data, - struct wl_touch *wl_touch) -{ -} +touch_frame(void *data, struct wl_touch *wl_touch){} static void touch_cancel(void *data, @@ -4205,14 +4101,14 @@ output_done(void *data, struct wl_output *wl_output) { struct output *output = data; - struct libdecor_frame_gtk *frame_gtk; + struct libdecor_frame *frame; struct seat *seat; - wl_list_for_each(frame_gtk, &ctx.visible_frame_list, link){ + wl_list_for_each(frame, &ctx.visible_frame_list, gtk_link){ bool updated = false; - updated |= redraw_scale(frame_gtk, &frame_gtk->shadow); + updated |= redraw_scale(frame, &frame->shadow); if (updated) - libdecor_frame_toplevel_commit(&frame_gtk->frame); + libdecor_frame_toplevel_commit(frame); } wl_list_for_each(seat, &ctx.seat_list, link) { if (update_local_cursor(seat)) @@ -4253,11 +4149,11 @@ remove_surface_outputs(struct border_component *cmpnt, const struct output *outp static void output_removed(struct output *output) { - struct libdecor_frame_gtk *frame_gtk; + struct libdecor_frame *frame; struct seat *seat; - wl_list_for_each(frame_gtk, &ctx.visible_frame_list, link) { - remove_surface_outputs(&frame_gtk->shadow, output); + wl_list_for_each(frame, &ctx.visible_frame_list, gtk_link) { + remove_surface_outputs(&frame->shadow, output); } wl_list_for_each(seat, &ctx.seat_list, link) { struct cursor_output *cursor_output; diff --git a/digesting_libdecor.h b/digesting_libdecor.h index 5d11f27..3daf7bf 100644 --- a/digesting_libdecor.h +++ b/digesting_libdecor.h @@ -122,7 +122,60 @@ struct libdecor_limits { int max_height; }; +enum header_element { + HEADER_NONE, + HEADER_FULL, /* entire header bar */ + HEADER_TITLE, /* label */ + HEADER_MIN, + HEADER_MAX, + HEADER_CLOSE, +}; + +enum titlebar_gesture_state { + TITLEBAR_GESTURE_STATE_INIT, + TITLEBAR_GESTURE_STATE_BUTTON_PRESSED, + TITLEBAR_GESTURE_STATE_CONSUMED, + TITLEBAR_GESTURE_STATE_DISCARDED, +}; + +struct header_element_data { + const char *name; + enum header_element type; + /* pointer to button or NULL if not found*/ + GtkWidget *widget; + GtkStateFlags state; +}; + +enum decoration_type { + DECORATION_TYPE_NONE, + DECORATION_TYPE_ALL, + DECORATION_TYPE_TITLE_ONLY +}; + +enum component { + NONE = 0, + SHADOW, + HEADER, +}; + +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; @@ -144,15 +197,15 @@ struct libdecor_frame { struct libdecor_configuration *pending_configuration; - int content_width; - int content_height; + int frame_content_width; + int frame_content_height; - enum libdecor_window_state window_state; + enum libdecor_window_state frame_window_state; bool has_decoration_mode; enum zxdg_toplevel_decoration_v1_mode decoration_mode; - enum libdecor_capabilities capabilities; + enum libdecor_capabilities frame_capabilities; enum libdecor_wm_capabilities wm_capabilities; @@ -161,7 +214,46 @@ struct libdecor_frame { bool visible; - struct wl_list link; + //struct libdecor_frame_gtk; + int gtk_content_width; + int gtk_content_height; + + enum libdecor_window_state gtk_window_state; + + enum decoration_type decoration_type; + + char *title; + + 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" @@ -206,42 +298,6 @@ static const char *cursor_names[] = { "bottom_right_corner" }; -enum header_element { - HEADER_NONE, - HEADER_FULL, /* entire header bar */ - HEADER_TITLE, /* label */ - HEADER_MIN, - HEADER_MAX, - HEADER_CLOSE, -}; - -enum titlebar_gesture_state { - TITLEBAR_GESTURE_STATE_INIT, - TITLEBAR_GESTURE_STATE_BUTTON_PRESSED, - TITLEBAR_GESTURE_STATE_CONSUMED, - TITLEBAR_GESTURE_STATE_DISCARDED, -}; - -struct header_element_data { - const char *name; - enum header_element type; - /* pointer to button or NULL if not found*/ - GtkWidget *widget; - GtkStateFlags state; -}; - -enum decoration_type { - DECORATION_TYPE_NONE, - DECORATION_TYPE_ALL, - DECORATION_TYPE_TITLE_ONLY -}; - -enum component { - NONE = 0, - SHADOW, - HEADER, -}; - struct seat { char *name; @@ -295,19 +351,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; @@ -318,50 +361,6 @@ struct cursor_output { struct wl_list link; }; -struct libdecor_frame_gtk { - struct libdecor_frame frame; - - 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; -}; - enum titlebar_gesture { TITLEBAR_GESTURE_DOUBLE_CLICK, TITLEBAR_GESTURE_MIDDLE_CLICK,