diff --git a/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/frame.rkt b/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/frame.rkt index 188397f9eb..f5a7e17079 100644 --- a/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/frame.rkt +++ b/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/frame.rkt @@ -160,13 +160,15 @@ adjust-client-delta queue-on-size) + (define floating? (memq 'float style)) + (define gtk (as-gtk-window-allocation - (gtk_window_new (if (memq 'float style) + (gtk_window_new (if floating? GTK_WINDOW_POPUP GTK_WINDOW_TOPLEVEL)))) (when (memq 'no-caption style) (gtk_window_set_decorated gtk #f)) - (when (memq 'float style) + (when floating? (gtk_window_set_keep_above gtk #t) (gtk_window_set_focus_on_map gtk #f)) (define-values (vbox-gtk panel-gtk) @@ -195,6 +197,8 @@ (define/override (get-client-gtk) panel-gtk) (define/override (get-window-gtk) gtk) + (define/override (in-floating?) floating?) + (super-new [parent parent] [gtk gtk] [client-gtk panel-gtk] diff --git a/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/window.rkt b/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/window.rkt index 494b7e5e96..38f91f75e0 100644 --- a/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/window.rkt +++ b/pkgs/gui-pkgs/gui-lib/mred/private/wx/gtk/window.rkt @@ -89,6 +89,9 @@ (define-gtk gtk_widget_is_focus (_fun _GtkWidget -> _gboolean)) (define-gtk gtk_widget_set_sensitive (_fun _GtkWidget _gboolean -> _void)) +(define-gdk gdk_keyboard_grab (_fun _GdkWindow _gboolean _int -> _void)) +(define-gdk gdk_keyboard_ungrab (_fun _int -> _void)) + (define _GtkAccelGroup (_cpointer 'GtkAccelGroup)) (define-gtk gtk_accel_group_new (_fun -> _GtkAccelGroup)) (define-gtk gtk_window_add_accel_group (_fun _GtkWindow _GtkAccelGroup -> _void)) @@ -321,6 +324,13 @@ (GdkEventCrossing-type event) (GdkEventButton-type event)))]) (let ([wx (gtk->wx gtk)]) + (when (or (= type GDK_BUTTON_PRESS) + (= type GDK_2BUTTON_PRESS) + (= type GDK_3BUTTON_PRESS)) + (let ([floating? (send wx in-floating?)]) + (if floating? + (gdk_keyboard_grab (widget-window gtk) #t 0) + (gdk_keyboard_ungrab 0)))) (and wx (if (or (= type GDK_2BUTTON_PRESS) @@ -608,6 +618,9 @@ (gtk_drag_dest_add_uri_targets gtk)) (gtk_drag_dest_unset gtk))) + (define/public (in-floating?) + (send parent in-floating?)) + (define/public (set-focus) (gtk_widget_grab_focus (get-client-gtk)))