- panel.refresh = 1;
- }
- /* Wallpaper changed */
- else if (at == server.atom._XROOTPMAP_ID) {
- set_panel_background();
- 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) {
- if (tsk->all_desktop) {
- Task *tsk2;
- 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) {
- tsk2 = l0->data;
- if (tsk->win == tsk2->win) {
- get_title(tsk2);
- tsk2->area.redraw = 1;
- }
- }
- }
- }
- else {
- 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) {
- if (panel.task_active->win == tsk->win) {
- if (tsk->all_desktop) {
- Task *tsk2;
- 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) {
- tsk2 = l0->data;
- tsk2->area.is_active = 0;
- }
- }
- }
- else
- panel.task_active->area.is_active = 0;
- panel.task_active = 0;
- }
- }
- }
- /* Window icon changed */
- else if (at == server.atom._NET_WM_ICON) {
- if (tsk->icon_data) {
- free (tsk->icon_data);
- tsk->icon_data = 0;
- }
- tsk->area.redraw = 1;
- panel.refresh = 1;
- }
- /* Window desktop changed */
- else if (at == server.atom._NET_WM_DESKTOP) {
- remove_task (tsk);
- add_task (win);
- panel.refresh = 1;
- }
-
- if (!server.got_root_win) server.root_win = RootWindow (server.dsp, server.screen);
- }
+ 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;
+ }
+ }
+// We do not check for the iconified state, since it only unsets our active window
+// but in openbox a shaded window is considered iconified. So we would loose the active window
+// property on unshading it again (commented 01.10.2009)
+// 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);
+ }