X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=driver%2Fxscreensaver-getimage.c;h=092540d478695bc297a1ffd5b209ef33ea7a87ec;hb=refs%2Fheads%2Fmaster;hp=22aefc34d7904249182bd80cd99865443dc9bfa6;hpb=b81f521c5ad7022ac12db18ca8fcdd9fb063831e;p=xscreensaver diff --git a/driver/xscreensaver-getimage.c b/driver/xscreensaver-getimage.c index 22aefc34..092540d4 100644 --- a/driver/xscreensaver-getimage.c +++ b/driver/xscreensaver-getimage.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2001-2012 by Jamie Zawinski +/* xscreensaver, Copyright (c) 2001-2018 by Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -69,7 +69,7 @@ /* On MacOS under X11, the usual X11 mechanism of getting a screen shot doesn't work, and we need to use an external program. This is only used when running under X11 on MacOS. If it's a Cocoa build, this - path is not taken, and OSX/osxgrabscreen.m is used instead. + path is not taken, and OSX/grabclient-osx.m is used instead. */ # define USE_EXTERNAL_SCREEN_GRABBER #endif @@ -256,9 +256,24 @@ compute_image_scaling (int src_w, int src_h, float rw = (float) dest_w / src_w; float rh = (float) dest_h / src_h; float r = (rw < rh ? rw : rh); - int tw = src_w * r; - int th = src_h * r; - int pct = (r * 100); + int tw, th, pct; + + /* If the window is a goofy aspect ratio, take a middle slice of + the image instead. */ + if (dest_w > dest_h * 5 || dest_h > dest_w * 5) + { + double r2 = (dest_w > dest_h + ? dest_w / (double) dest_h + : dest_h / (double) dest_w); + r *= r2; + if (verbose_p) + fprintf (stderr, "%s: weird aspect: scaling by %.1f\n", + progname, r2); + } + + tw = src_w * r; + th = src_h * r; + pct = (r * 100); #if 0 /* this optimization breaks things */ @@ -281,8 +296,8 @@ compute_image_scaling (int src_w, int src_h, if (destx < 0) srcx = -destx, destx = 0; if (desty < 0) srcy = -desty, desty = 0; - if (dest_w < src_w) src_w = dest_w; - if (dest_h < src_h) src_h = dest_h; + /* if (dest_w < src_w) src_w = dest_w; + if (dest_h < src_h) src_h = dest_h; */ *scaled_w_ret = src_w; *scaled_h_ret = src_h; @@ -292,8 +307,23 @@ compute_image_scaling (int src_w, int src_h, *scaled_to_y_ret = desty; if (verbose_p) - fprintf (stderr, "%s: displaying %dx%d image at %d,%d in %dx%d.\n", - progname, src_w, src_h, destx, desty, dest_w, dest_h); + fprintf (stderr, "%s: displaying %dx%d+%d+%d image at %d,%d in %dx%d.\n", + progname, src_w, src_h, srcx, srcy, destx, desty, dest_w, dest_h); +} + + +static void +colorbars (Screen *screen, Visual *visual, Drawable drawable, Colormap cmap) +{ + Pixmap mask = 0; + unsigned long *pixels; /* ignored - unfreed */ + int npixels; + Pixmap logo = xscreensaver_logo (screen, visual, drawable, cmap, + BlackPixelOfScreen (screen), + &pixels, &npixels, &mask, True); + draw_colorbars (screen, visual, drawable, cmap, 0, 0, 0, 0, logo, mask); + XFreePixmap (DisplayOfScreen (screen), logo); + XFreePixmap (DisplayOfScreen (screen), mask); } @@ -381,7 +411,9 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable, gdk_pixbuf_xlib_init_with_depth (dpy, screen_number (screen), win_depth); # ifdef HAVE_GTK2 +# if !GLIB_CHECK_VERSION(2, 36 ,0) g_type_init(); +# endif # else /* !HAVE_GTK2 */ xlib_rgb_init (dpy, screen); # endif /* !HAVE_GTK2 */ @@ -413,7 +445,7 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable, int ow = w, oh = h; GdkPixbuf *opb = pb; pb = gdk_pixbuf_apply_embedded_orientation (opb); - gdk_pixbuf_unref (opb); + g_object_unref (opb); w = gdk_pixbuf_get_width (pb); h = gdk_pixbuf_get_height (pb); if (verbose_p && (w != ow || h != oh)) @@ -430,7 +462,7 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable, GDK_INTERP_BILINEAR); if (pb2) { - gdk_pixbuf_unref (pb); + g_object_unref (pb); pb = pb2; w = w2; h = h2; @@ -464,6 +496,8 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable, gdk_pixbuf_render_pixmap_and_mask_for_colormap() instead. But I haven't tried. */ + if (srcx > 0) w -= srcx; + if (srcy > 0) h -= srcy; gdk_pixbuf_xlib_render_to_drawable_alpha (pb, drawable, srcx, srcy, destx, desty, w, h, @@ -838,8 +872,7 @@ jpg_error_exit (j_common_ptr cinfo) { getimg_jpg_error_mgr *err = (getimg_jpg_error_mgr *) cinfo->err; cinfo->err->output_message (cinfo); - draw_colorbars (err->screen, err->visual, err->drawable, err->cmap, - 0, 0, 0, 0); + colorbars (err->screen, err->visual, err->drawable, err->cmap); XSync (DisplayOfScreen (err->screen), False); exit (1); } @@ -1489,7 +1522,7 @@ drawable_miniscule_p (Display *dpy, Drawable drawable) int xx, yy; unsigned int bw, d, w = 0, h = 0; XGetGeometry (dpy, drawable, &root, &xx, &yy, &w, &h, &bw, &d); - return (w < 32 || h < 32); + return (w < 32 || h < 30); } @@ -1663,9 +1696,10 @@ get_image (Screen *screen, if (verbose_p) fprintf (stderr, "%s: drawing colorbars.\n", progname); XGetWindowAttributes (dpy, window, &xgwa); - draw_colorbars (screen, xgwa.visual, drawable, xgwa.colormap, - 0, 0, 0, 0); + colorbars (screen, xgwa.visual, drawable, xgwa.colormap); XSync (dpy, False); + if (! file_prop) file_prop = ""; + } break; @@ -1706,8 +1740,23 @@ get_image (Screen *screen, { Atom a = XInternAtom (dpy, XA_XSCREENSAVER_IMAGE_FILENAME, False); if (file_prop && *file_prop) - XChangeProperty (dpy, window, a, XA_STRING, 8, PropModeReplace, - (unsigned char *) file_prop, strlen(file_prop)); + { + char *f2 = strdup (file_prop); + + /* Take the extension off of the file name. */ + /* Duplicated in utils/grabclient.c. */ + char *slash = strrchr (f2, '/'); + char *dot = strrchr ((slash ? slash : f2), '.'); + if (dot) *dot = 0; + /* Replace slashes with newlines */ + /* while ((dot = strchr(f2, '/'))) *dot = '\n'; */ + /* Replace slashes with spaces */ + /* while ((dot = strchr(f2, '/'))) *dot = ' '; */ + + XChangeProperty (dpy, window, a, XA_STRING, 8, PropModeReplace, + (unsigned char *) f2, strlen(f2)); + free (f2); + } else XDeleteProperty (dpy, window, a);