CompMode compMode = CompSimple;
int shadowRadius = 12;
+int shadowOffsetX = -15;
+int shadowOffsetY = -15;
+double shadowOpacity = .75;
double fade_in_step = 0.028;
double fade_out_step = 0.03;
fade_time = now + fade_delta;
}
-#define SHADOW_OPACITY 0.75
-#define SHADOW_OFFSET_X (-shadowRadius * 5 / 4)
-#define SHADOW_OFFSET_Y (-shadowRadius * 5 / 4)
-
static double
gaussian (double r, double x, double y)
{
shadowImage->width,
shadowImage->height,
8);
+ if (!shadowPixmap)
+ {
+ XDestroyImage (shadowImage);
+ return None;
+ }
+
shadowPicture = XRenderCreatePicture (dpy, shadowPixmap,
XRenderFindStandardFormat (dpy, PictStandardA8),
0, 0);
+ if (!shadowPicture)
+ {
+ XDestroyImage (shadowImage);
+ XFreePixmap (dpy, shadowPixmap);
+ return None;
+ }
+
gc = XCreateGC (dpy, shadowPixmap, 0, 0);
+ if (!gc)
+ {
+ XDestroyImage (shadowImage);
+ XFreePixmap (dpy, shadowPixmap);
+ XRenderFreePicture (dpy, shadowPicture);
+ return None;
+ }
XPutImage (dpy, shadowPixmap, gc, shadowImage, 0, 0, 0, 0,
shadowImage->width,
}
else
{
- w->shadow_dx = SHADOW_OFFSET_X;
- w->shadow_dy = SHADOW_OFFSET_Y;
+ w->shadow_dx = shadowOffsetX;
+ w->shadow_dy = shadowOffsetY;
if (!w->shadow)
{
- double opacity = SHADOW_OPACITY;
+ double opacity = shadowOpacity;
if (w->mode == WINDOW_TRANS)
opacity = opacity * ((double)w->opacity)/((double)OPAQUE);
w->shadow = shadow_picture (dpy, opacity, w->alphaPict,
if (type != winNormalAtom)
return type;
- XQueryTree (dpy, w, &root_return, &parent_return, &children, &nchildren);
+ if (!XQueryTree (dpy, w, &root_return, &parent_return, &children,
+ &nchildren))
+ {
+ /* XQueryTree failed. */
+ return winNormalAtom;
+ }
+
for (i = 0;i < nchildren;i++)
{
type = determine_wintype (dpy, children[i]);
void
usage (char *program)
{
- fprintf (stderr, "usage: %s [-d display] [-n] [-s] [-c] [-a] [-f] [-F] [-C]\n", program);
+ fprintf (stderr, "%s v1.0\n", program);
+ fprintf (stderr, "usage: %s [options]\n", program);
+ fprintf (stderr, "Options\n");
+ fprintf (stderr, " -d display\n Specifies which display should be managed.\n");
+ fprintf (stderr, " -r radius\n Specifies the blur radius for client-side shadows. (default 12)\n");
+ fprintf (stderr, " -o opacity\n Specifies the translucency for client-side shadows. (default .75)\n");
+ fprintf (stderr, " -l left-offset\n Specifies the left offset for client-side shadows. (default -15)\n");
+ fprintf (stderr, " -t top-offset\n Specifies the top offset for clinet-side shadows. (default -15)\n");
+ fprintf (stderr, " -a\n Use automatic server-side compositing. Faster, but no special effects.\n");
+ fprintf (stderr, " -c\n Draw client-side shadows with fuzzy edges.\n");
+ fprintf (stderr, " -C\n Avoid drawing shadows on dock/panel windows.\n");
+ fprintf (stderr, " -f\n Fade windows in/out when opening/closing.\n");
+ fprintf (stderr, " -F\n Fade windows during opacity changes.\n");
+ fprintf (stderr, " -n\n Normal client-side compositing with transparency support\n");
+ fprintf (stderr, " -s\n Draw server-side shadows with sharp edges.\n");
+ fprintf (stderr, " -S\n Enable synchronous operation (for debugging).\n");
exit (1);
}
char *display = 0;
int o;
- while ((o = getopt (argc, argv, "d:scnfFCaS")) != -1)
+ while ((o = getopt (argc, argv, "d:r:o:l:t:scnfFCaS")) != -1)
{
switch (o) {
case 'd':
case 'S':
synchronize = True;
break;
+ case 'r':
+ shadowRadius = atoi (optarg);
+ break;
+ case 'o':
+ shadowOpacity = atof (optarg);
+ break;
+ case 'l':
+ shadowOffsetX = atoi (optarg);
+ break;
+ case 't':
+ shadowOffsetY = atoi (optarg);
+ break;
default:
usage (argv[0]);
break;