]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - gui.c
gui: Do not decode the pressed key multiple times.
[paraslash.git] / gui.c
diff --git a/gui.c b/gui.c
index 0c8aceaefdf3924b3418bf0d3c6b18814de8806b..d779ff864ddebfc38a34ba1a0d166b5c04089556 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -192,7 +192,7 @@ static bool curses_active(void)
 }
 
 /* taken from mutt */
 }
 
 /* taken from mutt */
-static char *km_keyname(int c)
+static const char *km_keyname(int c)
 {
        static char buf[10];
 
 {
        static char buf[10];
 
@@ -901,6 +901,14 @@ static int signal_post_select(struct sched *s, __a_unused void *context)
        switch (ret) {
        case SIGTERM:
                die(EXIT_FAILURE, "only the good die young (caught SIGTERM)\n");
        switch (ret) {
        case SIGTERM:
                die(EXIT_FAILURE, "only the good die young (caught SIGTERM)\n");
+       case SIGWINCH:
+               PARA_NOTICE_LOG("got SIGWINCH\n");
+               if (curses_active()) {
+                       shutdown_curses();
+                       init_curses();
+                       redraw_bot_win();
+               }
+               return 1;
        case SIGINT:
                return 1;
        case SIGUSR1:
        case SIGINT:
                return 1;
        case SIGUSR1:
@@ -1041,6 +1049,7 @@ static void handle_command(int c)
 {
        int i;
        const struct lls_opt_result *lor = OPT_RESULT(KEY_MAP);
 {
        int i;
        const struct lls_opt_result *lor = OPT_RESULT(KEY_MAP);
+       const char *keyname = km_keyname(c);
 
        /* first check user-defined key bindings */
        FOR_EACH_KEY_MAP(i) {
 
        /* first check user-defined key bindings */
        FOR_EACH_KEY_MAP(i) {
@@ -1051,7 +1060,7 @@ static void handle_command(int c)
                        free(tmp);
                        return;
                }
                        free(tmp);
                        return;
                }
-               if (strcmp(tmp, km_keyname(c))) {
+               if (strcmp(tmp, keyname)) {
                        free(tmp);
                        continue;
                }
                        free(tmp);
                        continue;
                }
@@ -1071,13 +1080,13 @@ static void handle_command(int c)
        }
        /* not found, check internal key bindings */
        for (i = 0; command_list[i].handler; i++) {
        }
        /* not found, check internal key bindings */
        for (i = 0; command_list[i].handler; i++) {
-               if (!strcmp(km_keyname(c), command_list[i].key)) {
+               if (!strcmp(keyname, command_list[i].key)) {
                        command_list[i].handler();
                        return;
                }
        }
        print_in_bar(COLOR_ERRMSG, "key '%s' is not bound, press ? for help",
                        command_list[i].handler();
                        return;
                }
        }
        print_in_bar(COLOR_ERRMSG, "key '%s' is not bound, press ? for help",
-               km_keyname(c));
+               keyname);
 }
 
 static int input_post_select(__a_unused struct sched *s,
 }
 
 static int input_post_select(__a_unused struct sched *s,
@@ -1106,14 +1115,8 @@ static int input_post_select(__a_unused struct sched *s,
        ret = wgetch(top.win);
        if (ret == ERR)
                return 0;
        ret = wgetch(top.win);
        if (ret == ERR)
                return 0;
-       if (ret == KEY_RESIZE) {
-               if (curses_active()) {
-                       shutdown_curses();
-                       init_curses();
-                       redraw_bot_win();
-               }
+       if (ret == KEY_RESIZE) /* already handled in signal_post_select() */
                return 0;
                return 0;
-       }
        if (exs == EXEC_IDLE)
                handle_command(ret);
        else if (exec_pid > 0)
        if (exs == EXEC_IDLE)
                handle_command(ret);
        else if (exec_pid > 0)
@@ -1416,6 +1419,7 @@ static int setup_tasks_and_schedule(void)
        para_install_sighandler(SIGTERM);
        para_install_sighandler(SIGCHLD);
        para_install_sighandler(SIGUSR1);
        para_install_sighandler(SIGTERM);
        para_install_sighandler(SIGCHLD);
        para_install_sighandler(SIGUSR1);
+       para_install_sighandler(SIGWINCH);
        signal_task->task = task_register(&(struct task_info) {
                .name = "signal",
                .pre_select = signal_pre_select,
        signal_task->task = task_register(&(struct task_info) {
                .name = "signal",
                .pre_select = signal_pre_select,