-/* xscreensaver, Copyright (c) 2001-2012 by Jamie Zawinski <jwz@jwz.org>
+/* xscreensaver, Copyright (c) 2001-2016 by Jamie Zawinski <jwz@jwz.org>
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
/* 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
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 */
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;
*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;
+ Pixmap logo = xscreensaver_logo (screen, visual, drawable, cmap,
+ BlackPixelOfScreen (screen),
+ 0, 0, &mask, True);
+ draw_colorbars (screen, visual, drawable, cmap, 0, 0, 0, 0, logo, mask);
+ XFreePixmap (DisplayOfScreen (screen), logo);
+ XFreePixmap (DisplayOfScreen (screen), mask);
}
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 */
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,
{
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);
}
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);
}
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;
{
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);