summaryrefslogtreecommitdiff
path: root/libmetacity/meta-theme.c
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2016-08-18 02:37:25 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2016-08-18 02:37:25 +0300
commitb2106b20993ad67e71a913acffb729445911b007 (patch)
tree6f4cac16ae3993a477fafd3cefe7f63556c08036 /libmetacity/meta-theme.c
parent619f814293e1a19a34d3ac80cced5c9c3392570d (diff)
downloadmetacity-b2106b20993ad67e71a913acffb729445911b007.tar.gz
libmetacity: redo button layout code
Diffstat (limited to 'libmetacity/meta-theme.c')
-rw-r--r--libmetacity/meta-theme.c109
1 files changed, 98 insertions, 11 deletions
diff --git a/libmetacity/meta-theme.c b/libmetacity/meta-theme.c
index efabb3f5..7084ef49 100644
--- a/libmetacity/meta-theme.c
+++ b/libmetacity/meta-theme.c
@@ -570,6 +570,63 @@ meta_theme_set_button_layout (MetaTheme *theme,
theme->button_layout = meta_button_layout_new (button_layout, invert);
}
+gboolean
+meta_theme_get_button (MetaTheme *theme,
+ gint x,
+ gint y,
+ MetaButton *button)
+{
+ gint side;
+
+ for (side = 0; side < 2; side++)
+ {
+ MetaButton *buttons;
+ gint n_buttons;
+ gint i;
+
+ if (side == 0)
+ {
+ buttons = theme->button_layout->left_buttons;
+ n_buttons = theme->button_layout->n_left_buttons;
+ }
+ else if (side == 1)
+ {
+ buttons = theme->button_layout->right_buttons;
+ n_buttons = theme->button_layout->n_right_buttons;
+ }
+ else
+ {
+ g_assert_not_reached ();
+ }
+
+ for (i = 0; i < n_buttons; i++)
+ {
+ MetaButton *btn;
+ GdkRectangle rect;
+
+ btn = &buttons[i];
+ rect = btn->rect.visible;
+
+ if (!btn->visible || btn->type == META_BUTTON_TYPE_SPACER ||
+ rect.width <= 0 || rect.height <= 0)
+ {
+ continue;
+ }
+
+ rect = btn->rect.clickable;
+
+ if (x >= rect.x && x < (rect.x + rect.width) &&
+ y >= rect.y && y < (rect.y + rect.height))
+ {
+ *button = *btn;
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
void
meta_theme_set_composited (MetaTheme *theme,
gboolean composited)
@@ -694,20 +751,50 @@ meta_theme_draw_frame (MetaTheme *theme,
title_height, flags, client_width, client_height,
theme->button_layout, type, &fgeom);
- for (i = 0; i < META_BUTTON_TYPE_LAST; i++)
+ for (i = 0; i < 2; i++)
{
- MetaButtonState state;
- GdkRectangle rect;
+ MetaButton *buttons;
+ gint n_buttons;
+ gint j;
- get_button_rect_for_type (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);
+ if (i == 0)
+ {
+ buttons = theme->button_layout->left_buttons;
+ n_buttons = theme->button_layout->n_left_buttons;
+ }
+ else if (i == 1)
+ {
+ buttons = theme->button_layout->right_buttons;
+ n_buttons = theme->button_layout->n_right_buttons;
+ }
+ else
+ {
+ g_assert_not_reached ();
+ }
- theme->button_layout->button_states[i] = state;
+ for (j = 0; j < n_buttons; j++)
+ {
+ MetaButton *button;
+ MetaButtonState state;
+ GdkRectangle rect;
+
+ button = &buttons[j];
+ state = META_BUTTON_STATE_NORMAL;
+ rect = button->rect.visible;
+
+ if (!button->visible || button->type == META_BUTTON_TYPE_SPACER ||
+ rect.width <= 0 || rect.height <= 0)
+ {
+ button->state = state;
+ continue;
+ }
+
+ if (func != NULL)
+ state = (* func) (button->type, button->rect.clickable, user_data);
+
+ g_assert (state >= META_BUTTON_STATE_NORMAL && state < META_BUTTON_STATE_LAST);
+ button->state = state;
+ }
}
impl_class->draw_frame (theme->impl, style, style_info, cr, &fgeom,