aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd-set-option.c2
-rw-r--r--input.c2
-rw-r--r--key-bindings.c5
-rw-r--r--mode-tree.c27
4 files changed, 23 insertions, 13 deletions
diff --git a/cmd-set-option.c b/cmd-set-option.c
index 02504d5c..d1ec6fcf 100644
--- a/cmd-set-option.c
+++ b/cmd-set-option.c
@@ -190,7 +190,7 @@ cmd_set_option_exec(struct cmd *self, struct cmdq_item *item)
/* Change the option. */
if (args_has(args, 'u')) {
if (o == NULL)
- goto fail;
+ goto out;
if (idx == -1) {
if (oo == global_options ||
oo == global_s_options ||
diff --git a/input.c b/input.c
index b67d2362..e4aecf7d 100644
--- a/input.c
+++ b/input.c
@@ -433,7 +433,7 @@ static const struct input_state input_state_rename_string = {
/* consume_st state definition. */
static const struct input_state input_state_consume_st = {
"consume_st",
- NULL, NULL,
+ input_enter_rename, NULL, /* rename also waits for ST */
input_state_consume_st_table
};
diff --git a/key-bindings.c b/key-bindings.c
index 39083af0..badbc0f4 100644
--- a/key-bindings.c
+++ b/key-bindings.c
@@ -138,12 +138,17 @@ void
key_bindings_remove_table(const char *name)
{
struct key_table *table;
+ struct client *c;
table = key_bindings_get_table(name, 0);
if (table != NULL) {
RB_REMOVE(key_tables, &key_tables, table);
key_bindings_unref_table(table);
}
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (c->keytable == table)
+ server_client_set_key_table(c, NULL);
+ }
}
void
diff --git a/mode-tree.c b/mode-tree.c
index fc31592a..ad783bb4 100644
--- a/mode-tree.c
+++ b/mode-tree.c
@@ -128,6 +128,17 @@ mode_tree_free_items(struct mode_tree_list *mtl)
}
static void
+mode_tree_check_selected(struct mode_tree_data *mtd)
+{
+ /*
+ * If the current line would now be off screen reset the offset to the
+ * last visible line.
+ */
+ if (mtd->current > mtd->height - 1)
+ mtd->offset = mtd->current - mtd->height + 1;
+}
+
+static void
mode_tree_clear_lines(struct mode_tree_data *mtd)
{
free(mtd->line_list);
@@ -192,7 +203,7 @@ mode_tree_set_current(struct mode_tree_data *mtd, uint64_t tag)
if (i != mtd->line_size) {
mtd->current = i;
if (mtd->current > mtd->height - 1)
- mtd->offset = 1 + mtd->current - mtd->height;
+ mtd->offset = mtd->current - mtd->height + 1;
else
mtd->offset = 0;
} else {
@@ -361,6 +372,7 @@ mode_tree_build(struct mode_tree_data *mtd)
mtd->height = screen_size_y(s);
} else
mtd->height = screen_size_y(s);
+ mode_tree_check_selected(mtd);
}
static void
@@ -792,7 +804,7 @@ mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key,
case KEYC_END:
mtd->current = mtd->line_size - 1;
if (mtd->current > mtd->height - 1)
- mtd->offset = mtd->current - mtd->height;
+ mtd->offset = mtd->current - mtd->height + 1;
else
mtd->offset = 0;
break;
@@ -870,15 +882,8 @@ mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key,
case 'v':
mtd->preview = !mtd->preview;
mode_tree_build(mtd);
-
- /*
- * If the current line would now be off screen now the preview
- * is on, reset the the offset to the last visible line.
- */
- if (mtd->preview && mtd->current > mtd->height - 1) {
- mtd->offset = mtd->current - mtd->height;
- mtd->current--;
- }
+ if (mtd->preview)
+ mode_tree_check_selected(mtd);
break;
}
return (0);