}
Atom convert_sel_outer(Window requestor, Atom target, Atom property) {
+ /*
+ * ICCCM 2.2 says that obsolete clients requesting the selection
+ * request may not specify a property name under which they want
+ * the data written to their window; selection owners are
+ * encouraged to support such clients by reusing the selection
+ * target name as the property.
+ */
+ if (property == None)
+ property = target;
+
if (target == multiple_atom) {
/*
* Support for the MULTIPLE selection type, since it's
return;
}
} else {
+ int have_ownership = True;
+
switch (ev.type) {
case SelectionClear:
/* Selection has been cleared by another app. */
- return;
+ have_ownership = False;
+ break;
case SelectionRequest:
- e2.xselection.type = SelectionNotify;
- e2.xselection.requestor = ev.xselectionrequest.requestor;
- e2.xselection.selection = ev.xselectionrequest.selection;
- e2.xselection.target = ev.xselectionrequest.target;
- e2.xselection.time = ev.xselectionrequest.time;
- e2.xselection.property =
- convert_sel_outer(ev.xselectionrequest.requestor,
- ev.xselectionrequest.target,
- ev.xselectionrequest.property);
- XSendEvent (disp, ev.xselectionrequest.requestor,
- False, 0, &e2);
+ if (have_ownership) {
+ e2.xselection.type = SelectionNotify;
+ e2.xselection.requestor = ev.xselectionrequest.requestor;
+ e2.xselection.selection = ev.xselectionrequest.selection;
+ e2.xselection.target = ev.xselectionrequest.target;
+ e2.xselection.time = ev.xselectionrequest.time;
+ e2.xselection.property =
+ convert_sel_outer(ev.xselectionrequest.requestor,
+ ev.xselectionrequest.target,
+ ev.xselectionrequest.property);
+ XSendEvent (disp, ev.xselectionrequest.requestor,
+ False, 0, &e2);
+ }
break;
case PropertyNotify:
for (i = j = 0; i < nincrs; i++) {
nincrs = j;
break;
}
+ if (nincrs == 0 && !have_ownership)
+ return;
}
}
}