aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.def.h60
-rw-r--r--main.c82
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 },
};
diff --git a/main.c b/main.c
index a902461..bba6baa 100644
--- a/main.c
+++ b/main.c
@@ -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);