From 740daf5c8b2908211b4ae1ad2c9353688bb1e2f9 Mon Sep 17 00:00:00 2001 From: James Knight Date: Mon, 22 Jun 2015 12:15:37 -0400 Subject: 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 --- src/options.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/options.c') 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; } -- cgit v1.2.3 From 8220640589fefde156963d35a8248ed01487555e Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Fri, 26 Jun 2015 16:47:52 +0200 Subject: adjust coding style in patch, always free gc, coherent HAVE_LIBXINERAMA wrapping --- src/options.c | 2 +- src/wallpaper.c | 60 +++++++++++++++++++++++---------------------------------- 2 files changed, 25 insertions(+), 37 deletions(-) (limited to 'src/options.c') diff --git a/src/options.c b/src/options.c index bff46c3..120541a 100644 --- a/src/options.c +++ b/src/options.c @@ -70,8 +70,8 @@ void init_parse_options(int argc, char **argv) #ifdef HAVE_LIBXINERAMA /* if we're using xinerama, then enable it by default */ opt.xinerama = 1; -#endif /* HAVE_LIBXINERAMA */ opt.xinerama_index = -1; +#endif /* HAVE_LIBXINERAMA */ feh_getopt_theme(argc, argv); diff --git a/src/wallpaper.c b/src/wallpaper.c index b992ec1..b6f2c0c 100644 --- a/src/wallpaper.c +++ b/src/wallpaper.c @@ -304,17 +304,17 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled, char filbuf[4096]; char *bgfill = NULL; bgfill = opt.image_bg == IMAGE_BG_WHITE ? "--image-bg white" : "--image-bg black" ; - - if (opt.xinerama) - { - if (opt.xinerama_index >= 0) - { + +#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; @@ -366,22 +366,19 @@ 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.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) - { + + 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); @@ -406,12 +403,9 @@ 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_index < 0 || opt.xinerama_index == 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); @@ -432,22 +426,19 @@ 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.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) - { + + 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); @@ -472,12 +463,9 @@ 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_index < 0 || opt.xinerama_index == 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); @@ -524,7 +512,7 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled, } } - if (fehbg) free(fehbg); + free(fehbg); /* create new display, copy pixmap to new display */ disp2 = XOpenDisplay(NULL); -- cgit v1.2.3