]> Dogcows Code - chaz/tint2/blob - src/systray/kde.c
New import
[chaz/tint2] / src / systray / kde.c
1 #include "kde.h"
2 #include "icons.h"
3 #include "docker.h"
4 #include "xproperty.h"
5 #include <assert.h>
6 #include <X11/Xatom.h>
7
8 Atom kde_systray_prop = None;
9
10 void kde_init()
11 {
12 kde_systray_prop = XInternAtom(display,
13 "_KDE_NET_SYSTEM_TRAY_WINDOWS", False);
14 assert(kde_systray_prop);
15
16 XSelectInput(display, root, PropertyChangeMask);
17 kde_update_icons();
18 }
19
20 void kde_update_icons()
21 {
22 gulong count = (unsigned) -1; /* grab as many as possible */
23 Window *ids;
24 unsigned int i;
25 GSList *it, *next;
26 gboolean removed = FALSE; /* were any removed? */
27
28 if (! xprop_get32(root, kde_systray_prop, XA_WINDOW, sizeof(Window)*8,
29 &count, &ids))
30 return;
31
32 /* add new windows to our list */
33 for (i = 0; i < count; ++i) {
34 for (it = icons; it != NULL; it = g_slist_next(it)) {
35 TrayWindow *traywin = it->data;
36 if (traywin->id == ids[i])
37 break;
38 }
39 if (!it)
40 icon_add(ids[i], KDE);
41 }
42
43 /* remove windows from our list that no longer exist in the property */
44 for (it = icons; it != NULL;) {
45 TrayWindow *traywin = it->data;
46 gboolean exists;
47
48 if (traywin->type != KDE) {
49 /* don't go removing non-kde windows */
50 exists = TRUE;
51 } else {
52 exists = FALSE;
53 for (i = 0; i < count; ++i) {
54 if (traywin->id == ids[i]) {
55 exists = TRUE;
56 break;
57 }
58 }
59 }
60
61 next = g_slist_next(it);
62 if (!exists) {
63 icon_remove(it);
64 removed =TRUE;
65 }
66 it = next;
67 }
68
69 if (removed) {
70 /* at least one tray app was removed, so reorganize 'em all and resize*/
71 reposition_icons();
72 fix_geometry();
73 }
74
75 XFree(ids);
76 }
This page took 0.040016 seconds and 4 git commands to generate.