Esempio n. 1
0
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;
		}
	}
}
Esempio n. 2
0
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;
    }
}
Esempio n. 3
0
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;
}