/* Copyright (c) 2026 Arslaan Pathan This software is licensed under the ARPL. See LICENSE for details. */ #include #include #include "config.h" /* struct so we can easily pass objects around. will actually use this in code later */ typedef struct { GtkWidget *window; GtkWidget *notebook; GtkWidget *cmdbar; } Cinnamon; /* 0 = normal mode, 1 = insert, 2 = passthrough */ static int mode = 0; static void parse_keybind(const char *key, guint *keyval, GdkModifierType *mods) { char name[32]; const char *start; const char *end; *mods = 0; if (key[0] != '<') { *keyval = gdk_keyval_from_name(key); return; } if (strstr(key, "S-")) *mods |= GDK_SHIFT_MASK; if (strstr(key, "C-")) *mods |= GDK_CONTROL_MASK; if (strstr(key, "A-")) *mods |= GDK_MOD1_MASK; /* everything after the last '-' and before '>' */ start = strrchr(key, '-') + 1; end = strchr(key, '>'); snprintf(name, sizeof(name), "%.*s", (int)(end - start), start); *keyval = gdk_keyval_from_name(name); } static void on_title_changed(WebKitWebView *webview, GParamSpec *pspec, GtkNotebook *notebook) { const char *title = webkit_web_view_get_title(webview); int page = gtk_notebook_page_num(notebook, GTK_WIDGET(webview)); gtk_notebook_set_tab_label_text(notebook, GTK_WIDGET(webview), title ? title : "New Tab"); } static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { if (event->keyval == GDK_KEY_colon) { /* we dont have command bar yet so pretend we did something and printf */ printf("this should show the command bar\n"); return TRUE; } for (int i = 0; i < sizeof(keybinds) / sizeof(keybinds[0]); i++) { guint keyval; GdkModifierType mods; parse_keybind(keybinds[i].key, &keyval, &mods); GdkModifierType relevant = GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK; if (gdk_keyval_to_lower(event->keyval) == keyval && (event->state & relevant) == mods) { /* we dont know what to do yet, printf */ printf("%s\n", keybinds[i].command); return TRUE; } } /* event not consumed pass to webview */ return FALSE; } int main(int argc, char *argv[]) { #ifndef ObamaPrism return 1; #endif gtk_init(&argc, &argv); /* Create a new window and set default size */ GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* Size constants defined in config.h */ gtk_window_set_default_size(GTK_WINDOW(window), WINDOW_WIDTH, WINDOW_HEIGHT); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); GtkWidget *notebook = gtk_notebook_new(); gtk_container_add(GTK_CONTAINER(window), notebook); /* Create initial tab */ GtkWidget *webview = webkit_web_view_new(); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), webview, gtk_label_new("New Tab")); /* HOMEPAGE defined in config.h */ webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview), HOMEPAGE); /* handle keypresses */ g_signal_connect(window, "key-press-event", G_CALLBACK(on_key_press), notebook); /* handle tab changes */ g_signal_connect(webview, "notify::title", G_CALLBACK(on_title_changed), notebook); gtk_widget_show_all(window); gtk_main(); return 0; }