gtk alternate key interpretetaions
original commit: 1270ba437eec0c02ad3f372f4c3ff35b17fb9e95
This commit is contained in:
parent
f60b9e42c4
commit
2567832c85
42
collects/mred/private/wx/gtk/keymap.rkt
Normal file
42
collects/mred/private/wx/gtk/keymap.rkt
Normal file
|
@ -0,0 +1,42 @@
|
|||
#lang racket/base
|
||||
(require ffi/unsafe
|
||||
"utils.rkt"
|
||||
"const.rkt"
|
||||
"types.rkt")
|
||||
|
||||
(provide get-alts)
|
||||
|
||||
(define _GdkKeymap (_cpointer 'GdkKeymap))
|
||||
|
||||
(define-gdk gdk_keymap_get_default (_fun -> _GdkKeymap))
|
||||
|
||||
(define-gdk gdk_keymap_translate_keyboard_state
|
||||
(_fun _GdkKeymap
|
||||
_uint ; hardware_keycode
|
||||
_int ; GdkModifierType state
|
||||
_int ; group
|
||||
(keyval : (_ptr o _uint))
|
||||
(effective_group : (_ptr o _int))
|
||||
(level : (_ptr o _int))
|
||||
(consumed_modifiers : (_ptr o _int))
|
||||
-> (r : _gboolean)
|
||||
-> (and r keyval)))
|
||||
|
||||
(define (get-alts event)
|
||||
(define (get-one-alt mask)
|
||||
(gdk_keymap_translate_keyboard_state (gdk_keymap_get_default)
|
||||
(GdkEventKey-hardware_keycode event)
|
||||
(let ([mods (GdkEventKey-state event)])
|
||||
(bitwise-ior (- mods (bitwise-and mods mask))
|
||||
(bitwise-and mask (bitwise-not (bitwise-and mods mask)))))
|
||||
(GdkEventKey-group event)))
|
||||
(let ([alt-gr? (eq? (= (bitwise-and (GdkEventKey-state event) GDK_CONTROL_MASK)
|
||||
GDK_CONTROL_MASK)
|
||||
(= (bitwise-and (GdkEventKey-state event) GDK_MOD1_MASK)
|
||||
GDK_MOD1_MASK))])
|
||||
(values (get-one-alt GDK_SHIFT_MASK)
|
||||
(and alt-gr?
|
||||
(get-one-alt (bitwise-ior GDK_MOD1_MASK GDK_CONTROL_MASK)))
|
||||
(and alt-gr?
|
||||
(get-one-alt (bitwise-ior GDK_SHIFT_MASK GDK_MOD1_MASK GDK_CONTROL_MASK)))
|
||||
(get-one-alt GDK_LOCK_MASK))))
|
|
@ -9,6 +9,7 @@
|
|||
"../common/queue.rkt"
|
||||
"../common/local.rkt"
|
||||
"keycode.rkt"
|
||||
"keymap.rkt"
|
||||
"queue.rkt"
|
||||
"utils.rkt"
|
||||
"const.rkt"
|
||||
|
@ -128,11 +129,12 @@
|
|||
wx
|
||||
(let* ([modifiers (GdkEventKey-state event)]
|
||||
[bit? (lambda (m v) (positive? (bitwise-and m v)))]
|
||||
[keyval->code (lambda (kv)
|
||||
(or
|
||||
(map-key-code kv)
|
||||
(integer->char (gdk_keyval_to_unicode kv))))]
|
||||
[k (new key-event%
|
||||
[key-code (let ([kv (GdkEventKey-keyval event)])
|
||||
(or
|
||||
(map-key-code kv)
|
||||
(integer->char (gdk_keyval_to_unicode kv))))]
|
||||
[key-code (keyval->code (GdkEventKey-keyval event))]
|
||||
[shift-down (bit? modifiers GDK_SHIFT_MASK)]
|
||||
[control-down (bit? modifiers GDK_CONTROL_MASK)]
|
||||
[meta-down (bit? modifiers GDK_META_MASK)]
|
||||
|
@ -141,6 +143,11 @@
|
|||
[y 0]
|
||||
[time-stamp (GdkEventKey-time event)]
|
||||
[caps-down (bit? modifiers GDK_LOCK_MASK)])])
|
||||
(let-values ([(s ag sag cl) (get-alts event)])
|
||||
(when s (send k set-other-shift-key-code (keyval->code s)))
|
||||
(when ag (send k set-other-altgr-key-code (keyval->code ag)))
|
||||
(when sag (send k set-other-shift-altgr-key-code (keyval->code sag)))
|
||||
(when cl (send k set-other-caps-key-code (keyval->code cl))))
|
||||
(if (send wx handles-events? gtk)
|
||||
(begin
|
||||
(queue-window-event wx (lambda () (send wx dispatch-on-char k #f)))
|
||||
|
|
Loading…
Reference in New Issue
Block a user