summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Knight <james.d.knight@live.com>2015-06-22 12:15:37 -0400
committerJames Knight <james.d.knight@live.com>2015-06-22 12:15:37 -0400
commit740daf5c8b2908211b4ae1ad2c9353688bb1e2f9 (patch)
treedfaecc4b8eea4da9eee1fe4b24d4427e0184f1e2
parent5e6cbb6c8d1435b3122dfc55b6e5cfeefb1a3aab (diff)
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: James Knight <james.d.knight@live.com>
-rw-r--r--man/feh.pre14
-rw-r--r--src/options.c5
-rw-r--r--src/options.h1
-rw-r--r--src/wallpaper.c97
4 files changed, 96 insertions, 21 deletions
diff --git a/man/feh.pre b/man/feh.pre
index 10ea58f..b994478 100644
--- a/man/feh.pre
+++ b/man/feh.pre
@@ -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
.
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)