Simplify systray icon management (attempt to fix issue 480)
git-svn-id: http://tint2.googlecode.com/svn/trunk@751 121b4492-b84c-0410-8b4c-0d4edfb3f3cc
This commit is contained in:
parent
e49e05ad69
commit
eb1244a415
3 changed files with 13 additions and 22 deletions
|
@ -217,8 +217,9 @@ void on_change_systray (void *obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
// position and size the icon window
|
// position and size the icon window
|
||||||
XMoveResizeWindow(server.dsp, traywin->id, traywin->x, traywin->y, sysbar->icon_size, sysbar->icon_size);
|
|
||||||
XResizeWindow(server.dsp, traywin->tray_id, sysbar->icon_size, sysbar->icon_size);
|
XResizeWindow(server.dsp, traywin->tray_id, sysbar->icon_size, sysbar->icon_size);
|
||||||
|
traywin->ignore_remaps = 2;
|
||||||
|
XReparentWindow(server.dsp, traywin->tray_id, ((Panel*)systray.area.panel)->main_win, traywin->x, traywin->y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -384,8 +385,7 @@ gboolean add_icon(Window id)
|
||||||
set_attr.background_pixmap = ParentRelative;
|
set_attr.background_pixmap = ParentRelative;
|
||||||
mask = CWBackPixmap;
|
mask = CWBackPixmap;
|
||||||
}
|
}
|
||||||
Window parent_window;
|
Window parent_window = panel->main_win;
|
||||||
parent_window = XCreateWindow(server.dsp, panel->main_win, 0, 0, 30, 30, 0, attr.depth, InputOutput, visual, mask, &set_attr);
|
|
||||||
old = XSetErrorHandler(window_error_handler);
|
old = XSetErrorHandler(window_error_handler);
|
||||||
XReparentWindow(server.dsp, id, parent_window, 0, 0);
|
XReparentWindow(server.dsp, id, parent_window, 0, 0);
|
||||||
// watch for the icon trying to resize itself / closing again!
|
// watch for the icon trying to resize itself / closing again!
|
||||||
|
@ -394,7 +394,6 @@ gboolean add_icon(Window id)
|
||||||
XSetErrorHandler(old);
|
XSetErrorHandler(old);
|
||||||
if (error != FALSE) {
|
if (error != FALSE) {
|
||||||
fprintf(stderr, "tint2 : not icon_swallow\n");
|
fprintf(stderr, "tint2 : not icon_swallow\n");
|
||||||
XDestroyWindow(server.dsp, parent_window);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -417,7 +416,6 @@ gboolean add_icon(Window id)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fprintf(stderr, "tint2 : xembed error\n");
|
fprintf(stderr, "tint2 : xembed error\n");
|
||||||
XDestroyWindow(server.dsp, parent_window);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -438,7 +436,6 @@ gboolean add_icon(Window id)
|
||||||
}
|
}
|
||||||
|
|
||||||
traywin = g_new0(TrayWindow, 1);
|
traywin = g_new0(TrayWindow, 1);
|
||||||
traywin->id = parent_window;
|
|
||||||
traywin->tray_id = id;
|
traywin->tray_id = id;
|
||||||
traywin->hide = hide;
|
traywin->hide = hide;
|
||||||
traywin->depth = attr.depth;
|
traywin->depth = attr.depth;
|
||||||
|
@ -455,16 +452,9 @@ gboolean add_icon(Window id)
|
||||||
systray.list_icons = g_slist_insert_sorted(systray.list_icons, traywin, compare_traywindows);
|
systray.list_icons = g_slist_insert_sorted(systray.list_icons, traywin, compare_traywindows);
|
||||||
//printf("add_icon id %lx, %d\n", id, g_slist_length(systray.list_icons));
|
//printf("add_icon id %lx, %d\n", id, g_slist_length(systray.list_icons));
|
||||||
|
|
||||||
if (server.real_transparency || systray.alpha != 100 || systray.brightness != 0 || systray.saturation != 0) {
|
|
||||||
traywin->damage = XDamageCreate(server.dsp, traywin->id, XDamageReportRawRectangles);
|
|
||||||
XCompositeRedirectWindow(server.dsp, traywin->id, CompositeRedirectManual);
|
|
||||||
}
|
|
||||||
|
|
||||||
// show the window
|
// show the window
|
||||||
if (!traywin->hide)
|
if (!traywin->hide)
|
||||||
XMapWindow(server.dsp, traywin->tray_id);
|
XMapWindow(server.dsp, traywin->tray_id);
|
||||||
if (!traywin->hide && !panel->is_hidden)
|
|
||||||
XMapRaised(server.dsp, traywin->id);
|
|
||||||
|
|
||||||
// changed in systray
|
// changed in systray
|
||||||
systray.area.resize = 1;
|
systray.area.resize = 1;
|
||||||
|
@ -491,7 +481,6 @@ void remove_icon(TrayWindow *traywin)
|
||||||
if (!traywin->hide)
|
if (!traywin->hide)
|
||||||
XUnmapWindow(server.dsp, traywin->tray_id);
|
XUnmapWindow(server.dsp, traywin->tray_id);
|
||||||
XReparentWindow(server.dsp, traywin->tray_id, server.root_win, 0, 0);
|
XReparentWindow(server.dsp, traywin->tray_id, server.root_win, 0, 0);
|
||||||
XDestroyWindow(server.dsp, traywin->id);
|
|
||||||
XSync(server.dsp, False);
|
XSync(server.dsp, False);
|
||||||
XSetErrorHandler(old);
|
XSetErrorHandler(old);
|
||||||
if (traywin->render_timeout)
|
if (traywin->render_timeout)
|
||||||
|
|
|
@ -34,7 +34,6 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
Window id;
|
|
||||||
Window tray_id;
|
Window tray_id;
|
||||||
int x, y;
|
int x, y;
|
||||||
int width, height;
|
int width, height;
|
||||||
|
@ -43,6 +42,7 @@ typedef struct
|
||||||
int depth;
|
int depth;
|
||||||
Damage damage;
|
Damage damage;
|
||||||
timeout* render_timeout;
|
timeout* render_timeout;
|
||||||
|
int ignore_remaps;
|
||||||
} TrayWindow;
|
} TrayWindow;
|
||||||
|
|
||||||
|
|
||||||
|
|
16
src/tint.c
16
src/tint.c
|
@ -832,8 +832,9 @@ void event_configure_notify (Window win)
|
||||||
traywin = (TrayWindow*)l->data;
|
traywin = (TrayWindow*)l->data;
|
||||||
if (traywin->tray_id == win) {
|
if (traywin->tray_id == 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);
|
XResizeWindow(server.dsp, traywin->tray_id, traywin->width, traywin->width);
|
||||||
XResizeWindow(server.dsp, traywin->tray_id, traywin->width, traywin->height);
|
traywin->ignore_remaps = 2;
|
||||||
|
XReparentWindow(server.dsp, traywin->tray_id, ((Panel*)systray.area.panel)->main_win, traywin->x, traywin->y);
|
||||||
panel_refresh = 1;
|
panel_refresh = 1;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1264,7 +1265,11 @@ start:
|
||||||
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)->tray_id == e.xany.window) {
|
||||||
remove_icon((TrayWindow*)it->data);
|
if (((TrayWindow*)it->data)->ignore_remaps > 0) {
|
||||||
|
((TrayWindow*)it->data)->ignore_remaps--;
|
||||||
|
} else {
|
||||||
|
remove_icon((TrayWindow*)it->data);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1408,10 +1413,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 ) {
|
systray_render_icon(traywin);
|
||||||
systray_render_icon(traywin);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue