From a0d8f1b88057e4c425894591cf2341a924b9f748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20=C5=A0ediv=C3=BD?= Date: Tue, 12 Jan 2021 22:54:13 +0100 Subject: [PATCH] xorg modifiers refactor. --- internal/api/room/keyboard.go | 33 ++++++-------------------- internal/desktop/xorg.go | 20 ++++++++++++++-- internal/desktop/xorg/xorg.c | 26 +++++++------------- internal/desktop/xorg/xorg.go | 23 ++++++++++++++++-- internal/desktop/xorg/xorg.h | 3 ++- internal/types/desktop.go | 8 ++++++- internal/websocket/handler/keyboard.go | 26 ++++---------------- 7 files changed, 68 insertions(+), 71 deletions(-) diff --git a/internal/api/room/keyboard.go b/internal/api/room/keyboard.go index 1fd25b5c..845ffb4f 100644 --- a/internal/api/room/keyboard.go +++ b/internal/api/room/keyboard.go @@ -4,6 +4,7 @@ import ( "net/http" "demodesk/neko/internal/utils" + "demodesk/neko/internal/types" ) type KeyboardLayoutData struct { @@ -11,9 +12,8 @@ type KeyboardLayoutData struct { } type KeyboardModifiersData struct { - NumLock *bool `json:"numlock"` - CapsLock *bool `json:"capslock"` - ScrollLock *bool `json:"scrollock"` + NumLock *bool `json:"numlock"` + CapsLock *bool `json:"capslock"` } func (h *RoomHandler) keyboardLayoutSet(w http.ResponseWriter, r *http.Request) { @@ -33,28 +33,9 @@ func (h *RoomHandler) keyboardModifiersSet(w http.ResponseWriter, r *http.Reques return } - var NumLock = 0 - if data.NumLock == nil { - NumLock = -1 - } else if *data.NumLock { - NumLock = 1 - } - - var CapsLock = 0 - if data.CapsLock == nil { - CapsLock = -1 - } else if *data.CapsLock { - CapsLock = 1 - } - - var ScrollLock = 0 - if data.ScrollLock == nil { - ScrollLock = -1 - } else if *data.ScrollLock { - ScrollLock = 1 - } - - h.desktop.SetKeyboardModifiers(NumLock, CapsLock, ScrollLock) - + h.desktop.SetKeyboardModifiers(types.KeyboardModifiers{ + NumLock: data.NumLock, + CapsLock: data.CapsLock, + }) utils.HttpSuccess(w) } diff --git a/internal/desktop/xorg.go b/internal/desktop/xorg.go index 370d02f4..52494000 100644 --- a/internal/desktop/xorg.go +++ b/internal/desktop/xorg.go @@ -57,8 +57,24 @@ func (manager *DesktopManagerCtx) SetKeyboardLayout(layout string) { xorg.SetKeyboardLayout(layout) } -func (manager *DesktopManagerCtx) SetKeyboardModifiers(NumLock int, CapsLock int, ScrollLock int) { - xorg.SetKeyboardModifiers(NumLock, CapsLock, ScrollLock) +func (manager *DesktopManagerCtx) SetKeyboardModifiers(mod types.KeyboardModifiers) { + if mod.NumLock != nil { + xorg.SetKeyboardModifier(xorg.KBD_NUM_LOCK, *mod.NumLock) + } + + if mod.CapsLock != nil { + xorg.SetKeyboardModifier(xorg.KBD_CAPS_LOCK, *mod.CapsLock) + } +} + +func (manager *DesktopManagerCtx) GetKeyboardModifiers() types.KeyboardModifiers { + NumLock := xorg.GetKeyboardModifier(xorg.KBD_NUM_LOCK) + CapsLock := xorg.GetKeyboardModifier(xorg.KBD_CAPS_LOCK) + + return types.KeyboardModifiers{ + NumLock: &NumLock, + CapsLock: &CapsLock, + } } func (manager *DesktopManagerCtx) GetCursorImage() *types.CursorImage { diff --git a/internal/desktop/xorg/xorg.c b/internal/desktop/xorg/xorg.c index 85b0553a..498f455d 100644 --- a/internal/desktop/xorg/xorg.c +++ b/internal/desktop/xorg/xorg.c @@ -126,27 +126,19 @@ void SetKeyboardLayout(char *layout) { system(cmd); } -void SetKeyboardModifiers(int num_lock, int caps_lock, int scroll_lock) { +void XSetKeyboardModifier(int mod, int on) { Display *display = getXDisplay(); - - if (num_lock != -1) { - XkbLockModifiers(display, XkbUseCoreKbd, 16, num_lock * 16); - } - - if (caps_lock != -1) { - XkbLockModifiers(display, XkbUseCoreKbd, 2, caps_lock * 2); - } - - if (scroll_lock != -1) { - XKeyboardControl values; - values.led_mode = scroll_lock ? LedModeOn : LedModeOff; - values.led = 3; - XChangeKeyboardControl(display, KBLedMode, &values); - } - + XkbLockModifiers(display, XkbUseCoreKbd, mod, on ? mod : 0); XFlush(display); } +int XGetKeyboardModifier(int mod) { + XkbStateRec xkbState; + Display *display = getXDisplay(); + XkbGetState(display, XkbUseCoreKbd, &xkbState); + return xkbState.locked_mods & mod; +} + XFixesCursorImage *XGetCursorImage(void) { Display *display = getXDisplay(); return XFixesGetCursorImage(display); diff --git a/internal/desktop/xorg/xorg.go b/internal/desktop/xorg/xorg.go index e1add2a3..d1489f1a 100644 --- a/internal/desktop/xorg/xorg.go +++ b/internal/desktop/xorg/xorg.go @@ -17,6 +17,13 @@ import ( "demodesk/neko/internal/types" ) +type KbdModifiers int + +const ( + KBD_CAPS_LOCK KbdModifiers = 2 + KBD_NUM_LOCK KbdModifiers = 16 +) + var ScreenConfigurations = make(map[int]types.ScreenConfiguration) var debounce_button = make(map[int]time.Time) @@ -211,11 +218,23 @@ func SetKeyboardLayout(layout string) { C.SetKeyboardLayout(layoutUnsafe) } -func SetKeyboardModifiers(num_lock int, caps_lock int, scroll_lock int) { +func SetKeyboardModifier(mod KbdModifiers, active bool) { mu.Lock() defer mu.Unlock() - C.SetKeyboardModifiers(C.int(num_lock), C.int(caps_lock), C.int(scroll_lock)) + num := C.int(0) + if active { + num = C.int(1) + } + + C.XSetKeyboardModifier(C.int(mod), num) +} + +func GetKeyboardModifier(mod KbdModifiers) bool { + mu.Lock() + defer mu.Unlock() + + return C.XGetKeyboardModifier(C.int(mod)) == C.int(1) } func GetCursorImage() *types.CursorImage { diff --git a/internal/desktop/xorg/xorg.h b/internal/desktop/xorg/xorg.h index 4a83026a..6f4aeca1 100644 --- a/internal/desktop/xorg/xorg.h +++ b/internal/desktop/xorg/xorg.h @@ -26,5 +26,6 @@ int XGetScreenSize(); short XGetScreenRate(); void SetKeyboardLayout(char *layout); -void SetKeyboardModifiers(int num_lock, int caps_lock, int scroll_lock); +void XSetKeyboardModifier(int mod, int on); +int XGetKeyboardModifier(int mod); XFixesCursorImage *XGetCursorImage(void); diff --git a/internal/types/desktop.go b/internal/types/desktop.go index 28c81431..f79b46a3 100644 --- a/internal/types/desktop.go +++ b/internal/types/desktop.go @@ -21,6 +21,11 @@ type ScreenConfiguration struct { Rates map[int]int16 } +type KeyboardModifiers struct { + NumLock *bool + CapsLock *bool +} + type DesktopManager interface { Start() Shutdown() error @@ -39,7 +44,8 @@ type DesktopManager interface { ScreenConfigurations() map[int]ScreenConfiguration GetScreenSize() *ScreenSize SetKeyboardLayout(layout string) - SetKeyboardModifiers(NumLock int, CapsLock int, ScrollLock int) + SetKeyboardModifiers(mod KeyboardModifiers) + GetKeyboardModifiers() KeyboardModifiers GetCursorImage() *CursorImage // xevent diff --git a/internal/websocket/handler/keyboard.go b/internal/websocket/handler/keyboard.go index 4776eef6..2ff5da88 100644 --- a/internal/websocket/handler/keyboard.go +++ b/internal/websocket/handler/keyboard.go @@ -22,27 +22,9 @@ func (h *MessageHandlerCtx) keyboardModifiers(session types.Session, payload *me return nil } - var NumLock = 0 - if payload.NumLock == nil { - NumLock = -1 - } else if *payload.NumLock { - NumLock = 1 - } - - var CapsLock = 0 - if payload.CapsLock == nil { - CapsLock = -1 - } else if *payload.CapsLock { - CapsLock = 1 - } - - var ScrollLock = 0 - if payload.ScrollLock == nil { - ScrollLock = -1 - } else if *payload.ScrollLock { - ScrollLock = 1 - } - - h.desktop.SetKeyboardModifiers(NumLock, CapsLock, ScrollLock) + h.desktop.SetKeyboardModifiers(types.KeyboardModifiers{ + NumLock: payload.NumLock, + CapsLock: payload.CapsLock, + }) return nil }