commit 12b5416b2c87427100979b00e6d30ff674d3c4a0
parent a937265833554a84856700240606de150a9b3c70
Author: Arun Prakash Jana <engineerarun@gmail.com>
Date: Wed, 20 Jul 2022 19:48:27 +0530
Fix #1428: handle unicode keybinds
Diffstat:
2 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/src/nnn.c b/src/nnn.c
@@ -104,7 +104,6 @@
#define __USE_XOPEN_EXTENDED 1
#endif
#include <ftw.h>
-#include <wchar.h>
#include <pwd.h>
#include <grp.h>
@@ -1362,25 +1361,27 @@ static inline bool xconfirm(int c)
static int get_input(const char *prompt)
{
+ wint_t ch[1];
+
if (prompt)
printmsg(prompt);
cleartimeout();
- int r = getch();
+ get_wch(ch);
#ifdef KEY_RESIZE
- while (r == KEY_RESIZE) {
+ while (*ch == KEY_RESIZE) {
if (prompt) {
clearoldprompt();
xlines = LINES;
printmsg(prompt);
}
- r = getch();
+ get_wch(ch);
}
#endif
settimeout();
- return r;
+ return (int)*ch;
}
static bool isselfileempty(void)
@@ -3010,13 +3011,13 @@ static int nextsel(int presel)
#ifdef BENCH
return SEL_QUIT;
#endif
- int c = presel;
- uint_t i;
+ wint_t c = presel;
+ int i = ERR;
bool escaped = FALSE;
if (c == 0 || c == MSGWAIT) {
try_quit:
- c = getch();
+ i = get_wch(&c);
//DPRINTF_D(c);
//DPRINTF_S(keyname(c));
@@ -3028,8 +3029,8 @@ try_quit:
/* Handle Alt+key */
if (c == ESC) {
timeout(0);
- c = getch();
- if (c != ERR) {
+ i = get_wch(&c);
+ if (i != ERR) {
if (c == ESC)
c = CONTROL('L');
else {
@@ -3051,14 +3052,14 @@ try_quit:
}
}
- if (c == ERR && presel == MSGWAIT)
+ if (i == ERR && presel == MSGWAIT)
c = (cfg.filtermode || filterset()) ? FILTER : CONTROL('L');
else if (c == FILTER || c == CONTROL('L'))
/* Clear previous filter when manually starting */
clearfilter();
}
- if (c == -1) {
+ if (i == ERR) {
++idle;
/*
diff --git a/src/nnn.h b/src/nnn.h
@@ -31,6 +31,7 @@
#pragma once
#include <curses.h>
+#include <wchar.h>
#define CONTROL(c) ((c) & 0x1f)
@@ -121,7 +122,7 @@ enum action {
/* Associate a pressed key to an action */
struct key {
- int sym; /* Key pressed */
+ wint_t sym; /* Key pressed */
enum action act; /* Action */
};