From 0a406cfbee9cae0c00ca097704f06185ed4b0a13 Mon Sep 17 00:00:00 2001 From: tlatorre Date: Sat, 5 Nov 2022 20:49:30 -0500 Subject: first draft of GUI for vito --- Makefile | 2 +- vito.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 129 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 4944cdd..158dbb6 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ all: vito -CFLAGS=$(shell pkg-config --cflags gtk4) +CFLAGS=$(shell pkg-config --cflags gtk4) -O0 -g -Wall LDLIBS=$(shell pkg-config --libs gtk4) vito: vito.c diff --git a/vito.c b/vito.c index 7bd1e91..9d2b344 100644 --- a/vito.c +++ b/vito.c @@ -1,33 +1,142 @@ #include +#include -static void -print_hello (GtkWidget *widget, - gpointer data) +#define LEN(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x]))))) + +static void aeGetTime(long *seconds, long *milliseconds) +{ + struct timeval tv; + + gettimeofday(&tv, NULL); + *seconds = tv.tv_sec; + *milliseconds = tv.tv_usec/1000; +} + +GtkWidget *window; +GtkWidget *button; +GtkWidget *text_widget; +GtkTextBuffer *text_buffer; +GtkTextTag *tag; + +char alphabet[] = "abcdefghijklmnopqrstuvwxyz_!?."; +char buf[1000000]; + +/* The current alphabetical letter. */ +int current_letter = 0; +/* The current position in the buffer. + * + * FIXME: What to do if we run out of buffer space?. */ +int current_position = 0; + +/* Time the mouse was clicked (seconds) */ +long pressed_time_sec = 0; +/* Time the mouse was clicked (milliseconds) */ +long pressed_time_msec = 0; +/* Time the mouse was released (seconds) */ +long released_time_sec = 0; +/* Time the mouse was released (milliseconds) */ +long released_time_msec = 0; + +static int pressed(GtkWidget *widget, gpointer data) +{ + aeGetTime(&pressed_time_sec,&pressed_time_msec); + g_print("mouse pressed\n"); + return TRUE; +} + +static void write_buf(void) +{ + GtkTextIter start, end; + + text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_widget)); + sprintf(buf+current_position,"%c",alphabet[current_letter % LEN(alphabet)]); + + gtk_text_buffer_set_text (text_buffer, buf, -1); + + gtk_text_buffer_get_iter_at_offset (text_buffer, &start, strlen(buf)-1); + gtk_text_buffer_get_iter_at_offset (text_buffer, &end, strlen(buf)); + gtk_text_buffer_apply_tag (text_buffer, tag, &start, &end); +} + +static int released(GtkWidget *widget, gpointer data) { - g_print ("Hello World\n"); + aeGetTime(&released_time_sec,&released_time_msec); + long long diff = (released_time_sec - pressed_time_sec)*1000 + (released_time_msec - pressed_time_msec); + + if (diff > 10000) { + current_position = 0; + current_letter = 0; + } else if (diff > 500) { + if (alphabet[current_letter % LEN(alphabet)] == '_') + sprintf(buf+current_position," "); + else + sprintf(buf+current_position,"%c",alphabet[current_letter % LEN(alphabet)]); + current_position += 1; + if (current_position > LEN(buf) - 1) { + /* FIXME: better way to do this? */ + current_position = 0; + } + current_letter = 0; + } else { + current_letter += 1; + } + + write_buf(); + + g_print("mouse released\n"); + return TRUE; } -static void -activate (GtkApplication *app, - gpointer user_data) +static void activate (GtkApplication *app, gpointer user_data) { - GtkWidget *window; - GtkWidget *button; + GtkCssProvider *provider; + GtkStyleContext *context; + GtkGesture *gesture; + + text_buffer = gtk_text_buffer_new(NULL); + gtk_text_buffer_set_text(text_buffer,"blah",4); + + window = gtk_application_window_new(app); + gtk_window_set_title(GTK_WINDOW (window), "Window"); + gtk_window_set_default_size(GTK_WINDOW (window), 200, 200); + + gesture = gtk_gesture_click_new(); + g_signal_connect(gesture, "pressed", G_CALLBACK (pressed), NULL); + g_signal_connect(gesture, "released", G_CALLBACK (released), NULL); + gtk_widget_add_controller(window, GTK_EVENT_CONTROLLER (gesture)); + + text_widget = gtk_text_view_new(); + gtk_text_view_set_editable((GtkTextView *) text_widget, FALSE); + gtk_text_view_set_cursor_visible((GtkTextView *) text_widget, TRUE); + gtk_text_view_set_wrap_mode((GtkTextView *) text_widget, GTK_WRAP_CHAR); + gtk_widget_set_can_focus(text_widget, FALSE); + gtk_widget_set_can_target(text_widget, FALSE); + text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_widget)); + + /* Change default font and color throughout the widget */ + provider = gtk_css_provider_new (); + gtk_css_provider_load_from_data (provider, + "textview {" + " font: 144pt monospace;" + " color: black;" + "}", + -1); + context = gtk_widget_get_style_context (text_widget); + gtk_style_context_add_provider(context, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - window = gtk_application_window_new (app); - gtk_window_set_title (GTK_WINDOW (window), "Window"); - gtk_window_set_default_size (GTK_WINDOW (window), 200, 200); + /* Use a tag to change the color for just one part of the widget */ + tag = gtk_text_buffer_create_tag(text_buffer, "red_foreground", "foreground", "red", NULL); + buf[0] = 'a'; + buf[1] = '\0'; + write_buf(); + gtk_window_set_child(GTK_WINDOW (window), text_widget); - button = gtk_button_new_with_label ("Hello World"); - g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL); - gtk_window_set_child (GTK_WINDOW (window), button); + gtk_window_fullscreen(GTK_WINDOW(window)); - gtk_window_present (GTK_WINDOW (window)); + gtk_window_present(GTK_WINDOW (window)); } -int -main (int argc, - char **argv) +int main(int argc, char **argv) { GtkApplication *app; int status; -- cgit