Beispiel #1
0
Task *click_task (Panel *panel, int x, int y)
{
	GSList *l0;
	Taskbar *tskbar;

	if ( (tskbar = click_taskbar(panel, x, y)) ) {
		if (panel_horizontal) {
			Task *tsk;
			for (l0 = tskbar->area.list; l0 ; l0 = l0->next) {
				tsk = l0->data;
				if (tsk->area.on_screen && x >= tsk->area.posx && x <= (tsk->area.posx + tsk->area.width)) {
					return tsk;
				}
			}
		}
		else {
			Task *tsk;
			for (l0 = tskbar->area.list; l0 ; l0 = l0->next) {
				tsk = l0->data;
				if (tsk->area.on_screen && y >= tsk->area.posy && y <= (tsk->area.posy + tsk->area.height)) {
					return tsk;
				}
			}
		}
	}
	return NULL;
}
Beispiel #2
0
void event_button_motion_notify(XEvent* e) {
    Panel* panel = get_panel(e->xany.window);
    if (!panel || !task_drag) return;

    // Find the taskbar on the event's location
    point_T point = {e->xbutton.x, e->xbutton.y};
    Taskbar* event_taskbar = click_taskbar(panel, point);
    if (event_taskbar == NULL) return;

    // Find the task on the event's location

    Task* event_task = click_task(panel, point);

    // If the event takes place on the same taskbar as the task being dragged
    if (event_taskbar == task_drag->area.parent) {
        // Swap the task_drag with the task on the event's location (if they differ)
        if (event_task && event_task != task_drag) {
            GSList* drag_iter = g_slist_find(event_taskbar->area.list, task_drag);
            GSList* task_iter = g_slist_find(event_taskbar->area.list, event_task);
            if (drag_iter && task_iter) {
                gpointer temp = task_iter->data;
                task_iter->data = drag_iter->data;
                drag_iter->data = temp;
                event_taskbar->area.resize = 1;
                panel_refresh = 1;
                task_dragged = 1;
            }
        }
    } else {  // The event is on another taskbar than the task being dragged
        if (task_drag->desktop == ALLDESKTOP || panel_mode != MULTI_DESKTOP) return;

        Taskbar* drag_taskbar = (Taskbar*)task_drag->area.parent;
        drag_taskbar->area.list =
            g_slist_remove(drag_taskbar->area.list, task_drag);

        if (event_taskbar->area.posx > drag_taskbar->area.posx ||
                event_taskbar->area.posy > drag_taskbar->area.posy) {
            int i = (taskbarname_enabled) ? 1 : 0;
            event_taskbar->area.list =
                g_slist_insert(event_taskbar->area.list, task_drag, i);
        } else
            event_taskbar->area.list =
                g_slist_append(event_taskbar->area.list, task_drag);

        // Move task to other desktop (but avoid the 'Window desktop changed' code
        // in 'event_property_notify')
        task_drag->area.parent = event_taskbar;
        task_drag->desktop = event_taskbar->desktop;

        windows_set_desktop(task_drag->win, event_taskbar->desktop);

        event_taskbar->area.resize = 1;
        drag_taskbar->area.resize = 1;
        task_dragged = 1;
        panel_refresh = 1;
    }
}
Beispiel #3
0
Task *click_task(Panel *panel, int x, int y)
{
	Taskbar *taskbar = click_taskbar(panel, x, y);
	if (taskbar) {
		GList *l = taskbar->area.children;
		if (taskbarname_enabled)
			l = l->next;
		for (; l; l = l->next) {
			Task *task = (Task *)l->data;
			if (area_is_under_mouse(task, x, y)) {
				return task;
			}
		}
	}
	return NULL;
}
Beispiel #4
0
int tinto_handles_click(Panel* panel, XButtonEvent* e) {
    point_T point = {e->x, e->y};
    Task* task = click_task(panel, point);
    if (task) {
        if ((e->button == 1) ||
                (e->button == 2 && mouse_middle != 0) ||
                (e->button == 3 && mouse_right != 0) ||
                (e->button == 4 && mouse_scroll_up != 0) ||
                (e->button == 5 && mouse_scroll_down != 0)) {
            return 1;
        } else
            return 0;
    }
    point.x = e->x;
    point.y = e->y;
    LauncherIcon* icon = click_launcher_icon(panel, point);
    if (icon) {
        if (e->button == 1) {
            return 1;
        } else {
            return 0;
        }
    }
    // no launcher/task clicked --> check if taskbar clicked
    Taskbar* tskbar = click_taskbar(panel, point);
    if (tskbar && e->button == 1 && panel_mode == MULTI_DESKTOP) return 1;
    point.x = e->x;
    point.y = e->y;
    if (click_clock(panel, point)) {
        if ((e->button == 1 && clock_lclick_command) ||
                (e->button == 3 && clock_rclick_command))
            return 1;
        else
            return 0;
    }
    return 0;
}
Beispiel #5
0
void event_button_release(XEvent* e) {
    Panel* panel = get_panel(e->xany.window);
    if (!panel) return;

    if (wm_menu && !tinto_handles_click(panel, &e->xbutton)) {
        forward_click(e);
        if (panel_layer == BOTTOM_LAYER) XLowerWindow(server.dsp, panel->main_win);
        task_drag = 0;
        return;
    }

    int action = TOGGLE_ICONIFY;
    switch (e->xbutton.button) {
    case 1:
        action = mouse_left;
        break;
    case 2:
        action = mouse_middle;
        break;
    case 3:
        action = mouse_right;
        break;
    case 4:
        action = mouse_scroll_up;
        break;
    case 5:
        action = mouse_scroll_down;
        break;
    case 6:
        action = mouse_tilt_left;
        break;
    case 7:
        action = mouse_tilt_right;
        break;
    }

    point_T point = {e->xbutton.x, e->xbutton.y};
    if (click_clock(panel, point)) {
        clock_action(e->xbutton.button);
        if (panel_layer == BOTTOM_LAYER) XLowerWindow(server.dsp, panel->main_win);
        task_drag = 0;
        return;
    }

    point.x = e->xbutton.x;
    point.y = e->xbutton.y;
    if (click_launcher(panel, point)) {
        point.x = e->xbutton.x;
        point.y = e->xbutton.y;
        LauncherIcon* icon = click_launcher_icon(panel, point);
        if (icon) {
            launcher_action(icon, e);
        }
        task_drag = 0;
        return;
    }

    Taskbar* tskbar;
    if (!(tskbar = click_taskbar(panel, point))) {
        // TODO: check better solution to keep window below
        if (panel_layer == BOTTOM_LAYER) XLowerWindow(server.dsp, panel->main_win);
        task_drag = 0;
        return;
    }

    // drag and drop task
    if (task_dragged) {
        task_drag = 0;
        task_dragged = 0;
        return;
    }

    // switch desktop
    if (panel_mode == MULTI_DESKTOP) {
        if (tskbar->desktop != server.desktop && action != CLOSE &&
                action != DESKTOP_LEFT && action != DESKTOP_RIGHT)
            set_desktop(tskbar->desktop);
    }

    // action on task
    // e->xbutton.x, e->xbutton.y
    window_action(click_task(panel, point), action);

    // to keep window below
    if (panel_layer == BOTTOM_LAYER) XLowerWindow(server.dsp, panel->main_win);
}