diff --git a/server/internal/remote/manager.go b/server/internal/remote/manager.go index 2b4802e4..4b89d854 100644 --- a/server/internal/remote/manager.go +++ b/server/internal/remote/manager.go @@ -217,8 +217,8 @@ func (manager *RemoteManager) GetScreenSize() *types.ScreenSize { return xorg.GetScreenSize() } -func (manager *RemoteManager) SetKeyboard(layout string) { - xorg.SetKeyboard(layout) +func (manager *RemoteManager) SetKeyboardLayout(layout string) { + xorg.SetKeyboardLayout(layout) } func (manager *RemoteManager) SetKeyboardModifiers(NumLock int, CapsLock int, ScrollLock int) { diff --git a/server/internal/types/remote.go b/server/internal/types/remote.go index a4a9d04f..b437d108 100644 --- a/server/internal/types/remote.go +++ b/server/internal/types/remote.go @@ -22,6 +22,6 @@ type RemoteManager interface { ReadClipboard() string WriteClipboard(data string) ResetKeys() - SetKeyboard(layout string) + SetKeyboardLayout(layout string) SetKeyboardModifiers(NumLock int, CapsLock int, ScrollLock int) } diff --git a/server/internal/websocket/control.go b/server/internal/websocket/control.go index bdab4503..f477a0ed 100644 --- a/server/internal/websocket/control.go +++ b/server/internal/websocket/control.go @@ -125,15 +125,7 @@ func (h *MessageHandler) controlKeyboard(id string, session types.Session, paylo // change layout if payload.Layout != nil { - h.remote.SetKeyboard(*payload.Layout) - } - - // set caps lock - var CapsLock = 0 - if payload.CapsLock == nil { - CapsLock = -1 - } else if *payload.CapsLock { - CapsLock = 1 + h.remote.SetKeyboardLayout(*payload.Layout) } // set num lock @@ -144,6 +136,14 @@ func (h *MessageHandler) controlKeyboard(id string, session types.Session, paylo NumLock = 1 } + // set caps lock + var CapsLock = 0 + if payload.CapsLock == nil { + CapsLock = -1 + } else if *payload.CapsLock { + CapsLock = 1 + } + // set scroll lock var ScrollLock = 0 if payload.ScrollLock == nil { @@ -152,6 +152,6 @@ func (h *MessageHandler) controlKeyboard(id string, session types.Session, paylo ScrollLock = 1 } - h.remote.SetKeyboardModifiers(CapsLock, NumLock, ScrollLock) + h.remote.SetKeyboardModifiers(NumLock, CapsLock, ScrollLock) return nil } diff --git a/server/internal/xorg/xorg.c b/server/internal/xorg/xorg.c index 2801f626..58421f5f 100644 --- a/server/internal/xorg/xorg.c +++ b/server/internal/xorg/xorg.c @@ -166,7 +166,7 @@ short XGetScreenRate() { return XRRConfigCurrentRate(conf); } -void SetKeyboard(char *layout) { +void SetKeyboardLayout(char *layout) { // TOOD: refactor, use native API. char cmd[13] = "setxkbmap "; strncat(cmd, layout, 2); @@ -174,33 +174,22 @@ void SetKeyboard(char *layout) { } void SetKeyboardModifiers(int num_lock, int caps_lock, int scroll_lock) { - // TOOD: refactor, use native API. - // https://stackoverflow.com/questions/8427817/how-to-get-a-num-lock-state-using-c-c/8429021 Display *display = getXDisplay(); - XKeyboardState x; - XGetKeyboardControl(display, &x); - // set caps lock - //printf("CapsLock is %s\n", (x.led_mask & 1) ? "On" : "Off"); - if(caps_lock != -1 && x.led_mask & 1 != caps_lock) { - XKey(0xffe5, 1); - XKey(0xffe5, 0); + if (num_lock != -1) { + XkbLockModifiers(display, XkbUseCoreKbd, 16, num_lock * 16); } - // set num lock - //printf("NumLock is %s\n", (x.led_mask & 2) ? "On" : "Off"); - if(num_lock != -1 && x.led_mask & 2 != num_lock) { - XKey(0xff7f, 1); - XKey(0xff7f, 0); + if (caps_lock != -1) { + XkbLockModifiers(display, XkbUseCoreKbd, 2, caps_lock * 2); } - /* NOT SUPPORTED - // set scroll lock - //printf("ScrollLock is %s\n", (x.led_mask & 4) ? "On" : "Off"); - if(scroll_lock != -1 && x.led_mask & 4 != scroll_lock) { - XKey(0xff14, 1); - XKey(0xff14, 0); + if (scroll_lock != -1) { + XKeyboardControl values; + values.led_mode = scroll_lock ? LedModeOn : LedModeOff; + values.led = 3; + XChangeKeyboardControl(display, KBLedMode, &values); } - */ + + XFlush(display); } - diff --git a/server/internal/xorg/xorg.go b/server/internal/xorg/xorg.go index ae96629d..39f33f7f 100644 --- a/server/internal/xorg/xorg.go +++ b/server/internal/xorg/xorg.go @@ -211,7 +211,7 @@ func GetScreenSize() *types.ScreenSize { return nil } -func SetKeyboard(layout string) { +func SetKeyboardLayout(layout string) { mu.Lock() defer mu.Unlock() @@ -222,7 +222,7 @@ func SetKeyboard(layout string) { layoutUnsafe := C.CString(layout) defer C.free(unsafe.Pointer(layoutUnsafe)) - C.SetKeyboard(layoutUnsafe) + C.SetKeyboardLayout(layoutUnsafe) } func SetKeyboardModifiers(num_lock int, caps_lock int, scroll_lock int) { diff --git a/server/internal/xorg/xorg.h b/server/internal/xorg/xorg.h index fabaf15a..88eca160 100644 --- a/server/internal/xorg/xorg.h +++ b/server/internal/xorg/xorg.h @@ -4,6 +4,7 @@ #define XDISPLAY_H #include + #include #include #include #include @@ -39,7 +40,7 @@ void XDisplayClose(void); void XDisplaySet(char *input); - void SetKeyboard(char *layout); + void SetKeyboardLayout(char *layout); void SetKeyboardModifiers(int num_lock, int caps_lock, int scroll_lock); #endif