From c14d2644758b1a9111db1629e11915f4bebccbda Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Thu, 6 Jul 2006 15:27:54 +0200 Subject: [PATCH] refactored insert/delete stuff into separate functions in kpress, this is necessary for chording/snarfing/paste --- liblitz/blitz.h | 2 +- liblitz/input.c | 87 ++++++++++++++++++++++++++++--------------------- 2 files changed, 51 insertions(+), 38 deletions(-) diff --git a/liblitz/blitz.h b/liblitz/blitz.h index 32eea956..08ae5faa 100644 --- a/liblitz/blitz.h +++ b/liblitz/blitz.h @@ -115,4 +115,4 @@ void blitz_brelease_input(BlitzInput *i, int button, int x, int y, unsigned long void blitz_bmotion_input(BlitzInput *i, int x, int y); Bool blitz_ispointinrect(int x, int y, XRectangle * r); void blitz_setinput(BlitzInput *i, char *text); -void blitz_kpress_input(BlitzInput *i, unsigned long mod, KeySym k, char *ks); +void blitz_kpress_input(BlitzInput *i, unsigned long mod, KeySym k, char *text); diff --git a/liblitz/input.c b/liblitz/input.c index c6ab4da7..2fa8e03e 100644 --- a/liblitz/input.c +++ b/liblitz/input.c @@ -303,13 +303,56 @@ blitz_bmotion_input(BlitzInput *i, int x, int y) xdraw(i); } -void -blitz_kpress_input(BlitzInput *i, unsigned long mod, KeySym k, char *ks) +static void +delete(BlitzInput *i, char *start, char *end) +{ + if(!start) + return; + else if((start == end) && (start != i->text)) { + i->curstart = i->curend = --start; + memmove(start, start + 1, strlen(start + 1)); + i->len--; + } + else { + i->curstart = i->curend = start; + memmove(start, end, strlen(end)); + i->len -= (end - start); + } + i->text[i->len] = 0; +} + +static void +insert(BlitzInput *i, char *start, char *end, char *text) { - char *start, *end; unsigned int len; int s, e; + if(!(len = strlen(text))) + return; + if(!start) { + blitz_setinput(i, text); + return; + } + i->len = i->len - (end - start) + len; + if(i->len + 1 > i->size) { + s = start - i->text; + e = end - i->text; + i->size = 2 * i->len + 1; + i->text = cext_erealloc(i->text, i->size); + start = i->text + s; + end = i->text + e; + } + memmove(start + len, end, strlen(end)); + memcpy(start, text, len); + i->curstart = i->curend = start + len; + i->text[i->len] = 0; +} + +void +blitz_kpress_input(BlitzInput *i, unsigned long mod, KeySym k, char *text) +{ + char *start, *end; + start = curstart(i); end = curend(i); if(mod & ControlMask) { @@ -371,41 +414,11 @@ blitz_kpress_input(BlitzInput *i, unsigned long mod, KeySym k, char *ks) } else { switch(k) { - case XK_BackSpace: - if(!start) - return; - else if((start == end) && (start != i->text)) { - i->curstart = i->curend = --start; - memmove(start, start + 1, strlen(start + 1)); - i->len--; - } - else { - i->curstart = i->curend = start; - memmove(start, end, strlen(end)); - i->len -= (end - start); - } - i->text[i->len] = 0; - goto Draw; default: - if(!(len = strlen(ks))) - return; - if(!start) { - blitz_setinput(i, ks); - goto Draw; - } - i->len = i->len - (end - start) + len; - if(i->len + 1 > i->size) { - s = start - i->text; - e = end - i->text; - i->size = 2 * i->len + 1; - i->text = cext_erealloc(i->text, i->size); - start = i->text + s; - end = i->text + e; - } - memmove(start + len, end, strlen(end)); - memcpy(start, ks, len); - i->curstart = i->curend = start + len; - i->text[i->len] = 0; + insert(i, start, end, text); + break; + case XK_BackSpace: + delete(i, start, end); } } Draw: