diff options
author | Mihai Moldovan <ionic@ionic.de> | 2016-11-08 08:00:44 +0100 |
---|---|---|
committer | Mihai Moldovan <ionic@ionic.de> | 2016-11-08 08:00:44 +0100 |
commit | b1d3f2ca5552528c01eefce7e55c18c36965660d (patch) | |
tree | 546ee82fe70cf9af80dc80598fde106a0687de46 | |
parent | 7b79e8d831a520624fd5e28be6da7c6ad3360c1a (diff) | |
parent | 2f2ade61a8823bad012737b2b388dcc168cccbbf (diff) | |
download | nx-libs-b1d3f2ca5552528c01eefce7e55c18c36965660d.tar.gz nx-libs-b1d3f2ca5552528c01eefce7e55c18c36965660d.tar.bz2 nx-libs-b1d3f2ca5552528c01eefce7e55c18c36965660d.zip |
Merge branch 'uli42-pr/keyboard_fixes' into arctica-3.6.x
Attributes GH PR #243: https://github.com/ArcticaProject/nx-libs/pull/243
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Keyboard.c | 146 | ||||
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Reconnect.c | 16 | ||||
-rw-r--r-- | nx-X11/programs/Xserver/xkb/ddxLoad.c | 34 |
3 files changed, 83 insertions, 113 deletions
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c index 5cb4ff4d9..2fd42d3cf 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c @@ -173,8 +173,6 @@ extern Status XkbGetControls( #define XKB_DFLT_KB_OPTIONS NULL #endif -#define NXAGENT_KEYMAP_DIR_FILE "keymap.dir" - extern int XkbDfltRepeatDelay; extern int XkbDfltRepeatInterval; @@ -479,6 +477,11 @@ CARD8 nxagentConvertKeycode(CARD8 k) { if (nxagentKeycodeConversion != 0) { + #ifdef DEBUG + if (k != nxagentConvertedKeycodes[k]) + fprintf(stderr, "nxagentConvertKeycode: converting keycode [%d] to [%d]\n", k, nxagentConvertedKeycodes[k]); + #endif + return nxagentConvertedKeycodes[k]; } else @@ -503,10 +506,10 @@ static void nxagentCheckXkbBaseDirectory(void) #ifdef TEST fprintf(stderr, "nxagentCheckXkbBaseDirectory: " - "Before calling _NXGetXkbBasePath.\n"); + "Before calling _NXGetXkbBasePath:\n"); fprintf(stderr, "nxagentCheckXkbBaseDirectory: " - "XkbBaseDirectory varible [%s].\n", + "XkbBaseDirectory variable [%s].\n", XkbBaseDirectory); #endif @@ -514,10 +517,10 @@ static void nxagentCheckXkbBaseDirectory(void) #ifdef TEST fprintf(stderr, "nxagentCheckXkbBaseDirectory: " - "After calling _NXGetXkbBasePath.\n"); + "After calling _NXGetXkbBasePath:\n"); fprintf(stderr, "nxagentCheckXkbBaseDirectory: " - "XkbBaseDirectory varible [%s].\n", + "XkbBaseDirectory variable [%s].\n", XkbBaseDirectory); #endif @@ -539,7 +542,7 @@ static char *nxagentXkbGetRules() sizeDflt = strlen(XKB_DFLT_RULES_FILE); sizeAlt = strlen(XKB_ALTS_RULES_FILE); size = strlen(XkbBaseDirectory) + strlen("/rules/"); - size += (sizeDflt > sizeAlt) ? sizeDflt: sizeAlt; + size += (sizeDflt > sizeAlt) ? sizeDflt : sizeAlt; if ((path = malloc((size + 1) * sizeof(char))) == NULL) { @@ -694,10 +697,6 @@ int nxagentKeyboardProc(DeviceIntPtr pDev, int onoff) int free_model = 0, free_layout = 0; XkbDescPtr xkb = NULL; - #ifdef TEST - int ret; - #endif - switch (onoff) { case DEVICE_INIT: @@ -854,13 +853,15 @@ XkbError: (char *) values.auto_repeats, sizeof(values.auto_repeats)); #ifdef TEST - ret = + { + int ret = #endif - InitKeyboardDeviceStruct((DevicePtr) pDev, &keySyms, modmap, + InitKeyboardDeviceStruct((DevicePtr) pDev, &keySyms, modmap, nxagentBell, nxagentChangeKeyboardControl); #ifdef TEST - fprintf(stderr, "nxagentKeyboardProc: InitKeyboardDeviceStruct returns [%d].\n", ret); + fprintf(stderr, "nxagentKeyboardProc: InitKeyboardDeviceStruct returns [%d].\n", ret); + } #endif #ifdef XKB @@ -868,8 +869,6 @@ XkbError: FILE *file; XkbConfigRtrnRec config; - int nxagentXkbConfigFilePathSize; - char *nxagentXkbConfigFilePath; XkbComponentNamesRec names; @@ -879,32 +878,30 @@ XkbError: fprintf(stderr, "nxagentKeyboardProc: Using XKB extension.\n"); #endif + #ifdef TEST + fprintf(stderr, "nxagentKeyboardProc: nxagentKeyboard is [%s].\n", nxagentKeyboard ? nxagentKeyboard : "NULL"); + #endif + memset(&names, 0, sizeof(XkbComponentNamesRec)); rules = nxagentXkbGetRules(); - if ((nxagentKeyboard != NULL) && (strcmp(nxagentKeyboard, "query") !=0)) + if ((nxagentKeyboard != NULL) && (strcmp(nxagentKeyboard, "query") != 0)) { for (i = 0; nxagentKeyboard[i] != '/' && nxagentKeyboard[i] != 0; i++); if(nxagentKeyboard[i] == 0 || nxagentKeyboard[i + 1] == 0 || i == 0) { - ErrorF("Warning: Wrong keyboard type: %s.\n",nxagentKeyboard); + ErrorF("Warning: Wrong keyboard type: %s.\n", nxagentKeyboard); goto XkbError; } free_model = 1; - model = malloc(i + 1); - - strncpy(model, nxagentKeyboard, i); - - model[i] = '\0'; + model = strndup(nxagentKeyboard, i); free_layout = 1; - layout = malloc(strlen(&nxagentKeyboard[i + 1]) + 1); - - strcpy(layout, &nxagentKeyboard[i + 1]); + layout = strdup(&nxagentKeyboard[i + 1]); /* * There is no description for pc105 on Solaris. @@ -946,7 +943,7 @@ XkbError: options = XKB_DFLT_KB_OPTIONS; #ifdef TEST - fprintf(stderr, "nxagentKeyboardProc: XkbInitialMap [%s]\n", XkbInitialMap ? XkbInitialMap: "NULL"); + fprintf(stderr, "nxagentKeyboardProc: XkbInitialMap [%s]\n", XkbInitialMap ? XkbInitialMap : "NULL"); #endif if (XkbInitialMap) { @@ -990,6 +987,11 @@ XkbError: } fprintf(stderr, "nxagentKeyboardProc: Going to set rules and init device.\n"); #endif + #ifdef DEBUG + fprintf(stderr, "nxagentKeyboardProc: Going to set rules and init device: " + "[rules='%s',model='%s',layout='%s',variants='%s',options='%s'].\n", + rules, model, layout, variants, options); + #endif XkbSetRulesDflts(rules, model, layout, variants, options); XkbInitKeyboardDeviceStruct((void *)pDev, &names, &keySyms, modmap, @@ -1007,22 +1009,15 @@ XkbError: XkbGetControls(nxagentDisplay, XkbAllControlsMask, xkb); if (nxagentX2go) - nxagentXkbConfigFilePathSize = strlen(XKB_CONFIG_FILE_X2GO); + nxagentXkbConfigFilePath = strdup(XKB_CONFIG_FILE_X2GO); else - nxagentXkbConfigFilePathSize = strlen(XKB_CONFIG_FILE_NX); + nxagentXkbConfigFilePath = strdup(XKB_CONFIG_FILE_NX); - nxagentXkbConfigFilePath = malloc((nxagentXkbConfigFilePathSize + 1) * sizeof(char)); - - if ( nxagentXkbConfigFilePath == NULL) + if (nxagentXkbConfigFilePath == NULL) { FatalError("nxagentKeyboardProc: malloc failed."); } - if (nxagentX2go) - nxagentXkbConfigFilePathSize = strlen(XKB_CONFIG_FILE_X2GO); - else - nxagentXkbConfigFilePathSize = strlen(XKB_CONFIG_FILE_NX); - #ifdef TEST fprintf(stderr, "nxagentKeyboardProc: nxagentXkbConfigFilePath [%s].\n", nxagentXkbConfigFilePath); @@ -1074,12 +1069,13 @@ XkbError: else { #ifdef TEST - fprintf(stderr, "nxagentKeyboardProc: No config file.\n"); - #endif - - #ifdef TEST fprintf(stderr, "nxagentKeyboardProc: No config file, going to set rules and init device.\n"); #endif + #ifdef DEBUG + fprintf(stderr, "nxagentKeyboardProc: Going to set rules and init device: " + "[rules='%s',model='%s',layout='%s',variants='%s',options='%s'].\n", + rules, model, layout, variants, options); + #endif XkbSetRulesDflts(rules, model, layout, variants, options); XkbInitKeyboardDeviceStruct((void *)pDev, &names, &keySyms, modmap, @@ -1099,6 +1095,11 @@ XkbError: #ifdef TEST fprintf(stderr, "nxagentKeyboardProc: Going to set rules and init device.\n"); #endif + #ifdef DEBUG + fprintf(stderr, "nxagentKeyboardProc: Going to set rules and init device: " + "[rules='%s',model='%s',layout='%s',variants='%s',options='%s'].\n", + rules, model, layout, variants, options); + #endif XkbSetRulesDflts(rules, model, layout, variants, options); XkbInitKeyboardDeviceStruct((void *)pDev, &names, &keySyms, modmap, @@ -1404,8 +1405,8 @@ void nxagentCheckRemoteKeycodes() nxagentNumLockKeycode = XKeysymToKeycode(nxagentDisplay, XK_Num_Lock); #ifdef DEBUG - fprintf(stderr, "nxagentCheckRemoteKeycodes: Remote CapsLock keycode " - "is [%d] NumLock [%d].\n", nxagentCapsLockKeycode, + fprintf(stderr, "nxagentCheckRemoteKeycodes: Remote keycodes: CapsLock " + "[%d] NumLock [%d].\n", nxagentCapsLockKeycode, nxagentNumLockKeycode); #endif } @@ -1791,11 +1792,11 @@ static int nxagentXkbGetNames(char **rules, char **model, char **layout, void nxagentKeycodeConversionSetup(void) { - char *drules = 0; - char *dmodel = 0; - char *dlayout = 0; - char *dvariant = 0; - char *doptions = 0; + char *drules = NULL; + char *dmodel = NULL; + char *dlayout = NULL; + char *dvariant = NULL; + char *doptions = NULL; unsigned int drulesLen; nxagentKeycodeConversion = 0; @@ -1807,8 +1808,8 @@ void nxagentKeycodeConversionSetup(void) if (drulesLen != 0 && drules != NULL && dmodel != NULL) { fprintf(stderr, "nxagentKeycodeConversionSetup: " - "Remote: [%s,%s,%s,%s,%s].\n", drules, dmodel, dlayout, - dvariant, doptions); + "Remote: [rules='%s',model='%s',layout='%s',variant='%s',options='%s'].\n", + drules, dmodel, dlayout, dvariant, doptions); } else { @@ -1820,37 +1821,40 @@ void nxagentKeycodeConversionSetup(void) if (drulesLen != 0) { char *sessionpath = nxagentGetSessionPath(); - if (sessionpath != NULL){ + if (sessionpath != NULL) + { int keyboard_file_path_size = strlen(sessionpath) + strlen("/keyboard"); char *keyboard_file_path = malloc((keyboard_file_path_size + 1) * sizeof(char)); FILE *keyboard_file; - if ( keyboard_file_path == NULL) + if (keyboard_file_path == NULL) { - FatalError("nxagentKeyboardProc: malloc failed."); + FatalError("nxagentKeycodeConversionSetup: malloc failed."); } strcpy(keyboard_file_path, sessionpath); strcat(keyboard_file_path, "/keyboard"); if ((keyboard_file = fopen(keyboard_file_path, "w")) != NULL) { - if ( drules != NULL ) - fprintf(keyboard_file, "rules=%s\n", drules); - if ( dmodel != NULL ) - fprintf(keyboard_file, "model=%s\n", dmodel); - if ( dlayout != NULL ) - fprintf(keyboard_file, "layout=%s\n", dlayout); - if ( dvariant != NULL ) - fprintf(keyboard_file, "variant=%s\n", dvariant); - if ( doptions != NULL ) - fprintf(keyboard_file, "options=%s\n", doptions); + if (drules != NULL) + fprintf(keyboard_file, "rules=\"%s\"\n", drules[0] == '\0' ? "," : drules); + if (dmodel != NULL) + fprintf(keyboard_file, "model=\"%s\"\n", dmodel[0] == '\0' ? "," : dmodel); + if (dlayout != NULL) + fprintf(keyboard_file, "layout=\"%s\"\n", dlayout[0] == '\0' ? "," : dlayout); + if (dvariant != NULL) + fprintf(keyboard_file, "variant=\"%s\"\n", dvariant[0] == '\0' ? "," : dvariant); + if (doptions != NULL) + fprintf(keyboard_file, "options=\"%s\"\n", doptions[0] == '\0' ? "," : doptions); fclose(keyboard_file); fprintf(stderr, "keyboard file created\n"); } - else { + else + { int save_err = errno; fprintf(stderr, "keyboard file not created: %s\n", strerror(save_err)); } free(keyboard_file_path); } - else { + else + { fprintf(stderr, "SessionPath not defined\n"); } } @@ -1859,11 +1863,15 @@ void nxagentKeycodeConversionSetup(void) fprintf(stderr, "Failed to create the keyboard file\n"); } - if (nxagentOption(ClientOs) == ClientOsLinux && - drules != NULL && dmodel != NULL && - (strcmp(drules, "evdev") == 0 || - strcmp(dmodel, "evdev") == 0)) + if (drules != NULL && dmodel != NULL && + (strcmp(drules, "evdev") == 0 || + strcmp(dmodel, "evdev") == 0)) { + #ifdef DEBUG + fprintf(stderr, "nxagentKeycodeConversionSetup: " + "Activating KeyCode conversion.\n"); + #endif + nxagentKeycodeConversion = 1; } diff --git a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c index c20386ea1..65e2ae795 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c @@ -438,22 +438,14 @@ Bool nxagentReconnectSession(void) if (nxagentKeyboard != NULL) { - int size; - - size = strlen(nxagentKeyboard); - - if ((nxagentOldKeyboard = malloc(size + 1)) != NULL) + nxagentOldKeyboard = strndup(nxagentKeyboard, strlen(nxagentKeyboard)); + if (nxagentOldKeyboard == NULL) { - strncpy(nxagentOldKeyboard, nxagentKeyboard, size); - - nxagentOldKeyboard[size] = '\0'; + /* 0 means reconnection failed */ + return 0; } - } - if (nxagentKeyboard) - { free(nxagentKeyboard); - nxagentKeyboard = NULL; } diff --git a/nx-X11/programs/Xserver/xkb/ddxLoad.c b/nx-X11/programs/Xserver/xkb/ddxLoad.c index dab94660d..53bae44df 100644 --- a/nx-X11/programs/Xserver/xkb/ddxLoad.c +++ b/nx-X11/programs/Xserver/xkb/ddxLoad.c @@ -223,8 +223,8 @@ static int NXVerifyXkbBaseDirectory(const char *dirPath) { #ifdef TEST - fprintf(stderr, "NXVerifyXkbBaseDirectory: Can't find the keymap.dir file [%s].\n", - rulesBaseFilePath); + fprintf(stderr, "NXVerifyXkbBaseDirectory: Xkb Base Directory [%s] is not valid (can't find file [%s]).\n", + dirPath, rulesBaseFilePath); #endif free(rulesBaseFilePath); @@ -767,36 +767,6 @@ char tmpname[PATH_MAX]; strncpy(nameRtrn,keymap,nameRtrnLen); nameRtrn[nameRtrnLen-1]= '\0'; } -#if defined(Lynx) && defined(__i386__) && defined(NEED_POPEN_WORKAROUND) - /* somehow popen/pclose is broken on LynxOS AT 2.3.0/2.4.0! - * the problem usually shows up with XF86Setup - * this hack waits at max 5 seconds after pclose() returns - * for the output of the xkbcomp output file. - * I didn't manage to get a patch in time for the 3.2 release - */ - { - int i; - char name[PATH_MAX]; -#ifdef NXAGENT_SERVER - if (_NXGetXkbCompPath(XkbBaseDirectory)!=NULL) - sprintf(name,"%s/%s%s.xkm", _NXGetXkbCompPath(XkbBaseDirectory) - ,xkm_output_dir, keymap); -#else - if (XkbBaseDirectory!=NULL) - sprintf(name,"%s/%s%s.xkm", XkbBaseDirectory - ,xkm_output_dir, keymap); -#endif - else - sprintf(name,"%s%s.xkm", xkm_output_dir, keymap); - for (i = 0; i < 10; i++) { - if (access(name, 0) == 0) break; - usleep(500000); - } -#ifdef DEBUG - if (i) ErrorF(">>>> Waited %d times for %s\n", i, name); -#endif - } -#endif if (buf != NULL) free (buf); return True; |