refactored insert/delete stuff into separate functions in kpress, this is necessary for chording/snarfing/paste

This commit is contained in:
Anselm R. Garbe 2006-07-06 15:27:54 +02:00
parent fd462e83c7
commit c14d264475
2 changed files with 51 additions and 38 deletions

View File

@ -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);

View File

@ -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: