diff options
Diffstat (limited to 'src/commands.c')
-rw-r--r-- | src/commands.c | 130 |
1 files changed, 121 insertions, 9 deletions
diff --git a/src/commands.c b/src/commands.c index 85057b3..b3546a9 100644 --- a/src/commands.c +++ b/src/commands.c @@ -34,6 +34,7 @@ CommandInfo cmdlist[] = { "search_clear", search_clear, TRUE }, { "dehilight", dehilight, 0 }, { "set", set_var, TRUE }, + { "toggle", toggle_var, 0 }, { "dump_config", act_dump_config, 0 }, { "dump_config_as_events", act_dump_config_as_events, 0 }, { "chain", chain, 0 }, @@ -110,23 +111,25 @@ view_go_forward(WebKitWebView *page, GArray *argv, GString *result) { void toggle_zoom_type (WebKitWebView* page, GArray *argv, GString *result) { - (void)argv; (void)result; - webkit_web_view_set_full_content_zoom (page, !webkit_web_view_get_full_content_zoom (page)); + (void)page; (void)argv; (void)result; + + int current_type = get_zoom_type(); + set_zoom_type(!current_type); } void toggle_status (WebKitWebView* page, GArray *argv, GString *result) { (void)page; (void)argv; (void)result; - uzbl.behave.show_status = !uzbl.behave.show_status; - - set_show_status(); + int current_status = get_show_status(); + set_show_status(!current_status); } /* * scroll vertical 20 * scroll vertical 20% * scroll vertical -40 + * scroll vertical 20! * scroll vertical begin * scroll vertical end * scroll horizontal 10 @@ -175,6 +178,112 @@ set_var(WebKitWebView *page, GArray *argv, GString *result) { g_strfreev(split); } +void +toggle_var(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; (void) result; + + if(!argv_idx(argv, 0)) + return; + + const gchar *var_name = argv_idx(argv, 0); + + uzbl_cmdprop *c = get_var_c(var_name); + + if(!c) { + set_var_value(var_name, argv_idx(argv, 1)); + return; + } + + switch(c->type) { + case TYPE_STR: + { + const gchar *next; + + if(argv->len >= 3) { + gchar *current = get_var_value_string_c(c); + + guint i = 2; + const gchar *first = argv_idx(argv, 1); + const gchar *this = first; + next = argv_idx(argv, 2); + + while(next && strcmp(current, this)) { + this = next; + next = argv_idx(argv, ++i); + } + + if(!next) + next = first; + + g_free(current); + } else + next = ""; + + set_var_value_string_c(c, next); + break; + } + case TYPE_INT: + { + int current = get_var_value_int_c(c); + int next; + + if(argv->len >= 3) { + guint i = 2; + + int first = strtoul(argv_idx(argv, 1), NULL, 10); + int this = first; + + const gchar *next_s = argv_idx(argv, 2); + + while(next_s && this != current) { + this = strtoul(next_s, NULL, 10); + next_s = argv_idx(argv, ++i); + } + + if(next_s) + next = strtoul(next_s, NULL, 10); + else + next = first; + } else + next = !current; + + set_var_value_int_c(c, next); + break; + } + case TYPE_FLOAT: + { + float current = get_var_value_float_c(c); + float next; + + if(argv->len >= 3) { + guint i = 2; + + float first = strtod(argv_idx(argv, 1), NULL); + float this = first; + + const gchar *next_s = argv_idx(argv, 2); + + while(next_s && this != current) { + this = strtod(next_s, NULL); + next_s = argv_idx(argv, ++i); + } + + if(next_s) + next = strtod(next_s, NULL); + else + next = first; + } else + next = !current; + + set_var_value_float_c(c, next); + break; + } + default: + g_assert_not_reached(); + } + + send_set_var_event(var_name, c); +} void event(WebKitWebView *page, GArray *argv, GString *result) { @@ -418,10 +527,13 @@ chain(WebKitWebView *page, GArray *argv, GString *result) { void close_uzbl (WebKitWebView *page, GArray *argv, GString *result) { (void)page; (void)argv; (void)result; - // hide window a soon as possible to avoid getting stuck with a - // non-response window in the cleanup steps - if (uzbl.gui.main_window) - gtk_widget_destroy(uzbl.gui.main_window); + // hide window a soon as possible to avoid getting stuck with a + // non-response window in the cleanup steps + if (uzbl.gui.main_window) + gtk_widget_destroy(uzbl.gui.main_window); + else if (uzbl.gui.plug) + gtk_widget_destroy(GTK_WIDGET(uzbl.gui.plug)); + gtk_main_quit (); } |