aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
diff options
context:
space:
mode:
authorUlrich Sibiller <uli42@gmx.de>2017-07-12 20:01:44 +0200
committerUlrich Sibiller <uli42@gmx.de>2017-07-16 21:20:39 +0200
commit79001dd8a1472886a573b3eecf7ab763210c541c (patch)
treef23ff4bf86e6fdb78b33262867cf61f807147d76 /nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
parentccd7c6962bb50faa4a1549011824e34c0d0792b9 (diff)
downloadnx-libs-79001dd8a1472886a573b3eecf7ab763210c541c.tar.gz
nx-libs-79001dd8a1472886a573b3eecf7ab763210c541c.tar.bz2
nx-libs-79001dd8a1472886a573b3eecf7ab763210c541c.zip
Improve keystroke file handling
Fixes ArcticaProject/nx-libs#486
Diffstat (limited to 'nx-X11/programs/Xserver/hw/nxagent/Keystroke.c')
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Keystroke.c87
1 files changed, 35 insertions, 52 deletions
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
index 1e3ebca8f..f790090bf 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
@@ -253,6 +253,24 @@ static Bool read_binding_from_xmlnode(xmlNode *node, struct nxagentSpecialKeystr
return False;
}
+char *checkKeystrokeFile(char *filename)
+{
+ if (!filename)
+ return NULL;
+
+ if (access(filename, R_OK) == 0)
+ {
+ return filename;
+ }
+ else
+ {
+ #ifdef WARNING
+ fprintf(stderr, "Warning: Cannot read keystroke file '%s'.\n", filename);
+ #endif
+ return NULL;
+ }
+}
+
/*
* searches a keystroke xml file
*
@@ -302,63 +320,24 @@ void nxagentInitKeystrokes(Bool force)
envvar = "NXAGENT_KEYSTROKEFILE";
}
- if (nxagentKeystrokeFile && access(nxagentKeystrokeFile, R_OK) == 0)
+ char *homepath = NULL;
+ char *homedir = getenv("HOME");
+ if (homedir)
{
- if (!(filename = strdup(nxagentKeystrokeFile)))
+ if (!(homepath = calloc(1, strlen(homedir) + strlen(homefile) + 1)))
{
fprintf(stderr, "malloc failed");
exit(EXIT_FAILURE);
}
- }
- else if (nxagentKeystrokeFile)
- {
- fprintf(stderr, "Warning: Cannot read keystroke file '%s'.\n", nxagentKeystrokeFile);
- if ((filename = getenv(envvar)) && access(filename, R_OK) == 0)
- {
- if (!(filename = strdup(filename)))
- {
- fprintf(stderr, "malloc failed");
- exit(EXIT_FAILURE);
- }
- }
- else
- {
- char *homedir = getenv("HOME");
- filename = NULL;
- if (homedir)
- {
- if (!(filename = calloc(1, strlen(homefile) + strlen(homedir) + 1)))
- {
- fprintf(stderr, "malloc failed");
- exit(EXIT_FAILURE);
- }
- strcpy(filename, homedir);
- strcpy(filename + strlen(homedir), homefile);
- }
-
- if (access(filename, R_OK) == 0)
- {
- /* empty */
- }
- else if (access(etcfile, R_OK) == 0)
- {
- free(filename);
- if (!(filename = strdup(etcfile)))
- {
- fprintf(stderr, "malloc failed");
- exit(EXIT_FAILURE);
- }
- }
- else
- {
- free(filename);
- filename = NULL;
- }
- }
+ strcpy(homepath, homedir);
+ strcpy(homepath + strlen(homedir), homefile);
}
- /* now we know which file to read, if any */
- if (filename)
+ /* if any of the files can be read we have our candidate */
+ if ((filename = checkKeystrokeFile(nxagentKeystrokeFile)) ||
+ (filename = checkKeystrokeFile(getenv(envvar))) ||
+ (filename = checkKeystrokeFile(homepath)) ||
+ (filename = checkKeystrokeFile(etcfile)))
{
LIBXML_TEST_VERSION
xmlDoc *doc = xmlReadFile(filename, NULL, 0);
@@ -405,9 +384,11 @@ void nxagentInitKeystrokes(Bool force)
map[j].modifierMask == map[idx].modifierMask &&
map[j].modifierAltMeta == map[idx].modifierAltMeta)
{
+ #ifdef WARNING
fprintf(stderr, "Warning: ignoring keystroke '%s' (already in use by '%s')\n",
nxagentSpecialKeystrokeNames[map[idx].stroke],
nxagentSpecialKeystrokeNames[map[j].stroke]);
+ #endif
store = False;
break;
}
@@ -430,13 +411,15 @@ void nxagentInitKeystrokes(Bool force)
xmlFreeDoc(doc);
xmlCleanupParser();
}
- else
+ #ifdef WARNING
+ else /* if (doc) */
{
fprintf(stderr, "Warning: could not read/parse keystrokes file '%s'\n", filename);
}
- free(filename);
+ #endif
filename = NULL;
}
+ free(homepath);
if (map == default_map)
{