diff --git a/agor-pty/native/agor_resize.c b/agor-pty/native/agor_resize.c index d6e5ef8..39c2b3b 100644 --- a/agor-pty/native/agor_resize.c +++ b/agor-pty/native/agor_resize.c @@ -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); diff --git a/agor-pty/native/libagor-resize.so b/agor-pty/native/libagor-resize.so index 192eca7..d18ae2d 100755 Binary files a/agor-pty/native/libagor-resize.so and b/agor-pty/native/libagor-resize.so differ