diff options
| -rw-r--r-- | config.def.h | 60 | ||||
| -rw-r--r-- | main.c | 82 |
2 files changed, 142 insertions, 0 deletions
diff --git a/config.def.h b/config.def.h index afc1693..28cb8f2 100644 --- a/config.def.h +++ b/config.def.h @@ -13,6 +13,9 @@ extern void tabopen(Cinnamon* cinnamon); extern void tabclose(Cinnamon* cinnamon); extern void set_mode(Cinnamon* cinnamon, int new_mode); extern void inject_hint_mode(Cinnamon* cinnamon, void (*callback)(Cinnamon*, char hint_buffer[16])); +extern void quickmark_add(Cinnamon* cinnamon, const char* name, const char* url); +extern void quickmark_load(Cinnamon* cinnamon, const char* name); +extern void quickmark_save_all(void); /* guard ensures config exists/enables brower */ #define CINNAMON_ENABLED @@ -34,6 +37,9 @@ extern void inject_hint_mode(Cinnamon* cinnamon, void (*callback)(Cinnamon*, cha #define TABS_SHOW_FAVICON #define TABS_SHOW_TITLE +/* quickmark filepath relative to the user data dir, usually ~/.local/share/cinnamon */ +#define QUICKMARK_FILE "quickmarks.txt" + /* Keybind definitions */ /* we use the _kbd prefix here just because, idk, good practice to keep keybinds isolated? in practice use whatever the hell you want as long as it doesnt interfere with builtin functions */ @@ -143,10 +149,40 @@ static void _kbd_prev_tab(Cinnamon* cinnamon, void* arg) { gtk_notebook_set_current_page(GTK_NOTEBOOK(cinnamon->notebook), prev); } +static void _kbd_qaddcmd(Cinnamon* cinnamon, void* arg) { + gtk_entry_set_text(GTK_ENTRY(cinnamon->cmdbar), "qadd "); + gtk_widget_show(cinnamon->cmdbar); + gtk_widget_grab_focus(cinnamon->cmdbar); + gtk_editable_set_position(GTK_EDITABLE(cinnamon->cmdbar), -1); + cmdbar_focused = true; + set_mode(cinnamon, 1); +} + +static void _kbd_qloadcmd(Cinnamon* cinnamon, void* arg) { + gtk_entry_set_text(GTK_ENTRY(cinnamon->cmdbar), "qload "); + gtk_widget_show(cinnamon->cmdbar); + gtk_widget_grab_focus(cinnamon->cmdbar); + gtk_editable_set_position(GTK_EDITABLE(cinnamon->cmdbar), -1); + cmdbar_focused = true; + set_mode(cinnamon, 1); +} + +static void _kbd_qloadtabcmd(Cinnamon* cinnamon, void* arg) { + gtk_entry_set_text(GTK_ENTRY(cinnamon->cmdbar), "qloadtab "); + gtk_widget_show(cinnamon->cmdbar); + gtk_widget_grab_focus(cinnamon->cmdbar); + gtk_editable_set_position(GTK_EDITABLE(cinnamon->cmdbar), -1); + cmdbar_focused = true; + set_mode(cinnamon, 1); +} + static const Keybind keybinds[] = { { "t", &_kbd_tabopen, NULL }, { "d", &_kbd_tabclose, NULL }, { "o", &_kbd_opencmd, NULL }, + { "m", &_kbd_qaddcmd, NULL }, + { "b", &_kbd_qloadcmd, NULL }, + { "<S-b>", &_kbd_qloadtabcmd, NULL }, { "s", &_kbd_toggletabs, NULL }, { "<S-i>", &_kbd_passthru, NULL }, { "i", &_kbd_insmode, NULL }, @@ -225,6 +261,27 @@ static void _cmd_quit(Cinnamon* cinnamon, const char* args) { gtk_main_quit(); } +static void _cmd_qadd(Cinnamon* cinnamon, const char* args) { + if (!args || strlen(args) == 0) return; + + GtkWidget *webview = gtk_notebook_get_nth_page(GTK_NOTEBOOK(cinnamon->notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(cinnamon->notebook))); + const char *url = webkit_web_view_get_uri(WEBKIT_WEB_VIEW(webview)); + + quickmark_add(cinnamon, args, url); + quickmark_save_all(); +} + +static void _cmd_qload(Cinnamon* cinnamon, const char* args) { + if (!args || strlen(args) == 0) return; + quickmark_load(cinnamon, args); +} + +static void _cmd_qloadtab(Cinnamon* cinnamon, const char* args) { + if (!args || strlen(args) == 0) return; + tabopen(cinnamon); + quickmark_load(cinnamon, args); +} + static const Command commands[] = { { "open", &_cmd_open }, { "reload", &_cmd_reload }, @@ -233,6 +290,9 @@ static const Command commands[] = { { "forward", &_cmd_forward }, { "q", &_cmd_quit }, { "quit", &_cmd_quit }, + { "qadd", &_cmd_qadd }, + { "qload", &_cmd_qload }, + { "qloadtab", &_cmd_qloadtab }, }; @@ -7,6 +7,7 @@ This software is licensed under the ARPL. See LICENSE for details. #include <cairo.h> #include <gdk-pixbuf/gdk-pixbuf.h> #include <stdio.h> +#include <stdlib.h> /* forward declare BEFORE including config.h so that config.h can reference them */ typedef struct { @@ -28,18 +29,96 @@ typedef struct { void (*fptr)(Cinnamon*, const char *args); } Command; +typedef struct Quickmark { + char *name; + char *url; + struct Quickmark *next; +} Quickmark; + #include "config.h" /* 0 = normal mode, 1 = insert, 2 = passthrough, 3 = hint */ static int mode = 0; bool cmdbar_focused = false; + +/* hinting */ static char hint_buffer[16] = {0}; static int hint_mode_active = 0; void (*hint_callback)(Cinnamon* cinnamon, char hint_buffer[16]); +/* quickmarks */ +static Quickmark* quickmarks = NULL; + /* some forward declarations */ void cancel_hint_mode(Cinnamon* cinnamon); +void quickmark_add(Cinnamon* cinnamon, const char* name, const char* url) { + Quickmark* curr = quickmarks; + while (curr) { + if (strcmp(curr->name, name) == 0) { + free(curr->url); + curr->url = strdup(url); + return; + } + curr = curr->next; + } + + Quickmark* new = malloc(sizeof(Quickmark)); + new->name = strdup(name); + new->url = strdup(url); + new->next = quickmarks; + quickmarks = new; +} + +void quickmark_load(Cinnamon* cinnamon, const char* name) { + Quickmark* curr = quickmarks; + while (curr) { + if (strcmp(curr->name, name) == 0) { + GtkWidget *webview = gtk_notebook_get_nth_page(GTK_NOTEBOOK(cinnamon->notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(cinnamon->notebook))); + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview), curr->url); + return; + } + curr = curr->next; + } +} + +void quickmark_save_all(void) { + char *path = g_build_filename(g_get_user_data_dir(), "cinnamon", QUICKMARK_FILE, NULL); + FILE *f = fopen(path, "w"); + if (!f) return; + + Quickmark *curr = quickmarks; + while (curr) { + fprintf(f, "%s\n%s\n", curr->name, curr->url); + curr = curr->next; + } + fclose(f); + g_free(path); +} + +void quickmark_load_all(void) { + char *path = g_build_filename(g_get_user_data_dir(), "cinnamon", QUICKMARK_FILE, NULL); + FILE *f = fopen(path, "r"); + if (!f) { + g_free(path); + return; + } + + char name[256], url[4096]; + while (fgets(name, sizeof(name), f) && fgets(url, sizeof(url), f)) { + name[strcspn(name, "\n")] = 0; + url[strcspn(url, "\n")] = 0; + + Quickmark *new = malloc(sizeof(Quickmark)); + new->name = strdup(name); + new->url = strdup(url); + new->next = quickmarks; + quickmarks = new; + } + fclose(f); + g_free(path); +} + static void parse_keybind(const char *key, guint *keyval, GdkModifierType *mods) { char name[32]; const char *start; @@ -296,6 +375,9 @@ int main(int argc, char *argv[]) { /* favicon db */ webkit_web_context_set_favicon_database_directory(cinnamon.web_context, g_build_filename(g_get_user_cache_dir(), "cinnamon", "favicons", NULL)); + /* load quickmarks! */ + quickmark_load_all(); + /* Create initial tab */ tabopen(&cinnamon); |
