[metacity] Add UXD shadows and borders Author: Sam Spilsbury <smspillaz gmail com> Removed 'unity_' prefix.



commit 881d5baf3edafe9594c9f1b932c508461dc4652c
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Wed Jun 4 11:42:40 2014 +0300

    Add UXD shadows and borders
    Author: Sam Spilsbury <smspillaz gmail com>
    Removed 'unity_' prefix.

 src/ui/theme-parser.c |  138 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/ui/theme.c        |   62 ++++++++++++++++++++++
 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 3db225f..77d80ca 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 bdc7ccd..de039a5 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 af50e81..f1b290e 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);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]