GUACAMOLE-313: Continuously track key press/release.
This commit is contained in:
parent
ebc731aaf3
commit
d39757b4dc
@ -57,6 +57,9 @@ guaclog_state* guaclog_state_alloc(const char* path) {
|
|||||||
/* Associate state with output file */
|
/* Associate state with output file */
|
||||||
state->output = output;
|
state->output = output;
|
||||||
|
|
||||||
|
/* No keys are initially tracked */
|
||||||
|
state->active_keys = 0;
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
|
|
||||||
/* Free all allocated data in case of failure */
|
/* 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) {
|
int guaclog_state_update_key(guaclog_state* state, int keysym, bool pressed) {
|
||||||
|
|
||||||
/* STUB */
|
int i;
|
||||||
fprintf(state->output, "STUB: keysym=0x%X, pressed=%s\n",
|
|
||||||
keysym, pressed ? "true" : "false");
|
/* 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;
|
return 0;
|
||||||
|
|
||||||
|
@ -25,6 +25,29 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#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.
|
* The current state of the Guacamole input log interpreter.
|
||||||
*/
|
*/
|
||||||
@ -35,6 +58,18 @@ typedef struct guaclog_state {
|
|||||||
*/
|
*/
|
||||||
FILE* output;
|
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;
|
} guaclog_state;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user