diff options
author | sabetts <sabetts> | 2006-03-16 04:38:17 +0000 |
---|---|---|
committer | sabetts <sabetts> | 2006-03-16 04:38:17 +0000 |
commit | d5b1235251c37d35c1063af62b8068d312fc825a (patch) | |
tree | be294722784d7577b5a440972829ef300eca8b3d | |
parent | 4e1d3ffcec845b5618f6ac8a2b2c8ad40dadbceb (diff) | |
download | ratpoison-d5b1235251c37d35c1063af62b8068d312fc825a.zip |
*** empty log message ***
-rw-r--r-- | contrib/sloppy.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/contrib/sloppy.c b/contrib/sloppy.c new file mode 100644 index 0000000..623e57e --- /dev/null +++ b/contrib/sloppy.c @@ -0,0 +1,109 @@ +/* Sloppy focus + * + * Copyright (C) 2005 Shawn Betts <sabetts@vcn.bc.ca> + * + * unrat is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * unrat is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA + */ + +#include <X11/Xos.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/Xproto.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/wait.h> + +int (*defaulthandler)(); + +int +errorhandler(Display *display, XErrorEvent *error) +{ + if(error->error_code!=BadWindow) + (*defaulthandler)(display,error); + return 0; +} + +int +spawn(char *cmd) +{ + int pid; + + pid = fork(); + if (pid == 0) + { + execl("/bin/sh", "sh", "-c", cmd, 0); + _exit(EXIT_FAILURE); + } + return pid; +} + +int +main (int argc, char **argv) +{ + Display *display; + int i, numscreens; + + display = XOpenDisplay(NULL); + if(!display) + { + perror("could not open display"); + exit(1); + } + + defaulthandler = XSetErrorHandler(errorhandler); + numscreens = ScreenCount(display); + + for (i=0; i<numscreens; i++) + { + unsigned int j, nwins; + Window dw1, dw2, *wins; + + XSelectInput(display,RootWindow(display, i), SubstructureNotifyMask); + XQueryTree(display, RootWindow(display, i), &dw1, &dw2, &wins, &nwins); + for (j=0; j<nwins; j++) + XSelectInput(display, wins[j], EnterWindowMask); + } + + while (1) + { + XEvent event; + do + { + XNextEvent(display,&event); + if (event.type == CreateNotify) + XSelectInput(display, event.xcreatewindow.window, EnterWindowMask); + } while(event.type != EnterNotify); + + /* A window was entered. select it. */ + { + char shell[256]; + snprintf (shell, 255, "$RATPOISON -c \"select `$RATPOISON -c 'windows %%i %%n' | grep '%ld' | awk '{print $2}'`\"", event.xcrossing.window); + //printf ("%s\n", shell); + spawn (shell); + wait (NULL); + } + } + + XCloseDisplay (display); + + return 0; +} + +/* +Local Variables: *** +compile-command: "gcc -g -Wall -O2 -I/usr/X11R6/include -o sloppy sloppy.c -L/usr/X11R6/lib -lX11" *** +End: *** +*/ |