racket/gui gtk: make keyboard focus work in floating frames

original commit: f697f5530bed890c9c511910515d283c7cd187b7
This commit is contained in:
Matthew Flatt 2013-11-07 13:37:21 -07:00
parent 4cb523e858
commit 48384395f6
2 changed files with 19 additions and 2 deletions

View File

@ -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]

View File

@ -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)))