#include "gdk/gdk.h" #include "gio/gio.h" #include "glib-object.h" #include "gtk/gtkcssprovider.h" #include #include #include 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; }