From 4230ca4e1d0c70e8abbbf128a31a0dfcaf82ef33 Mon Sep 17 00:00:00 2001 From: tlatorre Date: Sat, 12 Nov 2022 13:42:41 -0600 Subject: switch between alphabets by using spacebar --- vito.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/vito.c b/vito.c index 273216d..0e1bf20 100644 --- a/vito.c +++ b/vito.c @@ -1,6 +1,8 @@ #include #include #include +#include +#include #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); -- cgit