summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2014-06-04 11:42:40 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2014-06-04 11:42:40 +0300
commit881d5baf3edafe9594c9f1b932c508461dc4652c (patch)
treedce37e98439c7bd2c86f1d8cfb5e77b553406f33 /src
parent4ecd6e49164ee027cee8dfdbb51fd8389694ff43 (diff)
downloadmetacity-881d5baf3edafe9594c9f1b932c508461dc4652c.tar.gz
Add UXD shadows and borders
Author: Sam Spilsbury <smspillaz@gmail.com> Removed 'unity_' prefix.
Diffstat (limited to 'src')
-rw-r--r--src/ui/theme-parser.c138
-rw-r--r--src/ui/theme.c62
-rw-r--r--src/ui/theme.h64
3 files changed, 264 insertions, 0 deletions
diff --git a/src/ui/theme-parser.c b/src/ui/theme-parser.c
index 3db225fb..77d80ca6 100644
--- a/src/ui/theme-parser.c
+++ b/src/ui/theme-parser.c
@@ -65,6 +65,8 @@ typedef enum
STATE_FRAME_STYLE,
STATE_PIECE,
STATE_BUTTON,
+ STATE_SHADOW,
+ STATE_PADDING,
/* style set */
STATE_FRAME_STYLE_SET,
STATE_FRAME,
@@ -171,6 +173,20 @@ static void parse_button_element (GMarkupParseContext *context,
ParseInfo *info,
GError **error);
+static void parse_shadow_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ ParseInfo *info,
+ GError **error);
+
+static void parse_padding_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ ParseInfo *info,
+ GError **error);
+
static void parse_menu_icon_element (GMarkupParseContext *context,
const gchar *element_name,
const gchar **attribute_names,
@@ -2936,6 +2952,72 @@ parse_style_element (GMarkupParseContext *context,
push_state (info, STATE_BUTTON);
}
+ else if (ELEMENT_IS ("shadow"))
+ {
+ const char *shadow_radius = NULL;
+ const char *shadow_opacity = NULL;
+ const char *shadow_color = NULL;
+ const char *shadow_x_offset = NULL;
+ const char *shadow_y_offset = NULL;
+ double shadow_radius_v, shadow_opacity_v;
+ int shadow_x_offset_v, shadow_y_offset_v;
+ MetaColorSpec *shadow_color_v;
+
+ if (!locate_attributes (context, element_name, attribute_names, attribute_values,
+ error,
+ "radius", &shadow_radius,
+ "opacity", &shadow_opacity,
+ "color", &shadow_color,
+ "x_offset", &shadow_x_offset,
+ "y_offset", &shadow_y_offset,
+ NULL))
+ return;
+
+ parse_double (shadow_radius, &shadow_radius_v, context, error);
+ parse_double (shadow_opacity, &shadow_opacity_v, context, error);
+ parse_positive_integer (shadow_x_offset, &shadow_x_offset_v, context, info->theme, error);
+ parse_positive_integer (shadow_y_offset, &shadow_y_offset_v, context, info->theme, error);
+ shadow_color_v = parse_color (info->theme, shadow_color, error);
+
+ if (!info->style->shadow_properties)
+ info->style->shadow_properties = meta_shadow_properties_new ();
+
+ info->style->shadow_properties->shadow_radius = shadow_radius_v;
+ info->style->shadow_properties->shadow_opacity = shadow_opacity_v;
+ info->style->shadow_properties->shadow_x_offset = shadow_x_offset_v;
+ info->style->shadow_properties->shadow_y_offset = shadow_y_offset_v;
+ info->style->shadow_properties->shadow_color = shadow_color_v;
+
+ push_state (info, STATE_SHADOW);
+ }
+ else if (ELEMENT_IS ("padding"))
+ {
+ const char *left = NULL;
+ const char *bottom = NULL;
+ const char *right = NULL;
+ int left_v, right_v, bottom_v;
+
+ if (!locate_attributes (context, element_name, attribute_names, attribute_values,
+ error,
+ "left", &left,
+ "right", &right,
+ "bottom", &bottom,
+ NULL))
+ return;
+
+ parse_positive_integer (left, &left_v, context, info->theme, error);
+ parse_positive_integer (right, &right_v, context, info->theme, error);
+ parse_positive_integer (bottom, &bottom_v, context, info->theme, error);
+
+ if (!info->style->invisible_grab_area_properties)
+ info->style->invisible_grab_area_properties = meta_invisible_grab_area_properties_new ();
+
+ info->style->invisible_grab_area_properties->left = left_v;
+ info->style->invisible_grab_area_properties->right = right_v;
+ info->style->invisible_grab_area_properties->bottom = bottom_v;
+
+ push_state (info, STATE_PADDING);
+ }
else
{
set_error (error, context,
@@ -3214,6 +3296,38 @@ parse_button_element (GMarkupParseContext *context,
}
static void
+parse_shadow_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ ParseInfo *info,
+ GError **error)
+{
+ g_return_if_fail (peek_state (info) == STATE_SHADOW);
+
+ set_error (error, context,
+ G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
+ _("Element <%s> is not allowed below <%s>"),
+ element_name, "shadow");
+}
+
+static void
+parse_padding_element (GMarkupParseContext *context,
+ const gchar *element_name,
+ const gchar **attribute_names,
+ const gchar **attribute_values,
+ ParseInfo *info,
+ GError **error)
+{
+ g_return_if_fail (peek_state (info) == STATE_PADDING);
+
+ set_error (error, context,
+ G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
+ _("Element <%s> is not allowed below <%s>"),
+ element_name, "padding");
+}
+
+static void
parse_menu_icon_element (GMarkupParseContext *context,
const gchar *element_name,
const gchar **attribute_names,
@@ -3364,6 +3478,16 @@ start_element_handler (GMarkupParseContext *context,
attribute_names, attribute_values,
info, error);
break;
+ case STATE_SHADOW:
+ parse_shadow_element (context, element_name,
+ attribute_names, attribute_values,
+ info, error);
+ break;
+ case STATE_PADDING:
+ parse_padding_element (context, element_name,
+ attribute_names, attribute_values,
+ info, error);
+ break;
case STATE_MENU_ICON:
parse_menu_icon_element (context, element_name,
attribute_names, attribute_values,
@@ -3633,6 +3757,14 @@ end_element_handler (GMarkupParseContext *context,
}
pop_state (info);
break;
+ case STATE_SHADOW:
+ g_assert (info->style);
+ pop_state (info);
+ break;
+ case STATE_PADDING:
+ g_assert (info->style);
+ pop_state (info);
+ break;
case STATE_MENU_ICON:
g_assert (info->theme);
if (info->op_list != NULL)
@@ -3857,6 +3989,12 @@ text_handler (GMarkupParseContext *context,
case STATE_BUTTON:
NO_TEXT ("button");
break;
+ case STATE_SHADOW:
+ NO_TEXT ("shadow");
+ break;
+ case STATE_PADDING:
+ NO_TEXT ("padding");
+ break;
case STATE_MENU_ICON:
NO_TEXT ("menu_icon");
break;
diff --git a/src/ui/theme.c b/src/ui/theme.c
index bdc7ccd1..de039a5d 100644
--- a/src/ui/theme.c
+++ b/src/ui/theme.c
@@ -1080,6 +1080,51 @@ meta_alpha_gradient_spec_free (MetaAlphaGradientSpec *spec)
g_free (spec);
}
+MetaShadowProperties*
+meta_shadow_properties_new (void)
+{
+ MetaShadowProperties *properties;
+
+ properties = g_new0 (MetaShadowProperties, 1);
+
+ if (properties)
+ {
+ properties->shadow_radius = 0.0f;
+ properties->shadow_x_offset = 0;
+ properties->shadow_y_offset = 0;
+ properties->shadow_color = NULL;
+ }
+
+ return properties;
+}
+
+void
+meta_shadow_properties_free (MetaShadowProperties *properties)
+{
+ g_return_if_fail (properties != NULL);
+
+ meta_color_spec_free (properties->shadow_color);
+ g_free (properties);
+}
+
+MetaInvisibleGrabAreaProperties*
+meta_invisible_grab_area_properties_new (void)
+{
+ MetaInvisibleGrabAreaProperties *properties;
+
+ properties = g_new0 (MetaInvisibleGrabAreaProperties, 1);
+
+ return properties;
+}
+
+void
+meta_invisible_grab_area_properties_free (MetaInvisibleGrabAreaProperties *properties)
+{
+ g_return_if_fail (properties != NULL);
+
+ g_free (properties);
+}
+
MetaColorSpec*
meta_color_spec_new (MetaColorSpecType type)
{
@@ -4169,6 +4214,12 @@ meta_frame_style_unref (MetaFrameStyle *style)
if (style->parent)
meta_frame_style_unref (style->parent);
+ if (style->shadow_properties)
+ meta_shadow_properties_free (style->shadow_properties);
+
+ if (style->invisible_grab_area_properties)
+ meta_invisible_grab_area_properties_free (style->invisible_grab_area_properties);
+
DEBUG_FILL_STRUCT (style);
g_free (style);
}
@@ -4618,6 +4669,17 @@ meta_frame_style_draw_with_style (MetaFrameStyle *style,
}
}
+MetaShadowProperties*
+meta_frame_style_get_shadow_properties (MetaFrameStyle *style)
+{
+ return style->shadow_properties;
+}
+
+MetaInvisibleGrabAreaProperties* meta_frame_style_get_invisible_grab_area_properties (MetaFrameStyle *style)
+{
+ return style->invisible_grab_area_properties;
+}
+
MetaFrameStyleSet*
meta_frame_style_set_new (MetaFrameStyleSet *parent)
{
diff --git a/src/ui/theme.h b/src/ui/theme.h
index af50e812..f1b290ed 100644
--- a/src/ui/theme.h
+++ b/src/ui/theme.h
@@ -40,6 +40,54 @@ typedef struct _MetaFrameGeometry MetaFrameGeometry;
typedef struct _MetaTheme MetaTheme;
typedef struct _MetaPositionExprEnv MetaPositionExprEnv;
typedef struct _MetaDrawInfo MetaDrawInfo;
+typedef struct _MetaShadowProperties MetaShadowProperties;
+typedef struct _MetaInvisibleGrabAreaProperties MetaInvisibleGrabAreaProperties;
+
+struct _MetaShadowProperties
+{
+ /**
+ * Radius of the shadow
+ */
+ double shadow_radius;
+
+ /**
+ * Opacity of the shadow
+ */
+ double shadow_opacity;
+
+ /**
+ * Color of the shadow
+ */
+ MetaColorSpec *shadow_color;
+ /**
+ * Shadow X Offset
+ */
+ guint8 shadow_x_offset;
+ /**
+ * Shadow Y Offset
+ */
+ guint8 shadow_y_offset;
+};
+
+struct _MetaInvisibleGrabAreaProperties
+{
+ /**
+ * Left padding
+ */
+ guint8 left;
+ /**
+ * Right padding
+ */
+ guint8 right;
+ /**
+ * Bottom padding
+ */
+ guint8 bottom;
+ /**
+ * Top padding
+ */
+ guint8 top;
+};
#define META_THEME_ERROR (g_quark_from_static_string ("meta-theme-error"))
@@ -694,6 +742,14 @@ struct _MetaFrameStyle
* Transparency of the window background. 0=transparent; 255=opaque.
*/
guint8 window_background_alpha;
+ /**
+ * Shadow
+ */
+ MetaShadowProperties *shadow_properties;
+ /**
+ * Padding (eg invisible grab area)
+ */
+ MetaInvisibleGrabAreaProperties *invisible_grab_area_properties;
};
/* Kinds of frame...
@@ -915,11 +971,19 @@ MetaAlphaGradientSpec* meta_alpha_gradient_spec_new (MetaGradientType typ
int n_alphas);
void meta_alpha_gradient_spec_free (MetaAlphaGradientSpec *spec);
+MetaShadowProperties* meta_shadow_properties_new (void);
+void meta_shadow_properties_free (MetaShadowProperties *);
+
+MetaInvisibleGrabAreaProperties* meta_invisible_grab_area_properties_new (void);
+void meta_invisible_grab_area_properties_free (MetaInvisibleGrabAreaProperties *);
MetaFrameStyle* meta_frame_style_new (MetaFrameStyle *parent);
void meta_frame_style_ref (MetaFrameStyle *style);
void meta_frame_style_unref (MetaFrameStyle *style);
+MetaShadowProperties* meta_frame_style_get_shadow_properties (MetaFrameStyle *style);
+MetaInvisibleGrabAreaProperties* meta_frame_style_get_invisible_grab_area_properties (MetaFrameStyle *style);
+
gboolean meta_frame_style_validate (MetaFrameStyle *style,
guint current_theme_version,
GError **error);