You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@guacamole.apache.org by vn...@apache.org on 2018/01/30 19:08:30 UTC

[02/11] guacamole-server git commit: GUACAMOLE-313: Continuously track key press/release.

GUACAMOLE-313: Continuously track key press/release.


Project: http://git-wip-us.apache.org/repos/asf/guacamole-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/guacamole-server/commit/d39757b4
Tree: http://git-wip-us.apache.org/repos/asf/guacamole-server/tree/d39757b4
Diff: http://git-wip-us.apache.org/repos/asf/guacamole-server/diff/d39757b4

Branch: refs/heads/master
Commit: d39757b4dc09ff7f255761ca9c2f18e105be626f
Parents: ebc731a
Author: Michael Jumper <mj...@apache.org>
Authored: Sun Nov 26 17:24:49 2017 -0800
Committer: Michael Jumper <mj...@apache.org>
Committed: Fri Jan 26 16:24:14 2018 -0800

----------------------------------------------------------------------
 src/guaclog/state.c | 106 +++++++++++++++++++++++++++++++++++++++++++++--
 src/guaclog/state.h |  35 ++++++++++++++++
 2 files changed, 138 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/d39757b4/src/guaclog/state.c
----------------------------------------------------------------------
diff --git a/src/guaclog/state.c b/src/guaclog/state.c
index 6167bd3..cc6f763 100644
--- a/src/guaclog/state.c
+++ b/src/guaclog/state.c
@@ -57,6 +57,9 @@ guaclog_state* guaclog_state_alloc(const char* path) {
     /* Associate state with output file */
     state->output = output;
 
+    /* No keys are initially tracked */
+    state->active_keys = 0;
+
     return state;
 
     /* Free all allocated data in case of failure */
@@ -85,11 +88,108 @@ int guaclog_state_free(guaclog_state* state) {
 
 }
 
+/**
+ * Adds the given key state to the array of tracked keys. If the key is already
+ * being tracked, its corresponding entry within the array of tracked keys is
+ * updated, and the number of tracked keys remains the same. If the key is not
+ * already being tracked, it is added to the end of the array of tracked keys
+ * providing there is space available, and the number of tracked keys is
+ * updated. Failures to add keys will be automatically logged.
+ *
+ * @param state
+ *     The Guacamole input log interpreter state being updated.
+ *
+ * @param keysym
+ *     The X11 keysym of the key being pressed or released.
+ *
+ * @param pressed
+ *     true if the key is being pressed, false if the key is being released.
+ *
+ * @return
+ *     Zero if the key state was successfully added, non-zero otherwise.
+ */
+static int guaclog_state_add_key(guaclog_state* state, int keysym, bool pressed) {
+
+    int i;
+
+    /* Update existing key, if already tracked */
+    for (i = 0; i < state->active_keys; i++) {
+        guaclog_key_state* key = &state->key_states[i];
+        if (key->keysym == keysym) {
+            key->pressed = pressed;
+            return 0;
+        }
+    }
+
+    /* If not already tracked, we need space to add it */
+    if (state->active_keys == GUACLOG_MAX_KEYS) {
+        guaclog_log(GUAC_LOG_WARNING, "Unable to log key 0x%X: Too many "
+                "active keys.", keysym);
+        return 1;
+    }
+
+    /* Add key to state */
+    guaclog_key_state* key = &state->key_states[state->active_keys++];
+    key->keysym = keysym;
+    key->pressed = pressed;
+    return 0;
+
+}
+
+/**
+ * Removes released keys from the end of the array of tracked keys, such that
+ * the last key in the array is a pressed key. This function should be invoked
+ * after changes have been made to the interpreter state, to ensure that the
+ * array of tracked keys does not grow longer than necessary.
+ *
+ * @param state
+ *     The Guacamole input log interpreter state to trim.
+ */
+static void guaclog_state_trim_keys(guaclog_state* state) {
+
+    int i;
+
+    /* Reset active_keys to contain only up to the last pressed key */
+    for (i = state->active_keys - 1; i >= 0; i--) {
+        guaclog_key_state* key = &state->key_states[i];
+        if (key->pressed) {
+            state->active_keys = i + 1;
+            return;
+        }
+    }
+
+    /* No keys are active */
+    state->active_keys = 0;
+
+}
+
 int guaclog_state_update_key(guaclog_state* state, int keysym, bool pressed) {
 
-    /* STUB */
-    fprintf(state->output, "STUB: keysym=0x%X, pressed=%s\n",
-            keysym, pressed ? "true" : "false");
+    int i;
+
+    /* Update tracked keysysm state */
+    guaclog_state_add_key(state, keysym, pressed);
+    guaclog_state_trim_keys(state);
+
+    /* Output new log entries only when keys are pressed */
+    if (pressed) {   
+
+        /* STUB: Output raw hex log entry */
+        for (i = 0; i < state->active_keys; i++) {
+
+            if (i != 0)
+                fprintf(state->output, " ");
+
+            guaclog_key_state* key = &state->key_states[i];
+            fprintf(state->output, "0x%X:%s", key->keysym,
+                    key->pressed ? "*" : " ");
+
+        }
+
+        /* Terminate log entry with newline */
+        fprintf(state->output, "\n");
+
+    }
 
     return 0;
 

http://git-wip-us.apache.org/repos/asf/guacamole-server/blob/d39757b4/src/guaclog/state.h
----------------------------------------------------------------------
diff --git a/src/guaclog/state.h b/src/guaclog/state.h
index 5891cb5..0dd2f2f 100644
--- a/src/guaclog/state.h
+++ b/src/guaclog/state.h
@@ -26,6 +26,29 @@
 #include <stdio.h>
 
 /**
+ * The maximum number of keys which may be tracked at any one time before
+ * newly-pressed keys are ignored.
+ */
+#define GUACLOG_MAX_KEYS 256
+
+/**
+ * The current state of a single key.
+ */
+typedef struct guaclog_key_state {
+
+    /**
+     * The X11 keysym of the key.
+     */
+    int keysym;
+
+    /**
+     * Whether the key is currently pressed (true) or released (false).
+     */
+    bool pressed;
+
+} guaclog_key_state;
+
+/**
  * The current state of the Guacamole input log interpreter.
  */
 typedef struct guaclog_state {
@@ -35,6 +58,18 @@ typedef struct guaclog_state {
      */
     FILE* output;
 
+    /**
+     * The number of keys currently being tracked within the key_states array.
+     */
+    int active_keys;
+
+    /**
+     * Array of all keys currently being tracked. A key is added to the array
+     * when it is pressed for the first time. Released keys at the end of the
+     * array are automatically removed from tracking.
+     */
+    guaclog_key_state key_states[GUACLOG_MAX_KEYS];
+
 } guaclog_state;
 
 /**