diff options
Diffstat (limited to 'nx-X11/programs/Xserver/hw/nxagent/Keyboard.c')
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Keyboard.c | 459 |
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 |