From 2fbf1e9ca4b02ae7e1bcc3b884aa2bb6af5cd067 Mon Sep 17 00:00:00 2001 From: m1k1o Date: Sun, 21 Jun 2020 01:57:52 +0200 Subject: [PATCH 1/4] get named indicators --- server/internal/xorg/xorg.c | 45 +++++++++++++++++++------------------ server/internal/xorg/xorg.h | 2 ++ 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/server/internal/xorg/xorg.c b/server/internal/xorg/xorg.c index 2801f626..e287952a 100644 --- a/server/internal/xorg/xorg.c +++ b/server/internal/xorg/xorg.c @@ -174,33 +174,34 @@ 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); - } + Bool state; + Atom atom; // 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); + atom = XInternAtom(display, "Num Lock", 0); + XkbGetNamedIndicator(display, atom, NULL, &state, NULL, NULL); + //printf("Num Lock is %s\n", state ? "on" : "off"); + if(num_lock != -1 && state != num_lock) { + XKey(XK_Num_Lock, 1); + XKey(XK_Num_Lock, 0); + } + + // set caps lock + atom = XInternAtom(display, "Caps Lock", 0); + XkbGetNamedIndicator(display, atom, NULL, &state, NULL, NULL); + //printf("Caps Lock is %s\n", state ? "on" : "off"); + if(caps_lock != -1 && state != caps_lock) { + XKey(XK_Caps_Lock, 1); + XKey(XK_Caps_Lock, 0); } - /* 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); + atom = XInternAtom(display, "Scroll Lock", 0); + XkbGetNamedIndicator(display, atom, NULL, &state, NULL, NULL); + //printf("Scroll Lock is %s\n", state ? "on" : "off"); + if(scroll_lock != -1 && state != scroll_lock) { + XKey(XK_Scroll_Lock, 1); + XKey(XK_Scroll_Lock, 0); } - */ } - diff --git a/server/internal/xorg/xorg.h b/server/internal/xorg/xorg.h index fabaf15a..e5e7c2a9 100644 --- a/server/internal/xorg/xorg.h +++ b/server/internal/xorg/xorg.h @@ -4,6 +4,8 @@ #define XDISPLAY_H #include + #include + #include #include #include #include From 9ce26cffc5c5f268558192e155032923519f7234 Mon Sep 17 00:00:00 2001 From: m1k1o Date: Sun, 21 Jun 2020 03:01:15 +0200 Subject: [PATCH 2/4] bug: bad args order. --- server/internal/websocket/control.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/server/internal/websocket/control.go b/server/internal/websocket/control.go index bdab4503..ec7f196f 100644 --- a/server/internal/websocket/control.go +++ b/server/internal/websocket/control.go @@ -128,14 +128,6 @@ func (h *MessageHandler) controlKeyboard(id string, session types.Session, paylo h.remote.SetKeyboard(*payload.Layout) } - // set caps lock - var CapsLock = 0 - if payload.CapsLock == nil { - CapsLock = -1 - } else if *payload.CapsLock { - CapsLock = 1 - } - // set num lock var NumLock = 0 if payload.NumLock == nil { @@ -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 } From 6f4bbeb4520094e4916a97d8f8078408682a7ed7 Mon Sep 17 00:00:00 2001 From: m1k1o Date: Sun, 21 Jun 2020 03:01:59 +0200 Subject: [PATCH 3/4] change lock modifiers --- server/internal/xorg/xorg.c | 34 +++++++++++----------------------- server/internal/xorg/xorg.h | 1 - 2 files changed, 11 insertions(+), 24 deletions(-) diff --git a/server/internal/xorg/xorg.c b/server/internal/xorg/xorg.c index e287952a..9c45c9bc 100644 --- a/server/internal/xorg/xorg.c +++ b/server/internal/xorg/xorg.c @@ -175,33 +175,21 @@ void SetKeyboard(char *layout) { void SetKeyboardModifiers(int num_lock, int caps_lock, int scroll_lock) { Display *display = getXDisplay(); - Bool state; - Atom atom; - // set num lock - atom = XInternAtom(display, "Num Lock", 0); - XkbGetNamedIndicator(display, atom, NULL, &state, NULL, NULL); - //printf("Num Lock is %s\n", state ? "on" : "off"); - if(num_lock != -1 && state != num_lock) { - XKey(XK_Num_Lock, 1); - XKey(XK_Num_Lock, 0); + if (num_lock != -1) { + XkbLockModifiers(display, XkbUseCoreKbd, 16, num_lock * 16); } - // set caps lock - atom = XInternAtom(display, "Caps Lock", 0); - XkbGetNamedIndicator(display, atom, NULL, &state, NULL, NULL); - //printf("Caps Lock is %s\n", state ? "on" : "off"); - if(caps_lock != -1 && state != caps_lock) { - XKey(XK_Caps_Lock, 1); - XKey(XK_Caps_Lock, 0); + if (caps_lock != -1) { + XkbLockModifiers(display, XkbUseCoreKbd, 2, caps_lock * 2); } - // set scroll lock - atom = XInternAtom(display, "Scroll Lock", 0); - XkbGetNamedIndicator(display, atom, NULL, &state, NULL, NULL); - //printf("Scroll Lock is %s\n", state ? "on" : "off"); - if(scroll_lock != -1 && state != scroll_lock) { - XKey(XK_Scroll_Lock, 1); - XKey(XK_Scroll_Lock, 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.h b/server/internal/xorg/xorg.h index e5e7c2a9..d0a30214 100644 --- a/server/internal/xorg/xorg.h +++ b/server/internal/xorg/xorg.h @@ -5,7 +5,6 @@ #include #include - #include #include #include #include From 832968e8fc0cd12bd086abe91fd92bb3401ec794 Mon Sep 17 00:00:00 2001 From: m1k1o Date: Sun, 21 Jun 2020 03:05:58 +0200 Subject: [PATCH 4/4] fix naming convention --- server/internal/remote/manager.go | 4 ++-- server/internal/types/remote.go | 2 +- server/internal/websocket/control.go | 2 +- server/internal/xorg/xorg.c | 2 +- server/internal/xorg/xorg.go | 4 ++-- server/internal/xorg/xorg.h | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/server/internal/remote/manager.go b/server/internal/remote/manager.go index fe4413fb..c646a39e 100644 --- a/server/internal/remote/manager.go +++ b/server/internal/remote/manager.go @@ -219,6 +219,6 @@ 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) } \ No newline at end of file diff --git a/server/internal/types/remote.go b/server/internal/types/remote.go index 4b6453be..d2b0e36e 100644 --- a/server/internal/types/remote.go +++ b/server/internal/types/remote.go @@ -22,5 +22,5 @@ type RemoteManager interface { ReadClipboard() string WriteClipboard(data string) ResetKeys() - SetKeyboard(layout string) + SetKeyboardLayout(layout string) } diff --git a/server/internal/websocket/control.go b/server/internal/websocket/control.go index 234c5d06..7a2ffff9 100644 --- a/server/internal/websocket/control.go +++ b/server/internal/websocket/control.go @@ -123,6 +123,6 @@ func (h *MessageHandler) controlKeyboard(id string, session types.Session, paylo return nil } - h.remote.SetKeyboard(payload.Layout) + h.remote.SetKeyboardLayout(payload.Layout) return nil } diff --git a/server/internal/xorg/xorg.c b/server/internal/xorg/xorg.c index 3868f5d2..d49c3939 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); diff --git a/server/internal/xorg/xorg.go b/server/internal/xorg/xorg.go index 200294cc..5280a8ef 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) } //export goCreateScreenSize diff --git a/server/internal/xorg/xorg.h b/server/internal/xorg/xorg.h index 24384c48..cf0cd3e8 100644 --- a/server/internal/xorg/xorg.h +++ b/server/internal/xorg/xorg.h @@ -39,6 +39,6 @@ void XDisplayClose(void); void XDisplaySet(char *input); - void SetKeyboard(char *layout); + void SetKeyboardLayout(char *layout); #endif