diff options
author | tlatorre <tlatorre@uchicago.edu> | 2022-11-12 13:42:41 -0600 |
---|---|---|
committer | tlatorre <tlatorre@uchicago.edu> | 2022-11-12 13:42:41 -0600 |
commit | 4230ca4e1d0c70e8abbbf128a31a0dfcaf82ef33 (patch) | |
tree | e0e45513bc343cc914b1069468ca3b6db02b8bf7 /vito.c | |
parent | ee2b7d4faaed16df5ed735ea7e36d4173852e8c3 (diff) | |
download | moji-4230ca4e1d0c70e8abbbf128a31a0dfcaf82ef33.tar.gz moji-4230ca4e1d0c70e8abbbf128a31a0dfcaf82ef33.tar.bz2 moji-4230ca4e1d0c70e8abbbf128a31a0dfcaf82ef33.zip |
switch between alphabets by using spacebar
Diffstat (limited to 'vito.c')
-rw-r--r-- | vito.c | 52 |
1 files changed, 51 insertions, 1 deletions
@@ -1,6 +1,8 @@ #include <gtk/gtk.h> #include <sys/time.h> #include <stdlib.h> +#include <gdk/gdkkeysyms.h> +#include <gdk/gdkenums.h> #define CLICK_TIME 1000 @@ -195,7 +197,7 @@ static int released(GtkWidget *widget, gpointer data) * to keep the current letter. The reason is that you might want to * delete a whole word and so when you navigate to the backspace you * just have to keep entering the same letter. */ - //current_letter = 0; + current_letter = 0; } else { current_letter += 1; } @@ -205,6 +207,48 @@ static int released(GtkWidget *widget, gpointer data) return TRUE; } +gboolean on_key_press(GtkEventControllerKey *, guint keyval, guint keycode, GdkModifierType mod, gpointer user_data) +{ + GtkTextBuffer *text_buffer; + GtkTextIter start, end; + switch (keyval) + { + case GDK_KEY_space: + printf("switching alphabet"); + if (current_chars == &emoji) + current_chars = &alphabet; + else if (current_chars == &alphabet) + current_chars = &emoji; + write_buf(); + break; + case GDK_KEY_BackSpace: + case GDK_KEY_Delete: + if (current_position > 0) { + text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_widget)); + gtk_text_buffer_set_text(text_buffer, buf, -1); + + gtk_text_buffer_get_iter_at_offset(text_buffer, &start, 0); + gtk_text_buffer_get_iter_at_offset(text_buffer, &end, g_utf8_strlen(buf,-1)-2); + current_position = strlen(gtk_text_buffer_get_slice(text_buffer,&start,&end,TRUE)); + } + if (current_position > LEN(buf) - 1) { + /* FIXME: better way to do this? */ + current_position = 0; + } + /* Uncomment the next line to start over at the beginning of the + * alphabet after a new letter is entered. But, I think it's better + * to keep the current letter. The reason is that you might want to + * delete a whole word and so when you navigate to the backspace you + * just have to keep entering the same letter. */ + current_letter = 0; + write_buf(); + break; + default: + return FALSE; + } + return FALSE; +} + static void activate(GtkApplication *app, gpointer user_data) { GtkWidget *window; @@ -212,11 +256,17 @@ static void activate(GtkApplication *app, gpointer user_data) GtkCssProvider *provider; GtkStyleContext *context; GtkGesture *gesture; + GtkEventController *event_controller; window = gtk_application_window_new(app); gtk_window_set_title(GTK_WINDOW(window), "Window"); gtk_window_set_default_size(GTK_WINDOW(window), 200, 200); + event_controller = gtk_event_controller_key_new(); + g_signal_connect(event_controller, "key-pressed", G_CALLBACK(on_key_press), NULL); + //gtk_event_controller_set_propagation_phase ((GtkEventController*) event_controller, GTK_PHASE_CAPTURE); + gtk_widget_add_controller(window, event_controller); + gesture = gtk_gesture_click_new(); g_signal_connect(gesture, "pressed", G_CALLBACK(pressed), NULL); g_signal_connect(gesture, "released", G_CALLBACK(released), NULL); |