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);
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);
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;
}
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;
}
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++;
}
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;
}
}
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;
}
/* 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 },
}
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;
}
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) {
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){}