๐Ÿ“ฆ deluan / fyne-vnc

๐Ÿ“„ keys.go ยท 127 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127package main

import (
	"fyne.io/fyne"
	"fyne.io/fyne/driver/desktop"
	"github.com/deluan/bring"
)

// Handles keyboard events mapping between Bring and Fyne
type keyboardHandler struct {
	display *VncDisplay
	shift   bool
	caps    bool
}

func (ks *keyboardHandler) TypedKey(ev *fyne.KeyEvent) {
	keyName := ev.Name
	k, ok := keyMap[keyName]
	if !ok && len(keyName) == 1 && keyName[0] < 128 {
		k = bring.KeyCode(keyName[0])
	}
	if k > 0 {
		ks.sendKey(k, true)
		ks.sendKey(k, false)
	}
}

func (ks *keyboardHandler) KeyDown(ev *fyne.KeyEvent) {
	ks.handleDesktopKey(ev.Name, true)
}

func (ks *keyboardHandler) KeyUp(ev *fyne.KeyEvent) {
	ks.handleDesktopKey(ev.Name, false)
}

func (ks *keyboardHandler) handleDesktopKey(keyName fyne.KeyName, pressed bool) {
	if keyCode, ok := desktopKeyMap[keyName]; ok {
		if keyCode == bring.KeyLeftShift || keyCode == bring.KeyRightShift {
			ks.shift = pressed
		}
		if keyCode == bring.KeyCapsLock {
			ks.caps = pressed
		}
		ks.sendKey(keyCode, pressed)
	}
}

func (ks *keyboardHandler) sendKey(key bring.KeyCode, pressed bool) {
	if key >= 'A' && key <= 'Z' {
		if !ks.shift && !ks.caps {
			key = key + 32
		}
	}
	//_ = ks.display.Client.SendKey(key, pressed)
}

func (ks *keyboardHandler) Focused() bool {
	return true
}

func (ks *keyboardHandler) FocusGained() {
}

func (ks *keyboardHandler) FocusLost() {
}

func (ks *keyboardHandler) TypedRune(ch rune) {
}

var (
	keyMap        map[fyne.KeyName]bring.KeyCode
	desktopKeyMap map[fyne.KeyName]bring.KeyCode
)

func init() {
	desktopKeyMap = map[fyne.KeyName]bring.KeyCode{
		desktop.KeyAltLeft:      bring.KeyLeftAlt,
		desktop.KeyAltRight:     bring.KeyRightAlt,
		desktop.KeyControlLeft:  bring.KeyLeftControl,
		desktop.KeyControlRight: bring.KeyRightControl,
		desktop.KeyShiftLeft:    bring.KeyLeftShift,
		desktop.KeyShiftRight:   bring.KeyRightShift,
		desktop.KeySuperLeft:    bring.KeySuper,
		desktop.KeySuperRight:   bring.KeySuper,
		//:     bring.KeyCapsLock,
	}

	keyMap = map[fyne.KeyName]bring.KeyCode{
		fyne.KeySpace:     bring.KeyCode(32),
		fyne.KeyBackspace: bring.KeyBackspace,
		fyne.KeyDelete:    bring.KeyDelete,
		fyne.KeyDown:      bring.KeyDown,
		fyne.KeyEnd:       bring.KeyEnd,
		fyne.KeyEnter:     bring.KeyEnter,
		fyne.KeyReturn:    bring.KeyEnter,
		fyne.KeyEscape:    bring.KeyEscape,
		fyne.KeyF1:        bring.KeyF1,
		fyne.KeyF2:        bring.KeyF2,
		fyne.KeyF3:        bring.KeyF3,
		fyne.KeyF4:        bring.KeyF4,
		fyne.KeyF5:        bring.KeyF5,
		fyne.KeyF6:        bring.KeyF6,
		fyne.KeyF7:        bring.KeyF7,
		fyne.KeyF8:        bring.KeyF8,
		fyne.KeyF9:        bring.KeyF9,
		fyne.KeyF10:       bring.KeyF10,
		fyne.KeyF11:       bring.KeyF11,
		fyne.KeyF12:       bring.KeyF12,
		fyne.KeyHome:      bring.KeyHome,
		fyne.KeyInsert:    bring.KeyInsert,
		fyne.KeyLeft:      bring.KeyLeft,
		fyne.KeyPageDown:  bring.KeyPageDown,
		fyne.KeyPageUp:    bring.KeyPageUp,
		fyne.KeyRight:     bring.KeyRight,
		fyne.KeyTab:       bring.KeyTab,
		fyne.KeyUp:        bring.KeyUp,
		//:        bring.KeyPause,
		//:  bring.KeyPrintScreen,
		//:      bring.KeyNumLock,
		//:         bring.KeyMeta,
		//:          bring.KeyWin,
	}
}

// Make sure all necessary interfaces are implemented
var _ desktop.Keyable = (*keyboardHandler)(nil)