- 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) {
- config_taskbar();
- visible_object();
- }
- /* Change desktop */
- else if (at == server.atom._NET_CURRENT_DESKTOP) {
- server.desktop = server_get_current_desktop ();
- 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) {
- if (panel.task_active) {
- if (panel.task_active->all_desktop) {
- Task *tsk;
- GSList *l0;
- int i, nb;
- nb = server.nb_desktop * server.nb_monitor;
- for (i=0 ; i < nb ; i++) {
- for (l0 = panel.taskbar[i].area.list; l0 ; l0 = l0->next) {
- tsk = l0->data;
- tsk->area.is_active = 0;
- }
- }
- }
- else
- panel.task_active->area.is_active = 0;
- panel.task_active = 0;
+
+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);
+}
+
+
+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) {
+ int old_desktop = server.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 both taskbar
+ panel->taskbar[old_desktop].area.is_active = 0;
+ panel->taskbar[old_desktop].area.redraw = 1;
+ panel->taskbar[server.desktop].area.is_active = 1;
+ panel->taskbar[server.desktop].area.redraw = 1;
+ panel_refresh = 1;
+ }
+ // check ALLDESKTOP task => resize taskbar
+ Taskbar *tskbar;
+ Task *tsk;
+ GSList *l;
+ tskbar = &panel->taskbar[old_desktop];
+ for (l = tskbar->area.list; l ; l = l->next) {
+ tsk = l->data;
+ if (tsk->desktop == ALLDESKTOP) {
+ tsk->area.on_screen = 0;
+ tskbar->area.resize = 1;
+ panel_refresh = 1;
+ }
+ }
+ tskbar = &panel->taskbar[server.desktop];
+ for (l = tskbar->area.list; l ; l = l->next) {
+ tsk = l->data;
+ if (tsk->desktop == ALLDESKTOP) {
+ tsk->area.on_screen = 1;
+ tskbar->area.resize = 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;