aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/programs/Xserver/hw/nxagent/Keyboard.c')
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Keyboard.c459
1 files changed, 105 insertions, 354 deletions
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c
index 6c14e20bf..37e49eaeb 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c
@@ -75,8 +75,6 @@ is" without express or implied warranty.
static int nxagentXkbGetNames(char **rules, char **model, char **layout,
char **variant, char **options);
-static void nxagentKeycodeConversionSetup(void);
-
#endif /* XKB */
/*
@@ -191,281 +189,6 @@ unsigned int nxagentAltMetaMask;
void nxagentCheckAltMetaKeys(CARD8, int);
-static CARD8 nxagentConvertedKeycodes[] =
-{
- /* evdev pc105*/
- /* 0 */ 0,
- /* 1 */ 1,
- /* 2 */ 2,
- /* 3 */ 3,
- /* 4 */ 4,
- /* 5 */ 5,
- /* 6 */ 6,
- /* 7 */ 7,
- /* 8 */ 8,
- /* 9 */ 9,
- /* 10 */ 10,
- /* 11 */ 11,
- /* 12 */ 12,
- /* 13 */ 13,
- /* 14 */ 14,
- /* 15 */ 15,
- /* 16 */ 16,
- /* 17 */ 17,
- /* 18 */ 18,
- /* 19 */ 19,
- /* 20 */ 20,
- /* 21 */ 21,
- /* 22 */ 22,
- /* 23 */ 23,
- /* 24 */ 24,
- /* 25 */ 25,
- /* 26 */ 26,
- /* 27 */ 27,
- /* 28 */ 28,
- /* 29 */ 29,
- /* 30 */ 30,
- /* 31 */ 31,
- /* 32 */ 32,
- /* 33 */ 33,
- /* 34 */ 34,
- /* 35 */ 35,
- /* 36 */ 36,
- /* 37 */ 37,
- /* 38 */ 38,
- /* 39 */ 39,
- /* 40 */ 40,
- /* 41 */ 41,
- /* 42 */ 42,
- /* 43 */ 43,
- /* 44 */ 44,
- /* 45 */ 45,
- /* 46 */ 46,
- /* 47 */ 47,
- /* 48 */ 48,
- /* 49 */ 49,
- /* 50 */ 50,
- /* 51 */ 51,
- /* 52 */ 52,
- /* 53 */ 53,
- /* 54 */ 54,
- /* 55 */ 55,
- /* 56 */ 56,
- /* 57 */ 57,
- /* 58 */ 58,
- /* 59 */ 59,
- /* 60 */ 60,
- /* 61 */ 61,
- /* 62 */ 62,
- /* 63 */ 63,
- /* 64 */ 64,
- /* 65 */ 65,
- /* 66 */ 66,
- /* 67 */ 67,
- /* 68 */ 68,
- /* 69 */ 69,
- /* 70 */ 70,
- /* 71 */ 71,
- /* 72 */ 72,
- /* 73 */ 73,
- /* 74 */ 74,
- /* 75 */ 75,
- /* 76 */ 76,
- /* 77 */ 77,
- /* 78 */ 78,
- /* 79 */ 79,
- /* 80 */ 80,
- /* 81 */ 81,
- /* 82 */ 82,
- /* 83 */ 83,
- /* 84 */ 84,
- /* 85 */ 85,
- /* 86 */ 86,
- /* 87 */ 87,
- /* 88 */ 88,
- /* 89 */ 89,
- /* 90 */ 90,
- /* 91 */ 91,
- /* 92 */ 124,
- /* 93 */ 93,
- /* 94 */ 94,
- /* 95 */ 95,
- /* 96 */ 96,
- /* 97 */ 211,
- /* 98 */ 98,
- /* 99 */ 99,
- /* 100 */ 100,
- /* 101 */ 208,
- /* 102 */ 102,
- /* 103 */ 103,
- /* 104 */ 108,
- /* 105 */ 109,
- /* 106 */ 112,
- /* 107 */ 111,
- /* 108 */ 113,
- /* 109 */ 109,
- /* 110 */ 97,
- /* 111 */ 98,
- /* 112 */ 99,
- /* 113 */ 100,
- /* 114 */ 102,
- /* 115 */ 103,
- /* 116 */ 104,
- /* 117 */ 105,
- /* 118 */ 106,
- /* 119 */ 107,
- /* 120 */ 120,
- /* 121 */ 121,
- /* 122 */ 122,
- /* 123 */ 123,
- /* 124 */ 124,
- /* 125 */ 126,
- /* 126 */ 126,
- /* 127 */ 110,
- /* 128 */ 128,
- /* 129 */ 129,
- /* 130 */ 130,
- /* 131 */ 131,
- /* 132 */ 133,
- /* 133 */ 115,
- /* 134 */ 116,
- /* 135 */ 117,
- /* 136 */ 136,
- /* 137 */ 137,
- /* 138 */ 138,
- /* 139 */ 139,
- /* 140 */ 140,
- /* 141 */ 141,
- /* 142 */ 142,
- /* 143 */ 143,
- /* 144 */ 144,
- /* 145 */ 145,
- /* 146 */ 146,
- /* 147 */ 147,
- /* 148 */ 148,
- /* 149 */ 149,
- /* 150 */ 150,
- /* 151 */ 151,
- /* 152 */ 152,
- /* 153 */ 153,
- /* 154 */ 154,
- /* 155 */ 155,
- /* 156 */ 156,
- /* 157 */ 157,
- /* 158 */ 158,
- /* 159 */ 159,
- /* 160 */ 160,
- /* 161 */ 161,
- /* 162 */ 162,
- /* 163 */ 163,
- /* 164 */ 164,
- /* 165 */ 165,
- /* 166 */ 166,
- /* 167 */ 167,
- /* 168 */ 168,
- /* 169 */ 169,
- /* 170 */ 170,
- /* 171 */ 171,
- /* 172 */ 172,
- /* 173 */ 173,
- /* 174 */ 174,
- /* 175 */ 175,
- /* 176 */ 176,
- /* 177 */ 177,
- /* 178 */ 178,
- /* 179 */ 179,
- /* 180 */ 180,
- /* 181 */ 181,
- /* 182 */ 182,
- /* 183 */ 183,
- /* 184 */ 184,
- /* 185 */ 185,
- /* 186 */ 186,
- /* 187 */ 187,
- /* 188 */ 188,
- /* 189 */ 189,
- /* 190 */ 190,
- /* 191 */ 118,
- /* 192 */ 119,
- /* 193 */ 120,
- /* 194 */ 121,
- /* 195 */ 122,
- /* 196 */ 196,
- /* 197 */ 197,
- /* 198 */ 198,
- /* 199 */ 199,
- /* 200 */ 200,
- /* 201 */ 201,
- /* 202 */ 202,
- /* 203 */ 93,
- /* 204 */ 125,
- /* 205 */ 156,
- /* 206 */ 127,
- /* 207 */ 128,
- /* 208 */ 208,
- /* 209 */ 209,
- /* 210 */ 210,
- /* 211 */ 211,
- /* 212 */ 212,
- /* 213 */ 213,
- /* 214 */ 214,
- /* 215 */ 215,
- /* 216 */ 216,
- /* 217 */ 217,
- /* 218 */ 218,
- /* 219 */ 219,
- /* 220 */ 220,
- /* 221 */ 221,
- /* 222 */ 222,
- /* 223 */ 223,
- /* 224 */ 224,
- /* 225 */ 225,
- /* 226 */ 226,
- /* 227 */ 227,
- /* 228 */ 228,
- /* 229 */ 229,
- /* 230 */ 230,
- /* 231 */ 231,
- /* 232 */ 232,
- /* 233 */ 233,
- /* 234 */ 234,
- /* 235 */ 235,
- /* 236 */ 236,
- /* 237 */ 237,
- /* 238 */ 238,
- /* 239 */ 239,
- /* 240 */ 240,
- /* 241 */ 241,
- /* 242 */ 242,
- /* 243 */ 243,
- /* 244 */ 244,
- /* 245 */ 245,
- /* 246 */ 246,
- /* 247 */ 247,
- /* 248 */ 248,
- /* 249 */ 249,
- /* 250 */ 250,
- /* 251 */ 251,
- /* 252 */ 252,
- /* 253 */ 253,
- /* 254 */ 254,
- /* 255 */ 255
-};
-
-static int nxagentKeycodeConversion = 0;
-
-CARD8 nxagentConvertKeycode(CARD8 k)
-{
- if (nxagentKeycodeConversion != 0)
- {
- return nxagentConvertedKeycodes[k];
- }
- else
- {
- return k;
- }
-}
-
static int nxagentSaveKeyboardDeviceData(DeviceIntPtr dev, DeviceIntPtr devBackup);
static int nxagentRestoreKeyboardDeviceData(DeviceIntPtr devBackup, DeviceIntPtr dev);
@@ -675,6 +398,13 @@ int nxagentKeyboardProc(DeviceIntPtr pDev, int onoff)
int ret;
+ char *remoteRules = NULL;
+ char *remoteModel = NULL;
+
+ unsigned int remoteRulesLen;
+
+ XkbRF_VarDefsRec remoteDefs;
+
switch (onoff)
{
case DEVICE_INIT:
@@ -946,21 +676,14 @@ XkbError:
xkb = XkbGetKeyboard(nxagentDisplay, XkbGBN_AllComponentsMask, XkbUseCoreKbd);
- nxagentKeycodeConversionSetup();
-
if (xkb == NULL || xkb->geom == NULL)
{
#ifdef TEST
fprintf(stderr, "nxagentKeyboardProc: No current keyboard.\n");
- if (xkb == NULL)
- {
- fprintf(stderr, "nxagentKeyboardProc: xkb is null.\n");
- }
- else
- {
- fprintf(stderr, "nxagentKeyboardProc: xkb->geom is null.\n");
- }
- fprintf(stderr, "nxagentKeyboardProc: Going to set rules and init device.\n");
+ #endif
+
+ #ifdef TEST
+ fprintf(stderr, "nxagentKeyboardProc: No keyboard, going to set rules and init device.\n");
#endif
XkbSetRulesDflts(rules, model, layout, variants, options);
@@ -976,6 +699,40 @@ XkbError:
goto XkbEnd;
}
+ if (xkb != NULL)
+ {
+ char *drules = 0;
+ char *dmodel = 0;
+ char *dlayout = 0;
+ char *dvariant = 0;
+ char *doptions = 0;
+
+ remoteRulesLen = nxagentXkbGetNames(&drules, &dmodel, &dlayout,
+ &dvariant, &doptions);
+
+ if (remoteRulesLen != 0 && drules != NULL && dmodel != NULL)
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "nxagentKeyboardProc: Remote: [%s,%s,%s,%s,%s].\n",
+ drules, dmodel, dlayout, dvariant, doptions);
+ #endif
+
+ remoteRules = drules;
+ remoteModel = dmodel;
+ remoteDefs.model = dmodel;
+ remoteDefs.layout = dlayout;
+ remoteDefs.variant = dvariant;
+ remoteDefs.options = doptions;
+ }
+ #ifdef DEBUG
+ else
+ {
+ fprintf(stderr, "nxagentKeyboardProc: Failed to retrieve remote "
+ "rules");
+ }
+ #endif
+ }
+
XkbGetControls(nxagentDisplay, XkbAllControlsMask, xkb);
nxagentXkbConfigFilePathSize = strlen(XkbBaseDirectory) +
@@ -1056,6 +813,66 @@ XkbError:
free(nxagentXkbConfigFilePath);
+ if (xkb != NULL && nxagentOption(ClientOs) == ClientOsLinux &&
+ remoteRules != NULL && remoteModel != NULL &&
+ (strcmp(remoteRules, "evdev") == 0 ||
+ strcmp(remoteModel, "evdev") == 0) &&
+ pDev->key->xkbInfo != NULL &&
+ pDev->key->xkbInfo->desc != NULL)
+ {
+ XkbDescPtr xkbt;
+ void *tmp;
+ #ifdef _XSERVER64
+ int i;
+ #endif
+
+ xkbt = pDev->key->xkbInfo->desc;
+
+ xkbt->min_key_code = xkb->min_key_code;
+ xkbt->max_key_code = xkb->max_key_code;
+
+ if (xkbt->map != NULL && xkb->map != NULL)
+ {
+ tmp = (void *)xkbt->map;
+ xkbt->map = xkb->map;
+ xkb->map = (XkbClientMapPtr)tmp;
+
+ #ifdef _XSERVER64
+
+ tmp = (void *) xkbt->map->syms;
+ xkbt->map->syms = xalloc(xkbt->map->size_syms * sizeof(KeySym));
+
+ for (i = 0; i < xkbt->map->size_syms; i++)
+ {
+ xkbt->map->syms[i] = ((KeySym64 *)tmp)[i];
+ }
+
+ #endif
+ }
+
+ if (xkbt->server != NULL && xkb->server != NULL)
+ {
+ tmp = (void *)xkbt->server;
+ xkbt->server = xkb->server;
+ xkb->server = (XkbServerMapPtr)tmp;
+ }
+
+ if (xkbt->compat != NULL && xkb->compat != NULL)
+ {
+ tmp = (void *)xkbt->compat;
+ xkbt->compat = xkb->compat;
+ xkb->compat = (XkbCompatMapPtr)tmp;
+ }
+
+ XkbSetRulesDflts(remoteRules, remoteDefs.model, remoteDefs.layout,
+ remoteDefs.variant, remoteDefs.options);
+ XkbSetRulesUsed(&remoteDefs);
+
+ free(remoteRules);
+
+ goto XkbEnd;
+ }
+
if (!nxagentKeyboard ||
(nxagentKeyboard && (strcmp(nxagentKeyboard, "query") == 0)))
{
@@ -1745,70 +1562,4 @@ static int nxagentXkbGetNames(char **rules, char **model, char **layout,
return n;
}
-void nxagentKeycodeConversionSetup(void)
-{
- char *drules = 0;
- char *dmodel = 0;
- char *dlayout = 0;
- char *dvariant = 0;
- char *doptions = 0;
- unsigned int drulesLen;
-
- nxagentKeycodeConversion = 0;
-
- drulesLen = nxagentXkbGetNames(&drules, &dmodel, &dlayout,
- &dvariant, &doptions);
-
- #ifdef DEBUG
- if (drulesLen != 0 && drules != NULL && dmodel != NULL)
- {
- fprintf(stderr, "nxagentKeycodeConversionSetup: "
- "Remote: [%s,%s,%s,%s,%s].\n", drules, dmodel, dlayout,
- dvariant, doptions);
- }
- else
- {
- fprintf(stderr, "nxagentKeycodeConversionSetup: "
- "Failed to retrieve remote rules.\n");
- }
- #endif
-
- if (nxagentOption(ClientOs) == ClientOsLinux &&
- drules != NULL && dmodel != NULL &&
- (strcmp(drules, "evdev") == 0 ||
- strcmp(dmodel, "evdev") == 0))
- {
- nxagentKeycodeConversion = 1;
- }
-
- if (drules != NULL)
- {
- XFree(drules);
- }
-}
-
-void nxagentResetKeycodeConversion(void)
-{
- int result;
- XkbAgentInfoRec info;
-
- result = XkbQueryExtension(nxagentDisplay, &info.Opcode, &info.EventBase,
- &info.ErrorBase, &info.MajorVersion,
- &info.MinorVersion);
-
- if (result != 0)
- {
- nxagentKeycodeConversionSetup();
- }
- else
- {
- #ifdef WARNING
- fprintf(stderr, "nxagentResetKeycodeConversion: "
- "WARNING! Failed to query XKB extension.\n");
- #endif
-
- nxagentKeycodeConversion = 0;
- }
-}
-
#endif