Commit 740daf5c authored by James Knight's avatar James Knight
Browse files

support background setter for specific screen



The following adds the ability, when using `feh` as a background setter,
to use a specific Xinerama screen to render a provided image. Along with
the provided '--bg-*' option, the '--xinerama-index' argument will be
used to identify the index of the detected Xinerama screen to use.

Signed-off-by: default avatarJames Knight <james.d.knight@live.com>
parent 5e6cbb6c
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -470,6 +470,13 @@ managers.
Disable Xinerama support.  Only makes sense when you have Xinerama support
compiled in.
.
.It Cm --xinerama-index
.
Force Xinerama screen index to use.  Only makes sense when you have 
Xinerama support compiled in and using
.Nm
as a background setter.
.
.It Cm -j , --output-dir Ar directory
.
Save files to
@@ -820,7 +827,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
.
+5 −0
Original line number Diff line number Diff line
@@ -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;
		}
+1 −0
Original line number Diff line number Diff line
@@ -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;
+77 −20
Original line number Diff line number Diff line
@@ -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" ;
		
		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;
		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,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++)
				{
					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++)
				{
					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++)
				{
					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++)
				{
					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)