+GPtrArray* task_get_tasks(Window win)
+{
+ if (win_to_task_table && taskbar_enabled)
+ return g_hash_table_lookup(win_to_task_table, &win);
+ else
+ return 0;
+}
+
+
+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;
+ Task *tsk;
+
+ //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;
+ if (taskbar->area.list != NULL) {
+ tsk = taskbar->area.list->data;
+ text_width = tsk->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 set_taskbar_state(Taskbar *tskbar, int state)
+{
+ tskbar->area.bg = panel1[0].g_taskbar.background[state];
+ tskbar->area.pix = tskbar->state_pix[state];
+ if (tskbar->state_pix[state] == 0) {
+ tskbar->area.redraw = 1;
+ GSList *l;
+ for (l = tskbar->area.list ; l ; l = l->next)
+ ((Area*)l->data)->redraw = 1;
+ }
+ 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;
+}
+