Allen Webster 2016-06-03 09:40:16 -04:00
commit a4b892fbf1
1 changed files with 48 additions and 13 deletions

View File

@ -166,6 +166,7 @@ struct Linux_Vars{
String clipboard_outgoing; String clipboard_outgoing;
b32 new_clipboard; b32 new_clipboard;
Atom atom_TARGETS;
Atom atom_CLIPBOARD; Atom atom_CLIPBOARD;
Atom atom_UTF8_STRING; Atom atom_UTF8_STRING;
Atom atom__NET_WM_STATE; Atom atom__NET_WM_STATE;
@ -2272,27 +2273,57 @@ LinuxHandleX11Events(void)
response.time = request.time; response.time = request.time;
response.property = None; response.property = None;
//TODO(inso): handle TARGETS negotiation instead of requiring UTF8_STRING
if ( if (
linuxvars.clipboard_outgoing.size && linuxvars.clipboard_outgoing.size &&
request.target == linuxvars.atom_UTF8_STRING &&
request.selection == linuxvars.atom_CLIPBOARD && request.selection == linuxvars.atom_CLIPBOARD &&
request.property != None && request.property != None &&
request.display && request.display &&
request.requestor request.requestor
){ ){
XChangeProperty( Atom atoms[] = {
request.display, XA_STRING,
request.requestor, linuxvars.atom_UTF8_STRING
request.property, };
request.target,
8,
PropModeReplace,
(unsigned char*)linuxvars.clipboard_outgoing.str,
linuxvars.clipboard_outgoing.size
);
response.property = request.property; if(request.target == linuxvars.atom_TARGETS){
XChangeProperty(
request.display,
request.requestor,
request.property,
XA_ATOM,
32,
PropModeReplace,
(u8*)atoms,
ArrayCount(atoms)
);
response.property = request.property;
} else {
b32 found = false;
for(int i = 0; i < ArrayCount(atoms); ++i){
if(request.target == atoms[i]){
found = true;
break;
}
}
if(found){
XChangeProperty(
request.display,
request.requestor,
request.property,
request.target,
8,
PropModeReplace,
(u8*)linuxvars.clipboard_outgoing.str,
linuxvars.clipboard_outgoing.size
);
response.property = request.property;
}
}
} }
XSendEvent(request.display, request.requestor, True, 0, (XEvent*)&response); XSendEvent(request.display, request.requestor, True, 0, (XEvent*)&response);
@ -2339,6 +2370,7 @@ LinuxHandleX11Events(void)
should_step = 1; should_step = 1;
linuxvars.new_clipboard = 1; linuxvars.new_clipboard = 1;
XFree(data); XFree(data);
XDeleteProperty(linuxvars.XDisplay, linuxvars.XWindow, linuxvars.atom_CLIPBOARD);
} }
} }
}break; }break;
@ -2585,6 +2617,7 @@ main(int argc, char **argv)
#define LOAD_ATOM(x) linuxvars.atom_##x = XInternAtom(linuxvars.XDisplay, #x, False); #define LOAD_ATOM(x) linuxvars.atom_##x = XInternAtom(linuxvars.XDisplay, #x, False);
LOAD_ATOM(TARGETS);
LOAD_ATOM(CLIPBOARD); LOAD_ATOM(CLIPBOARD);
LOAD_ATOM(UTF8_STRING); LOAD_ATOM(UTF8_STRING);
LOAD_ATOM(_NET_WM_STATE); LOAD_ATOM(_NET_WM_STATE);
@ -2619,6 +2652,8 @@ main(int argc, char **argv)
linuxvars.atom_CLIPBOARD, linuxvars.atom_CLIPBOARD,
XFixesSetSelectionOwnerNotifyMask XFixesSetSelectionOwnerNotifyMask
); );
} else {
fputs("Your X server doesn't support XFIXES, mention this fact if you report any clipboard-related issues.\n", stderr);
} }
Init_Input_Result input_result = Init_Input_Result input_result =