+void task_refresh_tasklist ()
+{
+ Window *win;
+ int num_results, i;
+
+ if (!taskbar_enabled) return;
+ win = server_get_property (server.root_win, server.atom._NET_CLIENT_LIST, XA_WINDOW, &num_results);
+ if (!win) return;
+
+ GList* win_list = g_hash_table_get_keys(win_to_task_table);
+ GList* it;
+ for (it=win_list; it; it=it->next) {
+ for (i = 0; i < num_results; i++)
+ if (*((Window*)it->data) == win[i])
+ break;
+ if (i == num_results)
+ taskbar_remove_task(it->data, 0, 0);
+ }
+ g_list_free(win_list);
+
+ // Add any new
+ for (i = 0; i < num_results; i++)
+ if (!task_get_task (win[i]))
+ add_task (win[i]);
+
+ XFree (win);
+}
+
+
+void draw_taskbar (void *obj, cairo_t *c)
+{
+ Taskbar *taskbar = obj;
+ int state = (taskbar->desktop == server.desktop) ? TASKBAR_ACTIVE : TASKBAR_NORMAL;
+
+ taskbar->state_pix[state] = taskbar->area.pix;
+}
+
+
+int resize_taskbar(void *obj)
+{
+ Taskbar *taskbar = (Taskbar*)obj;
+ Panel *panel = (Panel*)taskbar->area.panel;
+ int text_width;
+
+ //printf("resize_taskbar %d %d\n", taskbar->area.posx, taskbar->area.posy);
+ if (panel_horizontal) {
+ resize_by_layout(obj, panel->g_task.maximum_width);
+
+ text_width = panel->g_task.maximum_width;
+ GSList *l = taskbar->area.list;
+ if (taskbarname_enabled) l = l->next;
+ if (l != NULL) {
+ text_width = ((Task *)l->data)->area.width;
+ }
+ taskbar->text_width = text_width - panel->g_task.text_posx - panel->g_task.area.bg->border.width - panel->g_task.area.paddingx;
+ }
+ else {
+ resize_by_layout(obj, panel->g_task.maximum_height);
+
+ taskbar->text_width = taskbar->area.width - (2 * panel->g_taskbar.area.paddingy) - panel->g_task.text_posx - panel->g_task.area.bg->border.width - panel->g_task.area.paddingx;
+ }
+ return 0;
+}
+
+
+void on_change_taskbar (void *obj)
+{
+ Taskbar *tskbar = obj;
+ int k;
+
+ // reset Pixmap when position/size changed
+ for (k=0; k<TASKBAR_STATE_COUNT; ++k) {
+ if (tskbar->state_pix[k]) XFreePixmap(server.dsp, tskbar->state_pix[k]);
+ tskbar->state_pix[k] = 0;
+ }
+ tskbar->area.pix = 0;
+ tskbar->area.redraw = 1;
+}
+
+
+void set_taskbar_state(Taskbar *tskbar, int state)
+{
+ tskbar->area.bg = panel1[0].g_taskbar.background[state];
+ tskbar->area.pix = tskbar->state_pix[state];
+ if (panel_mode != MULTI_DESKTOP) {
+ if (state == TASKBAR_NORMAL)
+ tskbar->area.on_screen = 0;
+ else
+ tskbar->area.on_screen = 1;
+ }
+ if (tskbar->area.on_screen == 1) {
+ if (tskbar->state_pix[state] == 0)
+ tskbar->area.redraw = 1;
+ if (panel_mode == MULTI_DESKTOP && panel1[0].g_taskbar.background[TASKBAR_NORMAL] != panel1[0].g_taskbar.background[TASKBAR_ACTIVE]) {
+ GSList *l = tskbar->area.list;
+ if (taskbarname_enabled) l = l->next;
+ for ( ; l ; l = l->next)
+ set_task_redraw(l->data);
+ }
+ }
+ panel_refresh = 1;
+}
+
+
+void visible_taskbar(void *p)
+{
+ Panel *panel =(Panel*)p;
+ int j;
+
+ Taskbar *taskbar;
+ for (j=0 ; j < panel->nb_desktop ; j++) {
+ taskbar = &panel->taskbar[j];
+ if (panel_mode != MULTI_DESKTOP && taskbar->desktop != server.desktop) {
+ // SINGLE_DESKTOP and not current desktop
+ taskbar->area.on_screen = 0;
+ }
+ else {
+ taskbar->area.on_screen = 1;
+ }
+ }
+ panel_refresh = 1;
+}
+