diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/options.c | 5 | ||||
| -rw-r--r-- | src/options.h | 1 | ||||
| -rw-r--r-- | src/wallpaper.c | 97 | 
3 files changed, 83 insertions, 20 deletions
| diff --git a/src/options.c b/src/options.c index cbeb729..bff46c3 100644 --- a/src/options.c +++ b/src/options.c @@ -71,6 +71,7 @@ void init_parse_options(int argc, char **argv)  	/* if we're using xinerama, then enable it by default */  	opt.xinerama = 1;  #endif				/* HAVE_LIBXINERAMA */ +	opt.xinerama_index = -1;  	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 9327d74..b992ec1 100644 --- a/src/wallpaper.c +++ b/src/wallpaper.c @@ -298,11 +298,23 @@ 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" ; +		 +		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");  		/* local display to set closedownmode on */  		Display *disp2; @@ -310,9 +322,6 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled,  		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,33 @@ 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_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); +			} +			  			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 || 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")); @@ -381,10 +407,17 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled,  #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_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 +425,41 @@ 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_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); +			} +			  			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 || 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) { @@ -423,10 +473,17 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled,  #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_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 +491,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) | 
