summaryrefslogtreecommitdiffstats
path: root/xorg/server/xrdpkeyb/rdpKeyboard.c
diff options
context:
space:
mode:
Diffstat (limited to 'xorg/server/xrdpkeyb/rdpKeyboard.c')
-rw-r--r--xorg/server/xrdpkeyb/rdpKeyboard.c732
1 files changed, 0 insertions, 732 deletions
diff --git a/xorg/server/xrdpkeyb/rdpKeyboard.c b/xorg/server/xrdpkeyb/rdpKeyboard.c
deleted file mode 100644
index 8c8a7c27..00000000
--- a/xorg/server/xrdpkeyb/rdpKeyboard.c
+++ /dev/null
@@ -1,732 +0,0 @@
-/*
-Copyright 2013-2014 Jay Sorg
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-xrdp keyboard module
-
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-/* this should be before all X11 .h files */
-#include <xorg-server.h>
-#include <xorgVersion.h>
-
-/* all driver need this */
-#include <xf86.h>
-#include <xf86_OSproc.h>
-
-#include "xf86Xinput.h"
-
-#include <mipointer.h>
-#include <fb.h>
-#include <micmap.h>
-#include <mi.h>
-
-#include <xkbsrv.h>
-
-#include "X11/keysym.h"
-
-#include "rdp.h"
-#include "rdpInput.h"
-#include "rdpDraw.h"
-
-/******************************************************************************/
-#define LOG_LEVEL 1
-#define LLOGLN(_level, _args) \
- do { if (_level < LOG_LEVEL) { ErrorF _args ; ErrorF("\n"); } } while (0)
-
-#define MIN_KEY_CODE 8
-#define MAX_KEY_CODE 255
-#define NO_OF_KEYS ((MAX_KEY_CODE - MIN_KEY_CODE) + 1)
-#define GLYPHS_PER_KEY 2
-/* control */
-#define CONTROL_L_KEY_CODE 37
-#define CONTROL_R_KEY_CODE 109
-/* shift */
-#define SHIFT_L_KEY_CODE 50
-#define SHIFT_R_KEY_CODE 62
-/* win keys */
-#define SUPER_L_KEY_CODE 115
-#define SUPER_R_KEY_CODE 116
-/* alt */
-#define ALT_L_KEY_CODE 64
-#define ALT_R_KEY_CODE 113
-/* caps lock */
-#define CAPS_LOCK_KEY_CODE 66
-/* num lock */
-#define NUM_LOCK_KEY_CODE 77
-
-#define N_PREDEFINED_KEYS \
- (sizeof(g_kbdMap) / (sizeof(KeySym) * GLYPHS_PER_KEY))
-
-static KeySym g_kbdMap[] =
-{
- NoSymbol, NoSymbol, /* 8 */
- XK_Escape, NoSymbol, /* 9 */
- XK_1, XK_exclam, /* 10 */
- XK_2, XK_at,
- XK_3, XK_numbersign,
- XK_4, XK_dollar,
- XK_5, XK_percent,
- XK_6, XK_asciicircum,
- XK_7, XK_ampersand,
- XK_8, XK_asterisk,
- XK_9, XK_parenleft,
- XK_0, XK_parenright,
- XK_minus, XK_underscore, /* 20 */
- XK_equal, XK_plus,
- XK_BackSpace, NoSymbol,
- XK_Tab, XK_ISO_Left_Tab,
- XK_Q, NoSymbol,
- XK_W, NoSymbol,
- XK_E, NoSymbol,
- XK_R, NoSymbol,
- XK_T, NoSymbol,
- XK_Y, NoSymbol,
- XK_U, NoSymbol, /* 30 */
- XK_I, NoSymbol,
- XK_O, NoSymbol,
- XK_P, NoSymbol,
- XK_bracketleft, XK_braceleft,
- XK_bracketright, XK_braceright,
- XK_Return, NoSymbol,
- XK_Control_L, NoSymbol,
- XK_A, NoSymbol,
- XK_S, NoSymbol,
- XK_D, NoSymbol, /* 40 */
- XK_F, NoSymbol,
- XK_G, NoSymbol,
- XK_H, NoSymbol,
- XK_J, NoSymbol,
- XK_K, NoSymbol,
- XK_L, NoSymbol,
- XK_semicolon, XK_colon,
- XK_apostrophe, XK_quotedbl,
- XK_grave, XK_asciitilde,
- XK_Shift_L, NoSymbol, /* 50 */
- XK_backslash, XK_bar,
- XK_Z, NoSymbol,
- XK_X, NoSymbol,
- XK_C, NoSymbol,
- XK_V, NoSymbol,
- XK_B, NoSymbol,
- XK_N, NoSymbol,
- XK_M, NoSymbol,
- XK_comma, XK_less,
- XK_period, XK_greater, /* 60 */
- XK_slash, XK_question,
- XK_Shift_R, NoSymbol,
- XK_KP_Multiply, NoSymbol,
- XK_Alt_L, NoSymbol,
- XK_space, NoSymbol,
- XK_Caps_Lock, NoSymbol,
- XK_F1, NoSymbol,
- XK_F2, NoSymbol,
- XK_F3, NoSymbol,
- XK_F4, NoSymbol, /* 70 */
- XK_F5, NoSymbol,
- XK_F6, NoSymbol,
- XK_F7, NoSymbol,
- XK_F8, NoSymbol,
- XK_F9, NoSymbol,
- XK_F10, NoSymbol,
- XK_Num_Lock, NoSymbol,
- XK_Scroll_Lock, NoSymbol,
- XK_KP_Home, XK_KP_7,
- XK_KP_Up, XK_KP_8, /* 80 */
- XK_KP_Prior, XK_KP_9,
- XK_KP_Subtract, NoSymbol,
- XK_KP_Left, XK_KP_4,
- XK_KP_Begin, XK_KP_5,
- XK_KP_Right, XK_KP_6,
- XK_KP_Add, NoSymbol,
- XK_KP_End, XK_KP_1,
- XK_KP_Down, XK_KP_2,
- XK_KP_Next, XK_KP_3,
- XK_KP_Insert, XK_KP_0, /* 90 */
- XK_KP_Delete, XK_KP_Decimal,
- NoSymbol, NoSymbol,
- NoSymbol, NoSymbol,
- NoSymbol, NoSymbol,
- XK_F11, NoSymbol,
- XK_F12, NoSymbol,
- XK_Home, NoSymbol,
- XK_Up, NoSymbol,
- XK_Prior, NoSymbol,
- XK_Left, NoSymbol, /* 100 */
- XK_Print, NoSymbol,
- XK_Right, NoSymbol,
- XK_End, NoSymbol,
- XK_Down, NoSymbol,
- XK_Next, NoSymbol,
- XK_Insert, NoSymbol,
- XK_Delete, NoSymbol,
- XK_KP_Enter, NoSymbol,
- XK_Control_R, NoSymbol,
- XK_Pause, NoSymbol, /* 110 */
- XK_Print, NoSymbol,
- XK_KP_Divide, NoSymbol,
- XK_Alt_R, NoSymbol,
- NoSymbol, NoSymbol,
- XK_Super_L, NoSymbol,
- XK_Super_R, NoSymbol,
- XK_Menu, NoSymbol,
- NoSymbol, NoSymbol,
- NoSymbol, NoSymbol,
- NoSymbol, NoSymbol, /* 120 */
- NoSymbol, NoSymbol
-};
-
-/******************************************************************************/
-static void
-rdpEnqueueKey(DeviceIntPtr device, int type, int scancode)
-{
- if (type == KeyPress)
- {
- xf86PostKeyboardEvent(device, scancode, TRUE);
- }
- else
- {
- xf86PostKeyboardEvent(device, scancode, FALSE);
- }
-}
-
-/******************************************************************************/
-static void
-sendDownUpKeyEvent(DeviceIntPtr device, int type, int x_scancode)
-{
- /* need this cause rdp and X11 repeats are different */
- /* if type is keydown, send keyup + keydown */
- if (type == KeyPress)
- {
- rdpEnqueueKey(device, KeyRelease, x_scancode);
- rdpEnqueueKey(device, KeyPress, x_scancode);
- }
- else
- {
- rdpEnqueueKey(device, KeyRelease, x_scancode);
- }
-}
-
-/******************************************************************************/
-static void
-check_keysa(rdpKeyboard *keyboard)
-{
- if (keyboard->ctrl_down != 0)
- {
- rdpEnqueueKey(keyboard->device, KeyRelease, keyboard->ctrl_down);
- keyboard->ctrl_down = 0;
- }
-
- if (keyboard->alt_down != 0)
- {
- rdpEnqueueKey(keyboard->device, KeyRelease, keyboard->alt_down);
- keyboard->alt_down = 0;
- }
-
- if (keyboard->shift_down != 0)
- {
- rdpEnqueueKey(keyboard->device, KeyRelease, keyboard->shift_down);
- keyboard->shift_down = 0;
- }
-}
-
-/**
- * @param down - true for KeyDown events, false otherwise
- * @param param1 - ASCII code of pressed key
- * @param param2 -
- * @param param3 - scancode of pressed key
- * @param param4 -
- ******************************************************************************/
-static void
-KbdAddEvent(rdpKeyboard *keyboard, int down, int param1, int param2,
- int param3, int param4)
-{
- int rdp_scancode;
- int x_scancode;
- int is_ext;
- int is_spe;
- int type;
-
- type = down ? KeyPress : KeyRelease;
- rdp_scancode = param3;
- is_ext = param4 & 256; /* 0x100 */
- is_spe = param4 & 512; /* 0x200 */
- x_scancode = 0;
-
- switch (rdp_scancode)
- {
- case 58: /* caps lock */
- case 42: /* left shift */
- case 54: /* right shift */
- case 70: /* scroll lock */
- x_scancode = rdp_scancode + MIN_KEY_CODE;
-
- if (x_scancode > 0)
- {
- rdpEnqueueKey(keyboard->device, type, x_scancode);
- }
-
- break;
-
- case 56: /* left - right alt button */
-
- if (is_ext)
- {
- x_scancode = 113; /* right alt button */
- }
- else
- {
- x_scancode = 64; /* left alt button */
- }
-
- rdpEnqueueKey(keyboard->device, type, x_scancode);
- break;
-
- case 15: /* tab */
-
- if (!down && !keyboard->tab_down)
- {
- /* leave x_scancode 0 here, we don't want the tab key up */
- check_keysa(keyboard);
- }
- else
- {
- sendDownUpKeyEvent(keyboard->device, type, 23);
- }
-
- keyboard->tab_down = down;
- break;
-
- case 29: /* left or right ctrl */
-
- /* this is to handle special case with pause key sending control first */
- if (is_spe)
- {
- if (down)
- {
- keyboard->pause_spe = 1;
- /* leave x_scancode 0 here, we don't want the control key down */
- }
- }
- else
- {
- x_scancode = is_ext ? 109 : 37;
- keyboard->ctrl_down = down ? x_scancode : 0;
- rdpEnqueueKey(keyboard->device, type, x_scancode);
- }
-
- break;
-
- case 69: /* Pause or Num Lock */
-
- if (keyboard->pause_spe)
- {
- x_scancode = 110;
-
- if (!down)
- {
- keyboard->pause_spe = 0;
- }
- }
- else
- {
- x_scancode = keyboard->ctrl_down ? 110 : 77;
- }
-
- sendDownUpKeyEvent(keyboard->device, type, x_scancode);
- break;
-
- case 28: /* Enter or Return */
- x_scancode = is_ext ? 108 : 36;
- sendDownUpKeyEvent(keyboard->device, type, x_scancode);
- break;
-
- case 53: /* / */
- x_scancode = is_ext ? 112 : 61;
- sendDownUpKeyEvent(keyboard->device, type, x_scancode);
- break;
-
- case 55: /* * on KP or Print Screen */
- x_scancode = is_ext ? 111 : 63;
- sendDownUpKeyEvent(keyboard->device, type, x_scancode);
- break;
-
- case 71: /* 7 or Home */
- x_scancode = is_ext ? 97 : 79;
- sendDownUpKeyEvent(keyboard->device, type, x_scancode);
- break;
-
- case 72: /* 8 or Up */
- x_scancode = is_ext ? 98 : 80;
- sendDownUpKeyEvent(keyboard->device, type, x_scancode);
- break;
-
- case 73: /* 9 or PgUp */
- x_scancode = is_ext ? 99 : 81;
- sendDownUpKeyEvent(keyboard->device, type, x_scancode);
- break;
-
- case 75: /* 4 or Left */
- x_scancode = is_ext ? 100 : 83;
- sendDownUpKeyEvent(keyboard->device, type, x_scancode);
- break;
-
- case 77: /* 6 or Right */
- x_scancode = is_ext ? 102 : 85;
- sendDownUpKeyEvent(keyboard->device, type, x_scancode);
- break;
-
- case 79: /* 1 or End */
- x_scancode = is_ext ? 103 : 87;
- sendDownUpKeyEvent(keyboard->device, type, x_scancode);
- break;
-
- case 80: /* 2 or Down */
- x_scancode = is_ext ? 104 : 88;
- sendDownUpKeyEvent(keyboard->device, type, x_scancode);
- break;
-
- case 81: /* 3 or PgDn */
- x_scancode = is_ext ? 105 : 89;
- sendDownUpKeyEvent(keyboard->device, type, x_scancode);
- break;
-
- case 82: /* 0 or Insert */
- x_scancode = is_ext ? 106 : 90;
- sendDownUpKeyEvent(keyboard->device, type, x_scancode);
- break;
-
- case 83: /* . or Delete */
- x_scancode = is_ext ? 107 : 91;
- sendDownUpKeyEvent(keyboard->device, type, x_scancode);
- break;
-
- case 91: /* left win key */
- rdpEnqueueKey(keyboard->device, type, 115);
- break;
-
- case 92: /* right win key */
- rdpEnqueueKey(keyboard->device, type, 116);
- break;
-
- case 93: /* menu key */
- rdpEnqueueKey(keyboard->device, type, 117);
- break;
-
- default:
- x_scancode = rdp_scancode + MIN_KEY_CODE;
-
- if (x_scancode > 0)
- {
- sendDownUpKeyEvent(keyboard->device, type, x_scancode);
- }
-
- break;
- }
-}
-
-/******************************************************************************/
-/* notes -
- scroll lock doesn't seem to be a modifier in X
-*/
-static void
-KbdSync(rdpKeyboard *keyboard, int param1)
-{
- int xkb_state;
-
- xkb_state = XkbStateFieldFromRec(&(keyboard->device->key->xkbInfo->state));
-
- if ((!(xkb_state & 0x02)) != (!(param1 & 4))) /* caps lock */
- {
- LLOGLN(0, ("KbdSync: toggling caps lock"));
- KbdAddEvent(keyboard, 1, 58, 0, 58, 0);
- KbdAddEvent(keyboard, 0, 58, 49152, 58, 49152);
- }
-
- if ((!(xkb_state & 0x10)) != (!(param1 & 2))) /* num lock */
- {
- LLOGLN(0, ("KbdSync: toggling num lock"));
- KbdAddEvent(keyboard, 1, 69, 0, 69, 0);
- KbdAddEvent(keyboard, 0, 69, 49152, 69, 49152);
- }
-
- if ((!(keyboard->scroll_lock_down)) != (!(param1 & 1))) /* scroll lock */
- {
- LLOGLN(0, ("KbdSync: toggling scroll lock"));
- KbdAddEvent(keyboard, 1, 70, 0, 70, 0);
- KbdAddEvent(keyboard, 0, 70, 49152, 70, 49152);
- }
-}
-
-/******************************************************************************/
-static int
-rdpInputKeyboard(rdpPtr dev, int msg, long param1, long param2,
- long param3, long param4)
-{
- rdpKeyboard *keyboard;
-
- keyboard = &(dev->keyboard);
- LLOGLN(10, ("rdpInputKeyboard:"));
- switch (msg)
- {
- case 15: /* key down */
- case 16: /* key up */
- KbdAddEvent(keyboard, msg == 15, param1, param2, param3, param4);
- break;
- case 17: /* from RDP_INPUT_SYNCHRONIZE */
- KbdSync(keyboard, param1);
- break;
- }
- return 0;
-}
-
-/******************************************************************************/
-void
-rdpkeybDeviceInit(DeviceIntPtr pDevice, KeySymsPtr pKeySyms, CARD8 *pModMap)
-{
- int i;
-
- LLOGLN(0, ("rdpkeybDeviceInit:"));
- LLOGLN(10, (" MAP_LENGTH %d GLYPHS_PER_KEY %d N_PREDEFINED_KEYS %d",
- MAP_LENGTH, GLYPHS_PER_KEY, (int) N_PREDEFINED_KEYS));
-
- for (i = 0; i < MAP_LENGTH; i++)
- {
- pModMap[i] = NoSymbol;
- }
-
- pModMap[SHIFT_L_KEY_CODE] = ShiftMask;
- pModMap[SHIFT_R_KEY_CODE] = ShiftMask;
- pModMap[CAPS_LOCK_KEY_CODE] = LockMask;
- pModMap[CONTROL_L_KEY_CODE] = ControlMask;
- pModMap[CONTROL_R_KEY_CODE] = ControlMask;
- pModMap[ALT_L_KEY_CODE] = Mod1Mask;
- pModMap[ALT_R_KEY_CODE] = Mod1Mask;
- pModMap[NUM_LOCK_KEY_CODE] = Mod2Mask;
- pModMap[SUPER_L_KEY_CODE] = Mod4Mask;
- pModMap[SUPER_R_KEY_CODE] = Mod4Mask;
- pKeySyms->minKeyCode = MIN_KEY_CODE;
- pKeySyms->maxKeyCode = MAX_KEY_CODE;
- pKeySyms->mapWidth = GLYPHS_PER_KEY;
- i = sizeof(KeySym) * MAP_LENGTH * GLYPHS_PER_KEY;
- pKeySyms->map = (KeySym *)malloc(i);
- if (pKeySyms->map == 0)
- {
- LLOGLN(0, ("rdpkeybDeviceInit: malloc failed"));
- exit(1);
- }
- else
- {
- memset(pKeySyms->map, 0, i);
- }
-
- for (i = 0; i < MAP_LENGTH * GLYPHS_PER_KEY; i++)
- {
- pKeySyms->map[i] = NoSymbol;
- }
-
- for (i = 0; i < N_PREDEFINED_KEYS * GLYPHS_PER_KEY; i++)
- {
- pKeySyms->map[i] = g_kbdMap[i];
- }
-}
-
-/******************************************************************************/
-static void
-rdpkeybDeviceOn(void)
-{
- LLOGLN(0, ("rdpkeybDeviceOn:"));
-}
-
-/******************************************************************************/
-static void
-rdpkeybDeviceOff(void)
-{
- LLOGLN(0, ("rdpkeybDeviceOff:"));
-}
-
-/******************************************************************************/
-static void
-rdpkeybBell(int volume, DeviceIntPtr pDev, pointer ctrl, int cls)
-{
- LLOGLN(0, ("rdpkeybBell:"));
-}
-
-/******************************************************************************/
-static void
-rdpkeybChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
-{
- LLOGLN(0, ("rdpkeybChangeKeyboardControl:"));
-}
-
-/******************************************************************************/
-static int
-rdpkeybControl(DeviceIntPtr device, int what)
-{
- KeySymsRec keySyms;
- CARD8 modMap[MAP_LENGTH];
- DevicePtr pDev;
- XkbRMLVOSet set;
- rdpPtr dev;
-
- LLOGLN(0, ("rdpkeybControl: what %d", what));
- pDev = (DevicePtr)device;
-
- switch (what)
- {
- case DEVICE_INIT:
- rdpkeybDeviceInit(device, &keySyms, modMap);
- memset(&set, 0, sizeof(set));
- set.rules = "base";
- set.model = "pc104";
- set.layout = "us";
- set.variant = "";
- set.options = "";
- InitKeyboardDeviceStruct(device, &set, rdpkeybBell,
- rdpkeybChangeKeyboardControl);
- dev = rdpGetDevFromScreen(NULL);
- dev->keyboard.device = device;
- rdpRegisterInputCallback(0, rdpInputKeyboard);
- break;
- case DEVICE_ON:
- pDev->on = 1;
- rdpkeybDeviceOn();
- break;
- case DEVICE_OFF:
- pDev->on = 0;
- rdpkeybDeviceOff();
- break;
- case DEVICE_CLOSE:
- if (pDev->on)
- {
- rdpkeybDeviceOff();
- }
- break;
- }
- return Success;
-}
-
-#if XORG_VERSION_CURRENT < (((1) * 10000000) + ((9) * 100000) + ((0) * 1000) + 1)
-
-/* debian 6
- ubuntu 10.04 */
-
-/******************************************************************************/
-static InputInfoPtr
-rdpkeybPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
-{
- InputInfoPtr info;
-
- LLOGLN(0, ("rdpkeybPreInit: drv %p dev %p, flags 0x%x",
- drv, dev, flags));
- info = xf86AllocateInput(drv, 0);
- info->name = dev->identifier;
- info->device_control = rdpkeybControl;
- info->flags = XI86_CONFIGURED | XI86_ALWAYS_CORE | XI86_SEND_DRAG_EVENTS |
- XI86_CORE_KEYBOARD | XI86_KEYBOARD_CAPABLE;
- info->type_name = "Keyboard";
- info->fd = -1;
- info->conf_idev = dev;
-
- return info;
-}
-
-#else
-
-/* debian 7
- ubuntu 12.04 */
-
-/******************************************************************************/
-static int
-rdpkeybPreInit(InputDriverPtr drv, InputInfoPtr info, int flags)
-{
- LLOGLN(0, ("rdpkeybPreInit: drv %p info %p, flags 0x%x",
- drv, info, flags));
- info->device_control = rdpkeybControl;
- info->type_name = "Keyboard";
-
- return 0;
-}
-
-#endif
-
-/******************************************************************************/
-static void
-rdpkeybUnInit(InputDriverPtr drv, InputInfoPtr info, int flags)
-{
- LLOGLN(0, ("rdpkeybUnInit: drv %p info %p, flags 0x%x",
- drv, info, flags));
- rdpUnregisterInputCallback(rdpInputKeyboard);
-}
-
-/******************************************************************************/
-static InputDriverRec rdpkeyb =
-{
- PACKAGE_VERSION_MAJOR, /* version */
- XRDP_KEYB_NAME, /* name */
- NULL, /* identify */
- rdpkeybPreInit, /* preinit */
- rdpkeybUnInit, /* uninit */
- NULL, /* module */
- 0 /* ref count */
-};
-
-/******************************************************************************/
-static pointer
-rdpkeybPlug(pointer module, pointer options, int *errmaj, int *errmin)
-{
- LLOGLN(0, ("rdpkeybPlug:"));
- xf86AddInputDriver(&rdpkeyb, module, 0);
- return module;
-}
-
-/******************************************************************************/
-static void
-rdpkeybUnplug(pointer p)
-{
- LLOGLN(0, ("rdpkeybUnplug:"));
-}
-
-/******************************************************************************/
-static XF86ModuleVersionInfo rdpkeybVersionRec =
-{
- XRDP_KEYB_NAME,
- MODULEVENDORSTRING,
- MODINFOSTRING1,
- MODINFOSTRING2,
- XORG_VERSION_CURRENT,
- PACKAGE_VERSION_MAJOR,
- PACKAGE_VERSION_MINOR,
- PACKAGE_VERSION_PATCHLEVEL,
- ABI_CLASS_XINPUT,
- ABI_XINPUT_VERSION,
- MOD_CLASS_XINPUT,
- { 0, 0, 0, 0 }
-};
-
-/******************************************************************************/
-_X_EXPORT XF86ModuleData xrdpkeybModuleData =
-{
- &rdpkeybVersionRec,
- rdpkeybPlug,
- rdpkeybUnplug
-};