diff options
author | Florian Müllner <fmuellner@gnome.org> | 2014-09-25 06:41:40 +0200 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2015-02-19 18:55:06 +0200 |
commit | e0a8a42808544c862d31f04eec494746f4b48d8d (patch) | |
tree | 4e74541710b54107f10ef9ce79fd9d143c28c5bc | |
parent | dce01fa7e380f20edd4f14bfde723aa9031c797b (diff) | |
download | metacity-e0a8a42808544c862d31f04eec494746f4b48d8d.tar.gz |
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
-rw-r--r-- | src/ui/theme.c | 72 | ||||
-rw-r--r-- | 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 8269a202..5ead0951 100644 --- a/src/ui/theme.c +++ b/src/ui/theme.c @@ -5571,6 +5571,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 f83a57ed..b7225ca7 100644 --- a/src/ui/theme.h +++ b/src/ui/theme.h @@ -1007,6 +1007,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, |