+
+void event_button_press (XEvent *e)
+{
+ Panel *panel = get_panel(e->xany.window);
+ if (!panel) return;
+
+ if (panel_mode == MULTI_DESKTOP)
+ 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;
+
+ if (wm_menu && click_padding(panel, e->xbutton.x, e->xbutton.y)) {
+ // forward the click to the desktop window (thanks conky)
+ e->xbutton.window = server.root_win;
+ XSendEvent(server.dsp, e->xbutton.window, False, ButtonReleaseMask, e);
+ 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);
+}
+
+
+void event_property_notify (XEvent *e)
+{
+ int i, j;
+ Task *tsk;
+ Window win = e->xproperty.window;
+ Atom at = e->xproperty.atom;
+
+ if (win == server.root_win) {
+ if (!server.got_root_win) {
+ XSelectInput (server.dsp, server.root_win, PropertyChangeMask|StructureNotifyMask);
+ server.got_root_win = 1;
+ }
+
+ // Change number of desktops
+ else if (at == server.atom._NET_NUMBER_OF_DESKTOPS) {
+ server.nb_desktop = server_get_number_of_desktop ();
+ cleanup_taskbar();
+ init_taskbar();
+ visible_object();
+ for (i=0 ; i < nb_panel ; i++) {
+ panel1[i].area.resize = 1;
+ }
+ task_refresh_tasklist();
+ panel_refresh = 1;
+ }
+ // Change desktop
+ else if (at == server.atom._NET_CURRENT_DESKTOP) {
+ server.desktop = server_get_current_desktop ();
+ for (i=0 ; i < nb_panel ; i++) {
+ Panel *panel = &panel1[i];
+ if (panel_mode == MULTI_DESKTOP && panel->g_taskbar.use_active) {
+ // redraw taskbar
+ panel_refresh = 1;
+ Taskbar *tskbar;
+ Task *tsk;
+ GSList *l;
+ for (j=0 ; j < panel->nb_desktop ; j++) {
+ tskbar = &panel->taskbar[j];
+ if (tskbar->area.is_active) {
+ tskbar->area.is_active = 0;
+ tskbar->area.redraw = 1;
+ for (l = tskbar->area.list; l ; l = l->next) {
+ tsk = l->data;
+ tsk->area.redraw = 1;
+ }
+ }
+ if (j == server.desktop) {
+ tskbar->area.is_active = 1;
+ tskbar->area.redraw = 1;
+ for (l = tskbar->area.list; l ; l = l->next) {
+ tsk = l->data;
+ tsk->area.redraw = 1;
+ }
+ }
+ }
+ }
+ }
+ if (panel_mode != MULTI_DESKTOP) {
+ visible_object();
+ }
+ }
+ // Window list
+ else if (at == server.atom._NET_CLIENT_LIST) {
+ task_refresh_tasklist();
+ panel_refresh = 1;
+ }
+ // Change active
+ else if (at == server.atom._NET_ACTIVE_WINDOW) {
+ GSList *l0;
+ if (task_active) {
+ for (i=0 ; i < nb_panel ; i++) {
+ for (j=0 ; j < panel1[i].nb_desktop ; j++) {
+ for (l0 = panel1[i].taskbar[j].area.list; l0 ; l0 = l0->next) {
+ tsk = l0->data;
+ tsk->area.is_active = 0;
+ }
+ }
+ }
+ task_active = 0;
+ }
+ Window w1 = window_get_active ();
+ Task *t = task_get_task(w1);
+ if (!t) {
+ Window w2;
+ if (XGetTransientForHint(server.dsp, w1, &w2) != 0)
+ if (w2) t = task_get_task(w2);
+ }
+ if (task_urgent == t) {
+ init_precision();
+ task_urgent = 0;