summaryrefslogtreecommitdiffstats
path: root/window-tree.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2018-04-10 13:02:28 +0100
committerThomas Adam <thomas@xteddy.org>2018-04-10 13:02:28 +0100
commit1bd66b65a330ffdf46eac668de92bf632ab5ad82 (patch)
tree6fab4904461f291c7f873353523259aded2c57e7 /window-tree.c
parent68bf7c532b83efdb1b29f1ee9a3e06f31f55dcd8 (diff)
parent051a29ca03718c8fedd5918ba86556f29672348e (diff)
Merge branch 'obsd-master'
Diffstat (limited to 'window-tree.c')
-rw-r--r--window-tree.c124
1 files changed, 119 insertions, 5 deletions
diff --git a/window-tree.c b/window-tree.c
index 2c466b36..234f4126 100644
--- a/window-tree.c
+++ b/window-tree.c
@@ -18,6 +18,7 @@
#include <sys/types.h>
+#include <ctype.h>
#include <stdlib.h>
#include <string.h>
@@ -860,8 +861,6 @@ window_tree_destroy(struct window_tree_modedata *data)
if (--data->references != 0)
return;
- mode_tree_free(data->data);
-
for (i = 0; i < data->item_size; i++)
window_tree_free_item(data->item_list[i]);
free(data->item_list);
@@ -881,6 +880,7 @@ window_tree_free(struct window_pane *wp)
return;
data->dead = 1;
+ mode_tree_free(data->data);
window_tree_destroy(data);
}
@@ -965,7 +965,7 @@ window_tree_command_callback(struct client *c, void *modedata, const char *s,
{
struct window_tree_modedata *data = modedata;
- if (s == NULL || data->dead)
+ if (s == NULL || *s == '\0' || data->dead)
return (0);
data->entered = s;
@@ -987,6 +987,77 @@ window_tree_command_free(void *modedata)
window_tree_destroy(data);
}
+static void
+window_tree_kill_each(__unused void* modedata, void* itemdata,
+ __unused struct client *c, __unused key_code key)
+{
+ struct window_tree_itemdata *item = itemdata;
+ struct session *s;
+ struct winlink *wl;
+ struct window_pane *wp;
+
+ window_tree_pull_item(item, &s, &wl, &wp);
+
+ switch (item->type) {
+ case WINDOW_TREE_NONE:
+ break;
+ case WINDOW_TREE_SESSION:
+ if (s != NULL) {
+ server_destroy_session(s);
+ session_destroy(s, __func__);
+ }
+ break;
+ case WINDOW_TREE_WINDOW:
+ if (wl != NULL)
+ server_kill_window(wl->window);
+ break;
+ case WINDOW_TREE_PANE:
+ if (wp != NULL)
+ server_kill_pane(wp);
+ break;
+ }
+}
+
+static int
+window_tree_kill_current_callback(struct client *c, void *modedata,
+ const char *s, __unused int done)
+{
+ struct window_tree_modedata *data = modedata;
+ struct mode_tree_data *mtd = data->data;
+
+ if (s == NULL || *s == '\0' || data->dead)
+ return (0);
+ if (tolower((u_char) s[0]) != 'y' || s[1] != '\0')
+ return (0);
+
+ window_tree_kill_each(data, mode_tree_get_current(mtd), c, KEYC_NONE);
+
+ data->references++;
+ cmdq_append(c, cmdq_get_callback(window_tree_command_done, data));
+
+ return (0);
+}
+
+static int
+window_tree_kill_tagged_callback(struct client *c, void *modedata,
+ const char *s, __unused int done)
+{
+ struct window_tree_modedata *data = modedata;
+ struct mode_tree_data *mtd = data->data;
+
+ if (s == NULL || *s == '\0' || data->dead)
+ return (0);
+ if (tolower((u_char) s[0]) != 'y' || s[1] != '\0')
+ return (0);
+
+ mode_tree_each_tagged(mtd, window_tree_kill_each, c, KEYC_NONE, 1);
+
+ data->references++;
+ cmdq_append(c, cmdq_get_callback(window_tree_command_done, data));
+
+ return (0);
+}
+
static key_code
window_tree_mouse(struct window_tree_modedata *data, key_code key, u_int x,
struct window_tree_itemdata *item)
@@ -1054,10 +1125,13 @@ window_tree_key(struct window_pane *wp, struct client *c,
{
struct window_tree_modedata *data = wp->modedata;
struct window_tree_itemdata *item, *new_item;
- char *name, *prompt;
+ char *name, *prompt = NULL;
struct cmd_find_state fs;
int finished;
- u_int tagged, x, y;
+ u_int tagged, x, y, idx;
+ struct session *ns;
+ struct winlink *nwl;
+ struct window_pane *nwp;
item = mode_tree_get_current(data->data);
finished = mode_tree_key(data->data, c, &key, m, &x, &y);
@@ -1074,6 +1148,46 @@ window_tree_key(struct window_pane *wp, struct client *c,
case '>':
data->offset++;
break;
+ case 'x':
+ window_tree_pull_item(item, &ns, &nwl, &nwp);
+ switch (item->type) {
+ case WINDOW_TREE_NONE:
+ break;
+ case WINDOW_TREE_SESSION:
+ if (ns == NULL)
+ break;
+ xasprintf(&prompt, "Kill session %s? ", ns->name);
+ break;
+ case WINDOW_TREE_WINDOW:
+ if (nwl == NULL)
+ break;
+ xasprintf(&prompt, "Kill window %u? ", nwl->idx);
+ break;
+ case WINDOW_TREE_PANE:
+ if (nwp == NULL || window_pane_index(nwp, &idx) != 0)
+ break;
+ xasprintf(&prompt, "Kill pane %u? ", idx);
+ break;
+ }
+ if (prompt == NULL)
+ break;
+ data->references++;
+ status_prompt_set(c, prompt, "",
+ window_tree_kill_current_callback, window_tree_command_free,
+ data, PROMPT_SINGLE|PROMPT_NOFORMAT);
+ free(prompt);
+ break;
+ case 'X':
+ tagged = mode_tree_count_tagged(data->data);
+ if (tagged == 0)
+ break;
+ xasprintf(&prompt, "Kill %u tagged? ", tagged);
+ data->references++;
+ status_prompt_set(c, prompt, "",
+ window_tree_kill_tagged_callback, window_tree_command_free,
+ data, PROMPT_SINGLE|PROMPT_NOFORMAT);
+ free(prompt);
+ break;
case ':':
tagged = mode_tree_count_tagged(data->data);
if (tagged != 0)