diff options
author | Josh Rickmar <jrick@devio.us> | 2012-06-01 17:55:03 -0400 |
---|---|---|
committer | Josh Rickmar <jrick@devio.us> | 2012-06-01 17:55:03 -0400 |
commit | 29e1c7496a0f6b7812e083aac8da186932fc8daf (patch) | |
tree | ec5d58f9a355031bcf2b248ce9baff6669e55113 /xombrero.c | |
parent | 66982c922628a9b4cde757a4342a92717fb092a0 (diff) | |
download | xombrero-29e1c7496a0f6b7812e083aac8da186932fc8daf.tar.gz |
Fix keybound prompts
Diffstat (limited to 'xombrero.c')
-rw-r--r-- | xombrero.c | 88 |
1 files changed, 46 insertions, 42 deletions
diff --git a/xombrero.c b/xombrero.c index 218fef1..2164f7d 100644 --- a/xombrero.c +++ b/xombrero.c @@ -167,11 +167,6 @@ TAILQ_HEAD(command_list, command_entry); #define XT_ZOOM_OUT (-2) #define XT_ZOOM_NORMAL (100) -#define XT_CMD_OPEN (0) -#define XT_CMD_OPEN_CURRENT (1) -#define XT_CMD_TABNEW (2) -#define XT_CMD_TABNEW_CURRENT (3) - #define XT_STATUS_NOTHING (0) #define XT_STATUS_LINK (1) #define XT_STATUS_URI (2) @@ -2646,14 +2641,21 @@ movetab(struct tab *t, struct karg *args) int cmd_prefix = 0; +struct prompt_sub { + const char *s; + const char *(*f)(struct tab *); +} subs[] = { + { "<uri>", get_uri }, +}; int command(struct tab *t, struct karg *args) { - char *s = NULL, *ss = NULL; - gchar *text, *base; - const gchar *uri; struct karg a; + int i; + char *s = NULL, *sp = NULL, *sl = NULL; + gchar **sv; + gchar *text, *base; if (t == NULL || args == NULL) { show_oops(NULL, "command invalid parameters"); @@ -2668,13 +2670,31 @@ command(struct tab *t, struct karg *args) s = "?"; break; case ':': - if (cmd_prefix == 0) - s = ":"; - else { - ss = g_strdup_printf(":%d", cmd_prefix); - s = ss; + if (cmd_prefix == 0) { + if (args->s != NULL && strlen(args->s) != 0) { + sp = g_strdup_printf(":%s", args->s); + s = sp; + } else + s = ":"; + } else { + sp = g_strdup_printf(":%d", cmd_prefix); + s = sp; cmd_prefix = 0; } + sl = g_strdup(s); + if (sp) { + g_free(sp); + sp = NULL; + } + s = sl; + for (i = 0; i < sizeof subs / sizeof (struct prompt_sub); ++i) { + sv = g_strsplit(sl, subs[i].s, -1); + if (sl) + g_free(sl); + sl = g_strjoinv(subs[i].f(t), sv); + g_strfreev(sv); + s = sl; + } break; case '.': t->mode = XT_MODE_HINT; @@ -2690,23 +2710,6 @@ command(struct tab *t, struct karg *args) hint(t, &a); s = ","; break; - case XT_CMD_OPEN: - s = ":open "; - break; - case XT_CMD_TABNEW: - s = ":tabnew "; - break; - case XT_CMD_OPEN_CURRENT: - s = ":open "; - /* FALL THROUGH */ - case XT_CMD_TABNEW_CURRENT: - if (!s) /* FALL THROUGH? */ - s = ":tabnew "; - if ((uri = get_uri(t)) != NULL) { - ss = g_strdup_printf("%s%s", s, uri); - s = ss; - } - break; default: show_oops(t, "command: invalid opcode %d", args->i); return (XT_CB_PASSTHROUGH); @@ -2726,8 +2729,10 @@ command(struct tab *t, struct karg *args) gtk_widget_grab_focus(GTK_WIDGET(t->cmd)); gtk_editable_set_position(GTK_EDITABLE(t->cmd), -1); - if (ss) - g_free(ss); + if (sp) + g_free(sp); + if (sl) + g_free(sl); return (XT_CB_HANDLED); } @@ -3224,12 +3229,6 @@ struct cmd { { "encoding", 0, set_encoding, 0, XT_USERARG }, { "loadimages", 0, tabaction, XT_TAB_LOAD_IMAGES, 0 }, - /* command aliases (handy when -S flag is used) */ - { "promptopen", 0, command, XT_CMD_OPEN, 0 }, - { "promptopencurrent", 0, command, XT_CMD_OPEN_CURRENT, 0 }, - { "prompttabnew", 0, command, XT_CMD_TABNEW, 0 }, - { "prompttabnewcurrent",0, command, XT_CMD_TABNEW_CURRENT, 0 }, - /* settings */ { "set", 0, set, 0, XT_SETARG }, @@ -5476,6 +5475,7 @@ done: gboolean handle_keypress(struct tab *t, GdkEventKey *e, int entry) { + struct karg args; struct key_binding *k; /* handle keybindings if buffercmd is empty. @@ -5490,11 +5490,15 @@ handle_keypress(struct tab *t, GdkEventKey *e, int entry) (e->state & CTRL || e->state & MOD1)) return (XT_CB_PASSTHROUGH); - if (k->mask == 0) { - if ((e->state & (CTRL | MOD1)) == 0) + if ((k->mask == 0 && + (e->state & (CTRL | MOD1)) == 0) || + (e->state & k->mask) == k->mask) { + if (k->cmd[0] == ':') { + args.i = ':'; + args.s = &k->cmd[1]; + return command(t, &args); + } else return (cmd_execute(t, k->cmd)); - } else if ((e->state & k->mask) == k->mask) { - return (cmd_execute(t, k->cmd)); } } |