From 435058ef576b86b89ac23715b21495cdaf601288 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= Date: Tue, 16 Aug 2016 21:30:27 +0300 Subject: libmetacity: use callback function to get button state --- libmetacity/meta-theme-gtk.c | 60 +---------------------------------- libmetacity/meta-theme-impl-private.h | 5 +++ libmetacity/meta-theme-impl.c | 58 +++++++++++++++++++++++++++++++++ libmetacity/meta-theme.c | 41 +++++++++++++++++------- libmetacity/meta-theme.h | 7 +++- 5 files changed, 100 insertions(+), 71 deletions(-) (limited to 'libmetacity') diff --git a/libmetacity/meta-theme-gtk.c b/libmetacity/meta-theme-gtk.c index 708526d6..9fcf25b2 100644 --- a/libmetacity/meta-theme-gtk.c +++ b/libmetacity/meta-theme-gtk.c @@ -733,64 +733,6 @@ get_class_from_button_function (MetaButtonFunction function) return NULL; } -static void -get_button_rect (MetaButtonFunction function, - const MetaFrameGeometry *fgeom, - GdkRectangle *rect) -{ - switch (function) - { - case META_BUTTON_FUNCTION_CLOSE: - *rect = fgeom->close_rect.visible; - break; - - case META_BUTTON_FUNCTION_SHADE: - *rect = fgeom->shade_rect.visible; - break; - - case META_BUTTON_FUNCTION_UNSHADE: - *rect = fgeom->unshade_rect.visible; - break; - - case META_BUTTON_FUNCTION_ABOVE: - *rect = fgeom->above_rect.visible; - break; - - case META_BUTTON_FUNCTION_UNABOVE: - *rect = fgeom->unabove_rect.visible; - break; - - case META_BUTTON_FUNCTION_STICK: - *rect = fgeom->stick_rect.visible; - break; - - case META_BUTTON_FUNCTION_UNSTICK: - *rect = fgeom->unstick_rect.visible; - break; - - case META_BUTTON_FUNCTION_MAXIMIZE: - *rect = fgeom->max_rect.visible; - break; - - case META_BUTTON_FUNCTION_MINIMIZE: - *rect = fgeom->min_rect.visible; - break; - - case META_BUTTON_FUNCTION_MENU: - *rect = fgeom->menu_rect.visible; - break; - - case META_BUTTON_FUNCTION_APPMENU: - *rect = fgeom->appmenu_rect.visible; - break; - - case META_BUTTON_FUNCTION_LAST: - default: - g_assert_not_reached (); - break; - } -} - static void meta_theme_gtk_draw_frame (MetaThemeImpl *impl, MetaFrameStyle *style, @@ -909,7 +851,7 @@ meta_theme_gtk_draw_frame (MetaThemeImpl *impl, cairo_save (cr); - get_button_rect (button_function, fgeom, &tmp_rect); + get_button_rect_for_function (button_function, fgeom, &tmp_rect); button_rect.x = tmp_rect.x / scale; button_rect.y = tmp_rect.y / scale; diff --git a/libmetacity/meta-theme-impl-private.h b/libmetacity/meta-theme-impl-private.h index 0144f797..14d90fda 100644 --- a/libmetacity/meta-theme-impl-private.h +++ b/libmetacity/meta-theme-impl-private.h @@ -88,6 +88,11 @@ G_GNUC_INTERNAL MetaFrameStyleSet *meta_theme_impl_get_style_set (MetaThemeImpl *impl, MetaFrameType type); +G_GNUC_INTERNAL +void get_button_rect_for_function (MetaButtonFunction function, + const MetaFrameGeometry *fgeom, + GdkRectangle *rect); + G_GNUC_INTERNAL void scale_border (GtkBorder *border, double factor); diff --git a/libmetacity/meta-theme-impl.c b/libmetacity/meta-theme-impl.c index f5583baf..773392c2 100644 --- a/libmetacity/meta-theme-impl.c +++ b/libmetacity/meta-theme-impl.c @@ -131,6 +131,64 @@ meta_theme_impl_get_style_set (MetaThemeImpl *impl, return priv->style_sets_by_type[type]; } +void +get_button_rect_for_function (MetaButtonFunction function, + const MetaFrameGeometry *fgeom, + GdkRectangle *rect) +{ + switch (function) + { + case META_BUTTON_FUNCTION_CLOSE: + *rect = fgeom->close_rect.visible; + break; + + case META_BUTTON_FUNCTION_SHADE: + *rect = fgeom->shade_rect.visible; + break; + + case META_BUTTON_FUNCTION_UNSHADE: + *rect = fgeom->unshade_rect.visible; + break; + + case META_BUTTON_FUNCTION_ABOVE: + *rect = fgeom->above_rect.visible; + break; + + case META_BUTTON_FUNCTION_UNABOVE: + *rect = fgeom->unabove_rect.visible; + break; + + case META_BUTTON_FUNCTION_STICK: + *rect = fgeom->stick_rect.visible; + break; + + case META_BUTTON_FUNCTION_UNSTICK: + *rect = fgeom->unstick_rect.visible; + break; + + case META_BUTTON_FUNCTION_MAXIMIZE: + *rect = fgeom->max_rect.visible; + break; + + case META_BUTTON_FUNCTION_MINIMIZE: + *rect = fgeom->min_rect.visible; + break; + + case META_BUTTON_FUNCTION_MENU: + *rect = fgeom->menu_rect.visible; + break; + + case META_BUTTON_FUNCTION_APPMENU: + *rect = fgeom->appmenu_rect.visible; + break; + + case META_BUTTON_FUNCTION_LAST: + default: + g_assert_not_reached (); + break; + } +} + void scale_border (GtkBorder *border, double factor) diff --git a/libmetacity/meta-theme.c b/libmetacity/meta-theme.c index 3643b51f..70aa2ea1 100644 --- a/libmetacity/meta-theme.c +++ b/libmetacity/meta-theme.c @@ -647,17 +647,18 @@ meta_theme_calc_geometry (MetaTheme *theme, } void -meta_theme_draw_frame (MetaTheme *theme, - const gchar *variant, - cairo_t *cr, - MetaFrameType type, - MetaFrameFlags flags, - gint client_width, - gint client_height, - const gchar *title, - MetaButtonState button_states[META_BUTTON_FUNCTION_LAST], - GdkPixbuf *mini_icon, - GdkPixbuf *icon) +meta_theme_draw_frame (MetaTheme *theme, + const gchar *variant, + cairo_t *cr, + MetaFrameType type, + MetaFrameFlags flags, + gint client_width, + gint client_height, + const gchar *title, + MetaButtonStateFunc func, + gpointer user_data, + GdkPixbuf *mini_icon, + GdkPixbuf *icon) { MetaFrameStyle *style; MetaThemeImplClass *impl_class; @@ -665,6 +666,8 @@ meta_theme_draw_frame (MetaTheme *theme, gint title_height; PangoLayout *title_layout; MetaFrameGeometry fgeom; + gint i; + MetaButtonState button_states[META_BUTTON_FUNCTION_LAST]; g_return_if_fail (type < META_FRAME_TYPE_LAST); @@ -683,6 +686,22 @@ meta_theme_draw_frame (MetaTheme *theme, title_height, flags, client_width, client_height, &theme->button_layout, type, &fgeom); + for (i = 0; i < META_BUTTON_FUNCTION_LAST; i++) + { + MetaButtonState state; + GdkRectangle rect; + + get_button_rect_for_function (i, &fgeom, &rect); + + state = META_BUTTON_STATE_NORMAL; + if (func != NULL) + state = (* func) (i, rect, user_data); + + g_assert (state >= META_BUTTON_STATE_NORMAL && state < META_BUTTON_STATE_LAST); + + button_states[i] = state; + } + impl_class->draw_frame (theme->impl, style, style_info, cr, &fgeom, title_layout, flags, button_states, mini_icon, icon); diff --git a/libmetacity/meta-theme.h b/libmetacity/meta-theme.h index d515f898..369e56cf 100644 --- a/libmetacity/meta-theme.h +++ b/libmetacity/meta-theme.h @@ -30,6 +30,10 @@ G_BEGIN_DECLS typedef struct _MetaButtonSpace MetaButtonSpace; typedef struct _MetaFrameGeometry MetaFrameGeometry; +typedef MetaButtonState (* MetaButtonStateFunc) (MetaButtonFunction function, + GdkRectangle rect, + gpointer user_data); + #define META_TYPE_THEME meta_theme_get_type () G_DECLARE_FINAL_TYPE (MetaTheme, meta_theme, META, THEME, GObject) @@ -186,7 +190,8 @@ void meta_theme_draw_frame (MetaTheme *theme, gint client_width, gint client_height, const gchar *title, - MetaButtonState button_states[META_BUTTON_FUNCTION_LAST], + MetaButtonStateFunc func, + gpointer user_data, GdkPixbuf *mini_icon, GdkPixbuf *icon); -- cgit v1.2.1