Created program logic.

This commit is contained in:
Nicolás Ortega Froysa 2019-04-16 19:20:02 +02:00
parent 2a0d2559b8
commit 8f8e68a83b

View File

@ -16,16 +16,120 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <signal.h>
#include <stdio.h> #include <stdio.h>
#include <time.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
int run;
void *data;
size_t data_size;
void quit() {
run = 0;
}
void send_selection(Display *display, XSelectionRequestEvent *sre, Atom utf8) {
XSelectionEvent se;
time_t now_tm;
char *now;
now_tm = time(NULL);
now = ctime(&now_tm);
#ifdef DEBUG
char *an = XGetAtomName(display, sre->property);
printf("Sending CLIPBOARD to window 0x%1x, property '%s'\n", sre->requestor, an);
if(an)
XFree(an);
#endif
XChangeProperty(display, sre->requestor, sre->property, utf8, 8, PropModeReplace, data, data_size);
}
int main() { int main() {
Display *display = XOpenDisplay(NULL); Display *display;
Window clip_win, root, owner;
int screen;
Atom selection, utf8, clip_property;
XEvent event;
// get current X display
display = XOpenDisplay(NULL);
if(!display) if(!display)
{ {
fprintf(stderr, "Could not open X display.\n"); fprintf(stderr, "Could not open X display.\n");
return 1; return 1;
} }
screen = DefaultScreen(display);
root = RootWindow(display, screen);
// create a dummy window for tinyclip
clip_win = XCreateSimpleWindow(display, root, -10, -10, 1, 1, 0, 0, 0);
XSelectInput(display, clip_win,
SelectionClear | SelectionRequest | SelectionNotify);
// create atoms for selections
selection = XInternAtom(display, "CLIPBOARD", 0);
utf8 = XInternAtom(display, "UTF8_STRING", 0);
clip_property = XInternAtom(display, "TINYCLIP", 0);
// check if there is currently someone using the clipboard
owner = XGetSelectionOwner(display, selection);
if(owner != None)
{
// take ownership of clipboard while copying contents
#ifdef DEBUG
printf("Current owner: 0x%1X\n", owner);
#endif
XConvertSelection(display, selection, utf8,
clip_property, clip_win, CurrentTime);
}
else
{
XSetSelectionOwner(display, selection, clip_win, CurrentTime);
}
run = 1;
signal(SIGINT, quit);
while(run)
{
XNextEvent(display, &event);
XSelectionRequestEvent *sre;
XSelectionEvent *se;
switch(event.type)
{
case SelectionClear:
// if someone else took the clipboard, regain ownership
#ifdef DEBUG
printf("Lost selection.\n");
#endif
XConvertSelection(display, selection, utf8,
clip_property, clip_win, CurrentTime);
break;
case SelectionNotify:
se = (XSelectionEvent*)&event.xselection;
if(se->property == None)
fprintf(stderr, "Conversion impossible.");
else
{
// TODO: handle new clipboard information
}
XSetSelectionOwner(display, selection, clip_win, CurrentTime);
break;
case SelectionRequest:
// respond to request for clipboard
sre = (XSelectionRequestEvent*) &event.xselectionrequest;
#ifdef DEBUG
printf("New selection request:\n"
" requestor: 0x%1x\n", sre->requestor);
#endif
send_selection(display, sre, utf8);
break;
}
}
return 0; return 0;
} }