5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-02 04:59:38 +08:00
wails/v2/internal/frontend/desktop/linux/keys.go
Amin Yahyaabadi 35eb1e0160
fix: avoid app crashing when the Linux GTK key is empty (#2672)
* fix: avoid app crash when the Linux GTK key is empty

Fixes this error:

```
DEBUG | Log dir is: /root/.config/surrealdb_explorer/log.txt

Overriding existing handler for signal 10. Set JSC_SIGNAL_FOR_GC if you want WebKit to use a different signal
panic: runtime error: index out of range [0] with length 0

goroutine 1 [running, locked to thread]:
github.com/wailsapp/wails/v2/internal/frontend/desktop/linux.parseKey({0x0, 0x0})
        /home/aminya/go/pkg/mod/github.com/wailsapp/wails/v2@v2.5.1/internal/frontend/desktop/linux/keys.go:87 +0xa5
github.com/wailsapp/wails/v2/internal/frontend/desktop/linux.acceleratorToGTK(0xc0001c5f20)
        /home/aminya/go/pkg/mod/github.com/wailsapp/wails/v2@v2.5.1/internal/frontend/desktop/linux/keys.go:72 +0x2c
github.com/wailsapp/wails/v2/internal/frontend/desktop/linux.processMenuItem(0x866bc0?, 0xc0001c8a80, 0xc0001c8a80?)
        /home/aminya/go/pkg/mod/github.com/wailsapp/wails/v2@v2.5.1/internal/frontend/desktop/linux/menu.go:159 +0x40b
github.com/wailsapp/wails/v2/internal/frontend/desktop/linux.processSubmenu(0xc0001c8a20, 0x79a2a9?)
        /home/aminya/go/pkg/mod/github.com/wailsapp/wails/v2@v2.5.1/internal/frontend/desktop/linux/menu.go:99 +0xdc
github.com/wailsapp/wails/v2/internal/frontend/desktop/linux.processMenu(0xc00021f6c0, 0x12?)
        /home/aminya/go/pkg/mod/github.com/wailsapp/wails/v2@v2.5.1/internal/frontend/desktop/linux/menu.go:82 +0x46
github.com/wailsapp/wails/v2/internal/frontend/desktop/linux.(*Window).SetApplicationMenu(0xc00021f6c0, 0xc000128dc8)
        /home/aminya/go/pkg/mod/github.com/wailsapp/wails/v2@v2.5.1/internal/frontend/desktop/linux/menu.go:75 +0x1b6
github.com/wailsapp/wails/v2/internal/frontend/desktop/linux.NewWindow(0xc00011ba40, 0x0)
        /home/aminya/go/pkg/mod/github.com/wailsapp/wails/v2@v2.5.1/internal/frontend/desktop/linux/window.go:126 +0x37b
github.com/wailsapp/wails/v2/internal/frontend/desktop/linux.NewFrontend({0x1cea4e8?, 0xc00023b890}, 0xc00011ba40, 0xc000128e40, 0xc0001c8b40, {0x1ce7480?, 0xc000139840})
        /home/aminya/go/pkg/mod/github.com/wailsapp/wails/v2@v2.5.1/internal/frontend/desktop/linux/frontend.go:182 +0x5c5
github.com/wailsapp/wails/v2/internal/frontend/desktop.NewFrontend(...)
        /home/aminya/go/pkg/mod/github.com/wailsapp/wails/v2@v2.5.1/internal/frontend/desktop/desktop_linux.go:16
github.com/wailsapp/wails/v2/internal/app.CreateApp(0xc00011ba40)
        /home/aminya/go/pkg/mod/github.com/wailsapp/wails/v2@v2.5.1/internal/app/app_production.go:84 +0x5a5
github.com/wailsapp/wails/v2/pkg/application.(*Application).Run(0xc000131940)
        /home/aminya/go/pkg/mod/github.com/wailsapp/wails/v2@v2.5.1/pkg/application/application.go:57 +0x29
wails_vue/backend.BootApplication(0xc000131640, 0xc000138a40, 0xc0001c5320, 0xc0001c55c0, 0xc000128b40, 0xc00012ec30, 0xc000131880)
        /home/aminya/Documents/GitHub/teamnoon/SurrealDB-Explorer/backend/Application.go:103 +0x718
reflect.Value.call({0x874160?, 0x1c761f0?, 0xc000138a00?}, {0x8e263d, 0x4}, {0xc0001584d0, 0x7, 0x1c761f0?})
        /usr/local/go/src/reflect/value.go:586 +0xb0b
reflect.Value.Call({0x874160?, 0x1c761f0?, 0x1c761f0?}, {0xc0001584d0?, 0x0?, 0x1c761f0?})
        /usr/local/go/src/reflect/value.go:370 +0xbc
github.com/Envuso/go-ioc-container.(*Invocable).CallMethodWith(0xc000138a00, 0x1c761f0?, {0x0?, 0x1cef290?, 0x8bd180?})
        /home/aminya/go/pkg/mod/github.com/!envuso/go-ioc-container@v0.0.5/invocable.go:149 +0xad
github.com/Envuso/go-ioc-container.(*ContainerInstance).Call(0xc00011c630?, {0x874160?, 0x1c761f0?}, {0x0, 0x0, 0x0})
        /home/aminya/go/pkg/mod/github.com/!envuso/go-ioc-container@v0.0.5/container_invocation.go:30 +0x6c
main.main()
        /home/aminya/Documents/GitHub/teamnoon/SurrealDB-Explorer/main.go:34 +0x112
```

* fix: merge the key length comparison
2023-05-25 18:40:37 +10:00

108 lines
2.6 KiB
Go

//go:build linux
// +build linux
package linux
/*
#cgo linux pkg-config: gtk+-3.0 webkit2gtk-4.0
#include "gtk/gtk.h"
*/
import "C"
import (
"github.com/wailsapp/wails/v2/pkg/menu/keys"
)
var namedKeysToGTK = map[string]C.guint{
"backspace": C.guint(0xff08),
"tab": C.guint(0xff09),
"return": C.guint(0xff0d),
"enter": C.guint(0xff0d),
"escape": C.guint(0xff1b),
"left": C.guint(0xff51),
"right": C.guint(0xff53),
"up": C.guint(0xff52),
"down": C.guint(0xff54),
"space": C.guint(0xff80),
"delete": C.guint(0xff9f),
"home": C.guint(0xff95),
"end": C.guint(0xff9c),
"page up": C.guint(0xff9a),
"page down": C.guint(0xff9b),
"f1": C.guint(0xffbe),
"f2": C.guint(0xffbf),
"f3": C.guint(0xffc0),
"f4": C.guint(0xffc1),
"f5": C.guint(0xffc2),
"f6": C.guint(0xffc3),
"f7": C.guint(0xffc4),
"f8": C.guint(0xffc5),
"f9": C.guint(0xffc6),
"f10": C.guint(0xffc7),
"f11": C.guint(0xffc8),
"f12": C.guint(0xffc9),
"f13": C.guint(0xffca),
"f14": C.guint(0xffcb),
"f15": C.guint(0xffcc),
"f16": C.guint(0xffcd),
"f17": C.guint(0xffce),
"f18": C.guint(0xffcf),
"f19": C.guint(0xffd0),
"f20": C.guint(0xffd1),
"f21": C.guint(0xffd2),
"f22": C.guint(0xffd3),
"f23": C.guint(0xffd4),
"f24": C.guint(0xffd5),
"f25": C.guint(0xffd6),
"f26": C.guint(0xffd7),
"f27": C.guint(0xffd8),
"f28": C.guint(0xffd9),
"f29": C.guint(0xffda),
"f30": C.guint(0xffdb),
"f31": C.guint(0xffdc),
"f32": C.guint(0xffdd),
"f33": C.guint(0xffde),
"f34": C.guint(0xffdf),
"f35": C.guint(0xffe0),
"numlock": C.guint(0xff7f),
}
func acceleratorToGTK(accelerator *keys.Accelerator) (C.guint, C.GdkModifierType) {
key := parseKey(accelerator.Key)
mods := parseModifiers(accelerator.Modifiers)
return key, mods
}
func parseKey(key string) C.guint {
var result C.guint
result, found := namedKeysToGTK[key]
if found {
return result
}
// Check for unknown namedkeys
// Check if we only have a single character
if len(key) != 1 {
return C.guint(0)
}
keyval := rune(key[0])
return C.gdk_unicode_to_keyval(C.guint(keyval))
}
func parseModifiers(modifiers []keys.Modifier) C.GdkModifierType {
var result C.GdkModifierType
for _, modifier := range modifiers {
switch modifier {
case keys.ShiftKey:
result |= C.GDK_SHIFT_MASK
case keys.ControlKey, keys.CmdOrCtrlKey:
result |= C.GDK_CONTROL_MASK
case keys.OptionOrAltKey:
result |= C.GDK_MOD1_MASK
}
}
return result
}