racket/gui gtk: make keyboard focus work in floating frames
This commit is contained in:
parent
bea7c852d7
commit
f697f5530b
|
@ -160,13 +160,15 @@
|
||||||
adjust-client-delta
|
adjust-client-delta
|
||||||
queue-on-size)
|
queue-on-size)
|
||||||
|
|
||||||
|
(define floating? (memq 'float style))
|
||||||
|
|
||||||
(define gtk (as-gtk-window-allocation
|
(define gtk (as-gtk-window-allocation
|
||||||
(gtk_window_new (if (memq 'float style)
|
(gtk_window_new (if floating?
|
||||||
GTK_WINDOW_POPUP
|
GTK_WINDOW_POPUP
|
||||||
GTK_WINDOW_TOPLEVEL))))
|
GTK_WINDOW_TOPLEVEL))))
|
||||||
(when (memq 'no-caption style)
|
(when (memq 'no-caption style)
|
||||||
(gtk_window_set_decorated gtk #f))
|
(gtk_window_set_decorated gtk #f))
|
||||||
(when (memq 'float style)
|
(when floating?
|
||||||
(gtk_window_set_keep_above gtk #t)
|
(gtk_window_set_keep_above gtk #t)
|
||||||
(gtk_window_set_focus_on_map gtk #f))
|
(gtk_window_set_focus_on_map gtk #f))
|
||||||
(define-values (vbox-gtk panel-gtk)
|
(define-values (vbox-gtk panel-gtk)
|
||||||
|
@ -195,6 +197,8 @@
|
||||||
(define/override (get-client-gtk) panel-gtk)
|
(define/override (get-client-gtk) panel-gtk)
|
||||||
(define/override (get-window-gtk) gtk)
|
(define/override (get-window-gtk) gtk)
|
||||||
|
|
||||||
|
(define/override (in-floating?) floating?)
|
||||||
|
|
||||||
(super-new [parent parent]
|
(super-new [parent parent]
|
||||||
[gtk gtk]
|
[gtk gtk]
|
||||||
[client-gtk panel-gtk]
|
[client-gtk panel-gtk]
|
||||||
|
|
|
@ -89,6 +89,9 @@
|
||||||
(define-gtk gtk_widget_is_focus (_fun _GtkWidget -> _gboolean))
|
(define-gtk gtk_widget_is_focus (_fun _GtkWidget -> _gboolean))
|
||||||
(define-gtk gtk_widget_set_sensitive (_fun _GtkWidget _gboolean -> _void))
|
(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 _GtkAccelGroup (_cpointer 'GtkAccelGroup))
|
||||||
(define-gtk gtk_accel_group_new (_fun -> _GtkAccelGroup))
|
(define-gtk gtk_accel_group_new (_fun -> _GtkAccelGroup))
|
||||||
(define-gtk gtk_window_add_accel_group (_fun _GtkWindow _GtkAccelGroup -> _void))
|
(define-gtk gtk_window_add_accel_group (_fun _GtkWindow _GtkAccelGroup -> _void))
|
||||||
|
@ -321,6 +324,13 @@
|
||||||
(GdkEventCrossing-type event)
|
(GdkEventCrossing-type event)
|
||||||
(GdkEventButton-type event)))])
|
(GdkEventButton-type event)))])
|
||||||
(let ([wx (gtk->wx gtk)])
|
(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
|
(and
|
||||||
wx
|
wx
|
||||||
(if (or (= type GDK_2BUTTON_PRESS)
|
(if (or (= type GDK_2BUTTON_PRESS)
|
||||||
|
@ -608,6 +618,9 @@
|
||||||
(gtk_drag_dest_add_uri_targets gtk))
|
(gtk_drag_dest_add_uri_targets gtk))
|
||||||
(gtk_drag_dest_unset gtk)))
|
(gtk_drag_dest_unset gtk)))
|
||||||
|
|
||||||
|
(define/public (in-floating?)
|
||||||
|
(send parent in-floating?))
|
||||||
|
|
||||||
(define/public (set-focus)
|
(define/public (set-focus)
|
||||||
(gtk_widget_grab_focus (get-client-gtk)))
|
(gtk_widget_grab_focus (get-client-gtk)))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user