--- compositor.c.old 2005-08-04 03:22:05.000000000 +0800 +++ compositor.c.new 2005-08-04 03:25:55.000000000 +0800 @@ -51,7 +51,7 @@ #define WINDOW_ARGB 2 #ifndef SHADOW_RADIUS -#define SHADOW_RADIUS 6 +#define SHADOW_RADIUS 12 #endif /* SHADOW_RADIUS */ #ifndef SHADOW_OPACITY @@ -66,6 +66,13 @@ #define SHADOW_OFFSET_Y (SHADOW_RADIUS * -5 / 4) #endif /* SHADOW_OFFSET_Y */ +#define BORDER_OPACITY 0.55 + +#define WINDOW_OPACITY 0.75 +#define DIALOG_OPACITY 0.8 +#define POPUP_OPACITY 0.775 + + typedef struct _CWindow CWindow; struct _CWindow { @@ -85,10 +92,12 @@ Picture picture; Picture shadow; Picture alphaPict; + Picture alphaBorderPict; Picture shadowPict; XserverRegion borderSize; XserverRegion borderClip; XserverRegion extents; + XserverRegion shadowClip; gint shadow_dx; gint shadow_dy; gint shadow_width; @@ -1020,7 +1032,12 @@ if (cw->shadow) { - XFixesSetPictureClipRegion (dpy, screen_info->rootBuffer, 0, 0, cw->borderClip); + if (cw->shadowClip == None) + { + cw->shadowClip = XFixesCreateRegion(dpy, 0, 0); + XFixesSubtractRegion (dpy, cw->shadowClip, cw->borderClip, cw->borderSize); + } + XFixesSetPictureClipRegion (dpy, screen_info->rootBuffer, 0, 0, cw->shadowClip); XRenderComposite (dpy, PictOpOver, screen_info->blackPicture, cw->shadow, screen_info->rootBuffer, 0, 0, 0, 0, cw->attr.x + cw->shadow_dx, @@ -1031,11 +1048,15 @@ if (cw->mode != WINDOW_SOLID) { gint x, y, w, h; + int has_frame = ((cw->c && FLAG_TEST (cw->c->xfwm_flags, XFWM_FLAG_HAS_BORDER)) ? 1 : 0); + if ((cw->opacity != NET_WM_OPAQUE) && !(cw->alphaPict)) { cw->alphaPict = solid_picture (screen_info, FALSE, (double) cw->opacity / NET_WM_OPAQUE, 0, 0, 0); + if (has_frame) + cw->alphaBorderPict = solid_picture (screen_info, FALSE, BORDER_OPACITY, 0, 0, 0); } XFixesIntersectRegion (dpy, cw->borderClip, cw->borderClip, cw->borderSize); @@ -1043,9 +1064,47 @@ /* cw->alphaPict can be None in the case of ARGB windows, that's ok */ get_paint_bounds (cw, &x, &y, &w, &h); + if (has_frame) + { + int clientX = cw->c->x; + int clientY = cw->c->y; + int clientWidth = cw->c->width; + int clientHeight = cw->c->height; + int topBorderHeight = clientY - y; + int bottomBorderHeight = h - clientHeight - topBorderHeight; + int leftBorderWidth = clientX - x; + int rightBorderWidth = w - clientWidth - leftBorderWidth; + // Top Border (title bar) + XRenderComposite (dpy, PictOpOver, cw->picture, cw->alphaBorderPict, + screen_info->rootBuffer, 0, 0, 0, 0, x, y, w, topBorderHeight); + // Bottom Border + XRenderComposite (dpy, PictOpOver, cw->picture, cw->alphaBorderPict, + screen_info->rootBuffer, 0, h-bottomBorderHeight, 0, 0, + x, y+h-bottomBorderHeight, w, bottomBorderHeight); + // Left Border + XRenderComposite (dpy, PictOpOver, cw->picture, cw->alphaBorderPict, + screen_info->rootBuffer, 0, topBorderHeight, 0, 0, + x, y+topBorderHeight, leftBorderWidth, h-topBorderHeight-bottomBorderHeight); + // Right Border + XRenderComposite (dpy, PictOpOver, cw->picture, cw->alphaBorderPict, + screen_info->rootBuffer, w-rightBorderWidth, topBorderHeight, 0, 0, + x+w-rightBorderWidth, y+topBorderHeight, rightBorderWidth, h-topBorderHeight-bottomBorderHeight); + // Client Window + XRenderComposite (dpy, PictOpOver, cw->picture, cw->alphaPict, + screen_info->rootBuffer, leftBorderWidth, topBorderHeight, 0, 0, + x+leftBorderWidth, y+topBorderHeight, w-leftBorderWidth-rightBorderWidth, h-topBorderHeight-bottomBorderHeight); + } + else XRenderComposite (dpy, PictOpOver, cw->picture, cw->alphaPict, screen_info->rootBuffer, 0, 0, 0, 0, x, y, w, h); } + + if (cw->shadowClip) + { + XFixesDestroyRegion (dpy, cw->shadowClip); + cw->shadowClip = None; + } + if (cw->borderClip) { XFixesDestroyRegion (dpy, cw->borderClip); @@ -1181,6 +1240,12 @@ cw->alphaPict = None; } + if (cw->alphaBorderPict) + { + XRenderFreePicture (myScreenGetXDisplay (cw->screen_info), cw->alphaBorderPict); + cw->alphaBorderPict = None; + } + if (cw->shadowPict) { XRenderFreePicture (myScreenGetXDisplay (cw->screen_info), cw->shadowPict); @@ -1312,6 +1377,11 @@ XRenderFreePicture (myScreenGetXDisplay (screen_info), cw->alphaPict); cw->alphaPict = None; } + if (cw->alphaBorderPict) + { + XRenderFreePicture (myScreenGetXDisplay (screen_info), cw->alphaBorderPict); + cw->alphaBorderPict = None; + } if (cw->shadowPict) { XRenderFreePicture (myScreenGetXDisplay (screen_info), cw->shadowPict); @@ -1323,14 +1393,14 @@ { cw->mode = WINDOW_ARGB; } - else if (cw->opacity != NET_WM_OPAQUE) + else/* if (cw->opacity != NET_WM_OPAQUE)*/ { cw->mode = WINDOW_TRANS; } - else + /*else { cw->mode = WINDOW_SOLID; - } + }*/ if (cw->extents) { @@ -1422,6 +1492,15 @@ ScreenInfo *screen_info = NULL; CWindow *new; + if (c && c->type == WINDOW_DESKTOP) + opacity = NET_WM_OPAQUE; + else if (c && (c->type == WINDOW_DIALOG || c->type == WINDOW_MODAL_DIALOG)) + opacity = NET_WM_OPAQUE * DIALOG_OPACITY; + else if (c && FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER)) + opacity = NET_WM_OPAQUE * WINDOW_OPACITY; + else + opacity = NET_WM_OPAQUE * POPUP_OPACITY; + TRACE ("entering add_win: 0x%lx", id); new = g_new0 (CWindow, 1); @@ -1491,6 +1570,7 @@ #endif new->picture = None; new->alphaPict = None; + new->alphaBorderPict = None; new->shadowPict = None; new->borderSize = None; new->extents = None;