aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/programs/Xserver
diff options
context:
space:
mode:
authorMike Gabriel <mike.gabriel@das-netzwerkteam.de>2017-03-13 23:07:19 +0100
committerMike Gabriel <mike.gabriel@das-netzwerkteam.de>2017-03-13 23:07:19 +0100
commit6ac805ab4411d3045c99e3ceefe8495ac95d8e15 (patch)
tree387628976fc6778cc3f77a037643b037ef685891 /nx-X11/programs/Xserver
parent320cece2e97035665d4df5e382ea45e5a7f07efa (diff)
parent6f4eb15408c9b7f13ff9e2765a7a50bace0dfae1 (diff)
downloadnx-libs-6ac805ab4411d3045c99e3ceefe8495ac95d8e15.tar.gz
nx-libs-6ac805ab4411d3045c99e3ceefe8495ac95d8e15.tar.bz2
nx-libs-6ac805ab4411d3045c99e3ceefe8495ac95d8e15.zip
Merge branch 'uli42-pr/cleanup_keystroke' into 3.6.x
Attributes GH PR #392: https://github.com/ArcticaProject/nx-libs/pull/392
Diffstat (limited to 'nx-X11/programs/Xserver')
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Keyboard.c8
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Keystroke.c365
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Keystroke.h38
3 files changed, 205 insertions, 206 deletions
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c
index 208ae0653..5fc01c976 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c
@@ -202,6 +202,8 @@ extern char *nxagentKeyboard;
static char *nxagentXkbGetRules(void);
unsigned int nxagentAltMetaMask;
+unsigned int nxagentAltMask;
+unsigned int nxagentMetaMask;
static void nxagentCheckAltMetaKeys(CARD8, int);
@@ -788,6 +790,8 @@ N/A
#endif /* #ifdef _XSERVER64 */
nxagentAltMetaMask = 0;
+ nxagentAltMask = 0;
+ nxagentMetaMask = 0;
for (i = 0; i < 256; i++)
modmap[i] = 0;
@@ -1378,21 +1382,25 @@ void nxagentCheckAltMetaKeys(CARD8 keycode, int j)
if (keycode == XKeysymToKeycode(nxagentDisplay, XK_Meta_L))
{
nxagentAltMetaMask |= 1 << j;
+ nxagentMetaMask |= 1 << j;
}
if (keycode == XKeysymToKeycode(nxagentDisplay, XK_Meta_R))
{
nxagentAltMetaMask |= 1 << j;
+ nxagentMetaMask |= 1 << j;
}
if (keycode == XKeysymToKeycode(nxagentDisplay, XK_Alt_L))
{
nxagentAltMetaMask |= 1 << j;
+ nxagentAltMask |= 1 << j;
}
if (keycode == XKeysymToKeycode(nxagentDisplay, XK_Alt_R))
{
nxagentAltMetaMask |= 1 << j;
+ nxagentAltMask |= 1 << j;
}
}
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
index 6237b9dac..d12b459fc 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
@@ -45,7 +45,6 @@
extern Bool nxagentWMIsRunning;
extern Bool nxagentIpaq;
extern char *nxagentKeystrokeFile;
-Bool nxagentKeystrokeFileParsed = False;
#ifdef NX_DEBUG_INPUT
int nxagentDebugInputDevices = 0;
@@ -70,6 +69,7 @@ char * nxagentSpecialKeystrokeNames[] = {
"end_marker",
"close_session",
"switch_all_screens",
+ "fullscreen",
"minimize",
"left",
"up",
@@ -85,61 +85,52 @@ char * nxagentSpecialKeystrokeNames[] = {
"test_input",
"deactivate_input_devices_grab",
- "fullscreen",
"viewport_move_left",
"viewport_move_up",
"viewport_move_right",
"viewport_move_down",
+
+ "reread_keystrokes",
NULL,
};
struct nxagentSpecialKeystrokeMap default_map[] = {
/* stroke, modifierMask, modifierAltMeta, keysym */
- {KEYSTROKE_DEBUG_TREE, ControlMask, 1, XK_q},
- {KEYSTROKE_DEBUG_TREE, ControlMask, 1, XK_Q},
- {KEYSTROKE_CLOSE_SESSION, ControlMask, 1, XK_t},
- {KEYSTROKE_CLOSE_SESSION, ControlMask, 1, XK_T},
- {KEYSTROKE_SWITCH_ALL_SCREENS, ControlMask, 1, XK_f},
- {KEYSTROKE_SWITCH_ALL_SCREENS, ControlMask, 1, XK_F},
- {KEYSTROKE_MINIMIZE, ControlMask, 1, XK_m},
- {KEYSTROKE_MINIMIZE, ControlMask, 1, XK_M},
- {KEYSTROKE_LEFT, ControlMask, 1, XK_Left},
- {KEYSTROKE_LEFT, ControlMask, 1, XK_KP_Left},
- {KEYSTROKE_UP, ControlMask, 1, XK_Up},
- {KEYSTROKE_UP, ControlMask, 1, XK_KP_Up},
- {KEYSTROKE_RIGHT, ControlMask, 1, XK_Right},
- {KEYSTROKE_RIGHT, ControlMask, 1, XK_KP_Right},
- {KEYSTROKE_DOWN, ControlMask, 1, XK_Down},
- {KEYSTROKE_DOWN, ControlMask, 1, XK_KP_Down},
- {KEYSTROKE_RESIZE, ControlMask, 1, XK_r},
- {KEYSTROKE_RESIZE, ControlMask, 1, XK_R},
- {KEYSTROKE_DEFER, ControlMask, 1, XK_e},
- {KEYSTROKE_DEFER, ControlMask, 1, XK_E},
- {KEYSTROKE_IGNORE, ControlMask, 1, XK_BackSpace},
- {KEYSTROKE_IGNORE, 0, 0, XK_Terminate_Server},
- {KEYSTROKE_FORCE_SYNCHRONIZATION, ControlMask, 1, XK_j},
- {KEYSTROKE_FORCE_SYNCHRONIZATION, ControlMask, 1, XK_J},
- {KEYSTROKE_REGIONS_ON_SCREEN, ControlMask, 1, XK_a},
- {KEYSTROKE_REGIONS_ON_SCREEN, ControlMask, 1, XK_A},
- {KEYSTROKE_TEST_INPUT, ControlMask, 1, XK_x},
- {KEYSTROKE_TEST_INPUT, ControlMask, 1, XK_X},
- {KEYSTROKE_DEACTIVATE_INPUT_DEVICES_GRAB, ControlMask, 1, XK_y},
- {KEYSTROKE_DEACTIVATE_INPUT_DEVICES_GRAB, ControlMask, 1, XK_Y},
- {KEYSTROKE_FULLSCREEN, ControlMask | ShiftMask, 1, XK_f},
- {KEYSTROKE_FULLSCREEN, ControlMask | ShiftMask, 1, XK_F},
- {KEYSTROKE_VIEWPORT_MOVE_LEFT, ControlMask | ShiftMask, 1, XK_Left},
- {KEYSTROKE_VIEWPORT_MOVE_LEFT, ControlMask | ShiftMask, 1, XK_KP_Left},
- {KEYSTROKE_VIEWPORT_MOVE_UP, ControlMask | ShiftMask, 1, XK_Up},
- {KEYSTROKE_VIEWPORT_MOVE_UP, ControlMask | ShiftMask, 1, XK_KP_Up},
- {KEYSTROKE_VIEWPORT_MOVE_RIGHT, ControlMask | ShiftMask, 1, XK_Right},
- {KEYSTROKE_VIEWPORT_MOVE_RIGHT, ControlMask | ShiftMask, 1, XK_KP_Right},
- {KEYSTROKE_VIEWPORT_MOVE_DOWN, ControlMask | ShiftMask, 1, XK_Down},
- {KEYSTROKE_VIEWPORT_MOVE_DOWN, ControlMask | ShiftMask, 1, XK_KP_Down},
- {KEYSTROKE_END_MARKER, 0, 0, 0},
+ {KEYSTROKE_DEBUG_TREE, ControlMask, True, XK_q},
+ {KEYSTROKE_CLOSE_SESSION, ControlMask, True, XK_t},
+ {KEYSTROKE_SWITCH_ALL_SCREENS, ControlMask, True, XK_f},
+ {KEYSTROKE_FULLSCREEN, ControlMask | ShiftMask, True, XK_f},
+ {KEYSTROKE_MINIMIZE, ControlMask, True, XK_m},
+ {KEYSTROKE_LEFT, ControlMask, True, XK_Left},
+ {KEYSTROKE_LEFT, ControlMask, True, XK_KP_Left},
+ {KEYSTROKE_UP, ControlMask, True, XK_Up},
+ {KEYSTROKE_UP, ControlMask, True, XK_KP_Up},
+ {KEYSTROKE_RIGHT, ControlMask, True, XK_Right},
+ {KEYSTROKE_RIGHT, ControlMask, True, XK_KP_Right},
+ {KEYSTROKE_DOWN, ControlMask, True, XK_Down},
+ {KEYSTROKE_DOWN, ControlMask, True, XK_KP_Down},
+ {KEYSTROKE_RESIZE, ControlMask, True, XK_r},
+ {KEYSTROKE_DEFER, ControlMask, True, XK_e},
+ {KEYSTROKE_IGNORE, ControlMask, True, XK_BackSpace},
+ {KEYSTROKE_IGNORE, 0, False, XK_Terminate_Server},
+ {KEYSTROKE_FORCE_SYNCHRONIZATION, ControlMask, True, XK_j},
+ {KEYSTROKE_REGIONS_ON_SCREEN, ControlMask, True, XK_a},
+ {KEYSTROKE_TEST_INPUT, ControlMask, True, XK_x},
+ {KEYSTROKE_DEACTIVATE_INPUT_DEVICES_GRAB, ControlMask, True, XK_y},
+ {KEYSTROKE_VIEWPORT_MOVE_LEFT, ControlMask | ShiftMask, True, XK_Left},
+ {KEYSTROKE_VIEWPORT_MOVE_LEFT, ControlMask | ShiftMask, True, XK_KP_Left},
+ {KEYSTROKE_VIEWPORT_MOVE_UP, ControlMask | ShiftMask, True, XK_Up},
+ {KEYSTROKE_VIEWPORT_MOVE_UP, ControlMask | ShiftMask, True, XK_KP_Up},
+ {KEYSTROKE_VIEWPORT_MOVE_RIGHT, ControlMask | ShiftMask, True, XK_Right},
+ {KEYSTROKE_VIEWPORT_MOVE_RIGHT, ControlMask | ShiftMask, True, XK_KP_Right},
+ {KEYSTROKE_VIEWPORT_MOVE_DOWN, ControlMask | ShiftMask, True, XK_Down},
+ {KEYSTROKE_VIEWPORT_MOVE_DOWN, ControlMask | ShiftMask, True, XK_KP_Down},
+ {KEYSTROKE_REREAD_KEYSTROKES, ControlMask, True, XK_k},
+ {KEYSTROKE_END_MARKER, 0, False, NoSymbol},
};
struct nxagentSpecialKeystrokeMap *map = default_map;
-static int modifier_matches(unsigned int mask, int compare_alt_meta, unsigned int state)
+static Bool modifier_matches(unsigned int mask, int compare_alt_meta, unsigned int state)
{
/* nxagentAltMetaMask needs special handling
* it seems to me its an and-ed mask of all possible meta and alt keys
@@ -147,28 +138,34 @@ static int modifier_matches(unsigned int mask, int compare_alt_meta, unsigned in
*
* otherwise this function would be just a simple bitop
*/
- int ret = 1;
+ Bool ret = True;
if (compare_alt_meta) {
if (! (state & nxagentAltMetaMask)) {
- ret = 0;
+ ret = False;
}
mask &= ~nxagentAltMetaMask;
+ state &= ~nxagentAltMetaMask;
}
/* all modifiers except meta/alt have to match exactly, extra bits are evil */
- if ((mask & state) != mask) {
- ret = 0;
+ if (mask != state) {
+ ret = False;
}
return ret;
}
-static int read_binding_from_xmlnode(xmlNode *node, struct nxagentSpecialKeystrokeMap *ret)
+static Bool read_binding_from_xmlnode(xmlNode *node, struct nxagentSpecialKeystrokeMap *ret)
{
- int successful = 0;
- struct nxagentSpecialKeystrokeMap new = {0, 0, 0, 0};
+ /* init the struct to have proper values in case not all attributes are found */
+ struct nxagentSpecialKeystrokeMap newkm = {
+ .stroke = KEYSTROKE_END_MARKER,
+ .modifierMask = 0,
+ .modifierAltMeta = False,
+ .keysym = NoSymbol
+ };
xmlAttr *attr;
for (attr = node->properties; attr; attr = attr->next)
@@ -176,20 +173,23 @@ static int read_binding_from_xmlnode(xmlNode *node, struct nxagentSpecialKeystro
/* ignore attributes without data (which should never happen anyways) */
if (attr->children->content == NULL)
{
+ #ifdef DEBUG
char *aname = (attr->name)?((char *)attr->name):"unknown";
fprintf(stderr, "attribute %s with NULL value", aname);
+ #endif
continue;
}
+
if (strcmp((char *)attr->name, "action") == 0)
{
- int i;
- for (i = 0; nxagentSpecialKeystrokeNames[i] != NULL; i++)
+ newkm.stroke = KEYSTROKE_END_MARKER;
+ for (int i = 0; nxagentSpecialKeystrokeNames[i] != NULL; i++)
{
- if (strcmp(nxagentSpecialKeystrokeNames[i],(char *)attr->children->content) == 0)
+ if (strcmp(nxagentSpecialKeystrokeNames[i], (char *)attr->children->content) == 0)
{
/* this relies on the values of enum nxagentSpecialKeystroke and the
* indices of nxagentSpecialKeystrokeNames being in sync */
- new.stroke = i;
+ newkm.stroke = i;
break;
}
}
@@ -197,60 +197,35 @@ static int read_binding_from_xmlnode(xmlNode *node, struct nxagentSpecialKeystro
}
else if (strcmp((char *)attr->name, "key") == 0)
{
- new.keysym = XStringToKeysym((char *)attr->children->content);
- /* NoSymbol is usually 0, but could there be weird implementations? */
- if (new.keysym == NoSymbol)
- {
- new.keysym = 0;
- }
+ newkm.keysym = XStringToKeysym((char *)attr->children->content);
continue;
}
-
- /* ignore attributes with value="0" or "false", everything else is interpreted as true */
- if (strcmp((char *)attr->children->content, "0") == 0 || strcmp((char *)attr->children->content, "false") == 0)
- continue;
-
- if (strcmp((char *)attr->name, "Mod1") == 0)
- {
- new.modifierMask |= Mod1Mask;
- }
- else if (strcmp((char *)attr->name, "Mod2") == 0)
- {
- new.modifierMask |= Mod2Mask;
- }
- else if (strcmp((char *)attr->name, "Mod3") == 0)
- {
- new.modifierMask |= Mod3Mask;
- }
- else if (strcmp((char *)attr->name, "Mod4") == 0)
- {
- new.modifierMask |= Mod4Mask;
- }
- else if (strcmp((char *)attr->name, "Control") == 0)
- {
- new.modifierMask |= ControlMask;
- }
- else if (strcmp((char *)attr->name, "Shift") == 0)
- {
- new.modifierMask |= ShiftMask;
- }
- else if (strcmp((char *)attr->name, "Lock") == 0)
- {
- new.modifierMask |= LockMask;
- }
- else if (strcmp((char *)attr->name, "AltMeta") == 0)
+ else
{
- new.modifierAltMeta = 1;
+ /* ignore attributes with value="0" or "false", everything else is interpreted as true */
+ if (strcmp((char *)attr->children->content, "0") == 0 || strcmp((char *)attr->children->content, "false") == 0)
+ continue;
+
+ if (strcmp((char *)attr->name, "Mod1") == 0) { newkm.modifierMask |= Mod1Mask; }
+ else if (strcmp((char *)attr->name, "Mod2") == 0) { newkm.modifierMask |= Mod2Mask; }
+ else if (strcmp((char *)attr->name, "Mod3") == 0) { newkm.modifierMask |= Mod3Mask; }
+ else if (strcmp((char *)attr->name, "Mod4") == 0) { newkm.modifierMask |= Mod4Mask; }
+ else if (strcmp((char *)attr->name, "Mod5") == 0) { newkm.modifierMask |= Mod5Mask; }
+ else if (strcmp((char *)attr->name, "Control") == 0) { newkm.modifierMask |= ControlMask; }
+ else if (strcmp((char *)attr->name, "Shift") == 0) { newkm.modifierMask |= ShiftMask; }
+ else if (strcmp((char *)attr->name, "Lock") == 0) { newkm.modifierMask |= LockMask; }
+ else if (strcmp((char *)attr->name, "AltMeta") == 0) { newkm.modifierAltMeta = True; }
}
}
- if (new.stroke != 0 && new.keysym != 0)
+ if (newkm.stroke != KEYSTROKE_END_MARKER && newkm.keysym != NoSymbol)
{
/* keysym and stroke are required, everything else is optional */
- successful = 1;
- memcpy(ret, &new, sizeof(struct nxagentSpecialKeystrokeMap));
+ memcpy(ret, &newkm, sizeof(struct nxagentSpecialKeystrokeMap));
+ return True;
}
- return successful;
+ else
+ return False;
}
/*
@@ -262,32 +237,57 @@ static int read_binding_from_xmlnode(xmlNode *node, struct nxagentSpecialKeystro
* - $HOME/.nx/config/keystrokes.cfg
* - /etc/nxagent/keystrokes.cfg
* - hardcoded traditional NX default settings
+ * If run in x2go flavour different filenames and varnames are used.
*/
-static void parse_keystroke_file(void)
+static void parse_keystroke_file(Bool force)
{
char *filename = NULL;
- char *homefile = "/.nx/config/keystrokes.cfg";
- char *etcfile = "/etc/nxagent/keystrokes.cfg";
+ char *homefile;
+ char *etcfile;
+ char *envvar;
+
+ /* used for tracking if the config file parsing has already been
+ done (regardless of the result) */
+ static Bool done = False;
+
+ if (force) {
+ if (map != default_map)
+ {
+ free(map);
+ map = default_map;
+ }
+ fprintf(stderr, "re-reading keystroke config\n");
+ }
+ else
+ {
+ if (done)
+ return;
+ }
+
+ done = True;
if (nxagentX2go) {
homefile = "/.x2go/config/keystrokes.cfg";
etcfile = "/etc/x2go/keystrokes.cfg";
+ envvar = "X2GO_KEYSTROKEFILE";
+ } else {
+ homefile = "/.nx/config/keystrokes.cfg";
+ etcfile = "/etc/nxagent/keystrokes.cfg";
+ envvar = "NXAGENT_KEYSTROKEFILE";
}
- if (nxagentKeystrokeFile != NULL && access(nxagentKeystrokeFile, R_OK) == 0)
+ if (nxagentKeystrokeFile && access(nxagentKeystrokeFile, R_OK) == 0)
{
- filename = strdup(nxagentKeystrokeFile);
- if (filename == NULL)
+ if (!(filename = strdup(nxagentKeystrokeFile)))
{
fprintf(stderr, "malloc failed");
exit(EXIT_FAILURE);
}
}
- else if ((filename = getenv("NXAGENT_KEYSTROKEFILE")) != NULL && access(filename, R_OK) == 0)
+ else if ((filename = getenv(envvar)) && access(filename, R_OK) == 0)
{
- filename = strdup(filename);
- if (filename == NULL)
+ if (!(filename = strdup(filename)))
{
fprintf(stderr, "malloc failed");
exit(EXIT_FAILURE);
@@ -297,26 +297,15 @@ static void parse_keystroke_file(void)
{
char *homedir = getenv("HOME");
filename = NULL;
- if (homedir != NULL)
+ if (homedir)
{
- homedir = strdup(homedir);
- if (homedir == NULL)
- {
- fprintf(stderr, "malloc failed");
-exit(EXIT_FAILURE);
- }
- filename = calloc(1, strlen(homefile) + strlen(homedir) + 1);
- if (filename == NULL)
+ 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 (homedir)
- {
- free(homedir);
- }
}
if (access(filename, R_OK) == 0)
@@ -325,10 +314,8 @@ exit(EXIT_FAILURE);
}
else if (access(etcfile, R_OK) == 0)
{
- if (filename)
- free(filename);
- filename = strdup(etcfile);
- if (filename == NULL)
+ free(filename);
+ if (!(filename = strdup(etcfile)))
{
fprintf(stderr, "malloc failed");
exit(EXIT_FAILURE);
@@ -336,8 +323,7 @@ exit(EXIT_FAILURE);
}
else
{
- if (filename)
-free(filename);
+ free(filename);
filename = NULL;
}
}
@@ -345,20 +331,15 @@ free(filename);
/* now we know which file to read, if any */
if (filename)
{
- xmlDoc *doc = NULL;
- xmlNode *root = NULL;
LIBXML_TEST_VERSION
- doc = xmlReadFile(filename, NULL, 0);
- if (doc != NULL)
+ xmlDoc *doc = xmlReadFile(filename, NULL, 0);
+ if (doc)
{
- xmlNode *cur = NULL;
- root = xmlDocGetRootElement(doc);
-
- for (cur = root; cur; cur = cur->next)
+ for (xmlNode *cur = xmlDocGetRootElement(doc); cur; cur = cur->next)
{
if (cur->type == XML_ELEMENT_NODE && strcmp((char *)cur->name, "keystrokes") == 0)
-{
- xmlNode *bindings = NULL;
+ {
+ xmlNode *bindings;
int num = 0;
int idx = 0;
@@ -369,23 +350,26 @@ free(filename);
num++;
}
}
- map = calloc((num + 1), sizeof(struct nxagentSpecialKeystrokeMap));
- if (map == NULL)
+ #ifdef DEBUG
+ fprintf(stderr, "%s: found %d keystrokes in %s\n", __func__, num, filename);
+ #endif
+ if (!(map = calloc(num+1, sizeof(struct nxagentSpecialKeystrokeMap))))
{
- fprintf(stderr, "malloc failed");
+ fprintf(stderr, "calloc failed");
exit(EXIT_FAILURE);
}
for (bindings = cur->children; bindings; bindings = bindings->next)
{
- if (bindings->type == XML_ELEMENT_NODE && strcmp((char *)bindings->name, "keystroke") == 0)
- {
- int res = 0;
- res = read_binding_from_xmlnode(bindings, &(map[idx]));
- if (res)
- idx++;
- }
+ map[idx].stroke = KEYSTROKE_NOTHING;
+ if (bindings->type == XML_ELEMENT_NODE &&
+ strcmp((char *)bindings->name, "keystroke") == 0 &&
+ read_binding_from_xmlnode(bindings, &(map[idx])))
+ idx++;
}
+ #ifdef DEBUG
+ fprintf(stderr, "%s: read %d keystrokes", __func__, idx);
+ #endif
map[idx].stroke = KEYSTROKE_END_MARKER;
}
@@ -397,35 +381,42 @@ free(filename);
else
{
#ifdef DEBUG
- fprintf("XML parsing for %s failed\n", filename);
+ fprintf(stderr, "XML parsing for %s failed\n", filename);
#endif
}
free(filename);
+ filename = NULL;
}
}
static enum nxagentSpecialKeystroke find_keystroke(XKeyEvent *X)
{
+ enum nxagentSpecialKeystroke ret = KEYSTROKE_NOTHING;
int keysyms_per_keycode_return;
+ struct nxagentSpecialKeystrokeMap *cur;
+
+ /* FIXME: we do late parsing here, this should be done at startup,
+ not at first keypress! */
+ parse_keystroke_file(False);
+
+ cur = map;
+
XlibKeySym *keysym = XGetKeyboardMapping(nxagentDisplay,
X->keycode,
1,
&keysyms_per_keycode_return);
-
- struct nxagentSpecialKeystrokeMap *cur = map;
-
- if (! nxagentKeystrokeFileParsed)
- {
- parse_keystroke_file();
- nxagentKeystrokeFileParsed = True;
- }
-
- enum nxagentSpecialKeystroke ret = KEYSTROKE_NOTHING;
-
+ #ifdef DEBUG
+ fprintf(stderr, "%s: got keysym '%c' (%d)\n", __func__, keysym[0], keysym[0]);
+ #endif
while (cur->stroke != KEYSTROKE_END_MARKER) {
+ #ifdef DEBUG
+ fprintf(stderr, "%s: checking keysym '%c' (%d)\n", __func__, cur->keysym, cur->keysym);
+ #endif
if (cur->keysym == keysym[0] && modifier_matches(cur->modifierMask, cur->modifierAltMeta, X->state)) {
-
+ #ifdef DEBUG
+ fprintf(stderr, "%s: match including modifiers for keysym '%c' (%d), stroke %d (%s)\n", __func__, cur->keysym, cur->keysym, cur->stroke, nxagentSpecialKeystrokeNames[cur->stroke]);
+ #endif
free(keysym);
return cur->stroke;
}
@@ -436,34 +427,22 @@ static enum nxagentSpecialKeystroke find_keystroke(XKeyEvent *X)
return ret;
}
-int nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result)
+Bool nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result)
{
enum nxagentSpecialKeystroke stroke = find_keystroke(X);
-
*result = doNothing;
- /*
- * I don't know how much hard work is doing this operation.
- * Do we need a cache ?
- */
-
- int keysyms_per_keycode_return;
- XlibKeySym *sym = XGetKeyboardMapping(nxagentDisplay,
- X->keycode,
- 1,
- &keysyms_per_keycode_return);
-
- if (sym[0] == XK_VoidSymbol || sym[0] == NoSymbol)
- {
- free(sym);
- return 0;
- }
-
#ifdef TEST
- fprintf(stderr, "nxagentCheckSpecialKeystroke: got code %x - state %x - sym %lx\n",
- X -> keycode, X -> state, sym[0]);
+ if (stroke != KEYSTROKE_NOTHING && stroke != KEYSTROKE_END_MARKER)
+ fprintf(stderr, "nxagentCheckSpecialKeystroke: got code %x - state %x - stroke %d (%s)\n",
+ X -> keycode, X -> state, stroke, nxagentSpecialKeystrokeNames[stroke]);
+ else
+ fprintf(stderr, "nxagentCheckSpecialKeystroke: got code %x - state %x - stroke %d (unused)\n",
+ X -> keycode, X -> state, stroke);
#endif
- free(sym);
+
+ if (stroke == KEYSTROKE_NOTHING)
+ return False;
/*
* Check special keys.
@@ -478,7 +457,7 @@ int nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result)
{
*result = doStartKbd;
- return 1;
+ return True;
}
switch (stroke) {
@@ -534,7 +513,7 @@ int nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result)
break;
case KEYSTROKE_IGNORE:
/* this is used e.g. to ignore C-A-Backspace aka XK_Terminate_Server */
- return 1;
+ return True;
break;
case KEYSTROKE_FORCE_SYNCHRONIZATION:
nxagentForceSynchronization = 1;
@@ -559,7 +538,7 @@ int nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result)
nxagentLastInputDevicesDumpTime = 0;
}
}
- return 1;
+ return True;
#endif
break;
case KEYSTROKE_DEACTIVATE_INPUT_DEVICES_GRAB:
@@ -567,7 +546,7 @@ int nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result)
if (X->type == KeyPress) {
nxagentDeactivateInputDevicesGrab();
}
- return 1;
+ return True;
#endif
break;
case KEYSTROKE_FULLSCREEN:
@@ -599,10 +578,20 @@ int nxagentCheckSpecialKeystroke(XKeyEvent *X, enum HandleEventResult *result)
*result = doViewportMoveDown;
}
break;
+ case KEYSTROKE_REREAD_KEYSTROKES:
+ /* two reasons to check on KeyRelease:
+ - this code is called for KeyPress and KeyRelease, so we
+ would read the keystroke file twice
+ - if the keystroke file changes settings for this key this
+ might lead to unexpected behaviour
+ */
+ if (X->type == KeyRelease)
+ parse_keystroke_file(True);
+ break;
case KEYSTROKE_NOTHING: /* do nothing. difference to KEYSTROKE_IGNORE is the return value */
case KEYSTROKE_END_MARKER: /* just to make gcc STFU */
case KEYSTROKE_MAX:
break;
}
- return (*result == doNothing) ? 0 : 1;
+ return (*result == doNothing);
}
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h
index 45791f9ba..48ed65b35 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h
+++ b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h
@@ -28,7 +28,7 @@
#include "Events.h"
-extern int nxagentCheckSpecialKeystroke(XKeyEvent*, enum HandleEventResult*);
+extern Bool nxagentCheckSpecialKeystroke(XKeyEvent*, enum HandleEventResult*);
unsigned int nxagentAltMetaMask;
@@ -42,40 +42,42 @@ enum nxagentSpecialKeystroke {
KEYSTROKE_END_MARKER = 0,
KEYSTROKE_CLOSE_SESSION = 1,
KEYSTROKE_SWITCH_ALL_SCREENS = 2,
- KEYSTROKE_MINIMIZE = 3,
- KEYSTROKE_LEFT = 4,
- KEYSTROKE_UP = 5,
- KEYSTROKE_RIGHT = 6,
- KEYSTROKE_DOWN = 7,
- KEYSTROKE_RESIZE = 8,
- KEYSTROKE_DEFER = 9,
- KEYSTROKE_IGNORE = 10,
- KEYSTROKE_FORCE_SYNCHRONIZATION = 11,
+ KEYSTROKE_FULLSCREEN = 3,
+ KEYSTROKE_MINIMIZE = 4,
+ KEYSTROKE_LEFT = 5,
+ KEYSTROKE_UP = 6,
+ KEYSTROKE_RIGHT = 7,
+ KEYSTROKE_DOWN = 8,
+ KEYSTROKE_RESIZE = 9,
+ KEYSTROKE_DEFER = 10,
+ KEYSTROKE_IGNORE = 11,
+ KEYSTROKE_FORCE_SYNCHRONIZATION = 12,
/* stuff used for debugging, probably not useful for most people */
- KEYSTROKE_DEBUG_TREE = 12,
- KEYSTROKE_REGIONS_ON_SCREEN = 13,
- KEYSTROKE_TEST_INPUT = 14,
- KEYSTROKE_DEACTIVATE_INPUT_DEVICES_GRAB = 15,
+ KEYSTROKE_DEBUG_TREE = 13,
+ KEYSTROKE_REGIONS_ON_SCREEN = 14,
+ KEYSTROKE_TEST_INPUT = 15,
+ KEYSTROKE_DEACTIVATE_INPUT_DEVICES_GRAB = 16,
- KEYSTROKE_FULLSCREEN = 16,
KEYSTROKE_VIEWPORT_MOVE_LEFT = 17,
KEYSTROKE_VIEWPORT_MOVE_UP = 18,
KEYSTROKE_VIEWPORT_MOVE_RIGHT = 19,
KEYSTROKE_VIEWPORT_MOVE_DOWN = 20,
- KEYSTROKE_NOTHING = 21,
+ KEYSTROKE_REREAD_KEYSTROKES = 21,
+
+ KEYSTROKE_NOTHING = 22,
/* insert more here, increment KEYSTROKE_MAX accordingly.
* then update string translation below */
- KEYSTROKE_MAX=22,
+ KEYSTROKE_MAX = 23,
};
struct nxagentSpecialKeystrokeMap {
enum nxagentSpecialKeystroke stroke;
unsigned int modifierMask; /* everything except alt/meta */
- int modifierAltMeta; /* modifier combination should include alt/meta */
+ Bool modifierAltMeta; /* modifier combination should include alt/meta */
KeySym keysym;
};