summaryrefslogtreecommitdiff
path: root/libmetacity/meta-theme-impl.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmetacity/meta-theme-impl.c')
-rw-r--r--libmetacity/meta-theme-impl.c195
1 files changed, 137 insertions, 58 deletions
diff --git a/libmetacity/meta-theme-impl.c b/libmetacity/meta-theme-impl.c
index ac2735c5..1a1da9e9 100644
--- a/libmetacity/meta-theme-impl.c
+++ b/libmetacity/meta-theme-impl.c
@@ -132,64 +132,6 @@ meta_theme_impl_get_style_set (MetaThemeImpl *impl,
}
void
-get_button_rect_for_type (MetaButtonType type,
- const MetaFrameGeometry *fgeom,
- GdkRectangle *rect)
-{
- switch (type)
- {
- case META_BUTTON_TYPE_CLOSE:
- *rect = fgeom->close_rect.visible;
- break;
-
- case META_BUTTON_TYPE_SHADE:
- *rect = fgeom->shade_rect.visible;
- break;
-
- case META_BUTTON_TYPE_UNSHADE:
- *rect = fgeom->unshade_rect.visible;
- break;
-
- case META_BUTTON_TYPE_ABOVE:
- *rect = fgeom->above_rect.visible;
- break;
-
- case META_BUTTON_TYPE_UNABOVE:
- *rect = fgeom->unabove_rect.visible;
- break;
-
- case META_BUTTON_TYPE_STICK:
- *rect = fgeom->stick_rect.visible;
- break;
-
- case META_BUTTON_TYPE_UNSTICK:
- *rect = fgeom->unstick_rect.visible;
- break;
-
- case META_BUTTON_TYPE_MAXIMIZE:
- *rect = fgeom->max_rect.visible;
- break;
-
- case META_BUTTON_TYPE_MINIMIZE:
- *rect = fgeom->min_rect.visible;
- break;
-
- case META_BUTTON_TYPE_MENU:
- *rect = fgeom->menu_rect.visible;
- break;
-
- case META_BUTTON_TYPE_APPMENU:
- *rect = fgeom->appmenu_rect.visible;
- break;
-
- case META_BUTTON_TYPE_LAST:
- default:
- g_assert_not_reached ();
- break;
- }
-}
-
-void
scale_border (GtkBorder *border,
double factor)
{
@@ -214,3 +156,140 @@ get_window_scaling_factor (void)
else
return 1;
}
+
+gboolean
+is_button_visible (MetaButton *button,
+ MetaFrameFlags flags)
+{
+ gboolean visible;
+
+ visible = FALSE;
+
+ switch (button->type)
+ {
+ case META_BUTTON_TYPE_MENU:
+ if (flags & META_FRAME_ALLOWS_MENU)
+ visible = TRUE;
+ break;
+
+ case META_BUTTON_TYPE_APPMENU:
+ if (flags & META_FRAME_ALLOWS_APPMENU)
+ visible = TRUE;
+ break;
+
+ case META_BUTTON_TYPE_MINIMIZE:
+ if (flags & META_FRAME_ALLOWS_MINIMIZE)
+ visible = TRUE;
+ break;
+
+ case META_BUTTON_TYPE_MAXIMIZE:
+ if (flags & META_FRAME_ALLOWS_MAXIMIZE)
+ visible = TRUE;
+ break;
+
+ case META_BUTTON_TYPE_CLOSE:
+ if (flags & META_FRAME_ALLOWS_DELETE)
+ visible = TRUE;
+ break;
+
+ case META_BUTTON_TYPE_SHADE:
+ if ((flags & META_FRAME_ALLOWS_SHADE) && !(flags & META_FRAME_SHADED))
+ visible = TRUE;
+ break;
+
+ case META_BUTTON_TYPE_ABOVE:
+ if (!(flags & META_FRAME_ABOVE))
+ visible = TRUE;
+ break;
+
+ case META_BUTTON_TYPE_STICK:
+ if (!(flags & META_FRAME_STUCK))
+ visible = TRUE;
+ break;
+
+ case META_BUTTON_TYPE_UNSHADE:
+ if ((flags & META_FRAME_ALLOWS_SHADE) && (flags & META_FRAME_SHADED))
+ visible = TRUE;
+ break;
+
+ case META_BUTTON_TYPE_UNABOVE:
+ if (flags & META_FRAME_ABOVE)
+ visible = TRUE;
+ break;
+
+ case META_BUTTON_TYPE_UNSTICK:
+ if (flags & META_FRAME_STUCK)
+ visible = TRUE;
+ break;
+
+ case META_BUTTON_TYPE_SPACER:
+ visible = TRUE;
+ break;
+
+ case META_BUTTON_TYPE_LAST:
+ default:
+ break;
+ }
+
+ return visible;
+}
+
+gboolean
+strip_button (MetaButton *buttons,
+ gint n_buttons,
+ MetaButtonType type)
+{
+ gint i;
+
+ for (i = 0; i < n_buttons; i++)
+ {
+ if (buttons[i].type == type && buttons[i].visible)
+ {
+ buttons[i].visible = FALSE;
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+gboolean
+strip_buttons (MetaButtonLayout *layout,
+ gint *n_left,
+ gint *n_right)
+{
+ gint count;
+ MetaButtonType types[META_BUTTON_TYPE_LAST];
+ gint i;
+
+ count = 0;
+ types[count++] = META_BUTTON_TYPE_ABOVE;
+ types[count++] = META_BUTTON_TYPE_UNABOVE;
+ types[count++] = META_BUTTON_TYPE_STICK;
+ types[count++] = META_BUTTON_TYPE_UNSTICK;
+ types[count++] = META_BUTTON_TYPE_SHADE;
+ types[count++] = META_BUTTON_TYPE_UNSHADE;
+ types[count++] = META_BUTTON_TYPE_MINIMIZE;
+ types[count++] = META_BUTTON_TYPE_MAXIMIZE;
+ types[count++] = META_BUTTON_TYPE_CLOSE;
+ types[count++] = META_BUTTON_TYPE_MENU;
+ types[count++] = META_BUTTON_TYPE_APPMENU;
+
+ for (i = 0; i < count; i++)
+ {
+ if (strip_button (layout->left_buttons, layout->n_left_buttons,
+ types[i]))
+ {
+ *n_left -= 1;
+ return TRUE;
+ }
+ else if (strip_button (layout->right_buttons, layout->n_right_buttons,
+ types[i]))
+ {
+ *n_left -= 1;
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}