diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2014-06-04 11:42:40 +0300 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2014-06-04 11:42:40 +0300 |
commit | 881d5baf3edafe9594c9f1b932c508461dc4652c (patch) | |
tree | dce37e98439c7bd2c86f1d8cfb5e77b553406f33 /src | |
parent | 4ecd6e49164ee027cee8dfdbb51fd8389694ff43 (diff) | |
download | metacity-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.c | 138 | ||||
-rw-r--r-- | src/ui/theme.c | 62 | ||||
-rw-r--r-- | src/ui/theme.h | 64 |
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); |