X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=scrotwm.c;h=958f6523bda10802532be38d834fb73a554dccba;hb=68bba3e25eabe8257674ed972fbe4f0d99aa4e1f;hp=a2997cc167b4776114c2d2b2ecf6c5f2870de599;hpb=af851bfc41facb5b4632d8b9938df2813be61684;p=spectrwm.git diff --git a/scrotwm.c b/scrotwm.c index a2997cc..958f652 100644 --- a/scrotwm.c +++ b/scrotwm.c @@ -287,6 +287,7 @@ struct ws_win { XWindowAttributes wa; XSizeHints sh; XClassHint ch; + XWMHints *hints; }; TAILQ_HEAD(ws_win_list, ws_win); @@ -1381,6 +1382,18 @@ bar_setup(struct swm_region *r) } void +drain_enter_notify(void) +{ + int i = 0; + XEvent cne; + + while (XCheckMaskEvent(display, EnterWindowMask, &cne)) + i++; + + DNPRINTF(SWM_D_MISC, "drain_enter_notify: drained %d\n", i); +} + +void set_win_state(struct ws_win *win, long state) { long data[] = {state, None}; @@ -1959,12 +1972,16 @@ switchws(struct swm_region *r, union arg *args) stack(); a.id = SWM_ARG_ID_FOCUSCUR; focus(new_ws->r, &a); + bar_update(); /* unmap old windows */ if (unmap_old) TAILQ_FOREACH(win, &old_ws->winlist, entry) unmap_window(win); + + if (focus_mode == SWM_FOCUS_DEFAULT) + drain_enter_notify(); } void @@ -2375,6 +2392,9 @@ stack(void) { } if (font_adjusted) font_adjusted--; + + if (focus_mode == SWM_FOCUS_DEFAULT) + drain_enter_notify(); } void @@ -3257,7 +3277,7 @@ resize(struct ws_win *win, union arg *args) XUngrabPointer(display, CurrentTime); /* drain events */ - while (XCheckMaskEvent(display, EnterWindowMask, &ev)); + drain_enter_notify(); } void @@ -3351,7 +3371,7 @@ move(struct ws_win *win, union arg *args) XUngrabPointer(display, CurrentTime); /* drain events */ - while (XCheckMaskEvent(display, EnterWindowMask, &ev)); + drain_enter_notify(); } /* user/key callable function IDs */ @@ -4301,6 +4321,7 @@ setup_quirks(void) setquirk("Xitk", "Xine Window", SWM_Q_FLOAT | SWM_Q_ANYWHERE); setquirk("xine", "xine Video Fullscreen Window", SWM_Q_FULLSCREEN | SWM_Q_FLOAT); setquirk("pcb", "pcb", SWM_Q_FLOAT); + setquirk("SDL_App", "SDL_App", SWM_Q_FLOAT | SWM_Q_FULLSCREEN); } /* conf file stuff */ @@ -4578,13 +4599,52 @@ conf_load(char *filename) } void -set_child_transient(struct ws_win *win) +set_child_transient(struct ws_win *win, Window *trans) { - struct ws_win *parent; + struct ws_win *parent, *w; + XWMHints *wmh = NULL; + struct swm_region *r; + struct workspace *ws; parent = find_window(win->transient); if (parent) parent->child_trans = win; + else { + DNPRINTF(SWM_D_MISC, "set_child_transient: parent doesn't exist" + " for %lu trans %lu\n", win->id, win->transient); + + if (win->hints == NULL) { + fprintf(stderr, "no hints for %lu\n", win->id); + return; + } + + r = root_to_region(win->wa.root); + ws = r->ws; + /* parent doen't exist in our window list */ + TAILQ_FOREACH(w, &ws->winlist, entry) { + if (wmh) + XFree(wmh); + + if ((wmh = XGetWMHints(display, w->id)) == NULL) { + fprintf(stderr, "can't get hints for %lu\n", + w->id); + continue; + } + + if (win->hints->window_group != wmh->window_group) + continue; + + w->child_trans = win; + win->transient = w->id; + *trans = w->id; + DNPRINTF(SWM_D_MISC, "set_child_transient: asjusting " + "transient to %lu\n", win->transient); + break; + } + } + + if (wmh) + XFree(wmh); } struct ws_win * @@ -4611,9 +4671,9 @@ manage_window(Window id) DNPRINTF(SWM_D_MISC, "manage previously unmanaged window " "%lu\n", win->id); TAILQ_REMOVE(&win->ws->unmanagedlist, win, entry); - if (win->transient) - set_child_transient(win); - if (trans && (ww = find_window(trans))) + if (win->transient) { + set_child_transient(win, &trans); + } if (trans && (ww = find_window(trans))) TAILQ_INSERT_AFTER(&win->ws->winlist, ww, win, entry); else TAILQ_INSERT_TAIL(&win->ws->winlist, win, entry); @@ -4633,10 +4693,11 @@ manage_window(Window id) False, XA_STRING, &type, &format, &nitems, &bytes, &prop); XGetWindowAttributes(display, id, &win->wa); XGetWMNormalHints(display, id, &win->sh, &mask); + win->hints = XGetWMHints(display, id); XGetTransientForHint(display, id, &trans); if (trans) { win->transient = trans; - set_child_transient(win); + set_child_transient(win, &trans); DNPRINTF(SWM_D_MISC, "manage_window: win %lu transient %lu\n", win->id, win->transient); } @@ -5020,11 +5081,6 @@ enternotify(XEvent *e) switch (focus_mode) { case SWM_FOCUS_DEFAULT: - if (QLength(display)) { - DNPRINTF(SWM_D_EVENT, "ignore enternotify %d\n", - QLength(display)); - return; - } break; case SWM_FOCUS_FOLLOW: break;