Loading man/feh.pre +21 −1 Original line number Diff line number Diff line Loading @@ -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 . Loading Loading @@ -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 . . Loading src/options.c +5 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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} }; Loading Loading @@ -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; } Loading src/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading src/wallpaper.c +75 −29 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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++) 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")); Loading @@ -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++) 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, Loading @@ -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++) 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) { Loading @@ -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++) 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, Loading @@ -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) Loading Loading @@ -465,9 +510,10 @@ 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); if (!disp2) Loading Loading
man/feh.pre +21 −1 Original line number Diff line number Diff line Loading @@ -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 . Loading Loading @@ -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 . . Loading
src/options.c +5 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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} }; Loading Loading @@ -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; } Loading
src/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
src/wallpaper.c +75 −29 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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++) 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")); Loading @@ -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++) 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, Loading @@ -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++) 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) { Loading @@ -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++) 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, Loading @@ -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) Loading Loading @@ -465,9 +510,10 @@ 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); if (!disp2) Loading