fix(electrobun): clear min-size in C before begin_resize_drag + configure logging

This commit is contained in:
Hibryda 2026-03-25 17:51:57 +01:00
parent 683013d704
commit 7af94fd4bd
2 changed files with 44 additions and 5 deletions

View file

@ -47,6 +47,26 @@ static GdkWindowEdge edge_for_position(int win_w, int win_h, double x, double y)
* If click is in the 8px border zone: start resize drag and consume the event.
* If click is in the interior: return FALSE to let WebKit handle it.
*/
/**
* Clear min-size on the entire widget tree so shrinking is allowed.
* set_size_request(1,1) forces a 1x1 minimum, overriding preferred size.
*/
static void clear_min_size(GtkWidget *widget, int depth)
{
if (!widget || depth > 10) return;
gtk_widget_set_size_request(widget, 1, 1);
if (GTK_IS_BIN(widget)) {
GtkWidget *child = gtk_bin_get_child(GTK_BIN(widget));
if (child) clear_min_size(child, depth + 1);
}
if (GTK_IS_CONTAINER(widget)) {
GList *children = gtk_container_get_children(GTK_CONTAINER(widget));
for (GList *l = children; l; l = l->next)
clear_min_size(GTK_WIDGET(l->data), depth + 1);
g_list_free(children);
}
}
static gboolean on_webview_button_press(GtkWidget *widget,
GdkEventButton *event,
gpointer user_data)
@ -57,12 +77,18 @@ static gboolean on_webview_button_press(GtkWidget *widget,
int w, h;
gtk_window_get_size(stored_window, &w, &h);
/* event->x, event->y are webview-local coords (= window coords when webview fills window) */
GdkWindowEdge edge = edge_for_position(w, h, event->x, event->y);
if ((int)edge == -1) return FALSE; /* Interior click — let WebKit handle */
if ((int)edge == -1) return FALSE; /* Interior — let WebKit handle */
fprintf(stderr, "[agor-resize] RESIZE edge=%d btn=%d xy=(%.0f,%.0f) root=(%.0f,%.0f) t=%u\n",
edge, event->button, event->x, event->y, event->x_root, event->y_root, event->time);
fprintf(stderr, "[agor-resize] RESIZE edge=%d btn=%d xy=(%.0f,%.0f) root=(%.0f,%.0f) t=%u size=%dx%d\n",
edge, event->button, event->x, event->y, event->x_root, event->y_root, event->time, w, h);
/* Clear min-size on entire tree BEFORE resize drag — allows shrinking */
clear_min_size(GTK_WIDGET(stored_window), 0);
/* Also set geometry hints with small minimum */
GdkGeometry geom = { .min_width = 400, .min_height = 300, .max_width = 32767, .max_height = 32767 };
gtk_window_set_geometry_hints(stored_window, NULL, &geom, GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
gtk_window_begin_resize_drag(
stored_window,
@ -73,7 +99,7 @@ static gboolean on_webview_button_press(GtkWidget *widget,
event->time
);
return TRUE; /* Consumed — WebKit does NOT see this click */
return TRUE;
}
/**
@ -116,6 +142,16 @@ static gboolean on_webview_motion(GtkWidget *widget,
return FALSE; /* Always let WebKit see motion events too */
}
/**
* Configure-event handler logs every window size change.
*/
static gboolean on_configure(GtkWidget *widget, GdkEventConfigure *event, gpointer data)
{
fprintf(stderr, "[agor-resize] CONFIGURE size=%dx%d pos=%d,%d\n",
event->width, event->height, event->x, event->y);
return FALSE;
}
/**
* Initialize: find the deepest WebView child and connect signals there.
* Call ONCE after window creation.
@ -155,6 +191,9 @@ void agor_resize_init(void *window_ptr, int border)
G_CALLBACK(on_webview_button_press), NULL);
g_signal_connect(webview, "motion-notify-event",
G_CALLBACK(on_webview_motion), NULL);
/* Log every window size change */
g_signal_connect(GTK_WIDGET(stored_window), "configure-event",
G_CALLBACK(on_configure), NULL);
fprintf(stderr, "[agor-resize] Initialized on %s (border=%dpx)\n",
G_OBJECT_TYPE_NAME(webview), border_width);

Binary file not shown.