From a3348d888b14d76da86a6f8dde8f4dc075ccf6b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Janouch?= Date: Tue, 11 Feb 2014 23:28:02 +0100 Subject: [PATCH] I've been enlightened Now responding to C-p, C-n, C-b, C-f and C-h as expected. --- src/sdtui.c | 111 ++++++++++++++++++++++++---------------------------- 1 file changed, 51 insertions(+), 60 deletions(-) diff --git a/src/sdtui.c b/src/sdtui.c index e4ccab2..d5ec6dc 100644 --- a/src/sdtui.c +++ b/src/sdtui.c @@ -45,17 +45,18 @@ #define CTRL_KEY(x) ((x) - 'A' + 1) -#define KEY_SOH CTRL_KEY ('A') //!< Ctrl-A -#define KEY_STX CTRL_KEY ('B') //!< Ctrl-B -#define KEY_ENQ CTRL_KEY ('E') //!< Ctrl-E -#define KEY_ACK CTRL_KEY ('F') //!< Ctrl-F -#define KEY_VT CTRL_KEY ('K') //!< Ctrl-K -#define KEY_FF CTRL_KEY ('L') //!< Ctrl-L -#define KEY_SO CTRL_KEY ('N') //!< Ctrl-N -#define KEY_DLE CTRL_KEY ('P') //!< Ctrl-P -#define KEY_DC4 CTRL_KEY ('T') //!< Ctrl-T -#define KEY_NAK CTRL_KEY ('U') //!< Ctrl-U -#define KEY_ETB CTRL_KEY ('W') //!< Ctrl-W +#define KEY_CTRL_A CTRL_KEY ('A') //!< Ctrl-A (SOH) +#define KEY_CTRL_B CTRL_KEY ('B') //!< Ctrl-B (STX) +#define KEY_CTRL_E CTRL_KEY ('E') //!< Ctrl-E (ENQ) +#define KEY_CTRL_F CTRL_KEY ('F') //!< Ctrl-F (ACK) +#define KEY_CTRL_H CTRL_KEY ('H') //!< Ctrl-H (BS) +#define KEY_CTRL_K CTRL_KEY ('K') //!< Ctrl-K (VT) +#define KEY_CTRL_L CTRL_KEY ('L') //!< Ctrl-L (FF) +#define KEY_CTRL_N CTRL_KEY ('N') //!< Ctrl-N (SO) +#define KEY_CTRL_P CTRL_KEY ('P') //!< Ctrl-P (DLE) +#define KEY_CTRL_T CTRL_KEY ('T') //!< Ctrl-T (DC4) +#define KEY_CTRL_U CTRL_KEY ('U') //!< Ctrl-U (NAK) +#define KEY_CTRL_W CTRL_KEY ('W') //!< Ctrl-W (ETB) #define KEY_RETURN 13 //!< Enter #define KEY_ESCAPE 27 //!< Esc @@ -824,7 +825,7 @@ app_process_extra_code (Application *self, CursesEvent *event) return TRUE; } -/** Process input that's not a character. */ +/** Process input that's not a character or is a control code. */ static gboolean app_process_nonchar_code (Application *self, CursesEvent *event) { @@ -872,7 +873,20 @@ app_process_nonchar_code (Application *self, CursesEvent *event) } break; + case KEY_ESCAPE: + return FALSE; + case KEY_RETURN: + self->input_confirmed = TRUE; + app_redraw_top (self); + break; + + case KEY_CTRL_L: // redraw everything + clear (); + app_redraw (self); + break; +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - case KEY_UP: + case KEY_CTRL_P: // previous if (self->selected > 0) { self->selected--; @@ -883,6 +897,7 @@ app_process_nonchar_code (Application *self, CursesEvent *event) RESTORE_CURSOR break; case KEY_DOWN: + case KEY_CTRL_N: // next if ((gint) self->selected < LINES - 2 && self->selected < app_count_view_items (self) - self->top_offset - 1) { @@ -894,21 +909,25 @@ app_process_nonchar_code (Application *self, CursesEvent *event) RESTORE_CURSOR break; case KEY_PPAGE: + case KEY_CTRL_B: // back app_scroll_up (self, LINES - 1); // FIXME selection RESTORE_CURSOR break; case KEY_NPAGE: + case KEY_CTRL_F: // forward app_scroll_down (self, LINES - 1); // FIXME selection RESTORE_CURSOR break; - +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - case KEY_HOME: + case KEY_CTRL_A: self->input_pos = 0; app_redraw_top (self); break; case KEY_END: + case KEY_CTRL_E: self->input_pos = self->input->len; app_redraw_top (self); break; @@ -927,6 +946,7 @@ app_process_nonchar_code (Application *self, CursesEvent *event) } break; case KEY_BACKSPACE: + case KEY_CTRL_H: if (self->input_pos > 0) { g_array_remove_index (self->input, --self->input_pos); @@ -942,50 +962,8 @@ app_process_nonchar_code (Application *self, CursesEvent *event) app_redraw_top (self); } break; - - default: - return app_process_extra_code (self, event); - } - return TRUE; -} - -/** Process input events from ncurses. */ -static gboolean -app_process_curses_event (Application *self, CursesEvent *event) -{ - if (!event->is_char) - return app_process_nonchar_code (self, event); - - switch (event->code) - { - case KEY_ESCAPE: - return FALSE; - case KEY_RETURN: - self->input_confirmed = TRUE; - app_redraw_top (self); - break; - - case KEY_FF: // Ctrl-L -- redraw everything - clear (); - app_redraw (self); - break; - - case KEY_STX: // Ctrl-B -- back - case KEY_ACK: // Ctrl-F -- forward - case KEY_DLE: // Ctrl-P -- previous - case KEY_SO: // Ctrl-N -- next - // TODO map this to something useful - break; - - case KEY_SOH: // Ctrl-A -- move to the start of line - self->input_pos = 0; - app_redraw_top (self); - break; - case KEY_ENQ: // Ctrl-E -- move to the end of line - self->input_pos = self->input->len; - app_redraw_top (self); - break; - case KEY_VT: // Ctrl-K -- delete until the end of line +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + case KEY_CTRL_K: // delete until the end of line if (self->input_pos < self->input->len) { g_array_remove_range (self->input, @@ -994,7 +972,7 @@ app_process_curses_event (Application *self, CursesEvent *event) app_redraw_top (self); } return TRUE; - case KEY_ETB: // Ctrl-W -- delete word before cursor + case KEY_CTRL_W: // delete word before cursor { if (self->input_pos == 0) return TRUE; @@ -1015,7 +993,7 @@ app_process_curses_event (Application *self, CursesEvent *event) app_redraw_top (self); return TRUE; } - case KEY_NAK: // Ctrl-U -- delete everything before the cursor + case KEY_CTRL_U: // delete everything before the cursor if (self->input->len != 0) { g_array_remove_range (self->input, 0, self->input_pos); @@ -1025,7 +1003,7 @@ app_process_curses_event (Application *self, CursesEvent *event) app_redraw_top (self); } return TRUE; - case KEY_DC4: // Ctrl-T -- transposition + case KEY_CTRL_T: // transposition { if (!self->input_pos || self->input->len < 2) break; @@ -1046,7 +1024,20 @@ app_process_curses_event (Application *self, CursesEvent *event) app_redraw_top (self); return TRUE; } + + default: + return app_process_extra_code (self, event); } + return TRUE; +} + +/** Process input events from ncurses. */ +static gboolean +app_process_curses_event (Application *self, CursesEvent *event) +{ + // Characters below the space are ASCII control codes + if (!event->is_char || event->code < L' ') + return app_process_nonchar_code (self, event); wchar_t code = event->code; gchar *letter = g_convert_with_iconv ((gchar *) &code, sizeof code,