+ Panel *panel = get_panel(e->xany.window);
+ if (!panel) return;
+
+ task_drag = click_task(panel, e->xbutton.x, e->xbutton.y);
+
+ if (wm_menu && !task_drag && !click_clock(panel, e->xbutton.x, e->xbutton.y) && (e->xbutton.button != 1) ) {
+ // forward the click to the desktop window (thanks conky)
+ XUngrabPointer(server.dsp, e->xbutton.time);
+ e->xbutton.window = server.root_win;
+ // icewm doesn't open under the mouse.
+ // and xfce doesn't open at all.
+ //e->xbutton.x = e->xbutton.x_root;
+ //e->xbutton.y = e->xbutton.y_root;
+ //printf("**** %d, %d\n", e->xbutton.x, e->xbutton.y);
+ XSetInputFocus(server.dsp, e->xbutton.window, RevertToParent, e->xbutton.time);
+ XSendEvent(server.dsp, e->xbutton.window, False, ButtonPressMask, e);
+ return;
+ }
+
+ XLowerWindow (server.dsp, panel->main_win);
+}
+
+
+void event_button_release (XEvent *e)
+{
+ Panel *panel = get_panel(e->xany.window);
+ if (!panel) return;
+
+ int action = TOGGLE_ICONIFY;
+ switch (e->xbutton.button) {
+ 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;
+ }
+
+ if ( click_clock(panel, e->xbutton.x, e->xbutton.y)) {
+ clock_action(e->xbutton.button);
+ XLowerWindow (server.dsp, panel->main_win);
+ task_drag = 0;
+ return;
+ }
+
+ Taskbar *tskbar;
+ if ( !(tskbar = click_taskbar(panel, e->xbutton.x, e->xbutton.y)) ) {
+ // TODO: check better solution to keep window below
+ XLowerWindow (server.dsp, panel->main_win);
+ task_drag = 0;
+ return;
+ }
+
+ // drag and drop task
+ if (task_drag) {
+ if (tskbar != task_drag->area.parent && action == TOGGLE_ICONIFY) {
+ if (task_drag->desktop != ALLDESKTOP && panel_mode == MULTI_DESKTOP) {
+ windows_set_desktop(task_drag->win, tskbar->desktop);
+ if (tskbar->desktop == server.desktop)
+ set_active(task_drag->win);
+ task_drag = 0;
+ }
+ return;
+ }
+ else task_drag = 0;
+ }
+
+ // 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
+ window_action( click_task(panel, e->xbutton.x, e->xbutton.y), action);
+
+ // to keep window below
+ XLowerWindow (server.dsp, panel->main_win);
+}