void Reborder(void) { FvwmWindow *tmp; /* temp fvwm window structure */ /* put a border back around all windows */ XGrabServer(dpy); InstallWindowColormaps(&Scr.FvwmRoot); /* force reinstall */ /* RBW - 05/15/1998 Grab the last window and work backwards: preserve stacking order on restart. */ for (tmp = Scr.FvwmRoot.stack_prev; tmp != &Scr.FvwmRoot; tmp = tmp->stack_prev) { RestoreWithdrawnLocation(tmp, True); XUnmapWindow(dpy, tmp->frame); XDestroyWindow(dpy, tmp->frame); } XUngrabServer(dpy); XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); XSync(dpy, 0); }
/* When a window is unmapped (or destroyed) this function takes care of * adjusting the focus window appropriately. */ void restore_focus_after_unmap( FvwmWindow *tmp_win, Bool do_skip_marked_transients) { extern FvwmWindow *colormap_win; FvwmWindow *t = NULL; FvwmWindow *set_focus_to = NULL; if (tmp_win == get_focus_window()) { if (tmp_win->transientfor != None && tmp_win->transientfor != Scr.Root) { for (t = Scr.FvwmRoot.next; t != NULL; t = t->next) { if (t->w == tmp_win->transientfor && t->Desk == tmp_win->Desk && (!do_skip_marked_transients || !IS_IN_TRANSIENT_SUBTREE(t))) { set_focus_to = t; break; } } } if (!set_focus_to && (HAS_CLICK_FOCUS(tmp_win) || HAS_SLOPPY_FOCUS(tmp_win))) { for (t = tmp_win->next; t != NULL; t = t->next) { if (t->Desk == tmp_win->Desk && !DO_SKIP_CIRCULATE(t) && !(IS_ICONIFIED(t) && ( DO_SKIP_ICON_CIRCULATE(t) || IS_ICON_SUPPRESSED(t))) && (!do_skip_marked_transients || !IS_IN_TRANSIENT_SUBTREE(t))) { /* If it is on a different desk we have to look for another window */ set_focus_to = t; break; } } } if (set_focus_to && set_focus_to != tmp_win && set_focus_to->Desk == tmp_win->Desk) { /* Don't transfer focus to windows on other desks */ SetFocusWindow(set_focus_to, 1); } if (tmp_win == get_focus_window()) { DeleteFocus(1); } } if (tmp_win == Scr.pushed_window) Scr.pushed_window = NULL; if (tmp_win == colormap_win) { InstallWindowColormaps(set_focus_to); } return; }
/* When a window is unmapped (or destroyed) this function takes care of * adjusting the focus window appropriately. */ void restore_focus_after_unmap( const FvwmWindow *fw, Bool do_skip_marked_transients) { extern FvwmWindow *colormap_win; FvwmWindow *set_focus_to = NULL; if (focus_is_focused(fw)) { set_focus_to = __restore_focus_after_unmap( fw, do_skip_marked_transients); } if (fw == Scr.pushed_window) { Scr.pushed_window = NULL; } if (fw == colormap_win) { InstallWindowColormaps(set_focus_to); } return; }
/*********************************************************************** * * Procedure: * HandleFocusIn - handles focus in events * ************************************************************************/ void HandleFocusIn() { XEvent d; Window w; DBUG("HandleFocusIn","Routine Entered"); w= Event.xany.window; while(XCheckTypedEvent(dpy,FocusIn,&d)) { w = d.xany.window; } if (XFindContext (dpy, w, FvwmContext, (caddr_t *) &Tmp_win) == XCNOENT) { Tmp_win = NULL; } if(!Tmp_win) { if(w != Scr.NoFocusWin) { Scr.UnknownWinFocused = w; } else { SetBorder(Scr.Hilite,False,True,True,None); BroadcastPacket(M_FOCUS_CHANGE, 5, 0, 0, 0, Scr.DefaultDecor.HiColors.fore, Scr.DefaultDecor.HiColors.back); if (Scr.ColormapFocus == COLORMAP_FOLLOWS_FOCUS) { if((Scr.Hilite)&&(!(Scr.Hilite->flags & ICONIFIED))) { InstallWindowColormaps(Scr.Hilite); } else { InstallWindowColormaps(NULL); } } } } else if(Tmp_win != Scr.Hilite) { SetBorder(Tmp_win,True,True,True,None); BroadcastPacket(M_FOCUS_CHANGE, 5, Tmp_win->w, Tmp_win->frame, (unsigned long)Tmp_win, GetDecor(Tmp_win,HiColors.fore), GetDecor(Tmp_win,HiColors.back)); if (Scr.ColormapFocus == COLORMAP_FOLLOWS_FOCUS) { if((Scr.Hilite)&&(!(Scr.Hilite->flags & ICONIFIED))) { InstallWindowColormaps(Scr.Hilite); } else { InstallWindowColormaps(NULL); } } } }
/*********************************************************************** * * Procedure: * HandleEnterNotify - EnterNotify event handler * ************************************************************************/ void HandleEnterNotify() { XEnterWindowEvent *ewp = &Event.xcrossing; XEvent d; DBUG("HandleEnterNotify","Routine Entered"); /* look for a matching leaveNotify which would nullify this enterNotify */ if(XCheckTypedWindowEvent (dpy, ewp->window, LeaveNotify, &d)) { /* RBW - if we're in startup, this is a coerced focus, so we don't want to save the event time, or exit prematurely. */ if (! fFvwmInStartup) { StashEventTime(&d); if((d.xcrossing.mode==NotifyNormal)&& (d.xcrossing.detail!=NotifyInferior)) return; } } /* an EnterEvent in one of the PanFrameWindows activates the Paging */ #ifndef NON_VIRTUAL if (ewp->window==Scr.PanFrameTop.win || ewp->window==Scr.PanFrameLeft.win || ewp->window==Scr.PanFrameRight.win || ewp->window==Scr.PanFrameBottom.win ) { int delta_x=0, delta_y=0; /* this was in the HandleMotionNotify before, HEDU */ HandlePaging(Scr.EdgeScrollX,Scr.EdgeScrollY, &Event.xcrossing.x_root,&Event.xcrossing.y_root, &delta_x,&delta_y,True); return; } #endif /* NON_VIRTUAL */ /* multi screen? */ if (Event.xany.window == Scr.Root) { if (!Scr.Focus || (!(Scr.Focus->flags&ClickToFocus)&& !(Scr.Focus->flags&SloppyFocus))) { SetFocus(Scr.NoFocusWin,NULL,1); } if (Scr.ColormapFocus == COLORMAP_FOLLOWS_MOUSE) { InstallWindowColormaps(NULL); } return; } /* make sure its for one of our windows */ if (!Tmp_win) return; if(!(Tmp_win->flags & ClickToFocus)) { SetFocus(Tmp_win->w,Tmp_win,1); } if (Scr.ColormapFocus == COLORMAP_FOLLOWS_MOUSE) { if((!(Tmp_win->flags & ICONIFIED))&&(Event.xany.window == Tmp_win->w)) InstallWindowColormaps(Tmp_win); else InstallWindowColormaps(NULL); } return; }