diff options
author | Arnaud Fontaine <arnau@debian.org> | 2011-10-30 16:43:09 +0900 |
---|---|---|
committer | Arnaud Fontaine <arnau@debian.org> | 2011-10-30 16:43:09 +0900 |
commit | 470ea5431ffe0a54995c93506ab5e55ce534e039 (patch) | |
tree | 85686908ebd41bff683f3ecc3f6f0d3e01990201 | |
parent | 30300bf213557b99bcfd3d92587f6a96e9494124 (diff) |
2005-03-13 Daniel Forchheimer <n04df@efd.lth.se>
Release v4
Bugfix: select by name or id didn't work in many
windowmanagers like xfce and wmaker.
* transSet.c:
Function get_top_window() fixes the bug
Options verbose, no-regex
* dsimple.c:
Window_With_Name_Regex() now takes same arguments as Window_With_Name()
* Makefile:
Added simple install instructions
2005-02-08 Daniel Forchheimer <n04df@efd.lth.se>
Select name now takes a regular expression
Fixed all warnings
* dsimple.c:
Window_With_Name_Regex()
* transSet.c:
use the new regex function
print the name (if possible)
* dsimple.h:
Added the new functions to avoid warnings
-rw-r--r-- | README | 7 | ||||
-rw-r--r-- | dsimple.c | 71 | ||||
-rw-r--r-- | dsimple.h | 7 | ||||
-rw-r--r-- | transSet.c | 171 |
4 files changed, 186 insertions, 70 deletions
@@ -21,8 +21,11 @@ Features *force toggle *increase or decrease opacity -Latest version is: 3 -Updated 2005-01-20 +Instalation + type: + make + make install + Homepage: http://www.forchheimer.se/transset-df/ Any questions/sugestions or if you just want to say hello don't fear to send @@ -35,6 +35,9 @@ from The Open Group. #include <stdio.h> #include <stdlib.h> #include <stdarg.h> + +#include <sys/types.h> +#include <regex.h> /* * Other_stuff.h: Definitions of routines in other_stuff. * @@ -460,9 +463,9 @@ Window Get_Window_Under_Cursor(dpy) { int status; Cursor cursor; - XEvent event; + //XEvent event; Window target_win = None, root = RootWindow(dpy,screen); - int buttons = 0; + //int buttons = 0; Window tmp; int rx,ry,cx,cy; unsigned int mask; @@ -503,7 +506,7 @@ Window Window_With_Name(dpy, top, name) int i; Window w=0; char *window_name; - + if (XFetchName(dpy, top, &window_name) && !strcmp(window_name, name)) return(top); @@ -520,6 +523,68 @@ Window Window_With_Name(dpy, top, name) } /* + * Window_With_Name_Regex: Same as above but use regular expressions + * to match a window name. Only returns the first + * result. + * Window_With_Name_Regex_Recurse: Takes regex_t struct as argument + * instead of char* + * Written by Daniel Forchheimer 2005 + * */ +Window Window_With_Name_Regex_Recurse(dpy, top, reg_name) + Display *dpy; + Window top; + regex_t *reg_name; +{ + Window *children, dummy; + unsigned int nchildren; + int i; + Window w=0; + char *window_name; + + if (XFetchName(dpy, top, &window_name) && !regexec(reg_name,window_name,0,NULL,0)) + return(top); + + if (!XQueryTree(dpy, top, &dummy, &dummy, &children, &nchildren)) + return(0); + + for (i=0; i<nchildren; i++) { + w = Window_With_Name_Regex_Recurse(dpy, children[i], reg_name); + if (w) + break; + } + if (children) XFree ((char *)children); + return(w); +} +/* prepare the reg-exp for use with above function */ +Window Window_With_Name_Regex(dpy,top,name) + Display *dpy; + Window top; + char *name; +{ + int err_no=0; + regex_t *regexp_name; + Window target_win; + regexp_name = (regex_t *) malloc(sizeof(regex_t)); + if((err_no=regcomp(regexp_name, name, 0))!=0) + { + size_t length; + char *buffer; + length = regerror (err_no, regexp_name, NULL, 0); + buffer = malloc(length); + regerror (err_no, regexp_name, buffer, length); + fprintf(stderr, "%s\n", buffer); + free(buffer); + regfree(regexp_name); + exit(1); + } + target_win = Window_With_Name_Regex_Recurse(dpy, RootWindow(dpy, screen),regexp_name); + + regfree(regexp_name); + free(regexp_name); + return target_win; +} + +/* * outl: a debugging routine. Flushes stdout then prints a message on stderr * and flushes stderr. Used to print messages when past certain points * in code so we can tell where we are. Outl may be invoked like @@ -39,6 +39,7 @@ from The Open Group. * Send bugs, etc. to chariot@athena.mit.edu. */ +#include <regex.h> /* Global variables used by routines in just_display.c */ extern char *program_name; /* Name of this program */ @@ -91,14 +92,20 @@ void usage(); unsigned long Resolve_Color(Window, char *); Pixmap Bitmap_To_Pixmap(Display *, Drawable, GC, Pixmap, int, int); Window Select_Window(Display *); +Window Get_Window_Under_Cursor(Display *); /*added by Daniel Forchheimer for transset-df*/ void blip(void); Window Window_With_Name(Display *, Window, char *); +Window Window_With_Name_Regex(Display *, Window, char *); /*added by Daniel Forchheimer for transset-df*/ +Window Window_With_Name_Regex_Recurse(Display *, Window, regex_t *); /*added by Daniel Forchheimer for transset-df*/ #else unsigned long Resolve_Color(); Pixmap Bitmap_To_Pixmap(); Window Select_Window(); +Window Get_Window_Under_Cursor(); /*added by Daniel Forchheimer for transset-df*/ void blip(); Window Window_With_Name(); +Window Window_With_Name_Regex(); /*added by Daniel Forchheimer for transset-df*/ +Window Window_With_Name_Regex_Recurse(); /*added by Daniel Forchheimer for transset-df*/ #endif #ifdef __GNUC__ void Fatal_Error(char *, ...) __attribute__((__noreturn__)); @@ -8,7 +8,8 @@ */ -#define VERSIONSTR "3" +#define VERSIONSTR "4" +#define RELEASEDATESTR "2005-03-13" #include <stdio.h> #include <X11/Xlib.h> @@ -16,7 +17,9 @@ #include "dsimple.h" #include <stdlib.h> #include <getopt.h> - +#include <string.h> +#include <sys/types.h> +#include <regex.h> Window target_win; @@ -36,7 +39,9 @@ void usage() fprintf(stderr, " -p, --point select the window currently under the cursor\n"); fprintf(stderr, - " -n, --name NAME select by name\n"); + " -n, --name NAME select by name, NAME is matched as regular expression\n"); + fprintf(stderr, + " --no-regex don't use regular expression for matching name\n"); fprintf(stderr, " -i, --id select by window id\n"); fprintf(stderr, @@ -48,7 +53,9 @@ void usage() fprintf(stderr, " -x, --max OPACITY maximum possible opacity (default = 1)\n"); fprintf(stderr, - " -v, --version print version number\n"); + " -v, --verbose print some debug info\n"); + fprintf(stderr, + " -V, --version print version number\n"); exit(1); } @@ -56,6 +63,29 @@ void usage() #define OPAQUE 0xffffffff #define OPACITY "_NET_WM_WINDOW_OPACITY" +/* returns the highest parent of child that is not the root-window */ +Window get_top_window(Display *dpy,Window child) { + Window parent; + Window root; + Window *child_list; + unsigned int num_children; + + if (!XQueryTree(dpy, child, &root, &parent, &child_list, + &num_children)) + Fatal_Error("Can't query window tree."); + if(parent==root) return child; + + while(parent!=root) { + child = parent; + if (!XQueryTree(dpy, child, &root, &parent, &child_list, + &num_children)) + Fatal_Error("Can't query window tree."); + + } + return child; +} + + /* nothing fancy */ int main(int argc, char **argv) { @@ -63,18 +93,17 @@ int main(int argc, char **argv) double d; unsigned int opacity; unsigned int current_opacity; - int select_method = 0; // 0 = click, 1 = point + int select_method = 0; // 0 = click, 1 = point, 2 = id, 3 = name int flag_toggle=0; int flag_increase=0; int flag_decrease=0; + int flag_verbose=0; + int flag_no_regex=0; int o; float min=0,max=1; char *idstr,*namestr; - - Window root_win; - Window *child_list; - unsigned int num_children; - + char *windowname=NULL; + int options_index=0; static struct option long_options[] = { {"toggle",0,NULL,'t'}, @@ -87,56 +116,65 @@ int main(int argc, char **argv) {"dec",0,NULL,'2'}, {"min",1,NULL,'m'}, {"max",1,NULL,'x'}, - {"version",0,NULL,'v'}, + {"no-regex",0,NULL,'4'}, + {"version",0,NULL,'V'}, + {"verbose",0,NULL,'v'}, {0,0,0,0} }; /* wonderful utility */ Setup_Display_And_Screen(&argc, argv); - while ((o = getopt_long(argc, argv, "thpci:n:vm:x:12",long_options,&options_index)) != -1) + /* parse arguments */ + while ((o = getopt_long(argc, argv, "thpci:n:vVm:x:123",long_options,&options_index)) != -1) { switch (o) { case 't': - flag_toggle=1; - break; + flag_toggle=1; + break; case 'h': - usage(); - break; + usage(); + break; case 'c': - select_method=0; - break; + select_method=0; + break; case 'p': - select_method=1; - break; + select_method=1; + break; case 'i': - idstr = malloc(strlen(optarg)+1); - idstr = optarg; - select_method=2; - break; + idstr = malloc(strlen(optarg)+1); + idstr = optarg; + select_method=2; + break; case 'n': - namestr = malloc(strlen(optarg)+1); - namestr = optarg; - select_method=3; - break; + namestr = malloc(strlen(optarg)+1); + namestr = optarg; + select_method=3; + break; case '1': - flag_increase=1; - break; + flag_increase=1; + break; case '2': - flag_decrease=1; - break; + flag_decrease=1; + break; + case 'v': + flag_verbose=1; + break; + case '4': + flag_no_regex=1; + break; case 'm': - min = atof(optarg); - break; + min = atof(optarg); + break; case 'x': - max = atof(optarg); - break; - case 'v': - fprintf(stderr,"version: %s\n",VERSIONSTR); - exit(1); - break; + max = atof(optarg); + break; + case 'V': + fprintf(stderr,"version: %s\nreleased: %s\n",VERSIONSTR,RELEASEDATESTR); + exit(1); + break; default: - usage(); + usage(); } } @@ -146,12 +184,14 @@ int main(int argc, char **argv) gotd = 1; } - + /* select the window to make transparent */ if(select_method==1) { /* don't wait for click */ + if(flag_verbose) printf("Selecting window by click\n"); target_win = Get_Window_Under_Cursor(dpy); } else if(select_method==2) { - /* select by id, pretty much stripped from dsimple.c */ + /* select by id, pretty much ripped from dsimple.c */ + if(flag_verbose) printf("Selecting window by id\n"); sscanf(idstr, "0x%lx", &target_win); if (!target_win) sscanf(idstr, "%ld", &target_win); @@ -159,30 +199,29 @@ int main(int argc, char **argv) fprintf(stderr,"Invalid window id format: %s.\n", idstr); exit(0); } - /* apparently we want the grandparent of this window, otherwise - * deleting the property won't work, cudos to another transset patch - * for leading me in this direction */ - if (!XQueryTree(dpy, target_win, &root_win, &target_win, &child_list, - &num_children)) - Fatal_Error("Can't query window tree."); - if (!XQueryTree(dpy, target_win, &root_win, &target_win, &child_list, - &num_children)) - Fatal_Error("Can't query window tree."); + if(flag_verbose) printf("Selected 0x%x, trying to get top parent ... ",(unsigned int)target_win); + target_win = get_top_window(dpy,target_win); + if(flag_verbose) printf("found 0x%x\n",(unsigned int)target_win); } else if(select_method==3) { - /* select by name, pretty much stripped from dsimple.c */ - target_win = Window_With_Name(dpy, RootWindow(dpy, screen),namestr); + /* select by name, pretty much ripped from dsimple.c */ + if(flag_verbose) printf("Selecting window by name\n"); + + if(flag_no_regex) + target_win = Window_With_Name(dpy, RootWindow(dpy, screen),namestr); + else + target_win = Window_With_Name_Regex(dpy, RootWindow(dpy, screen),namestr); + if (!target_win) { - fprintf(stderr,"No window with name %s exists!\n",namestr); + fprintf(stderr,"No window matching %s exists!\n",namestr); exit(0); } - /* get grandparent */ - if (!XQueryTree(dpy, target_win, &root_win, &target_win, &child_list, - &num_children)) - Fatal_Error("Can't query window tree."); - if (!XQueryTree(dpy, target_win, &root_win, &target_win, &child_list, - &num_children)) - Fatal_Error("Can't query window tree."); + /* store the matched window name*/ + XFetchName(dpy,target_win,&windowname); + + if(flag_verbose) printf("Selected 0x%x, trying to get top parent ... ",(unsigned int)target_win); + target_win = get_top_window(dpy,target_win); + if(flag_verbose) printf("found 0x%x\n",(unsigned int)target_win); } else { /* grab mouse and return window that is next clicked */ @@ -206,7 +245,7 @@ int main(int argc, char **argv) { memcpy (¤t_opacity, data, sizeof (unsigned int)); XFree(( void *) data ); - // printf("Found property: %g\n", (double) opacity / OPAQUE); + if(flag_verbose) printf("Found transparency: %g\n", (double) opacity / OPAQUE); } else current_opacity = OPAQUE; @@ -240,9 +279,11 @@ int main(int argc, char **argv) XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &opacity, 1L); XSync(dpy, False); - printf("Set Property to %g\n", (double) opacity / OPAQUE); - + printf("Set Property to %g", (double) opacity / OPAQUE); + if(windowname) printf(" on \n%s\n",windowname); + else printf("\n"); + if(flag_verbose) printf("Propery set on: 0x%x\n",(unsigned int)target_win); /* all done, wasn't that simple */ return 0; } |