Introduction
Introduction Statistics Contact Development Disclaimer Help
slackline: implement sl_move() to handle cursor movement - lchat - A line orien…
git clone git://git.suckless.org/lchat
Log
Files
Refs
README
---
commit f7052595cdec83861c5f28bc5e579c6238b5aced
parent 1971dd4cb092a1d603d41bc35cb5b6425394d194
Author: Tom Schwindl <[email protected]>
Date: Thu, 13 Oct 2022 16:23:21 +0200
slackline: implement sl_move() to handle cursor movement
Diffstat:
M slackline.c | 67 ++++++++++++++++++-----------…
1 file changed, 39 insertions(+), 28 deletions(-)
---
diff --git a/slackline.c b/slackline.c
@@ -24,6 +24,8 @@
#include "slackline.h"
+enum direction {LEFT, RIGHT, HOME, END};
+
struct slackline *
sl_init(void)
{
@@ -112,6 +114,35 @@ sl_backspace(struct slackline *sl)
sl->ptr = ncur;
}
+static void
+sl_move(struct slackline *sl, enum direction dir)
+{
+ switch (dir) {
+ case HOME:
+ sl->bcur = sl->rcur = 0;
+ sl->ptr = sl->buf;
+ return;
+ case END:
+ sl->rcur = sl->rlen;
+ sl->bcur = sl_postobyte(sl, sl->rcur);
+ sl->ptr = sl->buf + sl->bcur;
+ return;
+ case RIGHT:
+ if (sl->rcur < sl->rlen)
+ sl->rcur++;
+ break;
+ case LEFT:
+ if (sl->rcur > 0) {
+ sl->rcur--;
+ sl->bcur = sl_postobyte(sl, sl->rcur);
+ }
+ break;
+ }
+
+ sl->bcur = sl_postobyte(sl, sl->rcur);
+ sl->ptr = sl->buf + sl->bcur;
+}
+
int
sl_keystroke(struct slackline *sl, int key)
{
@@ -133,39 +164,22 @@ sl_keystroke(struct slackline *sl, int key)
case 'B': /* down */
break;
case 'C': /* right */
- if (sl->rcur < sl->rlen)
- sl->rcur++;
- sl->bcur = sl_postobyte(sl, sl->rcur);
- sl->ptr = sl->buf + sl->bcur;
+ sl_move(sl, RIGHT);
break;
case 'D': /* left */
- if (sl->rcur > 0)
- sl->rcur--;
- sl->bcur = sl_postobyte(sl, sl->rcur);
- sl->ptr = sl->buf + sl->bcur;
+ sl_move(sl, LEFT);
break;
case 'H': /* Home */
- sl->bcur = sl->rcur = 0;
- sl->ptr = sl->buf;
+ sl_move(sl, HOME);
break;
case 'F': /* End */
- sl->rcur = sl->rlen;
- sl->bcur = sl_postobyte(sl, sl->rcur);
- sl->ptr = sl->buf + sl->bcur;
+ sl_move(sl, END);
break;
case 'P': /* delete */
if (sl->rcur == sl->rlen)
break;
-
- char *ncur = sl_postoptr(sl, sl->rcur + 1);
-
- memmove(sl->ptr, ncur, sl->last - ncur);
-
- sl->rlen--;
- sl->blen = sl_postobyte(sl, sl->rlen);
-
- sl->last -= ncur - sl->ptr;
- *sl->last = '\0';
+ sl_move(sl, RIGHT);
+ sl_backspace(sl);
break;
case '0':
case '1':
@@ -188,13 +202,10 @@ sl_keystroke(struct slackline *sl, int key)
case '~':
switch(sl->nummod) {
case '7':
- sl->bcur = sl->rcur = 0;
- sl->ptr = sl->buf;
+ sl_move(sl, HOME);
break;
case '8':
- sl->rcur = sl->rlen;
- sl->bcur = sl_postobyte(sl, sl->rcur);
- sl->ptr = sl->buf + sl->bcur;
+ sl_move(sl, END);
break;
}
sl->esc = ESC_NONE;
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.