add clipboard feature to entry
git-svn-id: http://svn2.nishi.boats/svn/milsko/trunk@611 b9cfdab3-6d41-4d17-bbe4-086880011989
This commit is contained in:
parent
9874b24846
commit
12fdfe0864
2 changed files with 51 additions and 3 deletions
|
|
@ -785,8 +785,42 @@ void MwLLSetClipboard(MwLL handle, const char* text) {
|
||||||
}
|
}
|
||||||
|
|
||||||
char* MwLLGetClipboard(MwLL handle) {
|
char* MwLLGetClipboard(MwLL handle) {
|
||||||
/* TODO */
|
Atom clip, target, prop;
|
||||||
|
XEvent ev;
|
||||||
|
XEvent* queue = NULL;
|
||||||
|
char* r = NULL;
|
||||||
|
|
||||||
(void)handle;
|
clip = XInternAtom(handle->display, "CLIPBOARD", 0);
|
||||||
return NULL;
|
target = XA_STRING;
|
||||||
|
prop = XInternAtom(handle->display, "XSEL_DATA", 0);
|
||||||
|
|
||||||
|
XConvertSelection(handle->display, clip, target, prop, handle->window, CurrentTime);
|
||||||
|
|
||||||
|
while(1){
|
||||||
|
XNextEvent(handle->display, &ev);
|
||||||
|
if(ev.type == SelectionNotify){
|
||||||
|
if(ev.xselection.selection == clip && ev.xselection.property != 0){
|
||||||
|
Atom t;
|
||||||
|
unsigned long size, N;
|
||||||
|
char* data;
|
||||||
|
int format;
|
||||||
|
|
||||||
|
XGetWindowProperty(ev.xselection.display, ev.xselection.requestor, ev.xselection.property, 0L, (~0L), 0, AnyPropertyType, &t, &format, &size, &N, (unsigned char**)&data);
|
||||||
|
if(t == target){
|
||||||
|
r = MwStringDupliacte(data);
|
||||||
|
XFree(data);
|
||||||
|
}
|
||||||
|
XDeleteProperty(ev.xselection.display, ev.xselection.requestor, ev.xselection.property);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while(arrlen(queue) > 0){
|
||||||
|
XPutBackEvent(handle->display, &queue[0]);
|
||||||
|
arrdel(queue, 0);
|
||||||
|
}
|
||||||
|
arrfree(queue);
|
||||||
|
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,20 @@ static void key(MwWidget handle, int code) {
|
||||||
} else if(code == MwLLKeyEnter) {
|
} else if(code == MwLLKeyEnter) {
|
||||||
MwDispatchUserHandler(handle, MwNactivateHandler, NULL);
|
MwDispatchUserHandler(handle, MwNactivateHandler, NULL);
|
||||||
} else if(code == (MwLLControlMask | 'v')){
|
} else if(code == (MwLLControlMask | 'v')){
|
||||||
|
char* c = MwLLGetClipboard(handle->lowlevel);
|
||||||
|
if(c != NULL){
|
||||||
|
char* out = malloc(strlen(str) + strlen(c) + 1);
|
||||||
|
|
||||||
|
MwUTF8Copy(str, 0, out, 0, t->cursor);
|
||||||
|
MwUTF8Copy(c, 0, out, t->cursor, MwUTF8Length(c));
|
||||||
|
MwUTF8Copy(str, t->cursor, out, t->cursor + MwUTF8Length(c), MwUTF8Length(str) - t->cursor);
|
||||||
|
|
||||||
|
t->cursor += MwUTF8Length(c);
|
||||||
|
|
||||||
|
MwSetText(handle, MwNtext, out);
|
||||||
|
free(out);
|
||||||
|
free(c);
|
||||||
|
}
|
||||||
} else if(!(code & MwLLKeyMask)) {
|
} else if(!(code & MwLLKeyMask)) {
|
||||||
int incr = 0;
|
int incr = 0;
|
||||||
out = malloc(strlen(str) + 5 + 1);
|
out = malloc(strlen(str) + 5 + 1);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue