From: Michael D. Lowis Date: Sun, 9 Oct 2016 13:35:26 +0000 (-0400) Subject: Inverted status bar color and added simple column tracking to cursor movements X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=8d69c46e11c760f6b2aba704c5038c8327f2ca1e;p=projs%2Ftide.git Inverted status bar color and added simple column tracking to cursor movements --- diff --git a/buf.c b/buf.c index b9425c3..b32d69a 100644 --- a/buf.c +++ b/buf.c @@ -211,3 +211,14 @@ unsigned buf_byline(Buf* buf, unsigned pos, int count) { } return pos; } + +unsigned buf_getcol(Buf* buf, unsigned pos) { + return (pos - buf_bol(buf, pos)); +} + +unsigned buf_setcol(Buf* buf, unsigned pos, unsigned col) { + unsigned bol = buf_bol(buf, pos); + unsigned len = buf_eol(buf, pos) - bol; + return buf_byrune(buf, bol, (len > col ? col : len)); +} + diff --git a/edit.h b/edit.h index 876b876..8e1752a 100644 --- a/edit.h +++ b/edit.h @@ -155,6 +155,9 @@ unsigned buf_eol(Buf* buf, unsigned pos); unsigned buf_end(Buf* buf); unsigned buf_byrune(Buf* buf, unsigned pos, int count); unsigned buf_byline(Buf* buf, unsigned pos, int count); +unsigned buf_getcol(Buf* buf, unsigned pos); +unsigned buf_setcol(Buf* buf, unsigned pos, unsigned col); + /* Screen management functions *****************************************************************************/ diff --git a/keyboard.c b/keyboard.c index 6895d39..3730958 100644 --- a/keyboard.c +++ b/keyboard.c @@ -2,11 +2,32 @@ extern Buf Buffer; extern unsigned CursorPos; +extern unsigned TargetCol; static void special_keys(Rune key); static void control_keys(Rune key); static void vi_keys(Rune key); +static void cursor_up(void) { + CursorPos = buf_byline(&Buffer, CursorPos, -1); + CursorPos = buf_setcol(&Buffer, CursorPos, TargetCol); +} + +static void cursor_dn(void) { + CursorPos = buf_byline(&Buffer, CursorPos, 1); + CursorPos = buf_setcol(&Buffer, CursorPos, TargetCol); +} + +static void cursor_left(void) { + CursorPos = buf_byrune(&Buffer, CursorPos, -1); + TargetCol = buf_getcol(&Buffer, CursorPos); +} + +static void cursor_right(void) { + CursorPos = buf_byrune(&Buffer, CursorPos, 1); + TargetCol = buf_getcol(&Buffer, CursorPos); +} + void handle_key(Rune key) { /* ignore invalid keys */ if (key == RUNE_ERR) return; @@ -24,16 +45,16 @@ void handle_key(Rune key) { static void special_keys(Rune key) { switch (key) { - case KEY_F6: ColorBase = !ColorBase; break; - case KEY_UP: CursorPos = buf_byline(&Buffer, CursorPos, -1); break; - case KEY_DOWN: CursorPos = buf_byline(&Buffer, CursorPos, 1); break; - case KEY_LEFT: CursorPos = buf_byrune(&Buffer, CursorPos, -1); break; - case KEY_RIGHT: CursorPos = buf_byrune(&Buffer, CursorPos, 1); break; - case KEY_INSERT: Buffer.insert_mode = !Buffer.insert_mode; break; - case KEY_F1: Buffer.insert_mode = !Buffer.insert_mode; break; - case KEY_DELETE: buf_del(&Buffer, CursorPos); break; - case KEY_HOME: CursorPos = buf_bol(&Buffer, CursorPos); break; - case KEY_END: CursorPos = buf_eol(&Buffer, CursorPos); break; + case KEY_F6: ColorBase = !ColorBase; break; + case KEY_UP: cursor_up(); break; + case KEY_DOWN: cursor_dn(); break; + case KEY_LEFT: cursor_left(); break; + case KEY_RIGHT: cursor_right(); break; + case KEY_INSERT: Buffer.insert_mode = !Buffer.insert_mode; break; + case KEY_F1: Buffer.insert_mode = !Buffer.insert_mode; break; + case KEY_DELETE: buf_del(&Buffer, CursorPos); break; + case KEY_HOME: CursorPos = buf_bol(&Buffer, CursorPos); break; + case KEY_END: CursorPos = buf_eol(&Buffer, CursorPos); break; } } @@ -50,3 +71,5 @@ static void control_keys(Rune key) { static void vi_keys(Rune key) { (void)key; } + +/*****************************************************************************/ diff --git a/mouse.c b/mouse.c index fcde885..cf7a37d 100644 --- a/mouse.c +++ b/mouse.c @@ -7,6 +7,7 @@ struct { extern Buf Buffer; extern unsigned CursorPos; +extern unsigned TargetCol; #ifndef __MACH__ #include @@ -45,6 +46,7 @@ void unused(MouseEvent* mevnt) { void move_cursor(MouseEvent* mevnt) { CursorPos = screen_getoff(&Buffer, CursorPos, mevnt->y, mevnt->x); + TargetCol = buf_getcol(&Buffer, CursorPos); } void select_word(MouseEvent* mevnt) { diff --git a/tests/tests.c b/tests/tests.c index 228c730..5914bea 100644 --- a/tests/tests.c +++ b/tests/tests.c @@ -4,6 +4,7 @@ Buf Buffer; unsigned CursorPos; +unsigned TargetCol; void die(char* m) { (void)m; diff --git a/xedit.c b/xedit.c index 0cf00bd..1f86734 100644 --- a/xedit.c +++ b/xedit.c @@ -8,6 +8,7 @@ Buf Buffer; unsigned CursorPos = 0; +unsigned TargetCol = 0; enum ColorScheme ColorBase = DEFAULT_COLORSCHEME; struct { Display* display; @@ -200,13 +201,12 @@ static void redraw(void) { XftColor bkgclr = xftcolor(CLR_BASE03); XftColor gtrclr = xftcolor(CLR_BASE02); XftColor csrclr = xftcolor(CLR_BASE3); - XftColor staclr = xftcolor(CLR_BASE2); XftColor txtclr = xftcolor(CLR_BASE0); /* draw the background colors */ XftDrawRect(X.xft, &bkgclr, 0, 0, X.width, X.height); - XftDrawRect(X.xft, >rclr, 0, 0, X.width, fheight + X.font->descent); XftDrawRect(X.xft, >rclr, 79 * fwidth, 0, fwidth, X.height); + XftDrawRect(X.xft, &txtclr, 0, 0, X.width, fheight + X.font->descent); /* update the screen buffer and retrieve cursor coordinates */ unsigned csrx, csry; @@ -215,13 +215,13 @@ static void redraw(void) { /* flush the screen buffer */ unsigned nrows, ncols; screen_getsize(&nrows, &ncols); - screen_status("[%s]%s%s", + screen_status(" %s %s%s", (Buffer.charset == BINARY ? "BIN" : "UTF-8"), (Buffer.modified ? " * " : " "), Buffer.path); for (unsigned y = 0; y < nrows; y++) { Row* row = screen_getrow(y); - XftDrawString32(X.xft, (y==0 ? &staclr : &txtclr), X.font, 0, (y+1) * fheight, (FcChar32*)(row->cols), (row->len)); + XftDrawString32(X.xft, (y==0 ? &bkgclr : &txtclr), X.font, 0, (y+1) * fheight, (FcChar32*)(row->cols), (row->len)); } /* Place cursor on screen */