aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortlatorre <tlatorre@uchicago.edu>2022-11-12 13:42:41 -0600
committertlatorre <tlatorre@uchicago.edu>2022-11-12 13:42:41 -0600
commit4230ca4e1d0c70e8abbbf128a31a0dfcaf82ef33 (patch)
treee0e45513bc343cc914b1069468ca3b6db02b8bf7
parentee2b7d4faaed16df5ed735ea7e36d4173852e8c3 (diff)
downloadmoji-4230ca4e1d0c70e8abbbf128a31a0dfcaf82ef33.tar.gz
moji-4230ca4e1d0c70e8abbbf128a31a0dfcaf82ef33.tar.bz2
moji-4230ca4e1d0c70e8abbbf128a31a0dfcaf82ef33.zip
switch between alphabets by using spacebar
-rw-r--r--vito.c52
1 files changed, 51 insertions, 1 deletions
diff --git a/vito.c b/vito.c
index 273216d..0e1bf20 100644
--- a/vito.c
+++ b/vito.c
@@ -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);