diff --git a/src/conio/x_events.c b/src/conio/x_events.c index dde918a19091dbf6878a310a1c98b2d4bacbfbcc..bab34f536cadf461f39689ff1985967a98bfd1e8 100644 --- a/src/conio/x_events.c +++ b/src/conio/x_events.c @@ -52,10 +52,10 @@ sem_t mode_set; int x11_window_xpos; int x11_window_ypos; int x11_initialized=0; -sem_t event_thread_complete; -int terminate = 0; +static sem_t event_thread_complete; +static int terminate = 0; Atom copybuf_format; -Atom pastebuf_format; +static Atom pastebuf_format; bool xrender_found; bool xinerama_found; bool xrandr_found; @@ -65,16 +65,82 @@ bool x_internal_scaling = true; * Local variables */ +enum UsedAtom { + // UTF8_STRING: https://www.pps.jussieu.fr/~jch/software/UTF8_STRING/UTF8_STRING.text + ATOM_UTF8_STRING, + // ICCM: https://x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html + ATOM_TARGETS, + ATOM_WM_CLASS, + ATOM_WM_DELETE_WINDOW, + // EWMH: https://specifications.freedesktop.org/wm-spec/wm-spec-1.3.html + ATOM__NET_FRAME_EXTENTS, + ATOM__NET_SUPPORTED, + ATOM__NET_SUPPORTING_WM_CHECK, + ATOM__NET_WM_DESKTOP, + ATOM__NET_WM_ICON, + ATOM__NET_WM_ICON_NAME, + ATOM__NET_WM_NAME, + ATOM__NET_WM_PID, + ATOM__NET_WM_PING, + ATOM__NET_WM_STATE, + ATOM__NET_WM_STATE_FULLSCREEN, + ATOM__NET_WM_STATE_MAXIMIZED_VERT, + ATOM__NET_WM_STATE_MAXIMIZED_HORZ, + ATOM__NET_WM_WINDOW_TYPE, + ATOM__NET_WM_WINDOW_TYPE_NORMAL, + ATOM__NET_WORKAREA, + ATOMCOUNT +}; + +enum AtomStandard { + UTF8_ATOM, + ICCM_ATOM, + EWMH_ATOM +}; + +static uint32_t supported_standards; + +#define XA_UTF8_STRING (0x10000000UL) + +static struct AtomDef { + const char * const name; + const enum AtomStandard standard; + Atom req_type; + const int format; + Atom atom; + bool supported; +} SupportedAtoms[ATOMCOUNT] = { + // UTF8_STRING: https://www.pps.jussieu.fr/~jch/software/UTF8_STRING/UTF8_STRING.text + {"UTF8_STRING", UTF8_ATOM, None, 0, None, false}, + // ICCM: https://x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html + {"TARGETS", ICCM_ATOM, XA_ATOM, 32, None, false}, + {"WM_CLASS", ICCM_ATOM, XA_STRING, 8, None, false}, + {"WM_DELETE_WINDOW", ICCM_ATOM, None, 0, None, false}, + // EWMH: https://specifications.freedesktop.org/wm-spec/wm-spec-1.3.html + {"_NET_FRAME_EXTENTS", EWMH_ATOM, XA_CARDINAL, 32, None, false}, + {"_NET_SUPPORTED", EWMH_ATOM, XA_ATOM, 32, None, false}, + {"_NET_SUPPORTING_WM_CHECK", EWMH_ATOM, XA_WINDOW, 32, None, false}, + {"_NET_WM_DESKTOP", EWMH_ATOM, XA_CARDINAL, 32, None, false}, + {"_NET_WM_ICON", EWMH_ATOM, XA_CARDINAL, 32, None, false}, + {"_NET_WM_ICON_NAME", EWMH_ATOM, XA_UTF8_STRING, 8, None, false}, + {"_NET_WM_NAME", EWMH_ATOM, XA_UTF8_STRING, 8, None, false}, + {"_NET_WM_PID", EWMH_ATOM, XA_CARDINAL, 32, None, false}, + {"_NET_WM_PING", EWMH_ATOM, None, 0, None, false}, + {"_NET_WM_STATE", EWMH_ATOM, XA_ATOM, 32, None, false}, + {"_NET_WM_STATE_FULLSCREEN", EWMH_ATOM, None, 0, None, false}, + {"_NET_WM_STATE_MAXIMIZED_VERT", EWMH_ATOM, None, 0, None, false}, + {"_NET_WM_STATE_MAXIMIZED_HORZ", EWMH_ATOM, None, 0, None, false}, + {"_NET_WM_WINDOW_TYPE", EWMH_ATOM, XA_ATOM, 32, None, false}, + {"_NET_WM_WINDOW_TYPE_NORMAL", EWMH_ATOM, None, 0, None, false}, + {"_NET_WORKAREA", EWMH_ATOM, XA_CARDINAL, 4, None, false}, +}; + +#define A(name) SupportedAtoms[ATOM_ ## name].atom + /* Sets the atom to be used for copy/paste operations */ #define CONSOLE_CLIPBOARD XA_PRIMARY -static Atom WM_DELETE_WINDOW = None; -static Atom _NET_WM_PING = None; -static Atom _NET_WM_STATE = None; static const long _NET_WM_STATE_REMOVE = 0; static const long _NET_WM_STATE_ADD = 1; -static Atom _NET_WM_STATE_FULLSCREEN = None; -static Atom _NET_WM_STATE_MAXIMIZED_VERT = None; -static Atom _NET_WM_STATE_MAXIMIZED_HORZ = None; static Display *dpy=NULL; static Window win; @@ -226,6 +292,124 @@ static struct { { 0x8600, 0x5888, 0x8a00, 0x8c00 }, /* key 88 - F12 */ }; +static struct AtomDef * +get_atom_def(Atom atom) +{ + enum UsedAtom a; + + for (a = 0; a < ATOMCOUNT; a++) { + if (SupportedAtoms[a].atom == atom) + return &SupportedAtoms[a]; + } + + return NULL; +} + +static void +initialize_atoms(void) +{ + enum UsedAtom a; + Atom atr; + int afr; + unsigned long nir; + unsigned long bytes_left = 4; + unsigned char *prop = NULL; + Window w; + Atom atom; + struct AtomDef *ad; + long offset; + + supported_standards |= (1 << UTF8_ATOM); + supported_standards |= (1 << ICCM_ATOM); + + for (a = 0; a < ATOMCOUNT; a++) { + SupportedAtoms[a].atom = x11.XInternAtom(dpy, (char *)SupportedAtoms[a].name, False); + } + + if (A(UTF8_STRING) == None) + supported_standards &= ~(1 << UTF8_ATOM); + + if (supported_standards & (1 << UTF8_ATOM)) { + if (x11.XGetWindowProperty(dpy, root, A(_NET_SUPPORTING_WM_CHECK), 0, 1, False, XA_WINDOW, &atr, &afr, &nir, &bytes_left, &prop) == Success) { + if (atr == XA_WINDOW) { + if (nir == 1) { + w = *(Window *)prop; + x11.XFree(prop); + prop = NULL; + if (x11.XGetWindowProperty(dpy, w, A(_NET_SUPPORTING_WM_CHECK), 0, 1, False, XA_WINDOW, &atr, &afr, &nir, &bytes_left, &prop) == Success) { + if (atr == XA_WINDOW) { + if (nir == 1) { + if (w == *(Window *)prop) { + supported_standards |= (1 << EWMH_ATOM); + } + } + } + } + } + } + if (prop != NULL) + x11.XFree(prop); + } + } + + if (!(supported_standards & (1 << EWMH_ATOM))) { + for (a = 0; a < ATOMCOUNT; a++) { + if (SupportedAtoms[a].standard == EWMH_ATOM) + SupportedAtoms[a].atom = None; + } + } + else { + for (offset = 0, bytes_left = 1; bytes_left; offset += nir) { + if (x11.XGetWindowProperty(dpy, root, A(_NET_SUPPORTED), offset, 1, False, XA_ATOM, &atr, &afr, &nir, &bytes_left, &prop) != Success) + break; + if (atr != XA_ATOM) { + x11.XFree(prop); + break; + } + atom = *(Atom *)prop; + x11.XFree(prop); + if (atom != None) { + ad = get_atom_def(atom); + if (ad != NULL) + ad->supported = true; + } + } + for (a = 0; a < ATOMCOUNT; a++) { + if (SupportedAtoms[a].atom != None) { + if (SupportedAtoms[a].standard != EWMH_ATOM) + SupportedAtoms[a].supported = true; + if (!SupportedAtoms[a].supported) { + SupportedAtoms[a].atom = None; + } + } + } + } + + for (a = 0; a < ATOMCOUNT; a++) { + if (SupportedAtoms[a].req_type == XA_UTF8_STRING) { + if (A(UTF8_STRING) == None) { + SupportedAtoms[a].supported = false; + SupportedAtoms[a].atom = None; + } + else { + SupportedAtoms[a].req_type = A(UTF8_STRING); + } + } + } +} + +static bool +set_win_property(enum UsedAtom atom, Atom type, int format, int action, const void *value, int count) +{ + struct AtomDef *ad = &SupportedAtoms[atom]; + + if (ad->atom == None) + return false; + if (!(supported_standards & (1 << ad->standard))) + return false; + return (x11.XChangeProperty(dpy, win, ad->atom, type, format, action, (unsigned char *)value, count) != 0); +} + static bool fullscreen_geometry(int *x_org, int *y_org, int *width, int *height) { @@ -358,8 +542,9 @@ x11_get_maxsize(int *w, int *h) int afr; long *ret; unsigned long nir; - unsigned long bytes_left = 4; + unsigned long bytes_left; unsigned char *prop; + long desktop = -1; if (dpy == NULL) return false; @@ -369,31 +554,56 @@ x11_get_maxsize(int *w, int *h) } else { // First, try to get _NET_WORKAREA... - if (x11.workarea == None) { - x11.workarea = x11.XInternAtom(dpy, "_NET_WORKAREA", True); + if (A(_NET_WM_DESKTOP) != None && win != 0) { + if (x11.XGetWindowProperty(dpy, win, A(_NET_WM_DESKTOP), 0, 1, False, XA_CARDINAL, &atr, &afr, &nir, &bytes_left, &prop) == Success) { + if (atr == XA_CARDINAL && afr == 32 && nir > 0) { + desktop = *(long *)prop; + } + x11.XFree(prop); + } } - if (x11.workarea != None) { - for (i = 0, offset = 0; bytes_left; i++) { - if (x11.XGetWindowProperty(dpy, root, x11.workarea, offset, 4, False, XA_CARDINAL, &atr, &afr, &nir, &bytes_left, &prop) != Success) + if (A(_NET_WORKAREA) != None) { + for (i = 0, offset = 0, bytes_left = 1; bytes_left; i++, offset += nir) { + if (x11.XGetWindowProperty(dpy, root, A(_NET_WORKAREA), offset, 4, False, XA_CARDINAL, &atr, &afr, &nir, &bytes_left, &prop) != Success) break; if (atr != XA_CARDINAL) { x11.XFree(prop); break; } - if (nir > 0) - offset += nir; ret = (long *)prop; - if (nir >= 3) { - if (ret[2] > maxw) - maxw = ret[2]; + if (desktop == -1) { + if (nir >= 3) { + if (ret[2] > maxw) + maxw = ret[2]; + } + if (nir >= 4) { + if (ret[3] > maxh) + maxh = ret[3]; + } } - if (nir >= 4) { - if (ret[3] > maxh) + else if (desktop == i) { + if (nir >= 3) + maxw = ret[2]; + if (nir >= 4) maxh = ret[3]; + x11.XFree(prop); + break; } x11.XFree(prop); } } + if (maxw > 0 && maxh > 0) { + if (A(_NET_FRAME_EXTENTS) != None && win != 0) { + if (x11.XGetWindowProperty(dpy, win, A(_NET_FRAME_EXTENTS), 0, 4, False, XA_CARDINAL, &atr, &afr, &nir, &bytes_left, &prop) == Success) { + if (atr == XA_CARDINAL && afr == 32 && nir == 4) { + ret = (long *)prop; + maxw -= ret[0] + ret[1]; + maxh -= ret[2] + ret[3]; + } + x11.XFree(prop); + } + } + } } // Couldn't get work area, get size of screen instead. :( @@ -659,11 +869,14 @@ static int init_window() int mw, mh; int screen; int major, minor; + unsigned long pid_l; + Atom a; dpy = x11.XOpenDisplay(NULL); if (dpy == NULL) { return(-1); } + root = DefaultRootWindow(dpy); x11.XSynchronize(dpy, False); #ifdef WITH_XRENDER @@ -680,9 +893,7 @@ static int init_window() #endif xfd = ConnectionNumber(dpy); - x11.utf8 = x11.XInternAtom(dpy, "UTF8_STRING", False); - x11.targets = x11.XInternAtom(dpy, "TARGETS", False); - x11.workarea = x11.XInternAtom(dpy, "_NET_WORKAREA", True); + initialize_atoms(); screen = DefaultScreen(dpy); #ifdef DefaultVisual @@ -709,9 +920,8 @@ static int init_window() black=BlackPixel(dpy, DefaultScreen(dpy)); white=WhitePixel(dpy, DefaultScreen(dpy)); - /* Create window, but defer setting a size and GC. */ + /* Create window, but defer setting a size and GC. */ XSetWindowAttributes wa = {0}; - root = DefaultRootWindow(dpy); parent = root; wincmap = x11.XCreateColormap(dpy, root, visual, AllocNone); x11.XInstallColormap(dpy, wincmap); @@ -743,12 +953,13 @@ static int init_window() x11.XSetWMProperties(dpy, win, NULL, NULL, 0, 0, NULL, wmhints, classhints); x11.XFree(wmhints); } + set_win_property(A(_NET_WM_ICON), XA_CARDINAL, 32, PropModeReplace, ciolib_initial_icon, ciolib_initial_icon_width * ciolib_initial_icon_width); - Atom pid_atom = x11.XInternAtom(dpy, "_NET_WM_PID", False); - if (pid_atom != None) { - unsigned long pid_l = getpid(); - x11.XChangeProperty(dpy, win, pid_atom, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&pid_l, 1); - } + pid_l = getpid(); + set_win_property(ATOM__NET_WM_PID, XA_CARDINAL, 32, PropModeReplace, &pid_l, 1); + a = A(_NET_WM_WINDOW_TYPE_NORMAL); + if (a != None) + set_win_property(ATOM__NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, &a, 1); im = x11.XOpenIM(dpy, NULL, "CIOLIB", "CIOLIB"); if (im != NULL) { @@ -760,13 +971,6 @@ static int init_window() if (classhints) x11.XFree(classhints); - WM_DELETE_WINDOW = x11.XInternAtom(dpy, "WM_DELETE_WINDOW", False); - _NET_WM_PING = x11.XInternAtom(dpy, "_NET_WM_PING", False); - _NET_WM_STATE = x11.XInternAtom(dpy, "_NET_WM_STATE", False); - _NET_WM_STATE_FULLSCREEN = x11.XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); - _NET_WM_STATE_MAXIMIZED_VERT = x11.XInternAtom(dpy, "_NET_WM_STATE_MAXIMIZED_VERT", False); - _NET_WM_STATE_MAXIMIZED_HORZ = x11.XInternAtom(dpy, "_NET_WM_STATE_MAXIMIZED_HORZ", False); - gcv.function = GXcopy; gcv.foreground = black | 0xff000000; gcv.background = white; @@ -780,10 +984,10 @@ static int init_window() x11.XStoreName(dpy, win, "SyncConsole"); Atom protos[2]; int i = 0; - if (WM_DELETE_WINDOW != None) - protos[i++] = WM_DELETE_WINDOW; - if (_NET_WM_PING != None) - protos[i++] = _NET_WM_PING; + if (A(WM_DELETE_WINDOW) != None) + protos[i++] = A(WM_DELETE_WINDOW); + if (A(_NET_WM_PING) != None) + protos[i++] = A(_NET_WM_PING); if (i) x11.XSetWMProtocols(dpy, win, protos, i); @@ -797,18 +1001,18 @@ send_fullscreen(bool set) XEvent ev = {0}; bool ret = false; - if (_NET_WM_STATE != None && _NET_WM_STATE_FULLSCREEN != None) { + if (A(_NET_WM_STATE) != None && A(_NET_WM_STATE_FULLSCREEN) != None) { if (last != set) { ev.xclient.type = ClientMessage; ev.xclient.serial = 0; // Populated by XSendEvent ev.xclient.send_event = True; // Populated by XSendEvent ev.xclient.display = dpy; ev.xclient.window = win; - ev.xclient.message_type = _NET_WM_STATE; + ev.xclient.message_type = A(_NET_WM_STATE); ev.xclient.format = 32; memset(&ev.xclient.data.l, 0, sizeof(ev.xclient.data.l)); ev.xclient.data.l[0] = set ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE; - ev.xclient.data.l[1] = _NET_WM_STATE_FULLSCREEN; + ev.xclient.data.l[1] = A(_NET_WM_STATE_FULLSCREEN); ev.xclient.data.l[3] = 1; ret = x11.XSendEvent(dpy, root, False, SubstructureNotifyMask | SubstructureRedirectMask, &ev) != 0; if (ret) { @@ -1257,16 +1461,16 @@ is_maximized(void) unsigned char *prop; size_t offset; - if (_NET_WM_STATE != None) { + if (A(_NET_WM_STATE) != None) { for (offset = 0; bytes_left; offset += nir) { - if (x11.XGetWindowProperty(dpy, win, _NET_WM_STATE, offset, 1, False, XA_ATOM, &atr, &afr, &nir, &bytes_left, &prop) != Success) + if (x11.XGetWindowProperty(dpy, win, A(_NET_WM_STATE), offset, 1, False, XA_ATOM, &atr, &afr, &nir, &bytes_left, &prop) != Success) break; if (atr != XA_ATOM) { x11.XFree(prop); break; } ret = (Atom *)prop; - if (*ret == _NET_WM_STATE_MAXIMIZED_VERT || *ret == _NET_WM_STATE_MAXIMIZED_HORZ) + if (*ret == A(_NET_WM_STATE_MAXIMIZED_VERT) || *ret == A(_NET_WM_STATE_MAXIMIZED_HORZ)) is = true; x11.XFree(prop); if (is) @@ -1285,15 +1489,22 @@ static int x11_event(XEvent *ev) parent = ev->xreparent.parent; break; case ClientMessage: - if (ev->xclient.format == 32 && ev->xclient.data.l[0] == WM_DELETE_WINDOW && WM_DELETE_WINDOW != None) { + if (ev->xclient.format == 32 && ev->xclient.data.l[0] == A(WM_DELETE_WINDOW) && A(WM_DELETE_WINDOW) != None) { uint16_t key=CIO_KEY_QUIT; write(key_pipe[1], &key, 2); } - else if(ev->xclient.format == 32 && ev->xclient.data.l[0] == _NET_WM_PING && _NET_WM_PING != None) { + else if(ev->xclient.format == 32 && ev->xclient.data.l[0] == A(_NET_WM_PING) && A(_NET_WM_PING) != None) { ev->xclient.window = root; x11.XSendEvent(dpy, ev->xclient.window, False, SubstructureNotifyMask | SubstructureRedirectMask, ev); } break; + case PropertyNotify: + if (A(_NET_FRAME_EXTENTS) != None) { + if (ev->xproperty.atom != A(_NET_FRAME_EXTENTS)) + break; + map_window(); + } + break; /* Graphics related events */ case ConfigureNotify: { bool resize = false; @@ -1360,7 +1571,7 @@ static int x11_event(XEvent *ev) x11.XGetWindowProperty(dpy, win, ev->xselection.property, 0, 0, True, AnyPropertyType, &pastebuf_format, &format, &len, &bytes_left, (unsigned char **)(&pastebuf)); if(bytes_left > 0 && format==8) { x11.XGetWindowProperty(dpy, win, ev->xselection.property, 0, bytes_left, True, AnyPropertyType, &pastebuf_format, &format, &len, &dummy, (unsigned char **)&pastebuf); - if (x11.utf8 && pastebuf_format == x11.utf8) { + if (A(UTF8_STRING) && pastebuf_format == A(UTF8_STRING)) { char *opb = pastebuf; pastebuf = (char *)utf8_to_cp(CIOLIB_ISO_8859_1, (uint8_t *)pastebuf, '?', strlen(pastebuf), NULL); if (pastebuf == NULL) @@ -1378,7 +1589,7 @@ static int x11_event(XEvent *ev) /* Set paste buffer */ sem_post(&pastebuf_set); sem_wait(&pastebuf_used); - if (x11.utf8 && pastebuf_format == x11.utf8) + if (A(UTF8_STRING) && pastebuf_format == A(UTF8_STRING)) free(pastebuf); else x11.XFree(pastebuf); @@ -1394,8 +1605,6 @@ static int x11_event(XEvent *ev) req=&(ev->xselectionrequest); pthread_mutex_lock(©buf_mutex); - if (x11.targets == 0) - x11.targets = x11.XInternAtom(dpy, "TARGETS", False); respond.xselection.property=None; if(copybuf!=NULL) { if(req->target==XA_STRING) { @@ -1406,18 +1615,15 @@ static int x11_event(XEvent *ev) free(cpstr); } } - else if(req->target == x11.utf8) { - x11.XChangeProperty(dpy, req->requestor, req->property, x11.utf8, 8, PropModeReplace, (uint8_t *)copybuf, strlen((char *)copybuf)); + else if(req->target == A(UTF8_STRING)) { + x11.XChangeProperty(dpy, req->requestor, req->property, A(UTF8_STRING), 8, PropModeReplace, (uint8_t *)copybuf, strlen((char *)copybuf)); respond.xselection.property=req->property; } - else if(req->target == x11.targets) { - if (x11.utf8 == 0) - x11.utf8 = x11.XInternAtom(dpy, "UTF8_STRING", False); - - supported[count++] = x11.targets; + else if(req->target == A(TARGETS)) { + supported[count++] = A(TARGETS); supported[count++] = XA_STRING; - if (x11.utf8) - supported[count++] = x11.utf8; + if (A(UTF8_STRING)) + supported[count++] = A(UTF8_STRING); x11.XChangeProperty(dpy, req->requestor, req->property, XA_ATOM, 32, PropModeReplace, (unsigned char *)supported, count); respond.xselection.property=req->property; } @@ -1867,10 +2073,12 @@ void x11_event_thread(void *args) break; case X11_LOCAL_SETNAME: x11.XSetIconName(dpy, win, lev.data.name); + set_win_property(A(_NET_WM_ICON_NAME), A(UTF8_STRING), 8, PropModeReplace, lev.data.name, strlen(lev.data.name)); x11.XFlush(dpy); break; case X11_LOCAL_SETTITLE: x11.XStoreName(dpy, win, lev.data.title); + set_win_property(A(_NET_WM_NAME), A(UTF8_STRING), 8, PropModeReplace, lev.data.name, strlen(lev.data.name)); x11.XFlush(dpy); break; case X11_LOCAL_COPY: @@ -1895,7 +2103,7 @@ void x11_event_thread(void *args) FREE_AND_NULL(pastebuf); } else if(sowner!=None) { - x11.XConvertSelection(dpy, CONSOLE_CLIPBOARD, x11.utf8 ? x11.utf8 : XA_STRING, x11.utf8 ? x11.utf8 : XA_STRING, win, CurrentTime); + x11.XConvertSelection(dpy, CONSOLE_CLIPBOARD, A(UTF8_STRING) ? A(UTF8_STRING) : XA_STRING, A(UTF8_STRING) ? A(UTF8_STRING) : XA_STRING, win, CurrentTime); } else { /* Set paste buffer */ @@ -1915,12 +2123,10 @@ void x11_event_thread(void *args) x11.XBell(dpy, 100); break; case X11_LOCAL_SETICON: { - Atom wmicon = x11.XInternAtom(dpy, "_NET_WM_ICON", False); - if (wmicon) { - x11.XChangeProperty(dpy, win, wmicon, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)lev.data.icon_data, lev.data.icon_data[0] * lev.data.icon_data[1] + 2); - x11.XFlush(dpy); - } + // TODO: set_icon() is obsolete... delete set_icon(&lev.data.icon_data[2], lev.data.icon_data[0], NULL); + set_win_property(A(_NET_WM_ICON), XA_CARDINAL, 32, PropModeReplace, lev.data.icon_data, lev.data.icon_data[0] * lev.data.icon_data[1] + 2); + x11.XFlush(dpy); free(lev.data.icon_data); break; } diff --git a/src/conio/x_events.h b/src/conio/x_events.h index 2f3d7f9bd023290e07c8ae250f1087f8d2bbd33f..2e6aaaead060acb96cd4aff2b4179f631e339816 100644 --- a/src/conio/x_events.h +++ b/src/conio/x_events.h @@ -143,9 +143,6 @@ struct x11 { void (*XRRFreeCrtcInfo)(XRRCrtcInfo *crtcInfo); void (*XRRFreeScreenResources)(XRRScreenResources *resources); #endif - Atom utf8; - Atom targets; - Atom workarea; }; extern int local_pipe[2]; /* Used for passing local events */ @@ -159,11 +156,8 @@ extern char *pastebuf; extern sem_t pastebuf_set; extern sem_t pastebuf_used; extern Atom copybuf_format; -extern Atom pastebuf_format; extern sem_t init_complete; extern sem_t mode_set; -extern sem_t event_thread_complete; -extern int terminate; extern int x11_window_xpos; extern int x11_window_ypos; extern int x11_initialized; diff --git a/src/syncterm/syncterm.c b/src/syncterm/syncterm.c index f3d3b9fbd449953e879e6f3c6d89a1f28bd83dc9..259f765801cf56f921201cb567175c1dfa889946 100644 --- a/src/syncterm/syncterm.c +++ b/src/syncterm/syncterm.c @@ -1723,6 +1723,7 @@ main(int argc, char **argv) #endif if (initciolib(ciolib_mode)) return 1; + setname("SyncTERM"); if (settings.blocky) cio_api.options |= CONIO_OPT_BLOCKY_SCALING; else