From 7263fa36eb3d4488b89d01837dc4bd533e6f061a Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 3 Sep 2012 09:57:57 +0000 Subject: add cmd-choose-list to allow arbitrary options to be selected. From Thomas Adam. --- cmd-choose-list.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 cmd-choose-list.c (limited to 'cmd-choose-list.c') diff --git a/cmd-choose-list.c b/cmd-choose-list.c new file mode 100644 index 00000000..8b605d08 --- /dev/null +++ b/cmd-choose-list.c @@ -0,0 +1,117 @@ +/* $Id$ */ + +/* + * Copyright (c) 2012 Thomas Adam + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include + +#include +#include + +#include + +#include "tmux.h" + +#define CMD_CHOOSE_LIST_DEFAULT_TEMPLATE "run-shell '%%'" + +/* + * Enter choose mode to choose a custom list. + */ + +enum cmd_retval cmd_choose_list_exec(struct cmd *, struct cmd_ctx *); + +void cmd_choose_list_callback(struct window_choose_data *); +void cmd_choose_list_free(struct window_choose_data *); + +const struct cmd_entry cmd_choose_list_entry = { + "choose-list", NULL, + "l:t:", 0, 1, + "[-l items] " CMD_TARGET_WINDOW_USAGE "[template]", + 0, + NULL, + NULL, + cmd_choose_list_exec +}; + +enum cmd_retval +cmd_choose_list_exec(struct cmd *self, struct cmd_ctx *ctx) +{ + struct args *args = self->args; + struct winlink *wl; + const char *lists; + char *template, *list, *copy, *lists1; + u_int idx; + + if (ctx->curclient == NULL) { + ctx->error(ctx, "must be run interactively"); + return (CMD_RETURN_ERROR); + } + + if ((lists = args_get(args, 'l')) == NULL) + return (CMD_RETURN_ERROR); + + if ((wl = cmd_find_window(ctx, args_get(args, 't'), NULL)) == NULL) + return (CMD_RETURN_ERROR); + + if (window_pane_set_mode(wl->window->active, &window_choose_mode) != 0) + return (CMD_RETURN_NORMAL); + + if (args->argc != 0) + template = xstrdup(args->argv[0]); + else + template = xstrdup(CMD_CHOOSE_LIST_DEFAULT_TEMPLATE); + + copy = lists1 = xstrdup(lists); + idx = 0; + while ((list = strsep(&lists1, ",")) != NULL) + { + if (*list == '\0') /* no empty entries */ + continue; + window_choose_add_item(wl->window->active, ctx, wl, list, + template, idx); + idx++; + } + free(copy); + + window_choose_ready(wl->window->active, 0, cmd_choose_list_callback, + cmd_choose_list_free); + + free(template); + + return (CMD_RETURN_NORMAL); +} + +void +cmd_choose_list_callback(struct window_choose_data *cdata) +{ + if (cdata == NULL || (cdata->client->flags & CLIENT_DEAD)) + return; + + window_choose_ctx(cdata); +} + +void +cmd_choose_list_free(struct window_choose_data *cdata) +{ + cdata->session->references--; + cdata->client->references--; + + free(cdata->ft_template); + free(cdata->command); + format_free(cdata->ft); + free(cdata); + +} -- cgit From c96a2a3c9e7a0c460c668f65712a7beac07953bf Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 3 Sep 2012 10:02:39 +0000 Subject: Rename variables to something a but more understandable. --- cmd-choose-list.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'cmd-choose-list.c') diff --git a/cmd-choose-list.c b/cmd-choose-list.c index 8b605d08..15c644ec 100644 --- a/cmd-choose-list.c +++ b/cmd-choose-list.c @@ -51,8 +51,8 @@ cmd_choose_list_exec(struct cmd *self, struct cmd_ctx *ctx) { struct args *args = self->args; struct winlink *wl; - const char *lists; - char *template, *list, *copy, *lists1; + const char *list1; + char *template, *item, *copy, *list; u_int idx; if (ctx->curclient == NULL) { @@ -60,7 +60,7 @@ cmd_choose_list_exec(struct cmd *self, struct cmd_ctx *ctx) return (CMD_RETURN_ERROR); } - if ((lists = args_get(args, 'l')) == NULL) + if ((list1 = args_get(args, 'l')) == NULL) return (CMD_RETURN_ERROR); if ((wl = cmd_find_window(ctx, args_get(args, 't'), NULL)) == NULL) @@ -74,13 +74,13 @@ cmd_choose_list_exec(struct cmd *self, struct cmd_ctx *ctx) else template = xstrdup(CMD_CHOOSE_LIST_DEFAULT_TEMPLATE); - copy = lists1 = xstrdup(lists); + copy = list = xstrdup(list1); idx = 0; - while ((list = strsep(&lists1, ",")) != NULL) + while ((item = strsep(&list, ",")) != NULL) { - if (*list == '\0') /* no empty entries */ + if (*item == '\0') /* no empty entries */ continue; - window_choose_add_item(wl->window->active, ctx, wl, list, + window_choose_add_item(wl->window->active, ctx, wl, item, template, idx); idx++; } -- cgit From b2a9f4115f99f88a8b69a36a1f9ab12f6de4a986 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Wed, 5 Sep 2012 10:14:21 +0000 Subject: Handle empty list properly in choose-list, based on fix from Thomas Adam. --- cmd-choose-list.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'cmd-choose-list.c') diff --git a/cmd-choose-list.c b/cmd-choose-list.c index 15c644ec..4c32e694 100644 --- a/cmd-choose-list.c +++ b/cmd-choose-list.c @@ -86,6 +86,12 @@ cmd_choose_list_exec(struct cmd *self, struct cmd_ctx *ctx) } free(copy); + if (idx == 0) { + free(template); + window_pane_reset_mode(wl->window->active); + return (CMD_RETURN_ERROR); + } + window_choose_ready(wl->window->active, 0, cmd_choose_list_callback, cmd_choose_list_free); -- cgit