aboutsummaryrefslogtreecommitdiff
path: root/sway/input_state.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/input_state.c')
-rw-r--r--sway/input_state.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/sway/input_state.c b/sway/input_state.c
new file mode 100644
index 00000000..51213b19
--- /dev/null
+++ b/sway/input_state.c
@@ -0,0 +1,68 @@
+#include <string.h>
+#include <stdbool.h>
+#include <ctype.h>
+
+#include "input_state.h"
+
+#define KEY_STATE_MAX_LENGTH 64
+
+static keycode key_state_array[KEY_STATE_MAX_LENGTH];
+
+static uint8_t find_key(keycode key) {
+ int i;
+ for (i = 0; i < KEY_STATE_MAX_LENGTH; ++i) {
+ if (key_state_array[i] == key) {
+ break;
+ }
+ }
+ return i;
+}
+
+bool check_key(keycode key) {
+ return find_key(key) < KEY_STATE_MAX_LENGTH;
+}
+
+void press_key(keycode key) {
+ // Check if key exists
+ if (!check_key(key)) {
+ // Check that we dont exceed buffer length
+ int insert = find_key(0);
+ if (insert < KEY_STATE_MAX_LENGTH) {
+ key_state_array[insert] = key;
+ }
+ }
+}
+
+void release_key(keycode key) {
+ uint8_t index = find_key(key);
+ if (index < KEY_STATE_MAX_LENGTH) {
+ //shift it over and remove key
+ key_state_array[index] = 0;
+ }
+}
+
+struct pointer_state pointer_state = {0, 0, {0, 0}, {0, 0, 0, 0}};
+
+static struct wlc_geometry saved_floating;
+
+void start_floating(swayc_t *view) {
+ if (view->is_floating) {
+ saved_floating.origin.x = view->x;
+ saved_floating.origin.y = view->y;
+ saved_floating.size.w = view->width;
+ saved_floating.size.h = view->height;
+ }
+}
+
+void reset_floating(swayc_t *view) {
+ if (view->is_floating) {
+ view->x = saved_floating.origin.x;
+ view->y = saved_floating.origin.y;
+ view->width = saved_floating.size.w;
+ view->height = saved_floating.size.h;
+ arrange_windows(view->parent, -1, -1);
+ }
+ pointer_state.floating = (struct pointer_floating){0,0};
+ pointer_state.lock = (struct pointer_lock){0,0,0,0};
+}
+