tweaks: make prompt-bar input more similar to edit-buffer input
In preparation for the next commit.master
parent
61dc2cab0b
commit
f012d54a1d
42
src/prompt.c
42
src/prompt.c
|
@ -57,9 +57,9 @@ int do_statusbar_input(bool *finished)
|
|||
{
|
||||
int input;
|
||||
/* The character we read in. */
|
||||
static int *kbinput = NULL;
|
||||
static char *puddle = NULL;
|
||||
/* The input buffer. */
|
||||
static size_t kbinput_len = 0;
|
||||
static size_t depth = 0;
|
||||
/* The length of the input buffer. */
|
||||
const keystruct *shortcut;
|
||||
|
||||
|
@ -95,20 +95,22 @@ int do_statusbar_input(bool *finished)
|
|||
beep();
|
||||
else if (!ISSET(RESTRICTED) || currmenu != MWRITEFILE ||
|
||||
openfile->filename[0] == '\0') {
|
||||
kbinput_len++;
|
||||
kbinput = (int *)nrealloc(kbinput, kbinput_len * sizeof(int));
|
||||
kbinput[kbinput_len - 1] = input;
|
||||
puddle = charealloc(puddle, depth + 2);
|
||||
puddle[depth++] = (char)input;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we got a shortcut, or if there aren't any other keystrokes waiting,
|
||||
* it's time to insert all characters in the input buffer (if not empty)
|
||||
* into the answer, and then clear the input buffer. */
|
||||
if ((shortcut || get_key_buffer_len() == 0) && kbinput != NULL) {
|
||||
inject_into_answer(kbinput, kbinput_len);
|
||||
kbinput_len = 0;
|
||||
free(kbinput);
|
||||
kbinput = NULL;
|
||||
if ((shortcut || get_key_buffer_len() == 0) && puddle != NULL) {
|
||||
puddle[depth] = '\0';
|
||||
|
||||
inject_into_answer(puddle, depth);
|
||||
|
||||
free(puddle);
|
||||
puddle = NULL;
|
||||
depth = 0;
|
||||
}
|
||||
|
||||
if (shortcut) {
|
||||
|
@ -172,17 +174,11 @@ int do_statusbar_input(bool *finished)
|
|||
}
|
||||
|
||||
/* The user typed input_len multibyte characters. Add them to the answer. */
|
||||
void inject_into_answer(int *the_input, size_t input_len)
|
||||
void inject_into_answer(char *output, size_t input_len)
|
||||
{
|
||||
char *output = charalloc(input_len + 1);
|
||||
char onechar[MAXCHARLEN];
|
||||
size_t charlen, index = 0;
|
||||
|
||||
/* Copy the typed stuff so it can be treated. */
|
||||
for (size_t i = 0; i < input_len; i++)
|
||||
output[i] = (char)the_input[i];
|
||||
output[input_len] = '\0';
|
||||
|
||||
while (index < input_len) {
|
||||
/* Encode any NUL byte as 0x0A. */
|
||||
if (output[index] == '\0')
|
||||
|
@ -200,8 +196,6 @@ void inject_into_answer(int *the_input, size_t input_len)
|
|||
typing_x += charlen;
|
||||
index += charlen;
|
||||
}
|
||||
|
||||
free(output);
|
||||
}
|
||||
|
||||
/* Move to the beginning of the answer. */
|
||||
|
@ -317,12 +311,20 @@ void do_statusbar_prev_word(void)
|
|||
void do_statusbar_verbatim_input(void)
|
||||
{
|
||||
int *kbinput;
|
||||
char *bytes;
|
||||
size_t count;
|
||||
|
||||
kbinput = get_verbatim_kbinput(bottomwin, &count);
|
||||
|
||||
inject_into_answer(kbinput, count);
|
||||
bytes = charalloc(count + 1);
|
||||
|
||||
for (size_t i = 0; i < count; i++)
|
||||
bytes[i] = (char)kbinput[i];
|
||||
bytes[count] = '\0';
|
||||
|
||||
inject_into_answer(bytes, count);
|
||||
|
||||
free(bytes);
|
||||
free(kbinput);
|
||||
}
|
||||
|
||||
|
|
|
@ -445,7 +445,7 @@ bool okay_for_view(const keystruct *shortcut);
|
|||
void inject(char *output, size_t output_len);
|
||||
|
||||
/* Most functions in prompt.c. */
|
||||
void inject_into_answer(int *the_input, size_t input_len);
|
||||
void inject_into_answer(char *output, size_t input_len);
|
||||
void do_statusbar_home(void);
|
||||
void do_statusbar_end(void);
|
||||
void do_statusbar_left(void);
|
||||
|
|
Loading…
Reference in New Issue