|
|
@@ -116,21 +116,27 @@ static void enqueueEvents(DeviceIntPtr dev, int n) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* Pointer device methods */ |
|
|
|
|
|
|
|
PointerDevice::PointerDevice(rfb::VNCServerST *_server) |
|
|
|
InputDevice::InputDevice(rfb::VNCServerST *_server) |
|
|
|
: server(_server), oldButtonMask(0) |
|
|
|
{ |
|
|
|
dev = AddInputDevice( |
|
|
|
pointerDev = AddInputDevice( |
|
|
|
#if XORG >= 16 |
|
|
|
serverClient, |
|
|
|
#endif |
|
|
|
pointerProc, TRUE); |
|
|
|
RegisterPointerDevice(pointerDev); |
|
|
|
|
|
|
|
keyboardDev = AddInputDevice( |
|
|
|
#if XORG >= 16 |
|
|
|
serverClient, |
|
|
|
serverClient, |
|
|
|
#endif |
|
|
|
pointerProc, TRUE); |
|
|
|
RegisterPointerDevice(dev); |
|
|
|
keyboardProc, TRUE); |
|
|
|
RegisterKeyboardDevice(keyboardDev); |
|
|
|
|
|
|
|
initEventq(); |
|
|
|
} |
|
|
|
|
|
|
|
void PointerDevice::ButtonAction(int buttonMask) |
|
|
|
void InputDevice::PointerButtonAction(int buttonMask) |
|
|
|
{ |
|
|
|
int i, n; |
|
|
|
|
|
|
@@ -138,9 +144,9 @@ void PointerDevice::ButtonAction(int buttonMask) |
|
|
|
if ((buttonMask ^ oldButtonMask) & (1 << i)) { |
|
|
|
int action = (buttonMask & (1<<i)) ? |
|
|
|
ButtonPress : ButtonRelease; |
|
|
|
n = GetPointerEvents(eventq, dev, action, i + 1, |
|
|
|
n = GetPointerEvents(eventq, pointerDev, action, i + 1, |
|
|
|
POINTER_RELATIVE, 0, 0, NULL); |
|
|
|
enqueueEvents(dev, n); |
|
|
|
enqueueEvents(pointerDev, n); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
@@ -148,7 +154,7 @@ void PointerDevice::ButtonAction(int buttonMask) |
|
|
|
oldButtonMask = buttonMask; |
|
|
|
} |
|
|
|
|
|
|
|
void PointerDevice::Move(const rfb::Point &pos) |
|
|
|
void InputDevice::PointerMove(const rfb::Point &pos) |
|
|
|
{ |
|
|
|
int n, valuators[2]; |
|
|
|
|
|
|
@@ -157,14 +163,14 @@ void PointerDevice::Move(const rfb::Point &pos) |
|
|
|
|
|
|
|
valuators[0] = pos.x; |
|
|
|
valuators[1] = pos.y; |
|
|
|
n = GetPointerEvents(eventq, dev, MotionNotify, 0, POINTER_ABSOLUTE, 0, |
|
|
|
n = GetPointerEvents(eventq, pointerDev, MotionNotify, 0, POINTER_ABSOLUTE, 0, |
|
|
|
2, valuators); |
|
|
|
enqueueEvents(dev, n); |
|
|
|
enqueueEvents(pointerDev, n); |
|
|
|
|
|
|
|
cursorPos = pos; |
|
|
|
} |
|
|
|
|
|
|
|
void PointerDevice::Sync(void) |
|
|
|
void InputDevice::PointerSync(void) |
|
|
|
{ |
|
|
|
if (cursorPos.equals(oldCursorPos)) |
|
|
|
return; |
|
|
@@ -232,19 +238,6 @@ static int pointerProc(DeviceIntPtr pDevice, int onoff) |
|
|
|
return Success; |
|
|
|
} |
|
|
|
|
|
|
|
/* KeyboardDevice methods */ |
|
|
|
|
|
|
|
KeyboardDevice::KeyboardDevice(void) |
|
|
|
{ |
|
|
|
dev = AddInputDevice( |
|
|
|
#if XORG >= 16 |
|
|
|
serverClient, |
|
|
|
#endif |
|
|
|
keyboardProc, TRUE); |
|
|
|
RegisterKeyboardDevice(dev); |
|
|
|
initEventq(); |
|
|
|
} |
|
|
|
|
|
|
|
#define IS_PRESSED(keyc, keycode) \ |
|
|
|
((keyc)->down[(keycode) >> 3] & (1 << ((keycode) & 7))) |
|
|
|
|
|
|
@@ -458,7 +451,7 @@ static struct altKeysym_t { |
|
|
|
#define FREE_MAPS |
|
|
|
#endif |
|
|
|
|
|
|
|
void KeyboardDevice::keyEvent(rdr::U32 keysym, bool down) |
|
|
|
void InputDevice::keyEvent(rdr::U32 keysym, bool down) |
|
|
|
{ |
|
|
|
DeviceIntPtr master; |
|
|
|
KeyClassPtr keyc; |
|
|
@@ -484,16 +477,16 @@ void KeyboardDevice::keyEvent(rdr::U32 keysym, bool down) |
|
|
|
} |
|
|
|
|
|
|
|
#if XORG >= 17 |
|
|
|
keyc = dev->u.master->key; |
|
|
|
keyc = keyboardDev->u.master->key; |
|
|
|
|
|
|
|
keymap = XkbGetCoreMap(dev); |
|
|
|
keymap = XkbGetCoreMap(keyboardDev); |
|
|
|
if (!keymap) { |
|
|
|
vlog.error("VNC keyboard device has no map"); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (generate_modkeymap(serverClient, dev, &modmap, &maxKeysPerMod) |
|
|
|
!= Success) { |
|
|
|
if (generate_modkeymap(serverClient, keyboardDev, &modmap, |
|
|
|
&maxKeysPerMod) != Success) { |
|
|
|
vlog.error("generate_modkeymap failed"); |
|
|
|
xfree(keymap->map); |
|
|
|
xfree(keymap); |
|
|
@@ -502,7 +495,7 @@ void KeyboardDevice::keyEvent(rdr::U32 keysym, bool down) |
|
|
|
|
|
|
|
state = XkbStateFieldFromRec(&keyc->xkbInfo->state); |
|
|
|
#else |
|
|
|
keyc = dev->key; |
|
|
|
keyc = keyboardDev->key; |
|
|
|
state = keyc->state; |
|
|
|
maxKeysPerMod = keyc->maxKeysPerModifier; |
|
|
|
keymap = &keyc->curKeySyms; |
|
|
@@ -587,24 +580,24 @@ ModeSwitchFound: |
|
|
|
#if XORG == 15 |
|
|
|
master = inputInfo.keyboard; |
|
|
|
#else |
|
|
|
master = dev->u.master; |
|
|
|
master = keyboardDev->u.master; |
|
|
|
#endif |
|
|
|
void *slave = dixLookupPrivate(&master->devPrivates, |
|
|
|
CoreDevicePrivateKey); |
|
|
|
if (dev == slave) { |
|
|
|
if (keyboardDev == slave) { |
|
|
|
dixSetPrivate(&master->devPrivates, |
|
|
|
CoreDevicePrivateKey, NULL); |
|
|
|
#if XORG == 15 |
|
|
|
SwitchCoreKeyboard(dev); |
|
|
|
SwitchCoreKeyboard(keyboardDev); |
|
|
|
#else |
|
|
|
CopyKeyClass(dev, master); |
|
|
|
CopyKeyClass(keyboardDev, master); |
|
|
|
#endif |
|
|
|
} |
|
|
|
#else /* XORG < 17 */ |
|
|
|
XkbApplyMappingChange(dev, keymap, minKeyCode, |
|
|
|
XkbApplyMappingChange(keyboardDev, keymap, minKeyCode, |
|
|
|
maxKeyCode - minKeyCode + 1, |
|
|
|
NULL, serverClient); |
|
|
|
XkbCopyDeviceKeymap(dev->u.master, dev); |
|
|
|
XkbCopyDeviceKeymap(keyboardDev->u.master, keyboardDev); |
|
|
|
#endif /* XORG < 17 */ |
|
|
|
break; |
|
|
|
} |
|
|
@@ -632,8 +625,8 @@ ModeSwitchFound: |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
ModifierState shift(dev, ShiftMapIndex); |
|
|
|
ModifierState modeSwitch(dev, modeSwitchMapIndex); |
|
|
|
ModifierState shift(keyboardDev, ShiftMapIndex); |
|
|
|
ModifierState modeSwitch(keyboardDev, modeSwitchMapIndex); |
|
|
|
if (down) { |
|
|
|
if (col & 1) |
|
|
|
shift.press(); |
|
|
@@ -649,8 +642,8 @@ ModeSwitchFound: |
|
|
|
|
|
|
|
vlog.debug("keycode %d %s", kc, down ? "down" : "up"); |
|
|
|
action = down ? KeyPress : KeyRelease; |
|
|
|
n = GetKeyboardEvents(eventq, dev, action, kc); |
|
|
|
enqueueEvents(dev, n); |
|
|
|
n = GetKeyboardEvents(eventq, keyboardDev, action, kc); |
|
|
|
enqueueEvents(keyboardDev, n); |
|
|
|
|
|
|
|
/* |
|
|
|
* When faking a modifier we are putting a keycode (which can |