void set_task_state(Task *tsk, int state) { if (tsk == 0 || state < 0 || state >= TASK_STATE_COUNT) return; if (tsk->current_state != state || hide_task_diff_monitor) { GPtrArray* task_group = task_get_tasks(tsk->win); if (task_group) { for (size_t i=0; i<task_group->len; ++i) { Task* tsk1 = g_ptr_array_index(task_group, i); tsk1->current_state = state; tsk1->area.background = panel1[0].g_task.background[state]; tsk1->area.pixmap = tsk1->state_pix[state]; if (tsk1->state_pix[state] == 0) tsk1->area.redraw = 1; if (state == TASK_ACTIVE && g_slist_find(urgent_list, tsk1)) del_urgent(tsk1); // Show only the active task int hide = 0; if (hide_inactive_tasks) { if (state != TASK_ACTIVE) { hide = 1; } } if (window_get_monitor(tsk->win) != ((Panel*)tsk->area.panel)->monitor && (hide_task_diff_monitor || nb_panel > 1)) { hide = 1; } if (1 - hide != tsk1->area.visible) { tsk1->area.visible = 1 - hide; set_task_redraw(tsk1); Panel *p = (Panel*)tsk->area.panel; tsk->area.resize = 1; p->taskbar->area.resize = 1; p->area.resize = 1; } } panel_refresh = 1; } } }
void event_configure_notify(Window win) { // change in root window (xrandr) if (win == server.root_win) { signal_pending = SIGUSR1; return; } // 'win' is a trayer icon TrayWindow* traywin; GSList* l; for (l = systray.list_icons; l; l = l->next) { traywin = (TrayWindow*)l->data; if (traywin->tray_id == win) { XMoveResizeWindow(server.dsp, traywin->id, traywin->x, traywin->y, traywin->width, traywin->height); XResizeWindow(server.dsp, traywin->tray_id, traywin->width, traywin->height); panel_refresh = 1; return; } } // 'win' move in another monitor if (nb_panel == 1) return; Task* tsk = task_get_task(win); if (!tsk) return; Panel* p = tsk->area.panel; if (p->monitor != window_get_monitor(win)) { remove_task(tsk); tsk = add_task(win); if (win == window_get_active()) { set_task_state(tsk, TASK_ACTIVE); task_active = tsk; } panel_refresh = 1; } }
Task *add_task (Window win) { if (!win) return 0; if (window_is_hidden(win)) return 0; int monitor; if (nb_panel > 1) { monitor = window_get_monitor (win); if (monitor >= nb_panel) monitor = 0; } else monitor = 0; Task new_tsk; new_tsk.win = win; new_tsk.desktop = window_get_desktop (win); new_tsk.area.panel = &panel1[monitor]; new_tsk.current_state = window_is_iconified(win) ? TASK_ICONIFIED : TASK_NORMAL; window_get_coordinates (win, &new_tsk.geometry); // allocate only one title and one icon // even with task_on_all_desktop and with task_on_all_panel new_tsk.title = 0; int k; for (k=0; k<TASK_STATE_COUNT; ++k) { new_tsk.icon[k] = 0; new_tsk.state_pix[k] = 0; } get_title(&new_tsk); get_icon(&new_tsk); //printf("task %s : desktop %d, monitor %d\n", new_tsk->title, desktop, monitor); XSelectInput (server.dsp, new_tsk.win, PropertyChangeMask|StructureNotifyMask); GPtrArray* task_group = g_ptr_array_new(); Taskbar *tskbar; Task *new_tsk2=0; for (uint32_t j=0, desktop_count = panel1[monitor].nb_desktop; j < desktop_count ; j++) { if (new_tsk.desktop != ALLDESKTOP && new_tsk.desktop != j) continue; tskbar = &panel1[monitor].taskbar[j]; new_tsk2 = calloc(1, sizeof(Task)); memcpy(&new_tsk2->area, &panel1[monitor].g_task.area, sizeof(Area)); new_tsk2->area.parent = tskbar; new_tsk2->win = new_tsk.win; new_tsk2->desktop = new_tsk.desktop; /* new_tsk2->win_x = new_tsk.win_x; */ /* new_tsk2->win_y = new_tsk.win_y; */ /* new_tsk2->win_w = new_tsk.win_w; */ /* new_tsk2->win_h = new_tsk.win_h; */ new_tsk2->geometry = new_tsk.geometry; new_tsk2->current_state = -1; // to update the current state later in set_task_state... if (new_tsk2->desktop == ALLDESKTOP && server.desktop != (int)j) { // hide ALLDESKTOP task on non-current desktop new_tsk2->area.visible = 0; } new_tsk2->title = new_tsk.title; if (panel1[monitor].g_task.tooltip_enabled) new_tsk2->area._get_tooltip_text = task_get_tooltip; for (k=0; k<TASK_STATE_COUNT; ++k) { new_tsk2->icon[k] = new_tsk.icon[k]; new_tsk2->state_pix[k] = 0; } new_tsk2->icon_width = new_tsk.icon_width; new_tsk2->icon_height = new_tsk.icon_height; tskbar->area.children = g_slist_append(tskbar->area.children, new_tsk2); tskbar->area.resize = 1; g_ptr_array_add(task_group, new_tsk2); //printf("add_task panel %d, desktop %d, task %s\n", i, j, new_tsk2->title); } Window* key = calloc(1, sizeof(Window)); *key = new_tsk.win; g_hash_table_insert(win_to_task_table, key, task_group); set_task_state(new_tsk2, new_tsk.current_state); sort_taskbar_for_win(win); if (panel_mode == MULTI_DESKTOP) { Panel *panel = new_tsk2->area.panel; panel->area.resize = 1; } if (window_is_urgent(win)) { add_urgent(new_tsk2); } return new_tsk2; }