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; }
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; } }
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; }
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; }
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); }