]> git.mdlowis.com Git - projs/tide.git/commitdiff
Implemented selection shortcuts using the keyboard and shift modifer
authorMichael D. Lowis <mike.lowis@gentex.com>
Tue, 29 Nov 2016 18:00:02 +0000 (13:00 -0500)
committerMichael D. Lowis <mike.lowis@gentex.com>
Tue, 29 Nov 2016 18:00:02 +0000 (13:00 -0500)
inc/edit.h
libedit/view.c
libx/x11.c
xedit.c

index c3a67d46b6e040eafc0a688bcf6e3a35660bd1e1..e9ca6d7ac1476688e2b6d11e8c5a64fee435a586 100644 (file)
@@ -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);
index 525fd5fc6cc7b9cec1bae3242b63ef75f567409b..dd6b2b02b17740f059d22e45469c2736be409963 100644 (file)
@@ -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++;
     }
index f0fffb0ab84ca57b0271f8c51d406e7e57b0ea6c..3300a51df8afba52e0e1cb72d0be5e485e2c3a92 100644 (file)
@@ -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 c6cb28b03b29ef6c0830c35f16321de6ac680fe0..73af9f294f54f139923e94e56d7dd1d315e4cc4f 100644 (file)
--- 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){}