xorg modifiers refactor.

This commit is contained in:
Miroslav Šedivý
2021-01-12 22:54:13 +01:00
parent d89dd11b18
commit a0d8f1b880
7 changed files with 68 additions and 71 deletions

View File

@ -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 {

View File

@ -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);

View File

@ -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 {

View File

@ -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);