]> git.mdlowis.com Git - projs/tide.git/commitdiff
Inverted status bar color and added simple column tracking to cursor movements
authorMichael D. Lowis <mike@mdlowis.com>
Sun, 9 Oct 2016 13:35:26 +0000 (09:35 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Sun, 9 Oct 2016 13:35:26 +0000 (09:35 -0400)
buf.c
edit.h
keyboard.c
mouse.c
tests/tests.c
xedit.c

diff --git a/buf.c b/buf.c
index b9425c3eab94822223550af34a89687cc728e723..b32d69a1f9437faa2d386b5b4fee8fa2db32f58a 100644 (file)
--- 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 876b876d6faed0387732b44e18f07b5698e3b5bf..8e1752a4008eb100f16a4195a02381c0d7e72ae6 100644 (file)
--- 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
  *****************************************************************************/
index 6895d39ca75471dc6822b554b1cad8ca52bd9d7c..3730958d828f1d137f42f00eb55ad5b67b70c9b9 100644 (file)
@@ -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 fcde8852bf1d8345d34a30bacecd506089e88be1..cf7a37d940b5ecc3ebc0fa9655e9789483958b92 100644 (file)
--- a/mouse.c
+++ b/mouse.c
@@ -7,6 +7,7 @@ struct {
 
 extern Buf Buffer;
 extern unsigned CursorPos;
+extern unsigned TargetCol;
 
 #ifndef __MACH__
 #include <time.h>
@@ -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) {
index 228c73076f014600f88d2d9b9643f1276a7f9d6d..5914bead15a3e34ca72c25b91867568d350a62a5 100644 (file)
@@ -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 0cf00bdf1d86e74c8713402a016e32f0deaa3312..1f86734b7c22f6e67265bd464bc508e166e02661 100644 (file)
--- 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, &gtrclr, 0, 0, X.width, fheight + X.font->descent);
     XftDrawRect(X.xft, &gtrclr, 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 */