Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!usc!zaphod.mps.ohio-state.edu!uakari.primate.wisc.edu!aplcen!haven!decuac!shlump.nac.dec.com!shodha.dec.com!gsrc.dec.com!west From: west@gsrc.dec.com (Jim West (Stealth Contractor)) Newsgroups: comp.windows.x Subject: Re: Focus in DECwindows ??? Message-ID: <1427@shodha.dec.com> Date: 13 Jul 90 14:27:08 GMT Sender: news@shodha.dec.com Organization: Digital Equipment Corporation Lines: 222 In article <15510007@hpdmd48.HP.COM>, sritacco@hpdmd48.HP.COM (Steve Ritacco) writes... -Is there a way to get dxwm (the DECwindows window manager) to let -window focus follow the mouse pointer. I hate having to click in -a window to make it get the focus. I looked in the documentation -and couldn't find a way to do this. - -Thanks Here's a hack program that will do what you want. It goes against the grain of the DECwindows window manager...but it does work. NOTE: Totally %100 UNSUPPORTED !! cut here ----------------------------------------------------------------- /* autofocus.c: Crude hack to do uwm-style focus management. Author: Dave Burleigh */ #include #include #ifdef vms #include #include #include #else #include #include #include #endif #define forever while(1) static Window GetWMRoot(); static Window FrameOf(); /* Recursive */ static XWMHints *GetWMHints(); /* Recursive */ static int IgnoreDeadWindow(); main(argc,argv) unsigned int argc; char *argv[]; { Display *display; char *display_name[10]; Window wmroot,current,*children,*child; XWMHints *wmhints; int nchildren,i; /* Open the default display */ strcat(strcpy(display_name,getenv("SYS$NODE")),"0"); if (!(display = XOpenDisplay(display_name))) { fprintf(stderr,"Can't open display\n"); exit(0); } /* Find the window manager's pseudo-root window & its children */ wmroot = GetWMRoot(display,&children,&nchildren); XSelectInput(display,wmroot,StructureNotifyMask| SubstructureNotifyMask| KeyPressMask); /* Find out which children have set window manager hints */ for (i = 0, child = children; i < nchildren; ++i, ++child) { if (wmhints = GetWMHints(display,*child,¤t)) { XSelectInput(display,current,EnterWindowMask); XFree(wmhints); } } XFree(children); /* Ignore error when we try to set focus on a window which has died since we received the EnterWindow event */ XSetErrorHandler(IgnoreDeadWindow); forever { XEvent event; XMapEvent *map = (XMapEvent *)&event; XEnterWindowEvent *enter = (XEnterWindowEvent *)&event; XDestroyWindowEvent *destroy = (XDestroyWindowEvent *)&event; XNextEvent(display,&event); switch (event.type) { case MapNotify: if (wmhints = GetWMHints(display,map->window, ¤t)) { XSelectInput(display,current,EnterWindowMask); XFree(wmhints); } break; case EnterNotify: XSetInputFocus(display,enter->window, RevertToParent,CurrentTime); XMapRaised(display,enter->window); break; case DestroyNotify: if (destroy->window == wmroot) { fprintf(stderr,"Window Manager exited.\n"); exit(0); } } } } static XWMHints *GetWMHints(display,window,app_window) /* Recursive */ Display *display; Window window,*app_window; { XWMHints *wmhints; if (wmhints = XGetWMHints(display,window)) { *app_window = window; return wmhints; } else { Window root,parent,*children,*child,current = window; int i,nchildren; XQueryTree(display,current,&root,&parent,&children,&nchildren); for (i = 0, child = children; i < nchildren; ++i, ++child) { if (wmhints = GetWMHints(display,*child,app_window)) { XFree(children); return wmhints; } } if (nchildren) XFree(children); return NULL; } } static Window GetWMRoot(display,children,nchildren) Display *display; Window **children; int *nchildren; { Window window,root,parent,*child; XWMHints *wmhints; int x,y,width,height,bw,depth,found; register int i; /* Find first full-screen child of root */ window = RootWindow(display,DefaultScreen(display)); found = False; forever { XQueryTree(display,window,&root,&parent,children,nchildren); for (i = 0, child = *children; i < *nchildren; ++i, ++child) { XGetGeometry(display,*child,&root,&x,&y,&width,&height,&bw,&depth); found = width == DisplayWidth(display,DefaultScreen(display)) && height == DisplayHeight(display,DefaultScreen(display)); if (found) break; } if (found) break; if (*nchildren) XFree(*children); sleep(5); } /* Find first full-screen child of first full-screen child of root */ window = *child; XFree(*children); found = False; forever { XQueryTree(display,window,&root,&parent,children,nchildren); for (i = 0, child = *children; i < *nchildren; ++i, ++child) { XGetGeometry(display,*child,&root,&x,&y,&width,&height,&bw,&depth); found = width == DisplayWidth(display,DefaultScreen(display)) && height == DisplayHeight(display,DefaultScreen(display)); if (found) break; } if (found) break; if (*nchildren) XFree(*children); sleep(5); } /* Found window manager's pseudo-root; return it & its children */ window = *child; XFree(*children); XQueryTree(display,window,&root,&parent,children,nchildren); return window; } static int IgnoreDeadWindow(display,error) Display *display; XErrorEvent *error; { if (error->request_code == 42) /* Bad Window Id */ return; else XSetErrorHandler(NULL); } static Window FrameOf(display,window,wmroot) /* recursive */ Display *display; Window window,wmroot; { Window root,parent,*children; int nchildren; XQueryTree(display,window,&root,&parent,&children,&nchildren); return parent == wmroot ? window : FrameOf(display,parent,wmroot); } ---------------------------------------------------------------------- Jim West | The Schainker Converse west@gsrc.dec.com | to Hoare's Law : | These are my opinions. | Inside every small problem Digital has no idea | is a larger problem struggling what I'm saying. | to get out. ----------------------------------------------------------------------