Added MutterWindow::no-shadow property

Allows to specify that a window that otherwise would have shadow should not.
This commit is contained in:
Tomas Frydrych 2009-02-10 10:22:35 +00:00
parent 770a6f0138
commit 5780ffad12

View File

@ -186,7 +186,6 @@ struct _MutterWindowPrivate
gint map_in_progress;
gint destroy_in_progress;
guint needs_shadow : 1;
guint shaped : 1;
guint destroy_pending : 1;
guint argb32 : 1;
@ -200,6 +199,8 @@ struct _MutterWindowPrivate
guint needs_repair : 1;
guint needs_destroy : 1;
guint no_shadow : 1;
};
enum
@ -207,7 +208,8 @@ enum
PROP_MCW_META_WINDOW = 1,
PROP_MCW_META_SCREEN,
PROP_MCW_X_WINDOW,
PROP_MCW_X_WINDOW_ATTRIBUTES
PROP_MCW_X_WINDOW_ATTRIBUTES,
PROP_MCW_NO_SHADOW,
};
static void mutter_window_class_init (MutterWindowClass *klass);
@ -282,6 +284,16 @@ mutter_window_class_init (MutterWindowClass *klass)
g_object_class_install_property (object_class,
PROP_MCW_X_WINDOW_ATTRIBUTES,
pspec);
pspec = g_param_spec_boolean ("no-shadow",
"No shadow",
"Do not add shaddow to this window",
FALSE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
g_object_class_install_property (object_class,
PROP_MCW_NO_SHADOW,
pspec);
}
static void
@ -432,7 +444,8 @@ mutter_window_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
MutterWindowPrivate *priv = MUTTER_WINDOW (object)->priv;
MutterWindow *mw = MUTTER_WINDOW (object);
MutterWindowPrivate *priv = mw->priv;
switch (prop_id)
{
@ -448,6 +461,48 @@ mutter_window_set_property (GObject *object,
case PROP_MCW_X_WINDOW_ATTRIBUTES:
priv->attrs = *((XWindowAttributes*)g_value_get_boxed (value));
break;
case PROP_MCW_NO_SHADOW:
{
gboolean oldv = priv->no_shadow ? TRUE : FALSE;
gboolean newv = g_value_get_boolean (value);
if (oldv == newv)
return;
priv->no_shadow = newv;
if (newv && priv->shadow)
{
clutter_container_remove_actor (CLUTTER_CONTAINER (object),
priv->shadow);
priv->shadow = NULL;
}
else if (!newv && !priv->shadow && mutter_window_has_shadow (mw))
{
guint w, h;
MetaDisplay *display = meta_screen_get_display (priv->screen);
Mutter *compositor;
compositor = (Mutter*) meta_display_get_compositor (display);
clutter_actor_get_size (CLUTTER_ACTOR (mw), &w, &h);
priv->shadow =
tidy_texture_frame_new (CLUTTER_TEXTURE (compositor->shadow_src),
MAX_TILE_SZ,
MAX_TILE_SZ,
MAX_TILE_SZ,
MAX_TILE_SZ);
clutter_actor_set_position (priv->shadow,
SHADOW_OFFSET_X , SHADOW_OFFSET_Y);
clutter_actor_set_size (priv->shadow, w, h);
clutter_container_add_actor (CLUTTER_CONTAINER (mw), priv->shadow);
}
}
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -476,6 +531,9 @@ mutter_window_get_property (GObject *object,
case PROP_MCW_X_WINDOW_ATTRIBUTES:
g_value_set_boxed (value, &priv->attrs);
break;
case PROP_MCW_NO_SHADOW:
g_value_set_boolean (value, priv->no_shadow);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@ -565,6 +623,9 @@ mutter_window_has_shadow (MutterWindow *self)
{
MutterWindowPrivate * priv = self->priv;
if (priv->no_shadow)
return FALSE;
/*
* Always put a shadow around windows with a frame - This should override
* the restriction about not putting a shadow around shaped windows