diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/r-x11.c | 105 | ||||
| -rw-r--r-- | src/r-x11.h | 24 | 
2 files changed, 129 insertions, 0 deletions
| diff --git a/src/r-x11.c b/src/r-x11.c new file mode 100644 index 0000000..0e68225 --- /dev/null +++ b/src/r-x11.c @@ -0,0 +1,105 @@ +/*** +	This file is part of LockPassword +	Copyright (C) 2020-2021 Aleksandr D. Goncharov (Joursoir) <chat@joursoir.net> + +	This program is free software: you can redistribute it and/or modify +	it under the terms of the GNU General Public License as published by +	the Free Software Foundation, either version 3 of the License, or +	(at your option) any later version. + +	This program is distributed in the hope that it will be useful, +	but WITHOUT ANY WARRANTY; without even the implied warranty of +	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +	GNU General Public License for more details. + +	You should have received a copy of the GNU General Public License +	along with this program.  If not, see <https://www.gnu.org/licenses/>. +***/ + +#if defined(DISPLAY) + +#include <stdio.h> +#include <string.h> +#include <X11/Xlib.h> + +#include "constants.h" + +static Atom X_utf8; + +static void send_data(Display *dpy, XSelectionRequestEvent *sev, +	const char *data) +{ +	XSelectionEvent ssev; +	Atom target = sev->target; +	char *an; + +	an = XGetAtomName(dpy, target); +	if(an) { +		dbgprint("Request of type '%s'\n", an); +		XFree(an); +	} + +	/* All of these should match the values of the request. */ +	ssev.type = SelectionNotify; +	ssev.requestor = sev->requestor; +	ssev.selection = sev->selection; +	ssev.target = target; +	ssev.property = None; // means refusal +	ssev.time = sev->time; + +	if(target == X_utf8) { +		an = XGetAtomName(dpy, sev->property); +		if(an) { +			dbgprint("Sending data, property '%s'\n", sev->requestor, an); +			XFree(an); +		} + +		ssev.property = sev->property; +		XChangeProperty(dpy, sev->requestor, sev->property, X_utf8, 8, +			PropModeReplace, (unsigned char *)data, strlen(data)); +	} +	else { +		dbgprint("No valid target. Refuse request.\n"); +	} + +	XSendEvent(dpy, sev->requestor, True, NoEventMask, (XEvent *)&ssev); +} + +int run_clipboard(char *data) +{ +	Display *dpy; +	Window owner, root; +	int screen; +	Atom sel; +	XEvent ev; +	XSelectionRequestEvent *sev; + +	dpy = XOpenDisplay(NULL); // means use env $DISPLAY +	if(!dpy) +		errprint(1, "Open X display failed\n"); + +	screen = DefaultScreen(dpy); +	root = RootWindow(dpy, screen); +	owner = XCreateSimpleWindow(dpy, root, -10, -10, 1, 1, 0, 0, 0); + +	sel = XInternAtom(dpy, "CLIPBOARD", False); +	X_utf8 = XInternAtom(dpy, "UTF8_STRING", False); + +	XSetSelectionOwner(dpy, sel, owner, CurrentTime); +	for(;;) +	{ +		XNextEvent(dpy, &ev); +		switch(ev.type) { +		case SelectionClear: +			dbgprint("Lost 'CLIPBOARD' ownership\n"); +			return 2; +		case SelectionRequest: +			sev = (XSelectionRequestEvent *)&ev.xselectionrequest; +			dbgprint("SelectionRequest by 0x%lx\n", sev->requestor); + +			send_data(dpy, sev, data); +		} +	} +} + +#endif /* defined(DISPLAY) */ diff --git a/src/r-x11.h b/src/r-x11.h new file mode 100644 index 0000000..b331bb4 --- /dev/null +++ b/src/r-x11.h @@ -0,0 +1,24 @@ +#ifndef LPASS_RX11_H +#define LPASS_RX11_H + +/*** +	This file is part of LockPassword +	Copyright (C) 2020-2021 Aleksandr D. Goncharov (Joursoir) <chat@joursoir.net> + +	This program is free software: you can redistribute it and/or modify +	it under the terms of the GNU General Public License as published by +	the Free Software Foundation, either version 3 of the License, or +	(at your option) any later version. + +	This program is distributed in the hope that it will be useful, +	but WITHOUT ANY WARRANTY; without even the implied warranty of +	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +	GNU General Public License for more details. + +	You should have received a copy of the GNU General Public License +	along with this program.  If not, see <https://www.gnu.org/licenses/>. +***/ + +int run_clipboard(char *data); + +#endif /* LPASS_RX11_H */ | 
