github.com/secoba/wails/v2@v2.6.4/internal/frontend/desktop/linux/keys.go (about) 1 //go:build linux 2 // +build linux 3 4 package linux 5 6 /* 7 #cgo linux pkg-config: gtk+-3.0 webkit2gtk-4.0 8 9 #include "gtk/gtk.h" 10 11 */ 12 import "C" 13 import ( 14 "github.com/secoba/wails/v2/pkg/menu/keys" 15 ) 16 17 var namedKeysToGTK = map[string]C.guint{ 18 "backspace": C.guint(0xff08), 19 "tab": C.guint(0xff09), 20 "return": C.guint(0xff0d), 21 "enter": C.guint(0xff0d), 22 "escape": C.guint(0xff1b), 23 "left": C.guint(0xff51), 24 "right": C.guint(0xff53), 25 "up": C.guint(0xff52), 26 "down": C.guint(0xff54), 27 "space": C.guint(0xff80), 28 "delete": C.guint(0xff9f), 29 "home": C.guint(0xff95), 30 "end": C.guint(0xff9c), 31 "page up": C.guint(0xff9a), 32 "page down": C.guint(0xff9b), 33 "f1": C.guint(0xffbe), 34 "f2": C.guint(0xffbf), 35 "f3": C.guint(0xffc0), 36 "f4": C.guint(0xffc1), 37 "f5": C.guint(0xffc2), 38 "f6": C.guint(0xffc3), 39 "f7": C.guint(0xffc4), 40 "f8": C.guint(0xffc5), 41 "f9": C.guint(0xffc6), 42 "f10": C.guint(0xffc7), 43 "f11": C.guint(0xffc8), 44 "f12": C.guint(0xffc9), 45 "f13": C.guint(0xffca), 46 "f14": C.guint(0xffcb), 47 "f15": C.guint(0xffcc), 48 "f16": C.guint(0xffcd), 49 "f17": C.guint(0xffce), 50 "f18": C.guint(0xffcf), 51 "f19": C.guint(0xffd0), 52 "f20": C.guint(0xffd1), 53 "f21": C.guint(0xffd2), 54 "f22": C.guint(0xffd3), 55 "f23": C.guint(0xffd4), 56 "f24": C.guint(0xffd5), 57 "f25": C.guint(0xffd6), 58 "f26": C.guint(0xffd7), 59 "f27": C.guint(0xffd8), 60 "f28": C.guint(0xffd9), 61 "f29": C.guint(0xffda), 62 "f30": C.guint(0xffdb), 63 "f31": C.guint(0xffdc), 64 "f32": C.guint(0xffdd), 65 "f33": C.guint(0xffde), 66 "f34": C.guint(0xffdf), 67 "f35": C.guint(0xffe0), 68 "numlock": C.guint(0xff7f), 69 } 70 71 func acceleratorToGTK(accelerator *keys.Accelerator) (C.guint, C.GdkModifierType) { 72 key := parseKey(accelerator.Key) 73 mods := parseModifiers(accelerator.Modifiers) 74 return key, mods 75 } 76 77 func parseKey(key string) C.guint { 78 var result C.guint 79 result, found := namedKeysToGTK[key] 80 if found { 81 return result 82 } 83 // Check for unknown namedkeys 84 // Check if we only have a single character 85 if len(key) != 1 { 86 return C.guint(0) 87 } 88 keyval := rune(key[0]) 89 return C.gdk_unicode_to_keyval(C.guint(keyval)) 90 } 91 92 func parseModifiers(modifiers []keys.Modifier) C.GdkModifierType { 93 94 var result C.GdkModifierType 95 96 for _, modifier := range modifiers { 97 switch modifier { 98 case keys.ShiftKey: 99 result |= C.GDK_SHIFT_MASK 100 case keys.ControlKey, keys.CmdOrCtrlKey: 101 result |= C.GDK_CONTROL_MASK 102 case keys.OptionOrAltKey: 103 result |= C.GDK_MOD1_MASK 104 } 105 } 106 return result 107 }