aboutsummaryrefslogtreecommitdiff
path: root/main.c
blob: 0d710462098f762870bb38b586eef14322f472fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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;
}