-void event_property_notify (Window win, Atom at)
-{
-
- 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();
- redraw(&panel.area);
- }
- /* 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;
- }
- /* Active */
- else if (at == server.atom._NET_ACTIVE_WINDOW) {
- Window w1 = window_get_active ();
- Task *t = task_get_task(w1);
- if (t) panel.task_active = t;
- else {
- Window w2;
- if (XGetTransientForHint(server.dsp, w1, &w2) != 0)
- if (w2) panel.task_active = task_get_task(w2);
- }
- panel.refresh = 1;
- }
- /* Wallpaper changed */
- else if (at == server.atom._XROOTPMAP_ID) {
- XFreePixmap (server.dsp, server.root_pmap);
- server.root_pmap = 0;
- redraw(&panel.area);
- panel.clock.area.redraw = 1;
- panel.refresh = 1;
- }
- }
- else {
- Task *tsk;
- tsk = task_get_task (win);
- if (!tsk) return;
- //printf("atom root_win = %s, %s\n", XGetAtomName(server.dsp, at), tsk->title);
-
- /* Window title changed */
- if (at == server.atom._NET_WM_VISIBLE_NAME || at == server.atom._NET_WM_NAME || at == server.atom.WM_NAME) {
- get_title(tsk);
- tsk->area.redraw = 1;
- panel.refresh = 1;
- }
- /* Iconic state */
- else if (at == server.atom.WM_STATE) {
- if (window_is_iconified (win))
- if (panel.task_active == tsk) panel.task_active = 0;
- }
- /* Window icon changed */
- else if (at == server.atom._NET_WM_ICON) {
- if (tsk->icon_data != 0) XFree (tsk->icon_data);
- tsk->area.redraw = 1;
- tsk->icon_data = 0;
- panel.refresh = 1;
- }
- /* Window desktop changed */
- else if (at == server.atom._NET_WM_DESKTOP) {
- add_task (tsk->win);
- remove_task (tsk);
- panel.refresh = 1;
- }
-
- if (!server.got_root_win) server.root_win = RootWindow (server.dsp, server.screen);
- }
+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;
+ }
+ // put active state on all task (multi_desktop)
+ if (t) {
+ 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;
+ if (tsk->win == t->win) {
+ tsk->area.is_active = 1;
+ //printf("active monitor %d, task %s\n", panel1[i].monitor, tsk->title);
+ }
+ }
+ }
+ }
+ task_active = t;
+ }
+ panel_refresh = 1;
+ }
+ else if (at == server.atom._XROOTPMAP_ID) {
+ // change Wallpaper
+ for (i=0 ; i < nb_panel ; i++) {
+ set_panel_background(&panel1[i]);
+ }
+ panel_refresh = 1;
+ }
+ }
+ else {
+ tsk = task_get_task (win);
+ if (!tsk) {
+ if ( at != server.atom._NET_WM_STATE)
+ return;
+ else if ( !(tsk = add_task(win)) )
+ return;
+ }
+ //printf("atom root_win = %s, %s\n", XGetAtomName(server.dsp, at), tsk->title);
+
+ // Window title changed
+ if (at == server.atom._NET_WM_VISIBLE_NAME || at == server.atom._NET_WM_NAME || at == server.atom.WM_NAME) {
+ Task *tsk2;
+ GSList *l0;
+ get_title(tsk);
+ // changed other tsk->title
+ 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) {
+ tsk2 = l0->data;
+ if (tsk->win == tsk2->win && tsk != tsk2) {
+ tsk2->title = tsk->title;
+ tsk2->area.redraw = 1;
+ }
+ }
+ }
+ }
+ panel_refresh = 1;
+ }
+ // Demand attention
+ else if (at == server.atom._NET_WM_STATE) {
+ if (window_is_urgent (win)) {
+ task_urgent = tsk;
+ tick_urgent = 0;
+ time_precision = 1;
+ }
+ if (window_is_skip_taskbar(win)) {
+ remove_task( tsk );
+ panel_refresh = 1;
+ }
+ }
+// else if (at == server.atom.WM_STATE) {
+// // Iconic state
+// // TODO : try to delete following code
+// if (window_is_iconified (win)) {
+// if (task_active) {
+// if (task_active->win == tsk->win) {
+// Task *tsk2;
+// GSList *l0;
+// 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) {
+// tsk2 = l0->data;
+// tsk2->area.is_active = 0;
+// }
+// }
+// }
+// task_active = 0;
+// }
+// }
+// }
+// }
+ // Window icon changed
+ else if (at == server.atom._NET_WM_ICON) {
+ get_icon(tsk);
+ Task *tsk2;
+ GSList *l0;
+ 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) {
+ tsk2 = l0->data;
+ if (tsk->win == tsk2->win && tsk != tsk2) {
+ tsk2->icon_width = tsk->icon_width;
+ tsk2->icon_height = tsk->icon_height;
+ tsk2->icon = tsk->icon;
+ tsk2->icon_active = tsk->icon_active;
+ tsk2->area.redraw = 1;
+ }
+ }
+ }
+ }
+ panel_refresh = 1;
+ }
+ // Window desktop changed
+ else if (at == server.atom._NET_WM_DESKTOP) {
+ int desktop = window_get_desktop (win);
+ int active = tsk->area.is_active;
+ //printf(" Window desktop changed %d, %d\n", tsk->desktop, desktop);
+ // bug in windowmaker : send unecessary 'desktop changed' when focus changed
+ if (desktop != tsk->desktop) {
+ remove_task (tsk);
+ tsk = add_task (win);
+ if (tsk && active) {
+ tsk->area.is_active = 1;
+ task_active = tsk;
+ }
+ panel_refresh = 1;
+ }
+ }
+ else if (at == server.atom.WM_HINTS) {
+ XWMHints* wmhints = XGetWMHints(server.dsp, win);
+ if (wmhints && wmhints->flags & XUrgencyHint) {
+ task_urgent = tsk;
+ tick_urgent = 0;
+ time_precision = 1;
+ }
+ XFree(wmhints);
+ }
+
+ if (!server.got_root_win) server.root_win = RootWindow (server.dsp, server.screen);
+ }
+}
+
+
+void event_expose (XEvent *e)
+{
+ if (e->xany.window == g_tooltip.window)
+ tooltip_update();
+ else {
+ Panel *panel;
+ panel = get_panel(e->xany.window);
+ if (!panel) return;
+ // TODO : one panel_refresh per panel ?
+ panel_refresh = 1;
+ }