int now = get_time_in_milliseconds();
fade *f, *next;
int steps;
+ Bool need_dequeue;
#if 0
printf ("run fades\n");
printf ("opacity now %g\n", f->cur);
#endif
w->opacity = f->cur * OPAQUE;
+ need_dequeue = False;
if (f->step > 0)
{
if (f->cur >= f->finish)
{
w->opacity = f->finish*OPAQUE;
- dequeue_fade (dpy, f);
- }
+ need_dequeue = True;
+ }
}
else
{
if (f->cur <= f->finish)
{
w->opacity = f->finish*OPAQUE;
- dequeue_fade (dpy, f);
- }
+ need_dequeue = True;
+ }
}
determine_mode (dpy, w);
if (w->shadow)
w->shadow = None;
w->extents = win_extents(dpy, w);
}
+ /* Must do this last as it might destroy f->w in callbacks */
+ if (need_dequeue)
+ dequeue_fade (dpy, f);
}
fade_time = now + fade_delta;
}
XRenderColor c;
pixmap = XCreatePixmap (dpy, root, 1, 1, argb ? 32 : 8);
+ if (!pixmap)
+ return None;
+
pa.repeat = True;
picture = XRenderCreatePicture (dpy, pixmap,
XRenderFindStandardFormat (dpy, argb ? PictStandardARGB32 : PictStandardA8),
CPRepeat,
&pa);
+ if (!picture)
+ {
+ XFreePixmap (dpy, pixmap);
+ return None;
+ }
+
c.alpha = a * 0xffff;
c.red = r * 0xffff;
c.green = g * 0xffff;
/* never painted, ignore it */
if (!w->damaged)
continue;
+ /* if invisible, ignore it */
+ if (w->a.x + w->a.width < 1 || w->a.y + w->a.height < 1
+ || w->a.x >= root_width || w->a.y >= root_height)
+ continue;
if (!w->picture)
{
XRenderPictureAttributes pa;
case CompSimple:
break;
case CompServerShadows:
+ /* dont' bother drawing shadows on desktop windows */
+ if (w->windowType == winDesktopAtom)
+ break;
set_ignore (dpy, NextRequest (dpy));
if (w->opacity != OPAQUE && !w->shadowPict)
w->shadowPict = solid_picture (dpy, True,
w->shadow_width, w->shadow_height);
break;
case CompClientShadows:
- if (w->shadow)
+ /* don't bother drawing shadows on desktop windows */
+ if (w->shadow && w->windowType != winDesktopAtom)
{
XRenderComposite (dpy, PictOpOver, blackPicture, w->shadow, rootBuffer,
0, 0, 0, 0,
int result = XGetWindowProperty(dpy, w->id, opacityAtom, 0L, 1L, False,
XA_CARDINAL, &actual, &format,
&n, &left, &data);
- if (result == Success && data != None)
+ if (result == Success && data != NULL)
{
unsigned int i;
memcpy (&i, data, sizeof (unsigned int));
determine_wintype (Display *dpy, Window w)
{
Window root_return, parent_return;
- Window *children;
+ Window *children = NULL;
unsigned int nchildren, i;
Atom type;
&nchildren))
{
/* XQueryTree failed. */
+ if (children)
+ XFree ((void *)children);
return winNormalAtom;
}
return type;
}
+ if (children)
+ XFree ((void *)children);
+
return winNormalAtom;
}
win *w = find_win (dpy, ce->window);
Window new_above;
+ if (!w)
+ return;
+
if (ce->place == PlaceOnTop)
new_above = list->id;
else
void
usage (char *program)
{
- fprintf (stderr, "%s v1.0\n", program);
+ fprintf (stderr, "%s v1.1.2\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, " -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, " -I fade-in-step\n Specifies the opacity change between steps while fading in. (default 0.028)\n");
+ fprintf (stderr, " -O fade-out-step\n Specifies the opacity change between steps while fading out. (default 0.03)\n");
+ fprintf (stderr, " -D fade-delta-time\n Specifies the time between steps in a fade in milliseconds. (default 10)\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");
exit (1);
}
+static void
+give_me_a_name (void)
+{
+ Window w;
+
+ w = XCreateSimpleWindow (dpy, RootWindow (dpy, 0), 0, 0, 1, 1, 0, None,
+ None);
+
+ Xutf8SetWMProperties (dpy, w, "xcompmgr", "xcompmgr", NULL, 0, NULL, NULL,
+ NULL);
+}
+
int
main (int argc, char **argv)
{
char *display = 0;
int o;
- while ((o = getopt (argc, argv, "d:r:o:l:t:scnfFCaS")) != -1)
+ while ((o = getopt (argc, argv, "D:I:O:d:r:o:l:t:scnfFCaS")) != -1)
{
switch (o) {
case 'd':
display = optarg;
break;
+ case 'D':
+ fade_delta = atoi (optarg);
+ if (fade_delta < 1)
+ fade_delta = 10;
+ break;
+ case 'I':
+ fade_in_step = atof (optarg);
+ if (fade_in_step <= 0)
+ fade_in_step = 0.01;
+ break;
+ case 'O':
+ fade_out_step = atof (optarg);
+ if (fade_out_step <= 0)
+ fade_out_step = 0.01;
+ break;
case 's':
compMode = CompServerShadows;
break;
fprintf (stderr, "No XFixes extension\n");
exit (1);
}
+
+ give_me_a_name();
+
/* get atoms */
opacityAtom = XInternAtom (dpy, OPACITY_PROP, False);
winTypeAtom = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE", False);