Fixed handling of opacity and argb32 windows.

Parsing of _NET_WM_WINDOW_OPACITY; no shadows for argb32 and translucent
windows.
This commit is contained in:
Tomas Frydrych 2008-08-19 10:57:15 +01:00
parent 030afac8ab
commit 99b547bc1d

View File

@ -125,14 +125,16 @@ typedef struct _MetaCompWindow
ClutterActor *actor; ClutterActor *actor;
ClutterActor *shadow; ClutterActor *shadow;
Pixmap back_pixmap; Pixmap back_pixmap;
int mode;
MetaCompWindowType type; MetaCompWindowType type;
Damage damage; Damage damage;
guint8 opacity;
gboolean needs_shadow : 1; gboolean needs_shadow : 1;
gboolean shaped : 1; gboolean shaped : 1;
gboolean destroy_pending : 1; gboolean destroy_pending : 1;
gboolean argb32 : 1;
} MetaCompWindow; } MetaCompWindow;
@ -288,6 +290,14 @@ is_shaped (MetaDisplay *display,
static gboolean static gboolean
window_has_shadow (MetaCompWindow *cw) window_has_shadow (MetaCompWindow *cw)
{ {
/*
* Do not add shadows to ARGB windows (since they are probably transparent
*/
if (cw->argb32 || cw->opacity != 0xff) {
meta_verbose ("Window has no shadow as it is ARGB\n");
return FALSE;
}
if (cw->attrs.override_redirect) if (cw->attrs.override_redirect)
{ {
meta_verbose ("Window has shadow because it is override redirect.\n"); meta_verbose ("Window has shadow because it is override redirect.\n");
@ -318,13 +328,6 @@ window_has_shadow (MetaCompWindow *cw)
return FALSE; return FALSE;
} }
#if 0
if (cw->mode != WINDOW_ARGB) {
meta_verbose ("Window has shadow as it is not ARGB\n");
return TRUE;
}
#endif
if (cw->type == META_COMP_WINDOW_MENU if (cw->type == META_COMP_WINDOW_MENU
#if 0 #if 0
|| cw->type == META_COMP_WINDOW_DROP_DOWN_MENU || cw->type == META_COMP_WINDOW_DROP_DOWN_MENU
@ -584,6 +587,7 @@ add_win (MetaScreen *screen,
MetaCompScreen *info = meta_screen_get_compositor_data (screen); MetaCompScreen *info = meta_screen_get_compositor_data (screen);
MetaCompWindow *cw; MetaCompWindow *cw;
gulong event_mask; gulong event_mask;
XRenderPictFormat *format;
if (info == NULL) if (info == NULL)
return; return;
@ -597,6 +601,7 @@ add_win (MetaScreen *screen,
cw->screen = screen; cw->screen = screen;
cw->window = window; cw->window = window;
cw->id = xwindow; cw->id = xwindow;
cw->opacity = 0xff;
if (!XGetWindowAttributes (xdisplay, xwindow, &cw->attrs)) if (!XGetWindowAttributes (xdisplay, xwindow, &cw->attrs))
{ {
@ -619,6 +624,14 @@ add_win (MetaScreen *screen,
else else
cw->damage = XDamageCreate (xdisplay, xwindow, XDamageReportNonEmpty); cw->damage = XDamageCreate (xdisplay, xwindow, XDamageReportNonEmpty);
format = XRenderFindVisualFormat (xdisplay, cw->attrs.visual);
if (format && format->type == PictTypeDirect &&
format->direct.alphaMask)
{
cw->argb32 = TRUE;
}
/* Only add the window to the list of docks if it needs a shadow */ /* Only add the window to the list of docks if it needs a shadow */
if (cw->type == META_COMP_WINDOW_DOCK) if (cw->type == META_COMP_WINDOW_DOCK)
{ {
@ -985,9 +998,14 @@ process_property_notify (MetaCompositorClutter *compositor,
if (meta_prop_get_cardinal (display, event->window, if (meta_prop_get_cardinal (display, event->window,
compositor->atom_net_wm_window_opacity, compositor->atom_net_wm_window_opacity,
&value) == FALSE) &value) == FALSE)
value = 0xffffffff; {
guint8 opacity;
clutter_actor_set_opacity (cw->actor, 200); /* FIXME */ opacity = (guint8)((gfloat)value * 255.0 / ((gfloat)0xffffffff));
cw->opacity = opacity;
clutter_actor_set_opacity (cw->actor, opacity);
}
return; return;
} }