Merge branch 'kbd-modifier-state-sync' of github.com:m1k1o/neko into dev
This commit is contained in:
commit
bfcc3efe12
@ -217,8 +217,8 @@ func (manager *RemoteManager) GetScreenSize() *types.ScreenSize {
|
|||||||
return xorg.GetScreenSize()
|
return xorg.GetScreenSize()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (manager *RemoteManager) SetKeyboard(layout string) {
|
func (manager *RemoteManager) SetKeyboardLayout(layout string) {
|
||||||
xorg.SetKeyboard(layout)
|
xorg.SetKeyboardLayout(layout)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (manager *RemoteManager) SetKeyboardModifiers(NumLock int, CapsLock int, ScrollLock int) {
|
func (manager *RemoteManager) SetKeyboardModifiers(NumLock int, CapsLock int, ScrollLock int) {
|
||||||
|
@ -22,6 +22,6 @@ type RemoteManager interface {
|
|||||||
ReadClipboard() string
|
ReadClipboard() string
|
||||||
WriteClipboard(data string)
|
WriteClipboard(data string)
|
||||||
ResetKeys()
|
ResetKeys()
|
||||||
SetKeyboard(layout string)
|
SetKeyboardLayout(layout string)
|
||||||
SetKeyboardModifiers(NumLock int, CapsLock int, ScrollLock int)
|
SetKeyboardModifiers(NumLock int, CapsLock int, ScrollLock int)
|
||||||
}
|
}
|
||||||
|
@ -125,15 +125,7 @@ func (h *MessageHandler) controlKeyboard(id string, session types.Session, paylo
|
|||||||
|
|
||||||
// change layout
|
// change layout
|
||||||
if payload.Layout != nil {
|
if payload.Layout != nil {
|
||||||
h.remote.SetKeyboard(*payload.Layout)
|
h.remote.SetKeyboardLayout(*payload.Layout)
|
||||||
}
|
|
||||||
|
|
||||||
// set caps lock
|
|
||||||
var CapsLock = 0
|
|
||||||
if payload.CapsLock == nil {
|
|
||||||
CapsLock = -1
|
|
||||||
} else if *payload.CapsLock {
|
|
||||||
CapsLock = 1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// set num lock
|
// set num lock
|
||||||
@ -144,6 +136,14 @@ func (h *MessageHandler) controlKeyboard(id string, session types.Session, paylo
|
|||||||
NumLock = 1
|
NumLock = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set caps lock
|
||||||
|
var CapsLock = 0
|
||||||
|
if payload.CapsLock == nil {
|
||||||
|
CapsLock = -1
|
||||||
|
} else if *payload.CapsLock {
|
||||||
|
CapsLock = 1
|
||||||
|
}
|
||||||
|
|
||||||
// set scroll lock
|
// set scroll lock
|
||||||
var ScrollLock = 0
|
var ScrollLock = 0
|
||||||
if payload.ScrollLock == nil {
|
if payload.ScrollLock == nil {
|
||||||
@ -152,6 +152,6 @@ func (h *MessageHandler) controlKeyboard(id string, session types.Session, paylo
|
|||||||
ScrollLock = 1
|
ScrollLock = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
h.remote.SetKeyboardModifiers(CapsLock, NumLock, ScrollLock)
|
h.remote.SetKeyboardModifiers(NumLock, CapsLock, ScrollLock)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -166,7 +166,7 @@ short XGetScreenRate() {
|
|||||||
return XRRConfigCurrentRate(conf);
|
return XRRConfigCurrentRate(conf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetKeyboard(char *layout) {
|
void SetKeyboardLayout(char *layout) {
|
||||||
// TOOD: refactor, use native API.
|
// TOOD: refactor, use native API.
|
||||||
char cmd[13] = "setxkbmap ";
|
char cmd[13] = "setxkbmap ";
|
||||||
strncat(cmd, layout, 2);
|
strncat(cmd, layout, 2);
|
||||||
@ -174,33 +174,22 @@ void SetKeyboard(char *layout) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SetKeyboardModifiers(int num_lock, int caps_lock, int scroll_lock) {
|
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();
|
Display *display = getXDisplay();
|
||||||
XKeyboardState x;
|
|
||||||
XGetKeyboardControl(display, &x);
|
|
||||||
|
|
||||||
// set caps lock
|
if (num_lock != -1) {
|
||||||
//printf("CapsLock is %s\n", (x.led_mask & 1) ? "On" : "Off");
|
XkbLockModifiers(display, XkbUseCoreKbd, 16, num_lock * 16);
|
||||||
if(caps_lock != -1 && x.led_mask & 1 != caps_lock) {
|
|
||||||
XKey(0xffe5, 1);
|
|
||||||
XKey(0xffe5, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// set num lock
|
if (caps_lock != -1) {
|
||||||
//printf("NumLock is %s\n", (x.led_mask & 2) ? "On" : "Off");
|
XkbLockModifiers(display, XkbUseCoreKbd, 2, caps_lock * 2);
|
||||||
if(num_lock != -1 && x.led_mask & 2 != num_lock) {
|
|
||||||
XKey(0xff7f, 1);
|
|
||||||
XKey(0xff7f, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* NOT SUPPORTED
|
if (scroll_lock != -1) {
|
||||||
// set scroll lock
|
XKeyboardControl values;
|
||||||
//printf("ScrollLock is %s\n", (x.led_mask & 4) ? "On" : "Off");
|
values.led_mode = scroll_lock ? LedModeOn : LedModeOff;
|
||||||
if(scroll_lock != -1 && x.led_mask & 4 != scroll_lock) {
|
values.led = 3;
|
||||||
XKey(0xff14, 1);
|
XChangeKeyboardControl(display, KBLedMode, &values);
|
||||||
XKey(0xff14, 0);
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
XFlush(display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,7 +211,7 @@ func GetScreenSize() *types.ScreenSize {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetKeyboard(layout string) {
|
func SetKeyboardLayout(layout string) {
|
||||||
mu.Lock()
|
mu.Lock()
|
||||||
defer mu.Unlock()
|
defer mu.Unlock()
|
||||||
|
|
||||||
@ -222,7 +222,7 @@ func SetKeyboard(layout string) {
|
|||||||
layoutUnsafe := C.CString(layout)
|
layoutUnsafe := C.CString(layout)
|
||||||
defer C.free(unsafe.Pointer(layoutUnsafe))
|
defer C.free(unsafe.Pointer(layoutUnsafe))
|
||||||
|
|
||||||
C.SetKeyboard(layoutUnsafe)
|
C.SetKeyboardLayout(layoutUnsafe)
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetKeyboardModifiers(num_lock int, caps_lock int, scroll_lock int) {
|
func SetKeyboardModifiers(num_lock int, caps_lock int, scroll_lock int) {
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#define XDISPLAY_H
|
#define XDISPLAY_H
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/XKBlib.h>
|
||||||
#include <X11/extensions/Xrandr.h>
|
#include <X11/extensions/Xrandr.h>
|
||||||
#include <X11/extensions/XTest.h>
|
#include <X11/extensions/XTest.h>
|
||||||
#include <libclipboard.h>
|
#include <libclipboard.h>
|
||||||
@ -39,7 +40,7 @@
|
|||||||
void XDisplayClose(void);
|
void XDisplayClose(void);
|
||||||
void XDisplaySet(char *input);
|
void XDisplaySet(char *input);
|
||||||
|
|
||||||
void SetKeyboard(char *layout);
|
void SetKeyboardLayout(char *layout);
|
||||||
void SetKeyboardModifiers(int num_lock, int caps_lock, int scroll_lock);
|
void SetKeyboardModifiers(int num_lock, int caps_lock, int scroll_lock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user