aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Sibiller <uli42@gmx.de>2017-03-13 22:00:23 +0100
committerUlrich Sibiller <uli42@gmx.de>2017-03-13 22:17:42 +0100
commitabf6242128394aa2374f3882252dfc84d4499c33 (patch)
treed49003d2c7f49f0eee4a4cb47d0917f9e2ca2555
parentaadcac452379ae0da59f1a16c60189a69ef822d6 (diff)
downloadnx-libs-abf6242128394aa2374f3882252dfc84d4499c33.tar.gz
nx-libs-abf6242128394aa2374f3882252dfc84d4499c33.tar.bz2
nx-libs-abf6242128394aa2374f3882252dfc84d4499c33.zip
Keystroke.c: add new keystroke to reread keystroke config
Default is ctrl-alt-k
-rw-r--r--doc/nxagent/README.keystrokes4
-rw-r--r--etc/keystrokes.cfg1
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Keystroke.c34
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Keystroke.h6
4 files changed, 39 insertions, 6 deletions
diff --git a/doc/nxagent/README.keystrokes b/doc/nxagent/README.keystrokes
index ad850f6df..7edd340d2 100644
--- a/doc/nxagent/README.keystrokes
+++ b/doc/nxagent/README.keystrokes
@@ -92,6 +92,10 @@ viewport_move_right
Moves the image viewport to the right.
viewport_move_down
Moves the image viewport down.
+reread_keystrokes
+ forces nxagent to re-read the keystroke
+ configuration. Useful to add/changes keystrokes for a running
+ session.
Only in builds with certain debugging options enabled, ignored otherwise:
force_synchronization
diff --git a/etc/keystrokes.cfg b/etc/keystrokes.cfg
index 1716d6abe..22cc8c7a0 100644
--- a/etc/keystrokes.cfg
+++ b/etc/keystrokes.cfg
@@ -16,4 +16,5 @@
<keystroke action="viewport_move_up" Control="1" AltMeta="1" key="Up" />
<keystroke action="viewport_move_right" Control="1" AltMeta="1" key="Right" />
<keystroke action="viewport_move_down" Control="1" AltMeta="1" key="Down" />
+<keystroke action="reread_keystrokes" Control="1" AltMeta="1" key="k" />
</keystrokes>
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
index e0f8925fb..bb8d83f66 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.c
@@ -89,6 +89,8 @@ char * nxagentSpecialKeystrokeNames[] = {
"viewport_move_up",
"viewport_move_right",
"viewport_move_down",
+
+ "reread_keystrokes",
NULL,
};
@@ -134,6 +136,7 @@ struct nxagentSpecialKeystrokeMap default_map[] = {
{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;
@@ -247,7 +250,7 @@ static Bool read_binding_from_xmlnode(xmlNode *node, struct nxagentSpecialKeystr
* - 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;
@@ -258,8 +261,21 @@ static void parse_keystroke_file(void)
/* used for tracking if the config file parsing has already been
done (regardless of the result) */
static Bool done = False;
- if (done)
- return;
+
+ 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) {
@@ -392,7 +408,7 @@ static enum nxagentSpecialKeystroke find_keystroke(XKeyEvent *X)
/* FIXME: we do late parsing here, this should be done at startup,
not at first keypress! */
- parse_keystroke_file();
+ parse_keystroke_file(False);
cur = map;
@@ -573,6 +589,16 @@ Bool 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:
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h
index 56c977418..48ed65b35 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h
+++ b/nx-X11/programs/Xserver/hw/nxagent/Keystroke.h
@@ -64,12 +64,14 @@ enum nxagentSpecialKeystroke {
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 {