commit c14d2644758b1a9111db1629e11915f4bebccbda
parent fd462e83c757c863a21ea67cb552f1987ffd5dd0
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Thu, 6 Jul 2006 15:27:54 +0200
refactored insert/delete stuff into separate functions in kpress, this is necessary for chording/snarfing/paste
Diffstat:
2 files changed, 51 insertions(+), 38 deletions(-)
diff --git 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
@@ -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: