diff options
| author | Shav Kinderlehrer <shav@trinket.icu> | 2026-05-08 02:47:47 -0400 |
|---|---|---|
| committer | Shav Kinderlehrer <shav@trinket.icu> | 2026-05-08 02:47:47 -0400 |
| commit | e85467ec272826bed113c29042ea4db355b851a3 (patch) | |
| tree | 3879fe821e7f050bcfa77a45d63eecfb9357c6d7 /main.c | |
| download | extant-e85467ec272826bed113c29042ea4db355b851a3.tar.gz extant-e85467ec272826bed113c29042ea4db355b851a3.zip | |
Initial commit
Diffstat (limited to 'main.c')
| -rw-r--r-- | main.c | 81 |
1 files changed, 81 insertions, 0 deletions
@@ -0,0 +1,81 @@ +#include "gdk/gdk.h" +#include "gio/gio.h" +#include "glib-object.h" +#include "gtk/gtkcssprovider.h" +#include <gtk/gtk.h> +#include <gtk4-layer-shell/gtk4-layer-shell.h> +#include <libguile.h> + +static void setup_window_styles(GtkWindow *window) { + GtkCssProvider *css_provider = gtk_css_provider_new(); + gtk_css_provider_load_from_resource(css_provider, + "/ski/frog/assistant/window.css"); + + gtk_style_context_add_provider_for_display( + gdk_display_get_default(), GTK_STYLE_PROVIDER(css_provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); +} + +static gboolean on_escape_key_pressed(GtkEventControllerKey *controller, guint keyval, + guint keycode, GdkModifierType state, + gpointer user_data) { + GtkWindow *window = GTK_WINDOW(user_data); + if (keyval == GDK_KEY_Escape) { + gtk_window_close(window); + return TRUE; + } + return FALSE; +} + +static void setup_close_on_escape(GtkWindow *window) { + GtkEventController *controller = gtk_event_controller_key_new(); + g_signal_connect(controller, "key-pressed", G_CALLBACK(on_escape_key_pressed), + window); + gtk_widget_add_controller(GTK_WIDGET(window), controller); +} + +static void on_submit(GtkWidget *widget, gpointer data) { + GtkEntry *entry = GTK_ENTRY(data); + const char *text = gtk_editable_get_text(GTK_EDITABLE(entry)); + g_print("Got: %s\n", text); +} + +static void activate(GtkApplication *app, gpointer user_data) { + GtkWidget *window = gtk_application_window_new(app); + + gtk_layer_init_for_window(GTK_WINDOW(window)); + gtk_layer_set_layer(GTK_WINDOW(window), GTK_LAYER_SHELL_LAYER_OVERLAY); + gtk_layer_set_keyboard_mode(GTK_WINDOW(window), + GTK_LAYER_SHELL_KEYBOARD_MODE_EXCLUSIVE); + + gtk_window_set_decorated(GTK_WINDOW(window), FALSE); + + setup_window_styles(GTK_WINDOW(window)); + setup_close_on_escape(GTK_WINDOW(window)); + + GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5); + gtk_widget_set_name(hbox, "prompt-box"); + + GtkWidget *entry = gtk_entry_new(); + GtkWidget *submit_button = gtk_button_new_from_icon_name("send-to-symbolic"); + g_signal_connect(submit_button, "clicked", G_CALLBACK(on_submit), entry); + g_signal_connect(entry, "activate", G_CALLBACK(on_submit), entry); + + gtk_box_append(GTK_BOX(hbox), entry); + gtk_box_append(GTK_BOX(hbox), submit_button); + + gtk_window_set_child(GTK_WINDOW(window), hbox); + + gtk_window_present(GTK_WINDOW(window)); +} + +int main(int argc, char *argv[]) { + GtkApplication *app = + gtk_application_new("ski.frog.assistant", G_APPLICATION_DEFAULT_FLAGS); + g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); + + int status = g_application_run(G_APPLICATION(app), argc, argv); + g_object_unref(app); + + return status; +} |
