summaryrefslogtreecommitdiff
path: root/libmetacity
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2016-08-16 21:30:27 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2016-08-16 21:30:27 +0300
commit435058ef576b86b89ac23715b21495cdaf601288 (patch)
treed967c18438a82eef7a24496b3bd5df4e06a796a9 /libmetacity
parent5318cdbf7e16a454f3b685f5ddd5a36a1d072772 (diff)
downloadmetacity-435058ef576b86b89ac23715b21495cdaf601288.tar.gz
libmetacity: use callback function to get button state
Diffstat (limited to 'libmetacity')
-rw-r--r--libmetacity/meta-theme-gtk.c60
-rw-r--r--libmetacity/meta-theme-impl-private.h5
-rw-r--r--libmetacity/meta-theme-impl.c58
-rw-r--r--libmetacity/meta-theme.c41
-rw-r--r--libmetacity/meta-theme.h7
5 files changed, 100 insertions, 71 deletions
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
@@ -734,64 +734,6 @@ get_class_from_button_function (MetaButtonFunction function)
}
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,
MetaStyleInfo *style_info,
@@ -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
@@ -89,6 +89,11 @@ 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
@@ -132,6 +132,64 @@ meta_theme_impl_get_style_set (MetaThemeImpl *impl,
}
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);