summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud Fontaine <arnau@debian.org>2011-10-30 16:43:09 +0900
committerArnaud Fontaine <arnau@debian.org>2011-10-30 16:43:09 +0900
commit470ea5431ffe0a54995c93506ab5e55ce534e039 (patch)
tree85686908ebd41bff683f3ecc3f6f0d3e01990201
parent30300bf213557b99bcfd3d92587f6a96e9494124 (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--README7
-rw-r--r--dsimple.c71
-rw-r--r--dsimple.h7
-rw-r--r--transSet.c171
4 files changed, 186 insertions, 70 deletions
diff --git a/README b/README
index 8f056fa..4ae16e7 100644
--- a/README
+++ b/README
@@ -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
diff --git a/dsimple.c b/dsimple.c
index e388380..2dbdc72 100644
--- a/dsimple.c
+++ b/dsimple.c
@@ -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
diff --git a/dsimple.h b/dsimple.h
index a11cae7..002dba6 100644
--- a/dsimple.h
+++ b/dsimple.h
@@ -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__));
diff --git a/transSet.c b/transSet.c
index 5daea80..c871472 100644
--- a/transSet.c
+++ b/transSet.c
@@ -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 (&current_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;
}