systray.alpha = 100;
systray.sort = 3;
systray.area._draw_foreground = draw_systray;
+ systray.area._on_change_layout = on_change_systray;
systray.area.size_mode = SIZE_BY_CONTENT;
systray.area._resize = resize_systray;
}
void draw_systray(void *obj, cairo_t *c)
{
- // here, sysbar's position is defined. so we can calculate position of tray icon.
- Systraybar *sysbar = obj;
- Panel *panel = sysbar->area.panel;
- int i, posx, posy;
- int start = panel->area.bg->border.width + panel->area.paddingy + systray.area.bg->border.width + systray.area.paddingy +sysbar->marging/2;
- if (panel_horizontal) {
- posy = start;
- posx = systray.area.posx + systray.area.bg->border.width + systray.area.paddingxlr;
- }
- else {
- posx = start;
- posy = systray.area.posy + systray.area.bg->border.width + systray.area.paddingxlr;
- }
-
- TrayWindow *traywin;
- GSList *l;
- for (i=1, l = systray.list_icons; l ; i++, l = l->next) {
- traywin = (TrayWindow*)l->data;
- if (traywin->hide) continue;
-
- traywin->y = posy;
- traywin->x = posx;
- traywin->width = sysbar->icon_size;
- traywin->height = sysbar->icon_size;
- if (panel_horizontal) {
- if (i % sysbar->icons_per_column)
- posy += sysbar->icon_size + sysbar->area.paddingx;
- else {
- posy = start;
- posx += (sysbar->icon_size + systray.area.paddingx);
- }
- }
- else {
- if (i % sysbar->icons_per_row)
- posx += sysbar->icon_size + systray.area.paddingx;
- else {
- posx = start;
- posy += (sysbar->icon_size + systray.area.paddingx);
- }
- }
-
- // 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);
- }
-
if (server.real_transparency || systray.alpha != 100 || systray.brightness != 0 || systray.saturation != 0) {
if (render_background) XFreePixmap(server.dsp, render_background);
render_background = XCreatePixmap(server.dsp, server.root_win, systray.area.width, systray.area.height, server.depth);
}
+void on_change_systray (void *obj)
+{
+ // here, sysbar's position is defined. so we can calculate position of tray icon.
+ Systraybar *sysbar = obj;
+ Panel *panel = sysbar->area.panel;
+ int i, posx, posy;
+ int start = panel->area.bg->border.width + panel->area.paddingy + systray.area.bg->border.width + systray.area.paddingy +sysbar->marging/2;
+ if (panel_horizontal) {
+ posy = start;
+ posx = systray.area.posx + systray.area.bg->border.width + systray.area.paddingxlr;
+ }
+ else {
+ posx = start;
+ posy = systray.area.posy + systray.area.bg->border.width + systray.area.paddingxlr;
+ }
+
+ TrayWindow *traywin;
+ GSList *l;
+ for (i=1, l = systray.list_icons; l ; i++, l = l->next) {
+ traywin = (TrayWindow*)l->data;
+ if (traywin->hide) continue;
+
+ traywin->y = posy;
+ traywin->x = posx;
+ traywin->width = sysbar->icon_size;
+ traywin->height = sysbar->icon_size;
+ if (panel_horizontal) {
+ if (i % sysbar->icons_per_column)
+ posy += sysbar->icon_size + sysbar->area.paddingx;
+ else {
+ posy = start;
+ posx += (sysbar->icon_size + systray.area.paddingx);
+ }
+ }
+ else {
+ if (i % sysbar->icons_per_row)
+ posx += sysbar->icon_size + systray.area.paddingx;
+ else {
+ posx = start;
+ posy += (sysbar->icon_size + systray.area.paddingx);
+ }
+ }
+
+ // 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);
+ }
+}
+
+
// ***********************************************
// systray protocol
Panel *panel = (Panel*)tsk->area.panel;
//printf("draw_task %d %d\n", tsk->area.posx, tsk->area.posy);
- long value[] = { panel->posx+tsk->area.posx, panel->posy+tsk->area.posy, tsk->area.width, tsk->area.height };
- XChangeProperty (server.dsp, tsk->win, server.atom._NET_WM_ICON_GEOMETRY, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)value, 4);
-
if (panel->g_task.text) {
/* Layout */
layout = pango_cairo_create_layout (c);
}
+void on_change_task (void *obj)
+{
+ Task *tsk = obj;
+ Panel *panel = (Panel*)tsk->area.panel;
+
+ long value[] = { panel->posx+tsk->area.posx, panel->posy+tsk->area.posy, tsk->area.width, tsk->area.height };
+ XChangeProperty (server.dsp, tsk->win, server.atom._NET_WM_ICON_GEOMETRY, XA_CARDINAL, 32, PropModeReplace, (unsigned char*)value, 4);
+
+ // reset Pixmap when position/size changed
+ set_task_redraw(tsk);
+}
+
+
Task *next_task(Task *tsk)
{
if (tsk == 0)
// task
panel->g_task.area.size_mode = SIZE_BY_LAYOUT;
panel->g_task.area._draw_foreground = draw_task;
+ panel->g_task.area._on_change_layout = on_change_task;
panel->g_task.area.redraw = 1;
panel->g_task.area.on_screen = 1;
if ((panel->g_task.config_asb_mask & (1<<TASK_NORMAL)) == 0) {
for (l = taskbar->area.list; l ; l = l->next) {
tsk = l->data;
if (!tsk->area.on_screen) continue;
- //set_task_redraw(tsk); // always redraw task, because the background could have changed (taskbar_active_id)
tsk->area.width = pixel_width;
if (modulo_width) {
for (l = taskbar->area.list; l ; l = l->next) {
tsk = l->data;
if (!tsk->area.on_screen) continue;
- //set_task_redraw(tsk); // always redraw task, because the background could have changed (taskbar_active_id)
tsk->area.height = pixel_height;
if (modulo_height) {
size_by_content(l->data);
// calculate area's size
+ a->on_changed = 0;
if (a->resize && a->size_mode == SIZE_BY_CONTENT) {
a->resize = 0;
if (a->_resize(a)) {
// 'size' changed => 'resize = 1' on the parent and redraw object
((Area*)a->parent)->resize = 1;
+ a->on_changed = 1;
+ a->redraw = 1;
}
- a->redraw = 1;
}
}
}
if (a->_resize) {
if (a->_resize(a)) {
// if 'size' changed then 'resize = 1' on childs with SIZE_BY_LAYOUT
+ a->on_changed = 1;
for (l = a->list; l ; l = l->next) {
if (((Area*)l->data)->size_mode == SIZE_BY_LAYOUT)
((Area*)l->data)->resize = 1;
if (pos != child->posx) {
// pos changed => redraw
child->posx = pos;
+ child->on_changed = 1;
child->redraw = 1;
}
}
if (pos != child->posy) {
// pos changed => redraw
child->posy = pos;
+ child->on_changed = 1;
child->redraw = 1;
}
}
else
pos += child->height + a->paddingx;
}
+
+ if (a->on_changed && a->_on_change_layout)
+ a->_on_change_layout (a);
}