systray: Cleaned up the code a bit

This commit is contained in:
o9000 2015-06-07 12:58:29 +02:00
parent d8d4bc76cd
commit 9040764cf1
3 changed files with 77 additions and 75 deletions

View file

@ -126,7 +126,8 @@ void init_systray_panel(void *p)
void draw_systray(void *obj, cairo_t *c) void draw_systray(void *obj, cairo_t *c)
{ {
if (systray_composited) { if (systray_composited) {
if (render_background) XFreePixmap(server.dsp, render_background); if (render_background)
XFreePixmap(server.dsp, render_background);
render_background = XCreatePixmap(server.dsp, server.root_win, systray.area.width, systray.area.height, server.depth); render_background = XCreatePixmap(server.dsp, server.root_win, systray.area.width, systray.area.height, server.depth);
XCopyArea(server.dsp, systray.area.pix, render_background, server.gc, 0, 0, systray.area.width, systray.area.height, 0, 0); XCopyArea(server.dsp, systray.area.pix, render_background, server.gc, 0, 0, systray.area.width, systray.area.height, 0, 0);
} }
@ -163,8 +164,7 @@ int resize_systray(void *obj)
sysbar->marging = height - (sysbar->icons_per_column-1)*(sysbar->icon_size+sysbar->area.paddingx) - sysbar->icon_size; sysbar->marging = height - (sysbar->icons_per_column-1)*(sysbar->icon_size+sysbar->area.paddingx) - sysbar->icon_size;
sysbar->icons_per_row = count / sysbar->icons_per_column + (count%sysbar->icons_per_column != 0); sysbar->icons_per_row = count / sysbar->icons_per_column + (count%sysbar->icons_per_column != 0);
systray.area.width = (2 * systray.area.bg->border.width) + (2 * systray.area.paddingxlr) + (sysbar->icon_size * sysbar->icons_per_row) + ((sysbar->icons_per_row-1) * systray.area.paddingx); systray.area.width = (2 * systray.area.bg->border.width) + (2 * systray.area.paddingxlr) + (sysbar->icon_size * sysbar->icons_per_row) + ((sysbar->icons_per_row-1) * systray.area.paddingx);
} } else {
else {
int width = sysbar->area.width - 2*sysbar->area.bg->border.width - 2*sysbar->area.paddingy; int width = sysbar->area.width - 2*sysbar->area.bg->border.width - 2*sysbar->area.paddingy;
// here icons_per_row always higher than 0 // here icons_per_row always higher than 0
sysbar->icons_per_row = (width+sysbar->area.paddingx) / (sysbar->icon_size+sysbar->area.paddingx); sysbar->icons_per_row = (width+sysbar->area.paddingx) / (sysbar->icon_size+sysbar->area.paddingx);
@ -189,44 +189,42 @@ void on_change_systray (void *obj)
if (panel_horizontal) { if (panel_horizontal) {
posy = start; posy = start;
posx = systray.area.posx + systray.area.bg->border.width + systray.area.paddingxlr; posx = systray.area.posx + systray.area.bg->border.width + systray.area.paddingxlr;
} } else {
else {
posx = start; posx = start;
posy = systray.area.posy + systray.area.bg->border.width + systray.area.paddingxlr; posy = systray.area.posy + systray.area.bg->border.width + systray.area.paddingxlr;
} }
TrayWindow *traywin; TrayWindow *traywin;
GSList *l; GSList *l;
for (i=1, l = systray.list_icons; l ; i++, l = l->next) { for (i = 1, l = systray.list_icons; l ; i++, l = l->next) {
traywin = (TrayWindow*)l->data; traywin = (TrayWindow*)l->data;
if (traywin->hide) if (traywin->hide)
continue; continue;
traywin->y = posy; traywin->y = posy;
traywin->x = posx; traywin->x = posx;
// printf("systray %d %d : pos %d, %d\n", traywin->id, traywin->tray_id, posx, posy); // printf("systray %d %d : pos %d, %d\n", traywin->parent, traywin->win, posx, posy);
traywin->width = sysbar->icon_size; traywin->width = sysbar->icon_size;
traywin->height = sysbar->icon_size; traywin->height = sysbar->icon_size;
if (panel_horizontal) { if (panel_horizontal) {
if (i % sysbar->icons_per_column) if (i % sysbar->icons_per_column) {
posy += sysbar->icon_size + sysbar->area.paddingx; posy += sysbar->icon_size + sysbar->area.paddingx;
else { } else {
posy = start; posy = start;
posx += (sysbar->icon_size + systray.area.paddingx); posx += (sysbar->icon_size + systray.area.paddingx);
} }
} } else {
else { if (i % sysbar->icons_per_row) {
if (i % sysbar->icons_per_row)
posx += sysbar->icon_size + systray.area.paddingx; posx += sysbar->icon_size + systray.area.paddingx;
else { } else {
posx = start; posx = start;
posy += (sysbar->icon_size + systray.area.paddingx); posy += (sysbar->icon_size + systray.area.paddingx);
} }
} }
// position and size the icon window // position and size the icon window
XMoveResizeWindow(server.dsp, traywin->id, traywin->x, traywin->y, traywin->width, traywin->height); XMoveResizeWindow(server.dsp, traywin->parent, traywin->x, traywin->y, traywin->width, traywin->height);
XMoveResizeWindow(server.dsp, traywin->tray_id, 0, 0, traywin->width, traywin->height); XMoveResizeWindow(server.dsp, traywin->win, 0, 0, traywin->width, traywin->height);
} }
refresh_systray = 1; refresh_systray = 1;
} }
@ -242,10 +240,10 @@ void start_net()
if (!systray_enabled) if (!systray_enabled)
stop_net(); stop_net();
return; return;
} } else {
else
if (!systray_enabled) if (!systray_enabled)
return; return;
}
Window win = XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN); Window win = XGetSelectionOwner(server.dsp, server.atom._NET_SYSTEM_TRAY_SCREEN);
@ -330,7 +328,6 @@ void stop_net()
gboolean error; gboolean error;
int window_error_handler(Display *d, XErrorEvent *e) int window_error_handler(Display *d, XErrorEvent *e)
{ {
d=d;e=e;
error = TRUE; error = TRUE;
if (e->error_code != BadWindow) { if (e->error_code != BadWindow) {
printf("error_handler %d\n", e->error_code); printf("error_handler %d\n", e->error_code);
@ -353,14 +350,12 @@ static gint compare_traywindows(gconstpointer a, gconstpointer b)
systray.sort == SYSTRAY_SORT_DESCENDING) { systray.sort == SYSTRAY_SORT_DESCENDING) {
XTextProperty name_a, name_b; XTextProperty name_a, name_b;
if (XGetWMName(server.dsp, traywin_a->tray_id, &name_a) == 0) { if (XGetWMName(server.dsp, traywin_a->win, &name_a) == 0) {
return -1; return -1;
} } else if (XGetWMName(server.dsp, traywin_b->win, &name_b) == 0) {
else if (XGetWMName(server.dsp, traywin_b->tray_id, &name_b) == 0) {
XFree(name_a.value); XFree(name_a.value);
return 1; return 1;
} } else {
else {
gint retval = g_ascii_strncasecmp((char*)name_a.value, (char*)name_b.value, -1) * gint retval = g_ascii_strncasecmp((char*)name_a.value, (char*)name_b.value, -1) *
(systray.sort == SYSTRAY_SORT_ASCENDING ? 1 : -1); (systray.sort == SYSTRAY_SORT_ASCENDING ? 1 : -1);
XFree(name_a.value); XFree(name_a.value);
@ -379,7 +374,7 @@ static gint compare_traywindows(gconstpointer a, gconstpointer b)
} }
gboolean add_icon(Window id) gboolean add_icon(Window win)
{ {
TrayWindow *traywin; TrayWindow *traywin;
Panel *panel = systray.area.panel; Panel *panel = systray.area.panel;
@ -393,7 +388,7 @@ gboolean add_icon(Window id)
unsigned long nitems; unsigned long nitems;
unsigned long bytes_after; unsigned long bytes_after;
unsigned char *prop = 0; unsigned char *prop = 0;
int ret = XGetWindowProperty(server.dsp, id, server.atom._NET_WM_PID, 0, 1024, False, AnyPropertyType, &actual_type, &actual_format, &nitems, &bytes_after, &prop); int ret = XGetWindowProperty(server.dsp, win, server.atom._NET_WM_PID, 0, 1024, False, AnyPropertyType, &actual_type, &actual_format, &nitems, &bytes_after, &prop);
if (ret == Success && prop) { if (ret == Success && prop) {
pid = prop[1] * 256; pid = prop[1] * 256;
pid += prop[0]; pid += prop[0];
@ -404,7 +399,7 @@ gboolean add_icon(Window id)
GSList *l; GSList *l;
int num_empty_same_pid = 0; int num_empty_same_pid = 0;
for (l = systray.list_icons; l; l = l->next) { for (l = systray.list_icons; l; l = l->next) {
if (((TrayWindow*)l->data)->tray_id == id) if (((TrayWindow*)l->data)->win == win)
return FALSE; return FALSE;
if (pid && ((TrayWindow*)l->data)->pid == pid && ((TrayWindow*)l->data)->empty) if (pid && ((TrayWindow*)l->data)->pid == pid && ((TrayWindow*)l->data)->empty)
num_empty_same_pid++; num_empty_same_pid++;
@ -416,18 +411,17 @@ gboolean add_icon(Window id)
for (l = systray.list_icons; l; l = l->next) { for (l = systray.list_icons; l; l = l->next) {
if (pid && ((TrayWindow*)l->data)->pid == pid && ((TrayWindow*)l->data)->empty) { if (pid && ((TrayWindow*)l->data)->pid == pid && ((TrayWindow*)l->data)->empty) {
num_empty_same_pid++; num_empty_same_pid++;
fprintf(stderr, "Removing tray icon %lu from misbehaving application with pid=%d\n", ((TrayWindow*)l->data)->tray_id, pid); fprintf(stderr, "Removing tray icon %lu from misbehaving application with pid=%d\n", ((TrayWindow*)l->data)->win, pid);
remove_icon((TrayWindow*)l->data); remove_icon((TrayWindow*)l->data);
break; break;
} }
} }
} }
//printf("add_icon: %d, pid %d, %d\n", id, pid, num_empty_same_pid); //printf("add_icon: %d, pid %d, %d\n", win, pid, num_empty_same_pid);
// Create the parent window that will embed the icon // Create the parent window that will embed the icon
error = FALSE;
XWindowAttributes attr; XWindowAttributes attr;
if (XGetWindowAttributes(server.dsp, id, &attr) == False) if (XGetWindowAttributes(server.dsp, win, &attr) == False)
return FALSE; return FALSE;
unsigned long mask = 0; unsigned long mask = 0;
XSetWindowAttributes set_attr; XSetWindowAttributes set_attr;
@ -443,23 +437,24 @@ gboolean add_icon(Window id)
set_attr.background_pixmap = ParentRelative; set_attr.background_pixmap = ParentRelative;
mask = CWBackPixmap; mask = CWBackPixmap;
} }
Window parent_window = XCreateWindow(server.dsp, panel->main_win, 0, 0, 30, 30, 0, attr.depth, InputOutput, visual, mask, &set_attr); Window parent = XCreateWindow(server.dsp, panel->main_win, 0, 0, 30, 30, 0, attr.depth, InputOutput, visual, mask, &set_attr);
// Watch for the icon trying to resize itself / closing again // Watch for the icon trying to resize itself / closing again
error = FALSE;
XErrorHandler old = XSetErrorHandler(window_error_handler); XErrorHandler old = XSetErrorHandler(window_error_handler);
XSelectInput(server.dsp, id, StructureNotifyMask); XSelectInput(server.dsp, win, StructureNotifyMask);
XSync(server.dsp, False); XSync(server.dsp, False);
XSetErrorHandler(old); XSetErrorHandler(old);
if (error != FALSE) { if (error != FALSE) {
fprintf(stderr, "tint2 : cannot add systray icon\n"); fprintf(stderr, "tint2 : cannot add systray icon\n");
XDestroyWindow(server.dsp, parent_window); XDestroyWindow(server.dsp, parent);
return FALSE; return FALSE;
} }
// Add the icon to the list // Add the icon to the list
traywin = g_new0(TrayWindow, 1); traywin = g_new0(TrayWindow, 1);
traywin->id = parent_window; traywin->parent = parent;
traywin->tray_id = id; traywin->win = win;
traywin->hide = hide; traywin->hide = hide;
traywin->depth = attr.depth; traywin->depth = attr.depth;
// Reparenting is done at the first paint event when the window is positioned correctly over its empty background, // Reparenting is done at the first paint event when the window is positioned correctly over its empty background,
@ -479,7 +474,7 @@ gboolean add_icon(Window id)
else else
systray.list_icons = g_slist_append(systray.list_icons, traywin); systray.list_icons = g_slist_append(systray.list_icons, traywin);
systray.list_icons = g_slist_sort(systray.list_icons, compare_traywindows); systray.list_icons = g_slist_sort(systray.list_icons, compare_traywindows);
// printf("add_icon id %lx, %d\n", id, g_slist_length(systray.list_icons)); // printf("add_icon win %lx, %d\n", win, g_slist_length(systray.list_icons));
// Resize and redraw the systray // Resize and redraw the systray
systray.area.resize = 1; systray.area.resize = 1;
@ -494,10 +489,11 @@ gboolean reparent_icon(TrayWindow *traywin)
Panel* panel = systray.area.panel; Panel* panel = systray.area.panel;
error = FALSE;
XErrorHandler old = XSetErrorHandler(window_error_handler); XErrorHandler old = XSetErrorHandler(window_error_handler);
// Reparent // Reparent
XReparentWindow(server.dsp, traywin->tray_id, traywin->id, 0, 0); XReparentWindow(server.dsp, traywin->win, traywin->parent, 0, 0);
XSync(server.dsp, False); XSync(server.dsp, False);
traywin->reparented = 1; traywin->reparented = 1;
@ -509,14 +505,14 @@ gboolean reparent_icon(TrayWindow *traywin)
e.xclient.serial = 0; e.xclient.serial = 0;
e.xclient.send_event = True; e.xclient.send_event = True;
e.xclient.message_type = server.atom._XEMBED; e.xclient.message_type = server.atom._XEMBED;
e.xclient.window = traywin->id; e.xclient.window = traywin->parent;
e.xclient.format = 32; e.xclient.format = 32;
e.xclient.data.l[0] = CurrentTime; e.xclient.data.l[0] = CurrentTime;
e.xclient.data.l[1] = XEMBED_EMBEDDED_NOTIFY; e.xclient.data.l[1] = XEMBED_EMBEDDED_NOTIFY;
e.xclient.data.l[2] = 0; e.xclient.data.l[2] = 0;
e.xclient.data.l[3] = traywin->id; e.xclient.data.l[3] = traywin->parent;
e.xclient.data.l[4] = 0; e.xclient.data.l[4] = 0;
XSendEvent(server.dsp, traywin->tray_id, False, 0xFFFFFF, &e); XSendEvent(server.dsp, traywin->win, False, 0xFFFFFF, &e);
XSync(server.dsp, False); XSync(server.dsp, False);
} }
@ -528,7 +524,7 @@ gboolean reparent_icon(TrayWindow *traywin)
unsigned char *data = 0; unsigned char *data = 0;
int ret; int ret;
ret = XGetWindowProperty(server.dsp, traywin->tray_id, server.atom._XEMBED_INFO, 0, 2, False, server.atom._XEMBED_INFO, &acttype, &actfmt, &nbitem, &bytes, &data); ret = XGetWindowProperty(server.dsp, traywin->win, server.atom._XEMBED_INFO, 0, 2, False, server.atom._XEMBED_INFO, &acttype, &actfmt, &nbitem, &bytes, &data);
if (ret == Success) { if (ret == Success) {
if (data) { if (data) {
if (nbitem == 2) { if (nbitem == 2) {
@ -546,8 +542,8 @@ gboolean reparent_icon(TrayWindow *traywin)
// Redirect rendering when using compositing // Redirect rendering when using compositing
if (systray_composited) { if (systray_composited) {
traywin->damage = XDamageCreate(server.dsp, traywin->id, XDamageReportRawRectangles); traywin->damage = XDamageCreate(server.dsp, traywin->parent, XDamageReportRawRectangles);
XCompositeRedirectWindow(server.dsp, traywin->id, CompositeRedirectManual); XCompositeRedirectWindow(server.dsp, traywin->parent, CompositeRedirectManual);
} }
XSync(server.dsp, False); XSync(server.dsp, False);
@ -559,9 +555,9 @@ gboolean reparent_icon(TrayWindow *traywin)
// Make the icon visible // Make the icon visible
if (!traywin->hide) if (!traywin->hide)
XMapWindow(server.dsp, traywin->tray_id); XMapWindow(server.dsp, traywin->win);
if (!traywin->hide && !panel->is_hidden) if (!traywin->hide && !panel->is_hidden)
XMapRaised(server.dsp, traywin->id); XMapRaised(server.dsp, traywin->parent);
return TRUE; return TRUE;
} }
@ -572,9 +568,9 @@ void remove_icon(TrayWindow *traywin)
// remove from our list // remove from our list
systray.list_icons = g_slist_remove(systray.list_icons, traywin); systray.list_icons = g_slist_remove(systray.list_icons, traywin);
//printf("remove_icon: %d\n", traywin->tray_id); //printf("remove_icon: %d\n", traywin->win);
XSelectInput(server.dsp, traywin->tray_id, NoEventMask); XSelectInput(server.dsp, traywin->win, NoEventMask);
if (traywin->damage) if (traywin->damage)
XDamageDestroy(server.dsp, traywin->damage); XDamageDestroy(server.dsp, traywin->damage);
@ -582,9 +578,9 @@ void remove_icon(TrayWindow *traywin)
error = FALSE; error = FALSE;
old = XSetErrorHandler(window_error_handler); old = XSetErrorHandler(window_error_handler);
if (!traywin->hide) if (!traywin->hide)
XUnmapWindow(server.dsp, traywin->tray_id); XUnmapWindow(server.dsp, traywin->win);
XReparentWindow(server.dsp, traywin->tray_id, server.root_win, 0, 0); XReparentWindow(server.dsp, traywin->win, server.root_win, 0, 0);
XDestroyWindow(server.dsp, traywin->id); XDestroyWindow(server.dsp, traywin->parent);
XSync(server.dsp, False); XSync(server.dsp, False);
XSetErrorHandler(old); XSetErrorHandler(old);
stop_timeout(traywin->render_timeout); stop_timeout(traywin->render_timeout);
@ -610,13 +606,14 @@ void remove_icon(TrayWindow *traywin)
void net_message(XClientMessageEvent *e) void net_message(XClientMessageEvent *e)
{ {
unsigned long opcode; unsigned long opcode;
Window id; Window win;
opcode = e->data.l[1]; opcode = e->data.l[1];
switch (opcode) { switch (opcode) {
case SYSTEM_TRAY_REQUEST_DOCK: case SYSTEM_TRAY_REQUEST_DOCK:
id = e->data.l[2]; win = e->data.l[2];
if (id) add_icon(id); if (win)
add_icon(win);
break; break;
case SYSTEM_TRAY_BEGIN_MESSAGE: case SYSTEM_TRAY_BEGIN_MESSAGE:
@ -662,15 +659,20 @@ void systray_render_icon_composited(void* t)
} }
int empty = 1; int empty = 1;
XImage *ximage = XGetImage(server.dsp, traywin->tray_id, 0, 0, traywin->width, traywin->height, AllPlanes, XYPixmap); XImage *ximage = XGetImage(server.dsp, traywin->win, 0, 0, traywin->width, traywin->height, AllPlanes, XYPixmap);
if (ximage) { if (ximage) {
XColor color; XColor color;
int x, y; if (traywin->width > 0 && traywin->height > 0) {
for (x = 0; empty && x < traywin->width; x++) { color.pixel = XGetPixel(ximage, traywin->width/2, traywin->height/2);
for (y = 0; empty && y < traywin->height; y++) { if (color.pixel != 0)
color.pixel = XGetPixel(ximage, x, y); empty = 0;
if (color.pixel != 0) int x, y;
empty = 0; for (x = 0; empty && x < traywin->width; x++) {
for (y = 0; empty && y < traywin->height; y++) {
color.pixel = XGetPixel(ximage, x, y);
if (color.pixel != 0)
empty = 0;
}
} }
} }
XFree(ximage); XFree(ximage);
@ -681,7 +683,7 @@ void systray_render_icon_composited(void* t)
panel_refresh = 1; panel_refresh = 1;
systray.list_icons = g_slist_sort(systray.list_icons, compare_traywindows); systray.list_icons = g_slist_sort(systray.list_icons, compare_traywindows);
} }
//printf("systray_render_icon_now: %d empty %d\n", traywin->tray_id, empty); //printf("systray_render_icon_now: %d empty %d\n", traywin->win, empty);
if (empty) if (empty)
return; return;
@ -695,19 +697,19 @@ void systray_render_icon_composited(void* t)
// drawable. If someone knows why it does not work with the traywindow itself, please tell me ;) // drawable. If someone knows why it does not work with the traywindow itself, please tell me ;)
Pixmap tmp_pmap = XCreatePixmap(server.dsp, server.root_win, traywin->width, traywin->height, 32); Pixmap tmp_pmap = XCreatePixmap(server.dsp, server.root_win, traywin->width, traywin->height, 32);
XRenderPictFormat* f; XRenderPictFormat* f;
if (traywin->depth == 24) if (traywin->depth == 24) {
f = XRenderFindStandardFormat(server.dsp, PictStandardRGB24); f = XRenderFindStandardFormat(server.dsp, PictStandardRGB24);
else if (traywin->depth == 32) } else if (traywin->depth == 32) {
f = XRenderFindStandardFormat(server.dsp, PictStandardARGB32); f = XRenderFindStandardFormat(server.dsp, PictStandardARGB32);
else { } else {
printf("Strange tray icon found with depth: %d\n", traywin->depth); printf("Strange tray icon found with depth: %d\n", traywin->depth);
return; return;
} }
Picture pict_image; Picture pict_image;
//if (server.real_transparency) //if (server.real_transparency)
//pict_image = XRenderCreatePicture(server.dsp, traywin->id, f, 0, 0); //pict_image = XRenderCreatePicture(server.dsp, traywin->parent, f, 0, 0);
// reverted Rev 407 because here it's breaking alls icon with systray + xcompmgr // reverted Rev 407 because here it's breaking alls icon with systray + xcompmgr
pict_image = XRenderCreatePicture(server.dsp, traywin->tray_id, f, 0, 0); pict_image = XRenderCreatePicture(server.dsp, traywin->win, f, 0, 0);
Picture pict_drawable = XRenderCreatePicture(server.dsp, tmp_pmap, XRenderFindVisualFormat(server.dsp, server.visual32), 0, 0); Picture pict_drawable = XRenderCreatePicture(server.dsp, tmp_pmap, XRenderFindVisualFormat(server.dsp, server.visual32), 0, 0);
XRenderComposite(server.dsp, PictOpSrc, pict_image, None, pict_drawable, 0, 0, 0, 0, 0, 0, traywin->width, traywin->height); XRenderComposite(server.dsp, PictOpSrc, pict_image, None, pict_drawable, 0, 0, 0, 0, 0, 0, traywin->width, traywin->height);
XRenderFreePicture(server.dsp, pict_image); XRenderFreePicture(server.dsp, pict_image);
@ -756,8 +758,8 @@ void systray_render_icon(TrayWindow* traywin)
systray_render_icon_composited(traywin); systray_render_icon_composited(traywin);
} else { } else {
// Trigger window repaint // Trigger window repaint
XClearArea(server.dsp, traywin->id, 0, 0, traywin->width, traywin->height, True); XClearArea(server.dsp, traywin->parent, 0, 0, traywin->width, traywin->height, True);
XClearArea(server.dsp, traywin->tray_id, 0, 0, traywin->width, traywin->height, True); XClearArea(server.dsp, traywin->win, 0, 0, traywin->width, traywin->height, True);
} }
} }

View file

@ -35,8 +35,8 @@ typedef struct {
typedef struct typedef struct
{ {
Window id; Window parent;
Window tray_id; Window win;
int x, y; int x, y;
int width, height; int width, height;
// TODO: manage icon's show/hide // TODO: manage icon's show/hide

View file

@ -831,10 +831,10 @@ void event_configure_notify (Window win)
GSList *l; GSList *l;
for (l = systray.list_icons; l ; l = l->next) { for (l = systray.list_icons; l ; l = l->next) {
traywin = (TrayWindow*)l->data; traywin = (TrayWindow*)l->data;
if (traywin->tray_id == win) { if (traywin->win == win) {
//printf("move tray %d\n", traywin->x); //printf("move tray %d\n", traywin->x);
XMoveResizeWindow(server.dsp, traywin->id, traywin->x, traywin->y, traywin->width, traywin->height); XMoveResizeWindow(server.dsp, traywin->parent, traywin->x, traywin->y, traywin->width, traywin->height);
XMoveResizeWindow(server.dsp, traywin->tray_id, 0, 0, traywin->width, traywin->height); XMoveResizeWindow(server.dsp, traywin->win, 0, 0, traywin->width, traywin->height);
panel_refresh = 1; panel_refresh = 1;
refresh_systray = 1; refresh_systray = 1;
return; return;
@ -1269,7 +1269,7 @@ start:
if (e.xany.window == g_tooltip.window || !systray_enabled) if (e.xany.window == g_tooltip.window || !systray_enabled)
break; break;
for (it = systray.list_icons; it; it = g_slist_next(it)) { for (it = systray.list_icons; it; it = g_slist_next(it)) {
if (((TrayWindow*)it->data)->tray_id == e.xany.window) { if (((TrayWindow*)it->data)->win == e.xany.window) {
remove_icon((TrayWindow*)it->data); remove_icon((TrayWindow*)it->data);
break; break;
} }
@ -1414,7 +1414,7 @@ start:
XDamageNotifyEvent* de = &event_union.de; XDamageNotifyEvent* de = &event_union.de;
for (l = systray.list_icons; l ; l = l->next) { for (l = systray.list_icons; l ; l = l->next) {
traywin = (TrayWindow*)l->data; traywin = (TrayWindow*)l->data;
if ( traywin->id == de->drawable ) { if ( traywin->parent == de->drawable ) {
systray_render_icon(traywin); systray_render_icon(traywin);
break; break;
} }