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); |