mirror of https://github.com/0intro/wmii
refactored insert/delete stuff into separate functions in kpress, this is necessary for chording/snarfing/paste
This commit is contained in:
parent
fd462e83c7
commit
c14d264475
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue