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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
/* This file is released into the public domain.
* No rights reserved. Copy, modify, do whatever you want. */
#ifndef CONFIG_H
#define CONFIG_H
#include <webkit2/webkit2.h>
#include <gtk/gtk.h>
/* forward declarations from main.c */
extern void tabopen(Cinnamon* cinnamon);
extern void tabclose(Cinnamon* cinnamon);
extern void set_mode(Cinnamon* cinnamon, int new_mode);
/* guard ensures config exists/enables brower */
#define CINNAMON_ENABLED
/* default window width/height, can be resized after. */
#define WINDOW_WIDTH 1024
#define WINDOW_HEIGHT 768
#define HOMEPAGE "https://start.duckduckgo.com"
/* if a keybind is unbound, still don't send when not in insert mode */
#define NO_SEND_UNBOUND_KEYBINDS
/* if the last tab is closed, don't quit, just make a fresh one */
#define NO_QUIT_ON_CLOSE_LAST_TAB
/* hide the tab bar, unless a keybind or command shows it */
#define HIDE_TAB_BAR
/* 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 */
static void _kbd_insmode(Cinnamon* cinnamon, void* arg) {
set_mode(cinnamon, 1);
}
static void _kbd_passthru(Cinnamon* cinnamon, void* arg) {
set_mode(cinnamon, 2);
}
static void _kbd_tabopen(Cinnamon* cinnamon, void* arg) {
/* wrapper to satisfy the arg + keep keybinds isolated */
tabopen(cinnamon);
}
static void _kbd_scroll(Cinnamon* cinnamon, void* arg) {
GtkWidget *webview = gtk_notebook_get_nth_page(GTK_NOTEBOOK(cinnamon->notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(cinnamon->notebook)));
const char* js;
if (strcmp((const char*)arg, "left") == 0) {
js = "window.scrollBy(-100, 0);";
} else if (strcmp((const char*)arg, "right") == 0) {
js = "window.scrollBy(100, 0);";
} else if (strcmp((const char*)arg, "up") == 0) {
js = "window.scrollBy(0, -100);";
} else if (strcmp((const char*)arg, "down") == 0) {
js = "window.scrollBy(0, 100);";
} else {
js = "alert(\"an unexpected error occurred in the scroll handler\");";
}
/* some distros ship older versions of webkit2gtk-4.1, use the deprecated run_javascript api to ensure compatibility */
/* this entire scroll mechanism is scuffed, first of all, i should have abstracted that in main.c, second of all, we're using JS apis of all things just to scroll T_T */
/* this code sucks,
* you know it,
* i know it.
* call me an idiot later and just use the browser. */
webkit_web_view_run_javascript(WEBKIT_WEB_VIEW(webview), js, NULL, NULL, NULL);
}
static void _kbd_tabsel(Cinnamon* cinnamon, void* arg) {
gtk_notebook_set_current_page(GTK_NOTEBOOK(cinnamon->notebook), (int)(intptr_t)arg);
}
static void _kbd_tabclose(Cinnamon* cinnamon, void* arg) {
tabclose(cinnamon);
}
static void _kbd_toggletabs(Cinnamon* cinnamon, void* arg) {
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(cinnamon->notebook), !gtk_notebook_get_show_tabs(GTK_NOTEBOOK(cinnamon->notebook)));
}
static const Keybind keybinds[] = {
{ "t", &_kbd_tabopen, NULL },
{ "d", &_kbd_tabclose, NULL },
// { "o", ":commandline_show \":open\"" },
{ "s", &_kbd_toggletabs, NULL },
{ "<S-i>", &_kbd_passthru, NULL },
{ "i", &_kbd_insmode, NULL },
{ "j", &_kbd_scroll, "down" },
{ "k", &_kbd_scroll, "up" },
{ "h", &_kbd_scroll, "left" },
{ "l", &_kbd_scroll, "right" },
{ "<A-1>", &_kbd_tabsel, (void*)(intptr_t)0 },
{ "<A-2>", &_kbd_tabsel, (void*)(intptr_t)1 },
{ "<A-3>", &_kbd_tabsel, (void*)(intptr_t)2 },
{ "<A-4>", &_kbd_tabsel, (void*)(intptr_t)3 },
{ "<A-5>", &_kbd_tabsel, (void*)(intptr_t)4 },
{ "<A-6>", &_kbd_tabsel, (void*)(intptr_t)5 },
{ "<A-7>", &_kbd_tabsel, (void*)(intptr_t)6 },
{ "<A-8>", &_kbd_tabsel, (void*)(intptr_t)7 },
{ "<A-9>", &_kbd_tabsel, (void*)(intptr_t)8 },
{ "<A-0>", &_kbd_tabsel, (void*)(intptr_t)-1 },
};
#endif
|