diff --git a/mode-tree.c b/mode-tree.c index 349cda49..e6d26b46 100644 --- a/mode-tree.c +++ b/mode-tree.c @@ -266,7 +266,7 @@ mode_tree_count_tagged(struct mode_tree_data *mtd) void mode_tree_each_tagged(struct mode_tree_data *mtd, void (*cb)(void *, void *, - key_code), key_code key, int current) + struct client *, key_code), struct client *c, key_code key, int current) { struct mode_tree_item *mti; u_int i; @@ -277,12 +277,12 @@ mode_tree_each_tagged(struct mode_tree_data *mtd, void (*cb)(void *, void *, mti = mtd->line_list[i].item; if (mti->tagged) { fired = 1; - cb(mtd->modedata, mti->itemdata, key); + cb(mtd->modedata, mti->itemdata, c, key); } } if (!fired && current) { mti = mtd->line_list[mtd->current].item; - cb(mtd->modedata, mti->itemdata, key); + cb(mtd->modedata, mti->itemdata, c, key); } } diff --git a/tmux.1 b/tmux.1 index 1d02efab..0cf80367 100644 --- a/tmux.1 +++ b/tmux.1 @@ -4098,7 +4098,7 @@ a list. The following keys may be used in buffer mode: .Bl -column "Key" "Function" -offset indent .It Sy "Key" Ta Sy "Function" -.It Li "Enter" Ta "Choose selected buffer" +.It Li "Enter" Ta "Paste selected buffer" .It Li "Up" Ta "Select previous buffer" .It Li "Down" Ta "Select next buffer" .It Li "C-s" Ta "Search by name or content" @@ -4106,6 +4106,8 @@ The following keys may be used in buffer mode: .It Li "t" Ta "Toggle if buffer is tagged" .It Li "T" Ta "Tag no buffers" .It Li "C-t" Ta "Tag all buffers" +.It Li "p" Ta "Paste selected buffer" +.It Li "P" Ta "Paste tagged buffers" .It Li "d" Ta "Delete selected buffer" .It Li "D" Ta "Delete tagged buffers" .It Li "f" Ta "Enter a format to filter items" diff --git a/tmux.h b/tmux.h index 6cb9a06f..720ff40e 100644 --- a/tmux.h +++ b/tmux.h @@ -2226,7 +2226,7 @@ u_int layout_set_previous(struct window *); u_int mode_tree_count_tagged(struct mode_tree_data *); void *mode_tree_get_current(struct mode_tree_data *); void mode_tree_each_tagged(struct mode_tree_data *, void (*)(void *, void *, - key_code), key_code, int); + struct client *, key_code), struct client *, key_code, int); void mode_tree_up(struct mode_tree_data *, int); void mode_tree_down(struct mode_tree_data *, int); struct mode_tree_data *mode_tree_start(struct window_pane *, struct args *, diff --git a/window-buffer.c b/window-buffer.c index e37cd32a..5f58a858 100644 --- a/window-buffer.c +++ b/window-buffer.c @@ -319,7 +319,8 @@ window_buffer_resize(struct window_pane *wp, u_int sx, u_int sy) } static void -window_buffer_do_delete(void* modedata, void *itemdata, __unused key_code key) +window_buffer_do_delete(void* modedata, void *itemdata, + __unused struct client *c, __unused key_code key) { struct window_buffer_modedata *data = modedata; struct window_buffer_itemdata *item = itemdata; @@ -331,53 +332,53 @@ window_buffer_do_delete(void* modedata, void *itemdata, __unused key_code key) paste_free(pb); } +static void +window_buffer_do_paste(void* modedata, void *itemdata, struct client *c, + __unused key_code key) +{ + struct window_buffer_modedata *data = modedata; + struct window_buffer_itemdata *item = itemdata; + struct paste_buffer *pb; + + if ((pb = paste_get_name(item->name)) != NULL) + mode_tree_run_command(c, NULL, data->command, item->name); +} + static void window_buffer_key(struct window_pane *wp, struct client *c, __unused struct session *s, key_code key, struct mouse_event *m) { struct window_buffer_modedata *data = wp->modedata; + struct mode_tree_data *mtd = data->data; struct window_buffer_itemdata *item; - char *command, *name; int finished; - /* - * t = toggle tag - * T = tag none - * C-t = tag all - * q = exit - * O = change sort order - * - * d = delete buffer - * D = delete tagged buffers - * Enter = paste buffer - */ - - finished = mode_tree_key(data->data, c, &key, m); + finished = mode_tree_key(mtd, c, &key, m); switch (key) { case 'd': - item = mode_tree_get_current(data->data); - window_buffer_do_delete(data, item, key); - mode_tree_build(data->data); + item = mode_tree_get_current(mtd); + window_buffer_do_delete(data, item, c, key); + mode_tree_build(mtd); break; case 'D': - mode_tree_each_tagged(data->data, window_buffer_do_delete, key, - 0); - mode_tree_build(data->data); + mode_tree_each_tagged(mtd, window_buffer_do_delete, c, key, 0); + mode_tree_build(mtd); break; + case 'P': + mode_tree_each_tagged(mtd, window_buffer_do_paste, c, key, 0); + finished = 1; + break; + case 'p': case '\r': - item = mode_tree_get_current(data->data); - command = xstrdup(data->command); - name = xstrdup(item->name); - window_pane_reset_mode(wp); - mode_tree_run_command(c, NULL, command, name); - free(name); - free(command); - return; + item = mode_tree_get_current(mtd); + window_buffer_do_paste(data, item, c, key); + finished = 1; + break; } if (finished || paste_get_top(NULL) == NULL) window_pane_reset_mode(wp); else { - mode_tree_draw(data->data); + mode_tree_draw(mtd); wp->flags |= PANE_REDRAW; } } diff --git a/window-client.c b/window-client.c index 214d3b7c..4b57aa23 100644 --- a/window-client.c +++ b/window-client.c @@ -301,7 +301,8 @@ window_client_resize(struct window_pane *wp, u_int sx, u_int sy) } static void -window_client_do_detach(void* modedata, void *itemdata, key_code key) +window_client_do_detach(void* modedata, void *itemdata, + __unused struct client *c, key_code key) { struct window_client_modedata *data = modedata; struct window_client_itemdata *item = itemdata; @@ -321,56 +322,35 @@ window_client_key(struct window_pane *wp, struct client *c, __unused struct session *s, key_code key, struct mouse_event *m) { struct window_client_modedata *data = wp->modedata; + struct mode_tree_data *mtd = data->data; struct window_client_itemdata *item; - char *command, *name; int finished; - /* - * t = toggle tag - * T = tag none - * C-t = tag all - * q = exit - * O = change sort order - * - * d = detach client - * D = detach tagged clients - * x = detach and kill client - * X = detach and kill tagged clients - * z = suspend client - * Z = suspend tagged clients - * Enter = detach client - */ - - finished = mode_tree_key(data->data, c, &key, m); + finished = mode_tree_key(mtd, c, &key, m); switch (key) { case 'd': case 'x': case 'z': - item = mode_tree_get_current(data->data); - window_client_do_detach(data, item, key); - mode_tree_build(data->data); + item = mode_tree_get_current(mtd); + window_client_do_detach(data, item, c, key); + mode_tree_build(mtd); break; case 'D': case 'X': case 'Z': - mode_tree_each_tagged(data->data, window_client_do_detach, key, - 0); - mode_tree_build(data->data); + mode_tree_each_tagged(mtd, window_client_do_detach, c, key, 0); + mode_tree_build(mtd); break; case '\r': - item = mode_tree_get_current(data->data); - command = xstrdup(data->command); - name = xstrdup(item->c->ttyname); - window_pane_reset_mode(wp); - mode_tree_run_command(c, NULL, command, name); - free(name); - free(command); - return; + item = mode_tree_get_current(mtd); + mode_tree_run_command(c, NULL, data->command, item->c->ttyname); + finished = 1; + break; } if (finished || server_client_how_many() == 0) window_pane_reset_mode(wp); else { - mode_tree_draw(data->data); + mode_tree_draw(mtd); wp->flags |= PANE_REDRAW; } } diff --git a/window-tree.c b/window-tree.c index a95503f8..b7626c86 100644 --- a/window-tree.c +++ b/window-tree.c @@ -95,7 +95,6 @@ struct window_tree_modedata { struct window_tree_itemdata **item_list; u_int item_size; - struct client *client; const char *entered; struct cmd_find_state fs; @@ -898,7 +897,8 @@ window_tree_get_target(struct window_tree_itemdata *item, } static void -window_tree_command_each(void* modedata, void* itemdata, __unused key_code key) +window_tree_command_each(void* modedata, void* itemdata, struct client *c, + __unused key_code key) { struct window_tree_modedata *data = modedata; struct window_tree_itemdata *item = itemdata; @@ -907,7 +907,7 @@ window_tree_command_each(void* modedata, void* itemdata, __unused key_code key) name = window_tree_get_target(item, &fs); if (name != NULL) - mode_tree_run_command(data->client, &fs, data->entered, name); + mode_tree_run_command(c, &fs, data->entered, name); free(name); } @@ -934,13 +934,9 @@ window_tree_command_callback(struct client *c, void *modedata, const char *s, if (data->dead) return (0); - data->client = c; data->entered = s; - - mode_tree_each_tagged(data->data, window_tree_command_each, KEYC_NONE, - 1); - - data->client = NULL; + mode_tree_each_tagged(data->data, window_tree_command_each, c, + KEYC_NONE, 1); data->entered = NULL; data->references++; @@ -963,7 +959,7 @@ window_tree_key(struct window_pane *wp, struct client *c, { struct window_tree_modedata *data = wp->modedata; struct window_tree_itemdata *item; - char *command, *name, *prompt; + char *name, *prompt; struct cmd_find_state fs; int finished; u_int tagged; @@ -992,14 +988,12 @@ window_tree_key(struct window_pane *wp, struct client *c, break; case '\r': item = mode_tree_get_current(data->data); - command = xstrdup(data->command); name = window_tree_get_target(item, &fs); - window_pane_reset_mode(wp); if (name != NULL) - mode_tree_run_command(c, NULL, command, name); + mode_tree_run_command(c, NULL, data->command, name); + finished = 1; free(name); - free(command); - return; + break; } if (finished) window_pane_reset_mode(wp);