Improved closing application.

This commit is contained in:
Nicolás Ortega Froysa 2019-04-17 17:09:40 +02:00
parent 25a68d31cc
commit e1dbccf7f6

View File

@ -23,21 +23,28 @@
#include <string.h>
#include <X11/Xlib.h>
Display *display;
Window clip_win;
int run;
void *data;
size_t data_size;
void quit() {
run = 0;
XClientMessageEvent cme;
cme.type = ClientMessage;
cme.format = 32;
XSendEvent(display, clip_win, 0, 0, (XEvent*)&cme);
XFlush(display);
}
void get_selection(Display *display, Window window, Atom property) {
void get_selection(Atom property) {
Atom da, incr, type;
int di;
unsigned long size, dul;
unsigned char *prop_ret = NULL;
XGetWindowProperty(display, window, property, 0, 0, 0, AnyPropertyType,
XGetWindowProperty(display, clip_win, property, 0, 0, 0, AnyPropertyType,
&type, &di, &dul, &size, &prop_ret);
XFree(prop_ret);
@ -51,7 +58,7 @@ void get_selection(Display *display, Window window, Atom property) {
#ifdef DEBUG
printf("Property size: %lu\n", size);
#endif
XGetWindowProperty(display, window, property, 0, size, 0, AnyPropertyType,
XGetWindowProperty(display, clip_win, property, 0, size, 0, AnyPropertyType,
&da, &di, &dul, &dul, &prop_ret);
free(data);
data = malloc(size);
@ -61,10 +68,10 @@ void get_selection(Display *display, Window window, Atom property) {
printf("Received data: %s\n", (char*)data);
#endif
XFree(prop_ret);
XDeleteProperty(display, window, property);
XDeleteProperty(display, clip_win, property);
}
void send_reject(Display *display, XSelectionRequestEvent *sre) {
void send_reject(XSelectionRequestEvent *sre) {
XSelectionEvent reply_se;
#ifdef DEBUG
@ -86,8 +93,7 @@ void send_reject(Display *display, XSelectionRequestEvent *sre) {
NoEventMask, (XEvent*)&reply_se);
}
void send_selection(Display *display,
XSelectionRequestEvent *sre, Atom utf8)
void send_selection(XSelectionRequestEvent *sre, Atom utf8)
{
XSelectionEvent reply_se;
@ -114,11 +120,9 @@ void send_selection(Display *display,
}
int main() {
Display *display;
Window clip_win, root, owner;
Window root, owner;
int screen;
Atom selection, utf8, clip_property;
XEvent event;
data = NULL;
data_size = 0;
@ -135,7 +139,7 @@ int main() {
// 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);
SelectionClear | SelectionRequest | SelectionNotify | ClientMessage);
// create atoms for selections
selection = XInternAtom(display, "CLIPBOARD", 0);
@ -161,11 +165,15 @@ int main() {
run = 1;
signal(SIGINT, quit);
Atom wmDeleteMessage = XInternAtom(display, "WM_DELETE_WINDOW", 0);
XSetWMProtocols(display, clip_win, &wmDeleteMessage, 1);
while(run)
{
XNextEvent(display, &event);
XEvent event;
XSelectionRequestEvent *sre;
XSelectionEvent *se;
XNextEvent(display, &event);
switch(event.type)
{
case SelectionClear:
@ -179,7 +187,7 @@ int main() {
if(se->property == None)
fprintf(stderr, "Conversion impossible.");
else
get_selection(display, clip_win, clip_property);
get_selection(clip_property);
XSetSelectionOwner(display, selection, clip_win, CurrentTime);
break;
case SelectionRequest:
@ -190,9 +198,11 @@ int main() {
" requestor: 0x%1x\n", (unsigned int)sre->requestor);
#endif
if(sre->target != utf8 || sre->property == None)
send_reject(display, sre);
send_reject(sre);
else
send_selection(display, sre, utf8);
send_selection(sre, utf8);
break;
case ClientMessage:
break;
}
}