From 5521640c36b349df56e2e53e4fcdee8ec00e779a Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Tue, 29 Nov 2016 13:00:02 -0500 Subject: [PATCH] Implemented selection shortcuts using the keyboard and shift modifer --- inc/edit.h | 8 +++---- libedit/view.c | 26 ++++++++++++++--------- libx/x11.c | 30 ++++++++++++++++++++++++-- xedit.c | 57 ++++++++++++++++++++++++++++++++++---------------- 4 files changed, 87 insertions(+), 34 deletions(-) diff --git a/inc/edit.h b/inc/edit.h index c3a67d4..e9ca6d7 100644 --- a/inc/edit.h +++ b/inc/edit.h @@ -151,8 +151,8 @@ size_t view_limitrows(View* view, size_t maxrows, size_t ncols); void view_resize(View* view, size_t nrows, size_t ncols); void view_update(View* view, size_t* csrx, size_t* csry); Row* view_getrow(View* view, size_t row); -void view_byrune(View* view, int move); -void view_byline(View* view, int move); +void view_byrune(View* view, int move, bool extsel); +void view_byline(View* view, int move, bool extsel); void view_setcursor(View* view, size_t row, size_t col); void view_selext(View* view, size_t row, size_t col); void view_selword(View* view, size_t row, size_t col); @@ -163,8 +163,8 @@ void view_find(View* view, size_t row, size_t col); void view_findstr(View* view, char* str); void view_insert(View* view, Rune rune); void view_delete(View* view); -void view_bol(View* view); -void view_eol(View* view); +void view_bol(View* view, bool extsel); +void view_eol(View* view, bool extsel); void view_undo(View* view); void view_redo(View* view); void view_putstr(View* view, char* str); diff --git a/libedit/view.c b/libedit/view.c index 525fd5f..dd6b2b0 100644 --- a/libedit/view.c +++ b/libedit/view.c @@ -221,18 +221,20 @@ Row* view_getrow(View* view, size_t row) { return (row < view->nrows ? view->rows[row] : NULL); } -void view_byrune(View* view, int move) { +void view_byrune(View* view, int move, bool extsel) { Sel sel = view->selection; - sel.beg = sel.end = buf_byrune(&(view->buffer), sel.end, move); + sel.end = buf_byrune(&(view->buffer), sel.end, move); + if (!extsel) sel.beg = sel.end; sel.col = buf_getcol(&(view->buffer), sel.end); view->selection = sel; view->sync_needed = true; } -void view_byline(View* view, int move) { +void view_byline(View* view, int move, bool extsel) { Sel sel = view->selection; - sel.beg = sel.end = buf_byline(&(view->buffer), sel.end, move); - sel.beg = sel.end = buf_setcol(&(view->buffer), sel.end, sel.col); + sel.end = buf_byline(&(view->buffer), sel.end, move); + sel.end = buf_setcol(&(view->buffer), sel.end, sel.col); + if (!extsel) sel.beg = sel.end; view->selection = sel; view->sync_needed = true; } @@ -390,14 +392,18 @@ void view_delete(View* view) { view->sync_needed = true; } -void view_bol(View* view) { - view->selection.beg = view->selection.end = buf_bol(&(view->buffer), view->selection.end); +void view_bol(View* view, bool extsel) { + view->selection.end = buf_bol(&(view->buffer), view->selection.end); + if (!extsel) + view->selection.beg = view->selection.end; view->selection.col = buf_getcol(&(view->buffer), view->selection.end); view->sync_needed = true; } -void view_eol(View* view) { - view->selection.beg = view->selection.end = buf_eol(&(view->buffer), view->selection.end); +void view_eol(View* view, bool extsel) { + view->selection.end = buf_eol(&(view->buffer), view->selection.end); + if (!extsel) + view->selection.beg = view->selection.end; view->selection.col = buf_getcol(&(view->buffer), view->selection.end); view->sync_needed = true; } @@ -429,7 +435,7 @@ void view_append(View* view, char* str) { size_t end = buf_end(&(view->buffer)); if (view->selection.end != end) view->selection = (Sel){ .beg = end, .end = end }; - if (!num_selected(view->selection) && !buf_iseol(&(view->buffer), view->selection.end-1)) { + if (!num_selected(view->selection) && !buf_iseol(&(view->buffer), view->selection.end-1)) { buf_ins(&(view->buffer), view->selection.end++, '\n'); view->selection.beg++; } diff --git a/libx/x11.c b/libx/x11.c index f0fffb0..3300a51 100644 --- a/libx/x11.c +++ b/libx/x11.c @@ -157,7 +157,33 @@ static uint32_t special_keys(uint32_t key) { case XK_Down: return KEY_DOWN; case XK_Left: return KEY_LEFT; case XK_Right: return KEY_RIGHT; - default: return key; + case XK_Escape: return KEY_ESCAPE; + case XK_BackSpace: return '\b'; + case XK_Tab: return '\t'; + case XK_Return: return '\r'; + case XK_Linefeed: return '\n'; + + /* modifiers should not trigger key presses */ + case XK_Scroll_Lock: + case XK_Shift_L: + case XK_Shift_R: + case XK_Control_L: + case XK_Control_R: + case XK_Caps_Lock: + case XK_Shift_Lock: + case XK_Meta_L: + case XK_Meta_R: + case XK_Alt_L: + case XK_Alt_R: + case XK_Super_L: + case XK_Super_R: + case XK_Hyper_L: + case XK_Hyper_R: + return RUNE_ERR; + + /* if it ain't special, don't touch it */ + default: + return key; } } @@ -181,7 +207,7 @@ static uint32_t getkey(XEvent* e) { for (int i = 0; i < 8 && !utf8decode(&rune, &len, buf[i]); i++); } /* translate special key codes into unicode codepoints */ - key = special_keys(key); + rune = special_keys(key); return rune; } diff --git a/xedit.c b/xedit.c index c6cb28b..73af9f2 100644 --- a/xedit.c +++ b/xedit.c @@ -143,10 +143,11 @@ static KeyBinding Bindings[] = { /* Common Special Keys */ { ModNone, KEY_PGUP, page_up }, { ModNone, KEY_PGDN, page_dn }, - { ModNone, KEY_DELETE, delrune_right }, - { ModCtrl, KEY_DELETE, delword_right }, - { ModNone, KEY_BACKSPACE, delrune_left }, - { ModCtrl, KEY_BACKSPACE, delword_left }, + { ModNone, KEY_DELETE, delete }, // DELETE + //{ ModNone, KEY_DELETE, delrune_right }, + //{ ModCtrl, KEY_DELETE, delword_right }, + //{ ModNone, KEY_BACKSPACE, delrune_left }, + //{ ModCtrl, KEY_BACKSPACE, delword_left }, /* Cursor Movements */ { ModNone, KEY_HOME, cursor_bol }, @@ -252,8 +253,6 @@ static void mouse_handler(MouseAct act, MouseBtn btn, int x, int y) { } static void key_handler(int mods, Rune key) { - /* ignore invalid keys */ - if (key == RUNE_ERR) return; /* handle the proper line endings */ if (key == '\r') key = '\n'; if (key == '\n' && currview()->buffer.crlf) key = RUNE_CRLF; @@ -394,27 +393,27 @@ static void delete(void) { } static void cursor_up(void) { - view_byline(currview(), -1); + view_byline(currview(), -1, false); } static void cursor_dn(void) { - view_byline(currview(), +1); + view_byline(currview(), +1, false); } static void cursor_left(void) { - view_byrune(currview(), -1); + view_byrune(currview(), -1, false); } static void cursor_right(void) { - view_byrune(currview(), +1); + view_byrune(currview(), +1, false); } static void cursor_bol(void) { - view_bol(currview()); + view_bol(currview(), false); } static void cursor_eol(void) { - view_eol(currview()); + view_eol(currview(), false); } static void page_up(void) { @@ -516,17 +515,39 @@ static void delword_right(void){} static void delrune_left(void){} static void delword_left(void){} static void cursor_bof(void){} -static void select_bol(void){} + +static void select_bol(void){ + view_bol(currview(), true); +} + static void select_bof(void){} static void cursor_eof(void){} -static void select_eol(void){} + +static void select_eol(void) { + view_eol(currview(), true); +} + static void select_eof(void){} -static void select_up(void){} -static void select_dn(void){} -static void select_left(void){} + +static void select_up(void) { + view_byline(currview(), -1, true); +} + +static void select_dn(void) { + view_byline(currview(), +1, true); +} + +static void select_left(void) { + view_byrune(currview(), -1, true); +} + static void word_left(void){} static void selword_left(void){} -static void select_right(void){} + +static void select_right(void) { + view_byrune(currview(), +1, true); +} + static void word_right(void){} static void selword_right(void){} -- 2.49.0