aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--examples/configs/sampleconfig34
-rw-r--r--examples/configs/sampleconfig-dev34
-rw-r--r--uzbl.c243
3 files changed, 153 insertions, 158 deletions
diff --git a/examples/configs/sampleconfig b/examples/configs/sampleconfig
index b92acc2..d2991af 100644
--- a/examples/configs/sampleconfig
+++ b/examples/configs/sampleconfig
@@ -19,23 +19,21 @@ modkey = Mod1
show_status = 1
status_top = 0
-[bindings_internal]
-back = b
-forward = m
-stop = s
-refresh = r
-reload = R
-home = h
-follow_link_here = f
-follow_link_new_tab = F
-follow_link_new_window = w
-zoom_in = +
-zoom_out = -
-toggle_status = t
-
-[bindings_external]
-/bin/bash /usr/share/uzbl/examples/scripts/insert_bookmark.sh = B
-/bin/bash /usr/share/uzbl/examples/scripts/load_url_from_history.sh = u
-/bin/bash /usr/share/uzbl/examples/scripts/load_url_from_bookmarks.sh = U
+[bindings]
+b = back
+m = forward
+s = stop
+r = refresh
+R = reload
+h = home
+f = follow_link_here
+F = follow_link_new_tab
+w = follow_link_new_window
++ = zoom_in
+- = zoom_out
+t = toggle_status
+B = spawn /bin/bash /usr/share/uzbl/examples/scripts/insert_bookmark.sh
+u = spawn /bin/bash /usr/share/uzbl/examples/scripts/load_url_from_history.sh
+U = spawn /bin/bash /usr/share/uzbl/examples/scripts/load_url_from_bookmarks.sh
[network]
diff --git a/examples/configs/sampleconfig-dev b/examples/configs/sampleconfig-dev
index f7f3bb7..4caa9ff 100644
--- a/examples/configs/sampleconfig-dev
+++ b/examples/configs/sampleconfig-dev
@@ -19,23 +19,21 @@ modkey = Mod1
show_status = 1
status_top = 0
-[bindings_internal]
-back = b
-forward = m
-stop = s
-refresh = r
-reload = R
-home = h
-follow_link_here = f
-follow_link_new_tab = F
-follow_link_new_window = w
-zoom_in = +
-zoom_out = -
-toggle_status = t
-
-[bindings_external]
-/bin/bash ./examples/scripts/insert_bookmark.sh = B
-/bin/bash ./examples/scripts/load_url_from_history.sh = u
-/bin/bash ./examples/scripts/load_url_from_bookmarks.sh = U
+[bindings]
+b = back
+m = forward
+s = stop
+r = refresh
+R = reload
+h = home
+f = follow_link_here
+F = follow_link_new_tab
+w = follow_link_new_window
++ = zoom_in
+- = zoom_out
+t = toggle_status
+B = spawn /bin/bash ./examples/scripts/insert_bookmark.sh
+u = spawn /bin/bash ./examples/scripts/load_url_from_history.sh
+U = spawn /bin/bash ./examples/scripts/load_url_from_bookmarks.sh
[network]
diff --git a/uzbl.c b/uzbl.c
index ee10237..2e2c3a8 100644
--- a/uzbl.c
+++ b/uzbl.c
@@ -30,6 +30,7 @@
#define LENGTH(x) (sizeof x / sizeof x[0])
+#define MAX_BINDINGS 256
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
@@ -71,17 +72,14 @@ static gchar* modkey = NULL;
static guint modmask = 0;
typedef struct {
- const char *binding;
- const char *action;
+ char *binding;
+ char *action;
+ char *param;
} Binding;
/* settings from config: group bindings_internal */
-static Binding internal_bindings[256];
-static int num_internal_bindings = 0;
-
-/* settings from config: group bindings_external */
-static Binding external_bindings[256];
-static int num_external_bindings = 0;
+static Binding bindings[MAX_BINDINGS];
+static int num_bindings = 0;
/* commandline arguments (set initial values for the state variables) */
static GOptionEntry entries[] =
@@ -96,13 +94,12 @@ static GOptionEntry entries[] =
typedef struct
{
const char *command;
- void (*func_1_param)(WebKitWebView*);
- void (*func_2_params)(WebKitWebView*, const gchar *);
+ void (*func)(WebKitWebView*, const char *);
} Command;
/* XDG stuff */
-char *XDG_CONFIG_HOME_default[256];
-char *XDG_CONFIG_DIRS_default = "/etc/xdg";
+static char *XDG_CONFIG_HOME_default[256];
+static char *XDG_CONFIG_DIRS_default = "/etc/xdg";
static void
update_title (GtkWindow* window);
@@ -113,6 +110,10 @@ load_uri ( WebKitWebView * web_view, const gchar * uri);
static gboolean
run_command(const char *command, const char *args);
+static void
+spawn(WebKitWebView *web_view, const char *param);
+
+
/* --- CALLBACKS --- */
static gboolean
@@ -147,20 +148,9 @@ download_cb (WebKitWebView *web_view, GObject *download, gpointer user_data) {
}
static void
-go_back_cb (WebKitWebView* page) {
- (void) page;
- webkit_web_view_go_back (web_view);
-}
-
-static void
-go_forward_cb (WebKitWebView* page) {
- (void) page;
- webkit_web_view_go_forward (web_view);
-}
-
-static void
-toggle_status_cb (WebKitWebView* page) {
- (void) page;
+toggle_status_cb (WebKitWebView* page, const char *param) {
+ (void)page;
+ (void)param;
if (show_status) {
gtk_widget_hide(mainbar);
} else {
@@ -234,22 +224,35 @@ log_history_cb () {
}
}
+/* VIEW funcs (little webkit wrappers) */
+
+#define VIEWFUNC(name) static void view_##name(WebKitWebView *page, const char *param){(void)param; webkit_web_view_##name(page);}
+VIEWFUNC(reload)
+VIEWFUNC(stop_loading)
+VIEWFUNC(zoom_in)
+VIEWFUNC(zoom_out)
+VIEWFUNC(go_back)
+VIEWFUNC(go_forward)
+#undef VIEWFUNC
+
/* -- command to callback/function map for things we cannot attach to any signals */
// TODO: reload, home, quit
static Command commands[] =
{
- { "back", &go_back_cb, NULL },
- { "forward", &go_forward_cb, NULL },
- { "refresh", &webkit_web_view_reload, NULL }, //Buggy
- { "stop", &webkit_web_view_stop_loading, NULL },
- { "zoom_in", &webkit_web_view_zoom_in, NULL }, //Can crash (when max zoom reached?).
- { "zoom_out", &webkit_web_view_zoom_out, NULL },
- { "uri", NULL, &load_uri },
- { "toggle_status", &toggle_status_cb, NULL }
+ { "back", view_go_back },
+ { "forward", view_go_forward },
+ { "reload", view_reload, }, //Buggy
+ { "stop", view_stop_loading, },
+ { "zoom_in", view_zoom_in, }, //Can crash (when max zoom reached?).
+ { "zoom_out", view_zoom_out, },
+ { "uri", load_uri },
+ { "toggle_status", toggle_status_cb },
+ { "spawn", spawn },
//{ "get uri", &webkit_web_view_get_uri},
};
/* -- CORE FUNCTIONS -- */
+
static bool
file_exists (const char * filename) {
@@ -262,10 +265,10 @@ file_exists (const char * filename) {
}
static void
-load_uri (WebKitWebView * web_view, const gchar * uri) {
- if (uri != NULL) {
- GString* newuri = g_string_new (uri);
- if (g_strrstr (uri, "://") == NULL)
+load_uri (WebKitWebView * web_view, const gchar *param) {
+ if (param) {
+ GString* newuri = g_string_new (param);
+ if (g_strrstr (param, "://") == NULL)
g_string_prepend (newuri, "http://");
webkit_web_view_load_uri (web_view, newuri->str);
g_string_free (newuri, TRUE);
@@ -290,41 +293,24 @@ run_command(const char *command, const char *args) {
}
static void
-parse_command(const char *cmd) {
+spawn(WebKitWebView *web_view, const char *param) {
+ (void)web_view;
+ run_command(param, NULL);
+}
+
+static void
+parse_command(const char *action, const char *param) {
unsigned int i;
- Command *c = NULL;
- char buffer[512];
- strcpy (buffer, cmd);
- const gchar * command_name = strtok (buffer, " ");
- const gchar * command_param = strtok (NULL, " ,");
-
- Command *c_tmp = NULL;
- for (i = 0; i < LENGTH (commands); i++) {
- c_tmp = &commands[i];
- if (strncmp (command_name, c_tmp->command, strlen (c_tmp->command)) == 0) {
- c = c_tmp;
- }
- }
- if (c != NULL) {
- if (c->func_2_params != NULL) {
- if (command_param != NULL) {
- printf ("command executing: \"%s %s\"\n", command_name, command_param);
- c->func_2_params (web_view, command_param);
- } else {
- if (c->func_1_param != NULL) {
- printf ("command executing: \"%s\"\n", command_name);
- c->func_1_param (web_view);
- } else {
- fprintf (stderr, "command needs a parameter. \"%s\" is not complete\n", command_name);
- }
- }
- } else if (c->func_1_param != NULL) {
- printf ("command executing: \"%s\"\n", command_name);
- c->func_1_param (web_view);
- }
- } else {
- fprintf (stderr, "command \"%s\" not understood. ignoring.\n", cmd);
- }
+ int parsed = 0;
+
+ for (i = 0; i < LENGTH (commands); i++)
+ if (strcmp(action, commands[i].command) == 0) {
+ commands[i].func(web_view, param);
+ parsed = 1;
+ }
+
+ if (!parsed)
+ fprintf (stderr, "command \"%s\" not understood. ignoring.\n", action);
}
static void
@@ -351,10 +337,18 @@ static void
char buffer[256];
memset (buffer, 0, sizeof (buffer));
while (!feof (fifo) && fgets (buffer, sizeof (buffer), fifo)) {
- if (strcmp (buffer, "\n")) {
- buffer[strlen (buffer) - 1] = '\0'; // Remove newline
- parse_command (buffer);
- }
+ gchar **parts;
+
+ g_strstrip(buffer);
+
+ parts = g_strsplit(buffer, " ", 2);
+
+ if (!parts)
+ continue;
+
+ parse_command(parts[0], parts[1]);
+
+ g_strfreev(parts);
}
}
@@ -373,8 +367,10 @@ update_title (GtkWindow* window) {
GString* string_short = g_string_new ("");
if (!always_insert_mode)
g_string_append (string_long, (insert_mode ? "[I] " : "[C] "));
- g_string_append (string_long, main_title);
- g_string_append (string_short, main_title);
+ if (main_title) {
+ g_string_append (string_long, main_title);
+ g_string_append (string_short, main_title);
+ }
g_string_append (string_long, " - Uzbl browser");
g_string_append (string_short, " - Uzbl browser");
if (load_progress < 100)
@@ -414,21 +410,10 @@ key_press_cb (WebKitWebView* page, GdkEventKey* event)
return TRUE;
}
- //INTERNAL BINDINGS
- for (i = 0; i < num_internal_bindings; i++) {
- if (strcmp(event->string, internal_bindings[i].binding) == 0) {
+ for (i = 0; i < num_bindings; i++) {
+ if (strcmp(event->string, bindings[i].binding) == 0) {
if (!insert_mode || (event->state == modmask)) {
- parse_command (internal_bindings[i].action);
- result = TRUE;
- }
- }
- }
-
- //EXTERNAL BINDINGS
- for (i = 0; i < num_external_bindings; i++) {
- if (strcmp(event->string, external_bindings[i].binding) == 0) {
- if (!insert_mode || (event->state == modmask)) {
- run_command(external_bindings[i].action, NULL);
+ parse_command(bindings[i].action, bindings[i].param);
result = TRUE;
}
}
@@ -481,29 +466,39 @@ GtkWidget* create_window () {
}
static void
-add_binding (char *binding, char *action, bool internal) {
- Binding bind = {binding, action};
- if (internal) {
- internal_bindings[num_internal_bindings] = bind;
- num_internal_bindings ++;
- } else {
- external_bindings[num_external_bindings] = bind;
- num_external_bindings ++;
- }
+add_binding (const gchar *key, const gchar *action) {
+ char **parts = g_strsplit(action, " ", 2);
+
+ printf("add_binding, key '%s', action '%s'", key, action);
+
+ if (!parts)
+ return;
+
+ if (MAX_BINDINGS == num_bindings) {
+ fprintf(stderr, "Maximum number number bindings reached, ignoring\n");
+ return;
+ }
+
+ bindings[num_bindings].binding = g_strdup(key);
+ bindings[num_bindings].action = g_strdup(parts[0]); /* parts[0] is always defined */
+ bindings[num_bindings].param = (parts[1] ? g_strdup(parts[1]) : NULL);
+
+ num_bindings++;
+
+ g_strfreev(parts);
}
static void
settings_init () {
GKeyFile* config;
gboolean res = FALSE;
- gchar** keysi = NULL;
- gchar** keyse = NULL;
+ gchar** keys = NULL;
if (! config_file) {
const char* XDG_CONFIG_HOME = getenv ("XDG_CONFIG_HOME");
char conf[256];
if (! XDG_CONFIG_HOME || ! strcmp (XDG_CONFIG_HOME, "")) {
- XDG_CONFIG_HOME = (char *)XDG_CONFIG_HOME_default;
+ XDG_CONFIG_HOME = (char*)XDG_CONFIG_HOME_default;
}
printf("XDG_CONFIG_HOME: %s\n", XDG_CONFIG_HOME);
@@ -553,11 +548,10 @@ settings_init () {
always_insert_mode = g_key_file_get_boolean (config, "behavior", "always_insert_mode", NULL);
show_status = g_key_file_get_boolean (config, "behavior", "show_status", NULL);
modkey = g_key_file_get_value (config, "behavior", "modkey", NULL);
- keysi = g_key_file_get_keys (config, "bindings_internal", NULL, NULL);
- keyse = g_key_file_get_keys (config, "bindings_external", NULL, NULL);
status_top = g_key_file_get_boolean (config, "behavior", "status_top", NULL);
if (! fifodir)
fifodir = g_key_file_get_value (config, "behavior", "fifodir", NULL);
+ keys = g_key_file_get_keys (config, "bindings", NULL, NULL);
}
if (history_handler) {
@@ -610,32 +604,29 @@ settings_init () {
if (g_strrstr (modkeyup,"META") != NULL) modmask |= GDK_META_MASK; //the Meta modifier. Since 2.10 */
free (modkeyup);
- if (keysi) {
- int i = 0;
- for (i = 0; keysi[i]; i++) {
- gchar *binding = g_key_file_get_string (config, "bindings_internal", keysi[i], NULL);
- printf ("Action: %s, Binding: %s (internal)\n", g_strdup (keysi[i]), binding);
- add_binding (binding, g_strdup (keysi[i]), true);
- }
- }
- if (keyse) {
- int i = 0;
- for (i = 0; keyse[i]; i++) {
- gchar *binding = g_key_file_get_string (config, "bindings_external", keyse[i], NULL);
- printf ("Action: %s, Binding: %s (external)\n", g_strdup (keyse[i]), binding);
- add_binding (binding, g_strdup (keyse[i]), false);
+ if (keys) {
+ int i;
+ for (i = 0; keys[i]; i++) {
+ gchar *value = g_key_file_get_string (config, "bindings", keys[i], NULL);
+
+ add_binding(g_strstrip(keys[i]), value);
+ g_free(value);
}
+
+ g_strfreev(keys);
}
}
int
main (int argc, char* argv[]) {
+ int i;
+
gtk_init (&argc, &argv);
if (!g_thread_supported ())
g_thread_init (NULL);
- strcat ((char *) XDG_CONFIG_HOME_default, getenv ("HOME"));
- strcat ((char *) XDG_CONFIG_HOME_default, "/.config");
+ strcat ((char*)XDG_CONFIG_HOME_default, getenv ("HOME"));
+ strcat ((char*)XDG_CONFIG_HOME_default, "/.config");
GError *error = NULL;
GOptionContext* context = g_option_context_new ("- some stuff here maybe someday");
@@ -672,6 +663,14 @@ main (int argc, char* argv[]) {
gtk_main ();
+ for (i = 0; i < num_bindings; i++) {
+ g_free(bindings[i].binding);
+ g_free(bindings[i].action);
+ if (bindings[i].param)
+ g_free(bindings[i].param);
+ }
+
unlink (fifopath);
+
return 0;
}