summaryrefslogtreecommitdiff
path: root/src/wallpaper.c
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 /src/wallpaper.c
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>
Diffstat (limited to 'src/wallpaper.c')
-rw-r--r--src/wallpaper.c97
1 files changed, 77 insertions, 20 deletions
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)