Small cleanup, move selection supplying to a func
This commit is contained in:
@@ -50,6 +50,59 @@ static void help(const char name[]) {
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CUT_MAX (16 * 1024)
|
||||||
|
static uint8_t cutbuf[CUT_MAX];
|
||||||
|
|
||||||
|
static void supplyselection(Display *disp, const XEvent * const ev, const Atom xa_targets) {
|
||||||
|
XSelectionEvent sev;
|
||||||
|
|
||||||
|
sev.type = SelectionNotify;
|
||||||
|
sev.display = disp;
|
||||||
|
sev.requestor = ev->xselectionrequest.requestor;
|
||||||
|
sev.selection = ev->xselectionrequest.selection;
|
||||||
|
sev.target = ev->xselectionrequest.target;
|
||||||
|
sev.time = ev->xselectionrequest.time;
|
||||||
|
/*printf("someone wants our clipboard, sel %lu, tgt %lu, prop %lu\n",
|
||||||
|
sev.selection, sev.target,
|
||||||
|
ev.xselectionrequest.property);*/
|
||||||
|
|
||||||
|
if (ev->xselectionrequest.property == None)
|
||||||
|
sev.property = sev.target;
|
||||||
|
else
|
||||||
|
sev.property = ev->xselectionrequest.property;
|
||||||
|
|
||||||
|
const uint32_t len = strlen((char *) cutbuf);
|
||||||
|
|
||||||
|
if (xa_targets != None &&
|
||||||
|
sev.target == xa_targets) {
|
||||||
|
// Which formats can we do
|
||||||
|
Atom tgt[2] = {
|
||||||
|
xa_targets,
|
||||||
|
XA_STRING
|
||||||
|
};
|
||||||
|
|
||||||
|
XChangeProperty(disp, sev.requestor,
|
||||||
|
ev->xselectionrequest.property,
|
||||||
|
XA_ATOM, 32,
|
||||||
|
PropModeReplace,
|
||||||
|
(unsigned char *) tgt,
|
||||||
|
2);
|
||||||
|
//puts("sent targets");
|
||||||
|
} else {
|
||||||
|
// Data
|
||||||
|
XChangeProperty(disp, sev.requestor,
|
||||||
|
ev->xselectionrequest.property,
|
||||||
|
sev.target, 8,
|
||||||
|
PropModeReplace,
|
||||||
|
cutbuf, len);
|
||||||
|
//printf("sent data, of len %u\n", len);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send the notify event
|
||||||
|
XSendEvent(disp, sev.requestor, False, 0,
|
||||||
|
(XEvent *) &sev);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
|
|
||||||
const char *appstr = ":0";
|
const char *appstr = ":0";
|
||||||
@@ -57,9 +110,6 @@ int main(int argc, char **argv) {
|
|||||||
uint8_t resize = 0;
|
uint8_t resize = 0;
|
||||||
uint8_t fps = 30;
|
uint8_t fps = 30;
|
||||||
|
|
||||||
#define CUT_MAX (16 * 1024)
|
|
||||||
uint8_t cutbuf[CUT_MAX];
|
|
||||||
|
|
||||||
const struct option longargs[] = {
|
const struct option longargs[] = {
|
||||||
{"app-display", 1, NULL, 'a'},
|
{"app-display", 1, NULL, 'a'},
|
||||||
{"vnc-display", 1, NULL, 'v'},
|
{"vnc-display", 1, NULL, 'v'},
|
||||||
@@ -159,12 +209,8 @@ int main(int argc, char **argv) {
|
|||||||
XFixesSelectSelectionInput(vncdisp, vncroot, XA_PRIMARY,
|
XFixesSelectSelectionInput(vncdisp, vncroot, XA_PRIMARY,
|
||||||
XFixesSetSelectionOwnerNotifyMask);
|
XFixesSetSelectionOwnerNotifyMask);
|
||||||
|
|
||||||
#ifndef XA_LENGTH
|
Atom xa_targets_vnc = XInternAtom(vncdisp, "TARGETS", False);
|
||||||
Atom XA_LENGTH = XInternAtom(vncdisp, "LENGTH", True);
|
Atom xa_targets_app = XInternAtom(appdisp, "TARGETS", False);
|
||||||
#endif
|
|
||||||
static Atom xa_targets = None;
|
|
||||||
if (xa_targets == None)
|
|
||||||
xa_targets = XInternAtom(vncdisp, "TARGETS", False);
|
|
||||||
Window selwin = XCreateSimpleWindow(appdisp, approot, 3, 2, 1, 1, 0, 0, 0);
|
Window selwin = XCreateSimpleWindow(appdisp, approot, 3, 2, 1, 1, 0, 0, 0);
|
||||||
Window vncselwin = XCreateSimpleWindow(vncdisp, vncroot, 3, 2, 1, 1, 0, 0, 0);
|
Window vncselwin = XCreateSimpleWindow(vncdisp, vncroot, 3, 2, 1, 1, 0, 0, 0);
|
||||||
|
|
||||||
@@ -305,8 +351,6 @@ int main(int argc, char **argv) {
|
|||||||
XEvent ev;
|
XEvent ev;
|
||||||
XNextEvent(vncdisp, &ev);
|
XNextEvent(vncdisp, &ev);
|
||||||
|
|
||||||
XSelectionEvent sev;
|
|
||||||
|
|
||||||
if (ev.type == xfixesbasevnc + XFixesSelectionNotify) {
|
if (ev.type == xfixesbasevnc + XFixesSelectionNotify) {
|
||||||
XFixesSelectionNotifyEvent *xfe =
|
XFixesSelectionNotifyEvent *xfe =
|
||||||
(XFixesSelectionNotifyEvent *) &ev;
|
(XFixesSelectionNotifyEvent *) &ev;
|
||||||
@@ -337,61 +381,7 @@ int main(int argc, char **argv) {
|
|||||||
CurrentTime);
|
CurrentTime);
|
||||||
break;
|
break;
|
||||||
case SelectionRequest:
|
case SelectionRequest:
|
||||||
sev.type = SelectionNotify;
|
supplyselection(vncdisp, &ev, xa_targets_vnc);
|
||||||
sev.display = vncdisp;
|
|
||||||
sev.requestor = ev.xselectionrequest.requestor;
|
|
||||||
sev.selection = ev.xselectionrequest.selection;
|
|
||||||
sev.target = ev.xselectionrequest.target;
|
|
||||||
sev.time = ev.xselectionrequest.time;
|
|
||||||
/*printf("vnc wants our clipboard, sel %lu, tgt %lu, prop %lu\n",
|
|
||||||
sev.selection, sev.target,
|
|
||||||
ev.xselectionrequest.property);*/
|
|
||||||
|
|
||||||
if (ev.xselectionrequest.property == None)
|
|
||||||
sev.property = sev.target;
|
|
||||||
else
|
|
||||||
sev.property = ev.xselectionrequest.property;
|
|
||||||
|
|
||||||
uint32_t len = strlen((char *) cutbuf);
|
|
||||||
|
|
||||||
if (ev.xselectionrequest.target == XA_LENGTH) {
|
|
||||||
// They're asking for the length
|
|
||||||
long llen = len;
|
|
||||||
XChangeProperty(vncdisp, sev.requestor,
|
|
||||||
ev.xselectionrequest.property,
|
|
||||||
sev.target, 32,
|
|
||||||
PropModeReplace,
|
|
||||||
(unsigned char *) &llen,
|
|
||||||
1);
|
|
||||||
//puts("sent len");
|
|
||||||
} else if (xa_targets != None &&
|
|
||||||
sev.target == xa_targets) {
|
|
||||||
// Which formats can we do
|
|
||||||
Atom tgt[2] = {
|
|
||||||
xa_targets,
|
|
||||||
XA_STRING
|
|
||||||
};
|
|
||||||
|
|
||||||
XChangeProperty(vncdisp, sev.requestor,
|
|
||||||
ev.xselectionrequest.property,
|
|
||||||
XA_ATOM, 32,
|
|
||||||
PropModeReplace,
|
|
||||||
(unsigned char *) tgt,
|
|
||||||
2);
|
|
||||||
//puts("sent targets");
|
|
||||||
} else {
|
|
||||||
// Data
|
|
||||||
XChangeProperty(vncdisp, sev.requestor,
|
|
||||||
ev.xselectionrequest.property,
|
|
||||||
sev.target, 8,
|
|
||||||
PropModeReplace,
|
|
||||||
cutbuf, len);
|
|
||||||
//printf("sent data, of len %u\n", len);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send the notify event
|
|
||||||
XSendEvent(vncdisp, sev.requestor, False, 0,
|
|
||||||
(XEvent *) &sev);
|
|
||||||
break;
|
break;
|
||||||
case SelectionNotify:
|
case SelectionNotify:
|
||||||
{
|
{
|
||||||
@@ -447,8 +437,6 @@ int main(int argc, char **argv) {
|
|||||||
XEvent ev;
|
XEvent ev;
|
||||||
XNextEvent(appdisp, &ev);
|
XNextEvent(appdisp, &ev);
|
||||||
|
|
||||||
XSelectionEvent sev;
|
|
||||||
|
|
||||||
if (ev.type == xfixesbase + XFixesSelectionNotify) {
|
if (ev.type == xfixesbase + XFixesSelectionNotify) {
|
||||||
XFixesSelectionNotifyEvent *xfe =
|
XFixesSelectionNotifyEvent *xfe =
|
||||||
(XFixesSelectionNotifyEvent *) &ev;
|
(XFixesSelectionNotifyEvent *) &ev;
|
||||||
@@ -498,65 +486,7 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SelectionRequest:
|
case SelectionRequest:
|
||||||
/* printf("app selreq, owner %lu requester %lu, approot %lu selwin %lu\n",
|
supplyselection(appdisp, &ev, xa_targets_app);
|
||||||
ev.xselectionrequest.owner,
|
|
||||||
ev.xselectionrequest.requestor,
|
|
||||||
approot, selwin);*/
|
|
||||||
sev.type = SelectionNotify;
|
|
||||||
sev.display = appdisp;
|
|
||||||
sev.requestor = ev.xselectionrequest.requestor;
|
|
||||||
sev.selection = ev.xselectionrequest.selection;
|
|
||||||
sev.target = ev.xselectionrequest.target;
|
|
||||||
sev.time = ev.xselectionrequest.time;
|
|
||||||
/*printf("app wants our clipboard, sel %lu, tgt %lu, prop %lu\n",
|
|
||||||
sev.selection, sev.target,
|
|
||||||
ev.xselectionrequest.property);*/
|
|
||||||
|
|
||||||
if (ev.xselectionrequest.property == None)
|
|
||||||
sev.property = sev.target;
|
|
||||||
else
|
|
||||||
sev.property = ev.xselectionrequest.property;
|
|
||||||
|
|
||||||
uint32_t len = strlen((char *) cutbuf);
|
|
||||||
|
|
||||||
if (ev.xselectionrequest.target == XA_LENGTH) {
|
|
||||||
// They're asking for the length
|
|
||||||
long llen = len;
|
|
||||||
XChangeProperty(appdisp, sev.requestor,
|
|
||||||
ev.xselectionrequest.property,
|
|
||||||
sev.target, 32,
|
|
||||||
PropModeReplace,
|
|
||||||
(unsigned char *) &llen,
|
|
||||||
1);
|
|
||||||
//puts("sent len");
|
|
||||||
} else if (xa_targets != None &&
|
|
||||||
sev.target == xa_targets) {
|
|
||||||
// Which formats can we do
|
|
||||||
Atom tgt[2] = {
|
|
||||||
xa_targets,
|
|
||||||
XA_STRING
|
|
||||||
};
|
|
||||||
|
|
||||||
XChangeProperty(appdisp, sev.requestor,
|
|
||||||
ev.xselectionrequest.property,
|
|
||||||
XA_ATOM, 32,
|
|
||||||
PropModeReplace,
|
|
||||||
(unsigned char *) tgt,
|
|
||||||
2);
|
|
||||||
//puts("sent targets");
|
|
||||||
} else {
|
|
||||||
// Data
|
|
||||||
XChangeProperty(appdisp, sev.requestor,
|
|
||||||
ev.xselectionrequest.property,
|
|
||||||
sev.target, 8,
|
|
||||||
PropModeReplace,
|
|
||||||
cutbuf, len);
|
|
||||||
//printf("sent data, of len %u\n", len);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Send the notify event
|
|
||||||
XSendEvent(appdisp, sev.requestor, False, 0,
|
|
||||||
(XEvent *) &sev);
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf("Unexpected app event type %u\n", ev.type);
|
printf("Unexpected app event type %u\n", ev.type);
|
||||||
|
|||||||
Reference in New Issue
Block a user