summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Fonseca <jonas.fonseca@gmail.com>2014-03-12 01:05:53 -0400
committerJonas Fonseca <jonas.fonseca@gmail.com>2014-03-12 01:22:37 -0400
commit4ccbbb28c5888eadc7b39b630296e81cc54c6dd6 (patch)
tree060f96b3bdc778cf1a71061a3a932f595370db49
parent0b0b39b1e4cc9c135a169b32389bf46905e19770 (diff)
Move run request flags parsing to add_run_request
This changes option_bind_command to no longer parse the flags when adding run requests.
-rw-r--r--include/tig/keys.h18
-rw-r--r--src/help.c2
-rw-r--r--src/keys.c28
-rw-r--r--src/options.c29
-rw-r--r--src/tig.c16
5 files changed, 41 insertions, 52 deletions
diff --git a/include/tig/keys.h b/include/tig/keys.h
index fd0d478e..16acf7d0 100644
--- a/include/tig/keys.h
+++ b/include/tig/keys.h
@@ -66,26 +66,22 @@ enum status_code add_keybinding(struct keymap *table, enum request request, stru
const char *get_keys(struct keymap *keymap, enum request request, bool all);
#define get_view_key(view, request) get_keys(&(view)->ops->keymap, request, FALSE)
-enum run_request_flag {
- RUN_REQUEST_DEFAULT = 0,
- RUN_REQUEST_SILENT = 2,
- RUN_REQUEST_CONFIRM = 4,
- RUN_REQUEST_EXIT = 8,
- RUN_REQUEST_INTERNAL = 16,
+struct run_request_flags {
+ bool silent;
+ bool confirm;
+ bool exit;
+ bool internal;
};
struct run_request {
struct keymap *keymap;
struct key_input input;
+ struct run_request_flags flags;
const char **argv;
- bool silent;
- bool confirm;
- bool exit;
- bool internal;
};
struct run_request *get_run_request(enum request request);
-enum status_code add_run_request(struct keymap *keymap, struct key_input *input, const char **argv, enum run_request_flag flags);
+enum status_code add_run_request(struct keymap *keymap, struct key_input *input, const char **argv);
#endif
/* vim: set ts=8 sw=8 noexpandtab: */
diff --git a/src/help.c b/src/help.c
index 4cd73d01..066269c1 100644
--- a/src/help.c
+++ b/src/help.c
@@ -50,7 +50,7 @@ help_draw(struct view *view, struct line *line, unsigned int lineno)
} else if (help->request > REQ_RUN_REQUESTS) {
struct run_request *req = get_run_request(help->request);
const char *key = get_key_name(&req->input);
- const char *sep = req->internal ? ":" : "!";
+ const char *sep = req->flags.internal ? ":" : "!";
int i;
if (draw_field(view, LINE_DEFAULT, key, state->keys_width + 2, ALIGN_RIGHT, FALSE))
diff --git a/src/keys.c b/src/keys.c
index 32096c18..5451f9d9 100644
--- a/src/keys.c
+++ b/src/keys.c
@@ -279,9 +279,30 @@ static size_t run_requests;
DEFINE_ALLOCATOR(realloc_run_requests, struct run_request, 8)
enum status_code
-add_run_request(struct keymap *keymap, struct key_input *input, const char **argv, enum run_request_flag flags)
+add_run_request(struct keymap *keymap, struct key_input *input, const char **argv)
{
struct run_request *req;
+ struct run_request_flags flags = {};
+
+ if (!strchr(":!?@<", *argv[0]))
+ return ERROR_UNKNOWN_REQUEST_NAME;
+
+ while (*argv[0]) {
+ if (*argv[0] == ':') {
+ flags.internal = 1;
+ argv[0]++;
+ break;
+ } else if (*argv[0] == '@') {
+ flags.silent = 1;
+ } else if (*argv[0] == '?') {
+ flags.confirm = 1;
+ } else if (*argv[0] == '<') {
+ flags.exit = 1;
+ } else if (*argv[0] != '!') {
+ break;
+ }
+ argv[0]++;
+ }
if (!realloc_run_requests(&run_request, run_requests, 1))
return ERROR_OUT_OF_MEMORY;
@@ -290,10 +311,7 @@ add_run_request(struct keymap *keymap, struct key_input *input, const char **arg
return ERROR_OUT_OF_MEMORY;
req = &run_request[run_requests++];
- req->silent = flags & RUN_REQUEST_SILENT;
- req->confirm = flags & RUN_REQUEST_CONFIRM;
- req->exit = flags & RUN_REQUEST_EXIT;
- req->internal = flags & RUN_REQUEST_INTERNAL;
+ req->flags = flags;
req->keymap = keymap;
req->input = *input;
diff --git a/src/options.c b/src/options.c
index 7fedb3fa..10f3d858 100644
--- a/src/options.c
+++ b/src/options.c
@@ -541,33 +541,8 @@ option_bind_command(int argc, const char *argv[])
}
}
- if (request == REQ_UNKNOWN) {
- enum run_request_flag flags = RUN_REQUEST_DEFAULT;
-
- if (strchr("!?@<", *argv[2])) {
- while (*argv[2]) {
- if (*argv[2] == '@') {
- flags |= RUN_REQUEST_SILENT;
- } else if (*argv[2] == '?') {
- flags |= RUN_REQUEST_CONFIRM;
- } else if (*argv[2] == '<') {
- flags |= RUN_REQUEST_EXIT;
- } else if (*argv[2] != '!') {
- break;
- }
- argv[2]++;
- }
-
- } else if (*argv[2] == ':') {
- argv[2]++;
- flags |= RUN_REQUEST_INTERNAL;
-
- } else {
- return ERROR_UNKNOWN_REQUEST_NAME;
- }
-
- return add_run_request(keymap, &input, argv + 2, flags);
- }
+ if (request == REQ_UNKNOWN)
+ return add_run_request(keymap, &input, argv + 2);
return add_keybinding(keymap, request, &input);
}
diff --git a/src/tig.c b/src/tig.c
index dca39d1b..11394e2e 100644
--- a/src/tig.c
+++ b/src/tig.c
@@ -172,7 +172,7 @@ open_run_request(struct view *view, enum request request)
}
if (argv_format(view->env, &argv, req->argv, FALSE, TRUE)) {
- if (req->internal) {
+ if (req->flags.internal) {
char cmd[SIZEOF_STR];
if (argv_to_string(argv, cmd, sizeof(cmd), " ")) {
@@ -180,11 +180,11 @@ open_run_request(struct view *view, enum request request)
}
}
else {
- confirmed = !req->confirm;
+ confirmed = !req->flags.confirm;
- if (req->confirm) {
+ if (req->flags.confirm) {
char cmd[SIZEOF_STR], prompt[SIZEOF_STR];
- const char *and_exit = req->exit ? " and exit" : "";
+ const char *and_exit = req->flags.exit ? " and exit" : "";
if (argv_to_string(argv, cmd, sizeof(cmd), " ") &&
string_format(prompt, "Run `%s`%s?", cmd, and_exit) &&
@@ -194,10 +194,10 @@ open_run_request(struct view *view, enum request request)
}
if (confirmed && argv_remove_quotes(argv)) {
- if (req->silent)
+ if (req->flags.silent)
io_run_bg(argv);
else
- open_external_viewer(argv, NULL, !req->exit, "");
+ open_external_viewer(argv, NULL, !req->flags.exit, "");
}
}
}
@@ -207,10 +207,10 @@ open_run_request(struct view *view, enum request request)
free(argv);
if (request == REQ_NONE) {
- if (req->confirm && !confirmed)
+ if (req->flags.confirm && !confirmed)
request = REQ_NONE;
- else if (req->exit)
+ else if (req->flags.exit)
request = REQ_QUIT;
else if (view_has_flags(view, VIEW_REFRESH) && !view->unrefreshable)