diff options
| -rw-r--r-- | man/feh.pre | 22 | ||||
| -rw-r--r-- | src/options.c | 5 | ||||
| -rw-r--r-- | src/options.h | 1 | ||||
| -rw-r--r-- | src/wallpaper.c | 104 | 
4 files changed, 102 insertions, 30 deletions
| diff --git a/man/feh.pre b/man/feh.pre index 10ea58f..d3d3d1f 100644 --- a/man/feh.pre +++ b/man/feh.pre @@ -820,7 +820,12 @@ on screen 0, the second on screen 1, and so on.  .  Use  .Cm --no-xinerama -to treat the whole X display as one screen when setting wallpapers. +to treat the whole X display as one screen when setting wallpapers. You +may also use +.Cm --xinerama-index +to use +.Nm +as a background setter for a specific screen.  .  .Bl -tag -width indent  . @@ -859,6 +864,21 @@ Do not write a  .Pa ~/.fehbg  file  . +.It Cm --xinerama-index Ar screen +. +When used with any option other than +.Cm --bg-tile : +Only set wallpaper on +.Ar screen . +All other screens will be filled black/white. +. +This is most useful in a Xinerama configuration with overlapping screens. +For instance, assume you have two overlapping displays (index 0 and 1), where +index 0 is smaller. To center a background on the display with index 0 and +fill the extra space on index 1 black/white, use +.Qq --xinerama-index 0 +when setting the wallpaper. +.  .El  .  . diff --git a/src/options.c b/src/options.c index cbeb729..120541a 100644 --- a/src/options.c +++ b/src/options.c @@ -70,6 +70,7 @@ void init_parse_options(int argc, char **argv)  #ifdef HAVE_LIBXINERAMA  	/* if we're using xinerama, then enable it by default */  	opt.xinerama = 1; +	opt.xinerama_index = -1;  #endif				/* HAVE_LIBXINERAMA */  	feh_getopt_theme(argc, argv); @@ -404,6 +405,7 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun)  		{"no-fehbg"      , 0, 0, 236},  		{"keep-zoom-vp"  , 0, 0, 237},  		{"scroll-step"   , 1, 0, 238}, +		{"xinerama-index", 1, 0, 239},  		{0, 0, 0, 0}  	}; @@ -744,6 +746,9 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun)  		case 238:  			opt.scroll_step = atoi(optarg);  			break; +		case 239: +			opt.xinerama_index = atoi(optarg); +			break;  		default:  			break;  		} diff --git a/src/options.h b/src/options.h index a22cc05..923aa41 100644 --- a/src/options.h +++ b/src/options.h @@ -109,6 +109,7 @@ struct __fehoptions {  	int default_zoom;  	int zoom_mode;  	unsigned char adjust_reload; +	int xinerama_index;  	/* signed in case someone wants to invert scrolling real quick */  	int scroll_step; diff --git a/src/wallpaper.c b/src/wallpaper.c index 3e19c41..b6f2c0c 100644 --- a/src/wallpaper.c +++ b/src/wallpaper.c @@ -298,21 +298,30 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled,  		/* string for sticking in ~/.fehbg */  		char *fehbg = NULL; +		char fehbg_args[512]; +		fehbg_args[0] = '\0';  		char *home;  		char filbuf[4096]; -		char fehbg_xinerama[] = "--no-xinerama";  		char *bgfill = NULL;  		bgfill = opt.image_bg == IMAGE_BG_WHITE ?  "--image-bg white" : "--image-bg black" ; +#ifdef HAVE_LIBXINERAMA +		if (opt.xinerama) { +			if (opt.xinerama_index >= 0) { +				snprintf(fehbg_args, sizeof(fehbg_args), +					"--xinerama-index %d", opt.xinerama_index); +			} +		} +		else +			snprintf(fehbg_args, sizeof(fehbg_args), "--no-xinerama"); +#endif			/* HAVE_LIBXINERAMA */ +  		/* local display to set closedownmode on */  		Display *disp2;  		Window root2;  		int depth2;  		int in, out, w, h; -		if (opt.xinerama) -			fehbg_xinerama[0] = '\0'; -  		D(("Falling back to XSetRootWindowPixmap\n"));  		/* Put the filename in filbuf between ' and escape ' in the filename */ @@ -357,16 +366,30 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled,  			pmap_d1 = XCreatePixmap(disp, root, scr->width, scr->height, depth);  #ifdef HAVE_LIBXINERAMA -			if (opt.xinerama && xinerama_screens) -				for (i = 0; i < num_xinerama_screens; i++) -					feh_wm_set_bg_scaled(pmap_d1, im, use_filelist, -						xinerama_screens[i].x_org, xinerama_screens[i].y_org, -						xinerama_screens[i].width, xinerama_screens[i].height); +			if (opt.xinerama_index >= 0) { +				if (opt.image_bg == IMAGE_BG_WHITE) +					gcval.foreground = WhitePixel(disp, DefaultScreen(disp)); +				else +					gcval.foreground = BlackPixel(disp, DefaultScreen(disp)); +				gc = XCreateGC(disp, root, GCForeground, &gcval); +				XFillRectangle(disp, pmap_d1, gc, 0, 0, scr->width, scr->height); +				XFreeGC(disp, gc); +			} + +			if (opt.xinerama && xinerama_screens) { +				for (i = 0; i < num_xinerama_screens; i++) { +					if (opt.xinerama_index < 0 || opt.xinerama_index == i) { +						feh_wm_set_bg_scaled(pmap_d1, im, use_filelist, +							xinerama_screens[i].x_org, xinerama_screens[i].y_org, +							xinerama_screens[i].width, xinerama_screens[i].height); +					} +				} +			}  			else  #endif			/* HAVE_LIBXINERAMA */  				feh_wm_set_bg_scaled(pmap_d1, im, use_filelist,  					0, 0, scr->width, scr->height); -			fehbg = estrjoin(" ", "feh", fehbg_xinerama, "--bg-scale", filbuf, NULL); +			fehbg = estrjoin(" ", "feh", fehbg_args, "--bg-scale", filbuf, NULL);  		} else if (centered) {  			D(("centering\n")); @@ -380,11 +403,15 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled,  			XFillRectangle(disp, pmap_d1, gc, 0, 0, scr->width, scr->height);  #ifdef HAVE_LIBXINERAMA -			if (opt.xinerama && xinerama_screens) -				for (i = 0; i < num_xinerama_screens; i++) -					feh_wm_set_bg_centered(pmap_d1, im, use_filelist, -						xinerama_screens[i].x_org, xinerama_screens[i].y_org, -						xinerama_screens[i].width, xinerama_screens[i].height); +			if (opt.xinerama && xinerama_screens) { +				for (i = 0; i < num_xinerama_screens; i++) { +					if (opt.xinerama_index < 0 || opt.xinerama_index == i) { +						feh_wm_set_bg_centered(pmap_d1, im, use_filelist, +							xinerama_screens[i].x_org, xinerama_screens[i].y_org, +							xinerama_screens[i].width, xinerama_screens[i].height); +					} +				} +			}  			else  #endif				/* HAVE_LIBXINERAMA */  				feh_wm_set_bg_centered(pmap_d1, im, use_filelist, @@ -392,24 +419,38 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled,  			XFreeGC(disp, gc); -			fehbg = estrjoin(" ", "feh", fehbg_xinerama, bgfill, "--bg-center", filbuf, NULL); +			fehbg = estrjoin(" ", "feh", fehbg_args, bgfill, "--bg-center", filbuf, NULL);  		} else if (filled == 1) {  			pmap_d1 = XCreatePixmap(disp, root, scr->width, scr->height, depth);  #ifdef HAVE_LIBXINERAMA -			if (opt.xinerama && xinerama_screens) -				for (i = 0; i < num_xinerama_screens; i++) -					feh_wm_set_bg_filled(pmap_d1, im, use_filelist, -						xinerama_screens[i].x_org, xinerama_screens[i].y_org, -						xinerama_screens[i].width, xinerama_screens[i].height); +			if (opt.xinerama_index >= 0) { +				if (opt.image_bg == IMAGE_BG_WHITE) +					gcval.foreground = WhitePixel(disp, DefaultScreen(disp)); +				else +					gcval.foreground = BlackPixel(disp, DefaultScreen(disp)); +				gc = XCreateGC(disp, root, GCForeground, &gcval); +				XFillRectangle(disp, pmap_d1, gc, 0, 0, scr->width, scr->height); +				XFreeGC(disp, gc); +			} + +			if (opt.xinerama && xinerama_screens) { +				for (i = 0; i < num_xinerama_screens; i++) { +					if (opt.xinerama_index < 0 || opt.xinerama_index == i) { +						feh_wm_set_bg_filled(pmap_d1, im, use_filelist, +							xinerama_screens[i].x_org, xinerama_screens[i].y_org, +							xinerama_screens[i].width, xinerama_screens[i].height); +					} +				} +			}  			else  #endif				/* HAVE_LIBXINERAMA */  				feh_wm_set_bg_filled(pmap_d1, im, use_filelist  					, 0, 0, scr->width, scr->height); -			fehbg = estrjoin(" ", "feh", fehbg_xinerama, "--bg-fill", filbuf, NULL); +			fehbg = estrjoin(" ", "feh", fehbg_args, "--bg-fill", filbuf, NULL);  		} else if (filled == 2) { @@ -422,11 +463,15 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled,  			XFillRectangle(disp, pmap_d1, gc, 0, 0, scr->width, scr->height);  #ifdef HAVE_LIBXINERAMA -			if (opt.xinerama && xinerama_screens) -				for (i = 0; i < num_xinerama_screens; i++) -					feh_wm_set_bg_maxed(pmap_d1, im, use_filelist, -						xinerama_screens[i].x_org, xinerama_screens[i].y_org, -						xinerama_screens[i].width, xinerama_screens[i].height); +			if (opt.xinerama && xinerama_screens) { +				for (i = 0; i < num_xinerama_screens; i++) { +					if (opt.xinerama_index < 0 || opt.xinerama_index == i) { +						feh_wm_set_bg_maxed(pmap_d1, im, use_filelist, +							xinerama_screens[i].x_org, xinerama_screens[i].y_org, +							xinerama_screens[i].width, xinerama_screens[i].height); +					} +				} +			}  			else  #endif				/* HAVE_LIBXINERAMA */  				feh_wm_set_bg_maxed(pmap_d1, im, use_filelist, @@ -434,7 +479,7 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled,  			XFreeGC(disp, gc); -			fehbg = estrjoin(" ", "feh", fehbg_xinerama, bgfill, "--bg-max", filbuf, NULL); +			fehbg = estrjoin(" ", "feh", fehbg_args, bgfill, "--bg-max", filbuf, NULL);  		} else {  			if (use_filelist) @@ -465,8 +510,9 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled,  				}  				free(path);  			} -			free(fehbg);  		} +		 +		free(fehbg);  		/* create new display, copy pixmap to new display */  		disp2 = XOpenDisplay(NULL); | 
