From 6d0a65eb65459b772e5bfe1cdbfe68e7c8f59c75 Mon Sep 17 00:00:00 2001 From: Hibryda Date: Wed, 25 Mar 2026 17:59:32 +0100 Subject: [PATCH] fix(electrobun): disable WebView during resize drag in C (prevents grab theft) --- agor-pty/native/agor_resize.c | 39 ++++++++++++++++++++++++++++-- agor-pty/native/libagor-resize.so | Bin 17048 -> 17352 bytes 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/agor-pty/native/agor_resize.c b/agor-pty/native/agor_resize.c index 39c2b3b..33ac41c 100644 --- a/agor-pty/native/agor_resize.c +++ b/agor-pty/native/agor_resize.c @@ -16,7 +16,9 @@ #include static GtkWindow *stored_window = NULL; +static GtkWidget *stored_webview = NULL; static int border_width = 8; +static gboolean resize_active = FALSE; /** * Hit-test: determine which edge the pointer is on. @@ -86,10 +88,18 @@ static gboolean on_webview_button_press(GtkWidget *widget, /* 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 */ + /* 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); + /* Disable WebView input to prevent it from stealing the WM's pointer grab. + * The WebView's GdkWindow won't interfere with events during the resize. */ + if (stored_webview) { + gtk_widget_set_sensitive(stored_webview, FALSE); + resize_active = TRUE; + fprintf(stderr, "[agor-resize] WebView DISABLED for resize\n"); + } + gtk_window_begin_resize_drag( stored_window, edge, @@ -142,13 +152,37 @@ static gboolean on_webview_motion(GtkWidget *widget, return FALSE; /* Always let WebKit see motion events too */ } +static guint reenable_timer_id = 0; + /** - * Configure-event handler — logs every window size change. + * Timer callback: re-enable WebView after resize drag ends. + * Runs 500ms after the last configure event. + */ +static gboolean reenable_webview(gpointer data) +{ + if (stored_webview && resize_active) { + gtk_widget_set_sensitive(stored_webview, TRUE); + resize_active = FALSE; + fprintf(stderr, "[agor-resize] WebView RE-ENABLED (resize ended)\n"); + } + reenable_timer_id = 0; + return G_SOURCE_REMOVE; +} + +/** + * Configure-event handler — logs window size changes. + * Resets the re-enable timer on each configure (resize still in progress). */ 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); + + /* If resize is active, reset the re-enable timer */ + if (resize_active) { + if (reenable_timer_id) g_source_remove(reenable_timer_id); + reenable_timer_id = g_timeout_add(500, reenable_webview, NULL); + } return FALSE; } @@ -174,6 +208,7 @@ void agor_resize_init(void *window_ptr, int border) webview = child; } + stored_webview = webview; if (webview == GTK_WIDGET(stored_window)) { fprintf(stderr, "[agor-resize] WARNING: no child widget found, connecting on window\n"); } else { diff --git a/agor-pty/native/libagor-resize.so b/agor-pty/native/libagor-resize.so index d18ae2d127023a172a1748b5a4a41ce5ce5b61b7..659fbb857d5591d41f9c6d1e8ceb11c5bd29cab6 100755 GIT binary patch delta 4296 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 delta 3489 zcmZ`+4Nz3q6~6cFKG|IsWfzuReuU*G3MAcS1!BI89<5s7Vb) zvqSV{Ljs<3#>{Aj(#$CBq=jr|is=|J+JJ4f*qI8ZPP5K5=`+w)JIas2Y|p*#J=@as zGWVW)zI*=ez31$^j2xlIJ7`zFaC~`pVVNZwPk4*QcklIBf>xCaTDyBaW~))lsm0hS z_669Fu6CPAqS3@KH}-5eEO_Cl!385i5$%Ej!3l{57ailX8iNEq*z*mpW5yzC2cOYN zOJIl5OV2X_dYX$38C^7xK1GKkN%&(liaatwKc8TOi=b5VyyN1RccZR*$&-iXR6z-vV%4M zy*dcz&2_0-9`L2{YE^>WjTIJKoYVoOmNA+D3GwG>3S5qNQYU;GABvpFa~t1H?4@g# zc?j9nrK%Akb^2{yMnnrEl`}04DJ*{ZHJo=0wU}ekMOlZK>;;XY{7p0Gllz zYpAei7Mw(gv_2Y?LjGPx z+A+((VdXmHxhmT)VCIF5f^=N!bo>(M5*>|2F&moLTn@}kG$GTdGaHd<(3w@pd_!kS zk*U|2d}P+>Ogb`;>&!xA>U4&7Nt;7$Go+? zAqI!qqNF7Y(J0%E$Y~fbv8k}lxz32ki-nlJX)`11}X#5)_mMt z@+16cB>DXNbu23}r!bquzyf|kN&sai%DHze99BES%1v(cJSvansmkGC9%f7FCRIs2 zmkj0wqyE6i(iGK}PeD&cnoVJe*IBwwbI^5)e3-b?kevw_-nmeGB$J?2)|ee!8B0mCe}u{}zkwLt6BYSnN2` zS)~0)rUa@n{x4DfJGXIgaO~dsUjjs4zjwg{J?H#1!Zn#?Pq^kmXBB12>Z%h^gf?SHXUdH1BNL134A-k?x9(6lN=X;b&EcBUQ_< zP>9kvF!_6E5%l@J_7VIAV@;=67@zw+wl}ow)ahy{Sn0KlYbaL6Q!C3XGa8Ha(z~+E zrk9aU^WoOYcGDreCDy=J?Sv!MHgk_wK|S!}>T&neNRjTeCpoS!v^IQJ~jpFrx