diff options
Diffstat (limited to 'src/support.c')
-rw-r--r-- | src/support.c | 173 |
1 files changed, 109 insertions, 64 deletions
diff --git a/src/support.c b/src/support.c index d404047..e257271 100644 --- a/src/support.c +++ b/src/support.c @@ -131,7 +131,7 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled, enl_ipc_sync(); } else { Atom prop_root, prop_esetroot, type; - int format; + int format, i; unsigned long length, after; unsigned char *data_root, *data_esetroot; Pixmap pmap_d1, pmap_d2; @@ -139,6 +139,10 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled, char *fehbg = NULL; char *home; char filbuf[PATH_MAX]; + char fehbg_xinerama[] = "--no-xinerama"; + + if (opt.xinerama) + fehbg_xinerama[0] = '\0'; /* local display to set closedownmode on */ Display *disp2; @@ -163,21 +167,20 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled, filbuf[out++] = 0; if (scaled) { - w = scr->width; - h = scr->height; - -/* disable xinerama check for setting background */ -#if 0 -/* #ifdef HAVE_LIBXINERAMA */ - if (opt.xinerama && xinerama_screens) { - w = xinerama_screens[xinerama_screen].width; - h = xinerama_screens[xinerama_screen].height; - } -#endif /* HAVE_LIBXINERAMA */ - - pmap_d1 = XCreatePixmap(disp, root, w, h, depth); - gib_imlib_render_image_on_drawable_at_size(pmap_d1, im, 0, 0, w, h, 1, 0, 1); - fehbg = estrjoin(" ", "feh --bg-scale", filbuf, NULL); + 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++) + gib_imlib_render_image_on_drawable_at_size(pmap_d1, im, + xinerama_screens[i].x_org, xinerama_screens[i].y_org, + xinerama_screens[i].width, xinerama_screens[i].height, + 1, 0, !opt.force_aliasing); + else +#endif /* HAVE_LIBXINERAMA */ + gib_imlib_render_image_on_drawable_at_size(pmap_d1, im, 0, 0, + scr->width, scr->height, 1, 0, !opt.force_aliasing); + fehbg = estrjoin(" ", "feh", fehbg_xinerama, "--bg-scale", filbuf, NULL); } else if (centered) { XGCValues gcval; GC gc; @@ -186,25 +189,33 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled, D(("centering\n")); w = scr->width; h = scr->height; - -/* disable xinerama check for setting background */ -#if 0 -/* #ifdef HAVE_LIBXINERAMA */ - if (opt.xinerama && xinerama_screens) { - w = xinerama_screens[xinerama_screen].width; - h = xinerama_screens[xinerama_screen].height; - } -#endif /* HAVE_LIBXINERAMA */ + x = (w - gib_imlib_image_get_width(im)) >> 1; + y = (h - gib_imlib_image_get_height(im)) >> 1; pmap_d1 = XCreatePixmap(disp, root, w, h, depth); gcval.foreground = BlackPixel(disp, DefaultScreen(disp)); gc = XCreateGC(disp, root, GCForeground, &gcval); XFillRectangle(disp, pmap_d1, gc, 0, 0, w, h); - x = (w - gib_imlib_image_get_width(im)) >> 1; - y = (h - gib_imlib_image_get_height(im)) >> 1; - gib_imlib_render_image_on_drawable(pmap_d1, im, x, y, 1, 0, 0); + +#ifdef HAVE_LIBXINERAMA + if (opt.xinerama && xinerama_screens) + for (i = 0; i < num_xinerama_screens; i++) { + w = xinerama_screens[i].width; + h = xinerama_screens[i].height; + x = (w - gib_imlib_image_get_width(im)) >> 1; + y = (h - gib_imlib_image_get_height(im)) >> 1; + gib_imlib_render_image_part_on_drawable_at_size( + pmap_d1, im, + ((x < 0) ? -x : 0) , ((y < 0) ? -y : 0), w, h, + xinerama_screens[i].x_org + ((x > 0) ? x : 0), + xinerama_screens[i].y_org + ((y > 0) ? y : 0), + w, h, 1, 0, 0); + } + else +#endif /* HAVE_LIBXINERAMA */ + gib_imlib_render_image_on_drawable(pmap_d1, im, x, y, 1, 0, 0); XFreeGC(disp, gc); - fehbg = estrjoin(" ", "feh --bg-center", filbuf, NULL); + fehbg = estrjoin(" ", "feh", fehbg_xinerama, "--bg-center", filbuf, NULL); } else if (filled == 1) { int scr_w = scr->width; int scr_h = scr->height; @@ -212,20 +223,44 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled, int img_h = gib_imlib_image_get_height(im); int render_x = 0; int render_y = 0; + int cut_x = (((img_w * scr_h) > (img_h * scr_w)) ? 1 : 0); + w = (cut_x ? ((scr_h * img_w) / img_h) : scr_w); + h = (cut_x ? scr_h : ((scr_w * img_h) / img_w)); + + if (cut_x) + render_x = (scr_w - w) >> 1; + else + render_y = (scr_h - h) >> 1; - if ((img_w * scr_h) > (scr_w * img_h)) { - h = scr_h; - w = (scr_h * img_w) / img_h; - render_x = (scr_w - w) / 2; - } else { - h = (scr_w * img_h) / img_w; - w = scr_w; - render_y = (scr_h - h) / 2; - } pmap_d1 = XCreatePixmap(disp, root, w, h, depth); - gib_imlib_render_image_on_drawable_at_size(pmap_d1, im, - render_x, render_y, w, h, 1, 0, 1); - fehbg = estrjoin(" ", "feh --bg-fill", filbuf, NULL); + +#ifdef HAVE_LIBXINERAMA + if (opt.xinerama && xinerama_screens) + for (i = 0; i < num_xinerama_screens; i++) { + scr_w = xinerama_screens[i].width; + scr_h = xinerama_screens[i].height; + cut_x = (((img_w * scr_h) > (img_h * scr_w)) ? 1 : 0); + w = (cut_x ? ((img_h * scr_w) / scr_h) : img_w); + h = (cut_x ? img_h : ((img_w * scr_h) / scr_w)); + render_x = (cut_x ? ((img_w - w) >> 1) : 0); + render_y = (cut_x ? 0 : ((img_h - h) >> 1)); + + D(("cut_x %d w %5d h %5d x %5d y %5d\n", + cut_x, w, h, render_x, render_y)); + + gib_imlib_render_image_part_on_drawable_at_size( + pmap_d1, im, + render_x, render_y, + w, h, + xinerama_screens[i].x_org, + xinerama_screens[i].y_org, + scr_w, scr_h, 1, 0, !opt.force_aliasing); + } + else +#endif /* HAVE_LIBXINERAMA */ + gib_imlib_render_image_on_drawable_at_size(pmap_d1, im, + render_x, render_y, w, h, 1, 0, !opt.force_aliasing); + fehbg = estrjoin(" ", "feh", fehbg_xinerama, "--bg-fill", filbuf, NULL); } else if (filled == 2) { int scr_w = scr->width; int scr_h = scr->height; @@ -233,38 +268,48 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled, int img_h = gib_imlib_image_get_height(im); int render_x = 0; int render_y = 0; + int border_x = (((img_w * scr_h) > (img_h * scr_w)) ? 0 : 1); + w = (border_x ? ((scr_h * img_w) / img_h) : scr_w); + h = (border_x ? scr_h : ((scr_w * img_h) / img_w)); XGCValues gcval; - if (img_w > img_h) { - w = scr_w; - h = (((scr_w * 100) / img_w) * img_h) / 100; - render_y = (scr_h - h) / 2; - if (h > scr_h) { - w = (((scr_h * 100) / h) * w) / 100; - h = scr_h; - render_x = (scr_w - w) / 2; - render_y = 0; - } - } else { - h = scr_h; - w = (((scr_h * 100) / img_h) * img_w) / 100; - render_x = (scr_w - w) / 2; - if (w > scr_w) { - h = (((scr_w * 100) / w) * h) / 100; - w = scr_w; - render_x = 0; - render_y = (scr_h - h) / 2; - } - } + if (border_x) + render_x = (scr_w - w) >> 1; + else + render_y = (scr_h - h) >> 1; pmap_d1 = XCreatePixmap(disp, root, scr_w, scr_h, depth); gcval.foreground = BlackPixel(disp, DefaultScreen(disp)); gc = XCreateGC(disp, root, GCForeground, &gcval); XFillRectangle(disp, pmap_d1, gc, 0, 0, scr_w, scr_h); + +#ifdef HAVE_LIBXINERAMA + if (opt.xinerama && xinerama_screens) + for (i = 0; i < num_xinerama_screens; i++) { + scr_w = xinerama_screens[i].width; + scr_h = xinerama_screens[i].height; + border_x = (((img_w * scr_h) > (img_h * scr_w)) ? 0 : 1); + w = (border_x ? ((scr_h * img_w) / img_h) : scr_w); + h = (border_x ? scr_h : ((scr_w * img_h) / img_w)); + render_x = (border_x ? ((scr_w - w) >> 1) : 0); + render_y = (border_x ? 0 : ((scr_h - h) >> 1)); + + D(("border_x %d w %5d h %5d x %5d y %5d\n", + border_x, w, h, render_x, render_y)); + + gib_imlib_render_image_on_drawable_at_size( + pmap_d1, im, + xinerama_screens[i].x_org + render_x, + xinerama_screens[i].y_org + render_y, + w, h, + 1, 0, !opt.force_aliasing); + } + else +#endif /* HAVE_LIBXINERAMA */ gib_imlib_render_image_on_drawable_at_size(pmap_d1, im, - render_x, render_y, w, h, 1, 0, 1); + render_x, render_y, w, h, 1, 0, !opt.force_aliasing); XFreeGC(disp, gc); - fehbg = estrjoin(" ", "feh --bg-max", filbuf, NULL); + fehbg = estrjoin(" ", "feh", fehbg_xinerama, "--bg-max", filbuf, NULL); } else { w = gib_imlib_image_get_width(im); h = gib_imlib_image_get_height(im); |