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  }