From abf6242128394aa2374f3882252dfc84d4499c33 Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Mon, 13 Mar 2017 22:00:23 +0100 Subject: Keystroke.c: add new keystroke to reread keystroke config Default is ctrl-alt-k --- doc/nxagent/README.keystrokes | 4 +++ etc/keystrokes.cfg | 1 + nx-X11/programs/Xserver/hw/nxagent/Keystroke.c | 34 +++++++++++++++++++++++--- nx-X11/programs/Xserver/hw/nxagent/Keystroke.h | 6 +++-- 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 @@ + 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 { -- cgit v1.2.3