[metacity/wip/gtk-theme: 7/41] theme: Add method to adjust styles for frame state



commit 79e63b53a226bb8b7ca213e73df4fe48cf0073cf
Author: Florian Müllner <fmuellner gnome org>
Date:   Thu Sep 25 06:41:40 2014 +0200

    theme: Add method to adjust styles for frame state
    
    GTK+ expresses the window state as style classes and widget state for
    client-side decorations. Add a helper method to translate our own frame
    state to the corresponding changes to the style context hierarchy.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=741917

 src/ui/theme.c |   72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/ui/theme.h |    3 ++
 2 files changed, 75 insertions(+), 0 deletions(-)
---
diff --git a/src/ui/theme.c b/src/ui/theme.c
index 58fa661..dc9aa53 100644
--- a/src/ui/theme.c
+++ b/src/ui/theme.c
@@ -5547,6 +5547,78 @@ meta_style_info_unref (MetaStyleInfo *style_info)
     }
 }
 
+static void
+add_toplevel_class (GtkStyleContext *style,
+                    const gchar     *class_name)
+{
+  if (gtk_style_context_get_parent (style))
+    {
+      GtkWidgetPath *path;
+
+      path = gtk_widget_path_copy (gtk_style_context_get_path (style));
+      gtk_widget_path_iter_add_class (path, 0, class_name);
+      gtk_style_context_set_path (style, path);
+      gtk_widget_path_unref (path);
+    }
+  else
+    gtk_style_context_add_class (style, class_name);
+}
+
+static void
+remove_toplevel_class (GtkStyleContext *style,
+                       const gchar     *class_name)
+{
+  if (gtk_style_context_get_parent (style))
+    {
+      GtkWidgetPath *path;
+
+      path = gtk_widget_path_copy (gtk_style_context_get_path (style));
+      gtk_widget_path_iter_remove_class (path, 0, class_name);
+      gtk_style_context_set_path (style, path);
+      gtk_widget_path_unref (path);
+    }
+  else
+    gtk_style_context_remove_class (style, class_name);
+}
+
+void
+meta_style_info_set_flags (MetaStyleInfo  *style_info,
+                           MetaFrameFlags  flags)
+{
+  GtkStyleContext *style;
+  const gchar *class_name = NULL;
+  gboolean backdrop;
+  GtkStateFlags state;
+  int i;
+
+  backdrop = !(flags & META_FRAME_HAS_FOCUS);
+  if (flags & META_FRAME_IS_FLASHING)
+    backdrop = !backdrop;
+
+  if (flags & META_FRAME_MAXIMIZED)
+    class_name = "maximized";
+  else if (flags & META_FRAME_TILED_LEFT ||
+           flags & META_FRAME_TILED_RIGHT)
+    class_name = "tiled";
+
+  for (i = 0; i < META_STYLE_ELEMENT_LAST; i++)
+    {
+      style = style_info->styles[i];
+
+      state = gtk_style_context_get_state (style);
+      if (backdrop)
+        gtk_style_context_set_state (style, state | GTK_STATE_FLAG_BACKDROP);
+      else
+        gtk_style_context_set_state (style, state & ~GTK_STATE_FLAG_BACKDROP);
+
+      remove_toplevel_class (style, "maximized");
+      remove_toplevel_class (style, "tiled");
+
+      if (class_name)
+        add_toplevel_class (style, class_name);
+    }
+}
+
 PangoFontDescription*
 meta_style_info_create_font_desc (MetaStyleInfo *style_info)
 {
diff --git a/src/ui/theme.h b/src/ui/theme.h
index 261ec30..73ac2e7 100644
--- a/src/ui/theme.h
+++ b/src/ui/theme.h
@@ -1006,6 +1006,9 @@ MetaStyleInfo* meta_theme_create_style_info (GdkScreen     *screen,
 MetaStyleInfo* meta_style_info_ref          (MetaStyleInfo *style);
 void           meta_style_info_unref        (MetaStyleInfo *style_info);
 
+void           meta_style_info_set_flags    (MetaStyleInfo  *style_info,
+                                             MetaFrameFlags  flags);
+
 PangoFontDescription* meta_style_info_create_font_desc (MetaStyleInfo *style_info);
 
 void meta_style_info_set_flags              (MetaStyleInfo  *style_info,


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