#include <sys/poll.h>
#include <sys/time.h>
#include <time.h>
+#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#define SHADOWS 1
#define SHARP_SHADOW 0
-#if SHADOWS
-#define SHADOW_RADIUS 12
+typedef enum _compMode {
+ CompSimple, /* looks like a regular X server */
+ CompServerShadows, /* use window alpha for shadow; sharp, but precise */
+ CompClientShadows, /* use window extents for shadow, blurred */
+} CompMode;
+
+CompMode compMode = CompSimple;
+
+int shadowRadius = 12;
+
#define SHADOW_OPACITY 0.75
-#define SHADOW_OFFSET_X (-SHADOW_RADIUS * 5 / 4)
-#define SHADOW_OFFSET_Y (-SHADOW_RADIUS * 5 / 4)
+#define SHADOW_OFFSET_X (-shadowRadius * 5 / 4)
+#define SHADOW_OFFSET_Y (-shadowRadius * 5 / 4)
static double
gaussian (double r, double x, double y)
return shadowPicture;
}
-#endif /* SHADOWS */
-
Picture
solid_picture (Display *dpy, Bool argb, double a, double r, double g, double b)
{
r.y = w->a.y;
r.width = w->a.width + w->a.border_width * 2;
r.height = w->a.height + w->a.border_width * 2;
-#if SHADOWS
-#if !SHARP_SHADOW
- if (w->mode != WINDOW_ARGB)
-#endif
+ if (compMode != CompSimple)
{
- XRectangle sr;
-
-#if SHARP_SHADOW
- w->shadow_dx = 2;
- w->shadow_dy = 7;
- w->shadow_width = w->a.width;
- w->shadow_height = w->a.height;
-#else
- w->shadow_dx = SHADOW_OFFSET_X;
- w->shadow_dy = SHADOW_OFFSET_Y;
- if (!w->shadow)
+ if (compMode == CompServerShadows || w->mode != WINDOW_ARGB)
{
- double opacity = SHADOW_OPACITY;
- if (w->mode == WINDOW_TRANS)
- opacity = opacity * TRANS_OPACITY;
- w->shadow = shadow_picture (dpy, opacity,
- w->a.width + w->a.border_width * 2,
- w->a.height + w->a.border_width * 2,
- &w->shadow_width, &w->shadow_height);
- }
-#endif
- sr.x = w->a.x + w->shadow_dx;
- sr.y = w->a.y + w->shadow_dy;
- sr.width = w->shadow_width;
- sr.height = w->shadow_height;
- if (sr.x < r.x)
- {
- r.width = (r.x + r.width) - sr.x;
- r.x = sr.x;
- }
- if (sr.y < r.y)
- {
- r.height = (r.y + r.height) - sr.y;
- r.y = sr.y;
+ XRectangle sr;
+
+ if (compMode == CompServerShadows)
+ {
+ w->shadow_dx = 2;
+ w->shadow_dy = 7;
+ w->shadow_width = w->a.width;
+ w->shadow_height = w->a.height;
+ }
+ else
+ {
+ w->shadow_dx = SHADOW_OFFSET_X;
+ w->shadow_dy = SHADOW_OFFSET_Y;
+ if (!w->shadow)
+ {
+ double opacity = SHADOW_OPACITY;
+ if (w->mode == WINDOW_TRANS)
+ opacity = opacity * TRANS_OPACITY;
+ w->shadow = shadow_picture (dpy, opacity,
+ w->a.width + w->a.border_width * 2,
+ w->a.height + w->a.border_width * 2,
+ &w->shadow_width, &w->shadow_height);
+ }
+ }
+ sr.x = w->a.x + w->shadow_dx;
+ sr.y = w->a.y + w->shadow_dy;
+ sr.width = w->shadow_width;
+ sr.height = w->shadow_height;
+ if (sr.x < r.x)
+ {
+ r.width = (r.x + r.width) - sr.x;
+ r.x = sr.x;
+ }
+ if (sr.y < r.y)
+ {
+ r.height = (r.y + r.height) - sr.y;
+ r.y = sr.y;
+ }
+ if (sr.x + sr.width > r.x + r.width)
+ r.width = sr.x + sr.width - r.x;
+ if (sr.y + sr.height > r.y + r.height)
+ r.height = sr.y + sr.height - r.y;
}
- if (sr.x + sr.width > r.x + r.width)
- r.width = sr.x + sr.width - r.x;
- if (sr.y + sr.height > r.y + r.height)
- r.height = sr.y + sr.height - r.y;
}
-#endif
return XFixesCreateRegion (dpy, &r, 1);
}
for (w = t; w; w = w->prev_trans)
{
XFixesSetPictureClipRegion (dpy, rootBuffer, 0, 0, w->borderClip);
-#if SHADOWS
-#if SHARP_SHADOW
- set_ignore (dpy, NextRequest (dpy));
- if (w->opacity != OPAQUE && !w->shadowPict)
- w->shadowPict = solid_picture (dpy, True,
- (double) w->opacity / OPAQUE * 0.3,
- 0, 0, 0);
- XRenderComposite (dpy, PictOpOver,
- w->shadowPict ? w->shadowPict : transBlackPicture,
- w->picture, rootBuffer,
- 0, 0, 0, 0,
- w->a.x + w->shadow_dx,
- w->a.y + w->shadow_dy,
- w->shadow_width, w->shadow_height);
-#else
- if (w->shadow)
- {
- XRenderComposite (dpy, PictOpOver, blackPicture, w->shadow, rootBuffer,
+ switch (compMode) {
+ case CompSimple:
+ break;
+ case CompServerShadows:
+ set_ignore (dpy, NextRequest (dpy));
+ if (w->opacity != OPAQUE && !w->shadowPict)
+ w->shadowPict = solid_picture (dpy, True,
+ (double) w->opacity / OPAQUE * 0.3,
+ 0, 0, 0);
+ XRenderComposite (dpy, PictOpOver,
+ w->shadowPict ? w->shadowPict : transBlackPicture,
+ w->picture, rootBuffer,
0, 0, 0, 0,
w->a.x + w->shadow_dx,
w->a.y + w->shadow_dy,
w->shadow_width, w->shadow_height);
+ break;
+ case CompClientShadows:
+ if (w->shadow)
+ {
+ XRenderComposite (dpy, PictOpOver, blackPicture, w->shadow, rootBuffer,
+ 0, 0, 0, 0,
+ w->a.x + w->shadow_dx,
+ w->a.y + w->shadow_dy,
+ w->shadow_width, w->shadow_height);
+ }
+ break;
}
-#endif
-#endif /* SHADOWS */
if (w->opacity != OPAQUE)
w->alphaPict = solid_picture (dpy, False,
(double) w->opacity / OPAQUE, 0, 0, 0);
XFixesTranslateRegion (dpy, parts,
w->a.x + w->a.border_width,
w->a.y + w->a.border_width);
-#if SHADOWS
-#if SHARP_SHADOW
- o = XFixesCreateRegion (dpy, 0, 0);
- XFixesCopyRegion (dpy, o, parts);
- XFixesTranslateRegion (dpy, o, w->shadow_dx, w->shadow_dy);
- XFixesUnionRegion (dpy, parts, parts, o);
- XFixesDestroyRegion (dpy, o);
-#endif
-#endif
+ if (compMode == CompServerShadows)
+ {
+ o = XFixesCreateRegion (dpy, 0, 0);
+ XFixesCopyRegion (dpy, o, parts);
+ XFixesTranslateRegion (dpy, o, w->shadow_dx, w->shadow_dy);
+ XFixesUnionRegion (dpy, parts, parts, o);
+ XFixesDestroyRegion (dpy, o);
+ }
}
add_damage (dpy, parts);
w->damaged = 1;
w->pixmap = 0;
}
if (w->picture)
+ {
+ set_ignore (dpy, NextRequest (dpy));
XRenderFreePicture (dpy, w->picture);
+ w->picture = None;
+ }
/* don't care about properties anymore */
set_ignore (dpy, NextRequest (dpy));
}
}
+void
+usage (char *program)
+{
+ fprintf (stderr, "usage: %s [-d display] [-n] [-s] [-c]\n", program);
+ exit (1);
+}
+
int
main (int argc, char **argv)
{
int now;
int p;
int composite_major, composite_minor;
+ char *display = 0;
+ int o;
- dpy = XOpenDisplay (0);
+ while ((o = getopt (argc, argv, "d:scn")) != -1)
+ {
+ switch (o) {
+ case 'd':
+ display = optarg;
+ break;
+ case 's':
+ compMode = CompServerShadows;
+ break;
+ case 'c':
+ compMode = CompClientShadows;
+ break;
+ case 'n':
+ compMode = CompSimple;
+ break;
+ default:
+ usage (argv[0]);
+ break;
+ }
+ }
+
+ dpy = XOpenDisplay (display);
if (!dpy)
{
fprintf (stderr, "Can't open display\n");
}
XCompositeQueryVersion (dpy, &composite_major, &composite_minor);
#if 0
+ /*
+ * Don't use this yet; we don't have set semantics for new pixmaps
+ */
if (composite_major > 0 || composite_minor >= 2)
hasNamePixmap = True;
#endif
pa.subwindow_mode = IncludeInferiors;
-#if SHADOWS && !SHARP_SHADOW
- gaussianMap = make_gaussian_map(dpy, SHADOW_RADIUS);
-#endif
+ if (compMode == CompClientShadows)
+ gaussianMap = make_gaussian_map(dpy, shadowRadius);
root_width = DisplayWidth (dpy, scr);
root_height = DisplayHeight (dpy, scr);
CPSubwindowMode,
&pa);
blackPicture = solid_picture (dpy, True, 1, 0, 0, 0);
-#if SHADOWS && SHARP_SHADOW
- transBlackPicture = solid_picture (dpy, True, 0.3, 0, 0, 0);
-#endif
+ if (compMode == CompServerShadows)
+ transBlackPicture = solid_picture (dpy, True, 0.3, 0, 0, 0);
allDamage = None;
clipChanged = True;
XGrabServer (dpy);