systray: Fix race in sorting icons by name
o9000 mrovi9000@gmail.com
1 files changed,
19 insertions(+),
3 deletions(-)
jump to
M
src/systray/systraybar.c
→
src/systray/systraybar.c
@@ -526,6 +526,13 @@ return FALSE;
} } + // Dangerous actions begin + XSync(server.display, False); + error = FALSE; + XErrorHandler old = XSetErrorHandler(window_error_handler); + + XSelectInput(server.display, win, StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask); + XTextProperty xname; char *name; if (XGetWMName(server.display, win, &xname)) {@@ -571,8 +578,19 @@ if (systray_profile)
fprintf(stderr, "XGetWindowAttributes(server.display, win = %ld, &attr)\n", win); if (XGetWindowAttributes(server.display, win, &attr) == False) { free(name); + XSelectInput(server.display, win, NoEventMask); + + // Dangerous actions end + XSync(server.display, False); + XSetErrorHandler(old); + return FALSE; } + + // Dangerous actions end + XSync(server.display, False); + XSetErrorHandler(old); + unsigned long mask = 0; XSetWindowAttributes set_attr; Visual *visual = server.visual;@@ -606,6 +624,7 @@ set_attr.background_pixmap = ParentRelative;
mask = CWBackPixmap; } } + if (systray_profile) fprintf(stderr, "XCreateWindow(...)\n"); Window parent = XCreateWindow(server.display,@@ -683,9 +702,6 @@ // Watch for the icon trying to resize itself / closing again
XSync(server.display, False); error = FALSE; XErrorHandler old = XSetErrorHandler(window_error_handler); - if (systray_profile) - fprintf(stderr, "XSelectInput(server.display, traywin->win, ...)\n"); - XSelectInput(server.display, traywin->win, StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask); XWithdrawWindow(server.display, traywin->win, server.screen); XReparentWindow(server.display, traywin->win, traywin->parent, 0, 0);