summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas James Alexander Thurman <tthurman@src.gnome.org>2006-04-23 04:36:49 +0000
committerThomas James Alexander Thurman <tthurman@src.gnome.org>2006-04-23 04:36:49 +0000
commitfc8cdfd162ca05c9430131fc8e4fa14d1ccc4765 (patch)
tree67d4a4af5ff28ba4e6fb4c202b47c4fddd76046d
parent8bc7afb635d0407fe51ded70c08c9942dbc14f07 (diff)
downloadmetacity-fc8cdfd162ca05c9430131fc8e4fa14d1ccc4765.tar.gz
Add a shade button. #96229. Will check in fixed versions of each theme later (probably all of them by Monday or Tuesday.
-rw-r--r--src/common.h20
-rw-r--r--src/frames.c48
-rw-r--r--src/frames.h1
-rw-r--r--src/prefs.c6
-rw-r--r--src/theme.c23
-rw-r--r--src/theme.h3
6 files changed, 91 insertions, 10 deletions
diff --git a/src/common.h b/src/common.h
index 24f208db..de6a0fcb 100644
--- a/src/common.h
+++ b/src/common.h
@@ -129,7 +129,8 @@ typedef enum
META_GRAB_OP_CLICKING_MAXIMIZE,
META_GRAB_OP_CLICKING_UNMAXIMIZE,
META_GRAB_OP_CLICKING_DELETE,
- META_GRAB_OP_CLICKING_MENU
+ META_GRAB_OP_CLICKING_MENU,
+ META_GRAB_OP_CLICKING_SHADE
} MetaGrabOp;
typedef enum
@@ -226,9 +227,15 @@ typedef enum
META_BUTTON_FUNCTION_MINIMIZE,
META_BUTTON_FUNCTION_MAXIMIZE,
META_BUTTON_FUNCTION_CLOSE,
+ META_BUTTON_FUNCTION_SHADE,
META_BUTTON_FUNCTION_LAST
} MetaButtonFunction;
+/* Hmm. Strictly speaking, we're not supposed to change the
+ * interpretation of theme-1, but the max number of buttons
+ * in one corner is equal to the number of buttons in theme-2
+ * in both theme formats. :(
+ */
#define MAX_BUTTONS_PER_CORNER META_BUTTON_FUNCTION_LAST
typedef struct _MetaButtonLayout MetaButtonLayout;
@@ -256,4 +263,15 @@ struct _MetaButtonLayout
(ycoord) >= (rect).y && \
(ycoord) < ((rect).y + (rect).height))
+/* Features present only in some theme versions */
+
+/* FIXME */
+#define META_THEME_ALLOWS(feature) (2 >= feature)
+
+/* Each feature is defined to be equal to the theme version
+ * * in which it was introduced.
+ * */
+#define META_THEME_SHADE_BUTTONS 2
+
+
#endif
diff --git a/src/frames.c b/src/frames.c
index 4114f642..fd50cdcc 100644
--- a/src/frames.c
+++ b/src/frames.c
@@ -1097,6 +1097,9 @@ show_tip_now (MetaFrames *frames)
case META_FRAME_CONTROL_UNMAXIMIZE:
tiptext = _("Unmaximize Window");
break;
+ case META_FRAME_CONTROL_SHADE:
+ tiptext = _("Roll Up Window");
+ break;
case META_FRAME_CONTROL_RESIZE_SE:
break;
case META_FRAME_CONTROL_RESIZE_S:
@@ -1305,6 +1308,7 @@ meta_frames_button_press_event (GtkWidget *widget,
control == META_FRAME_CONTROL_UNMAXIMIZE ||
control == META_FRAME_CONTROL_MINIMIZE ||
control == META_FRAME_CONTROL_DELETE ||
+ control == META_FRAME_CONTROL_SHADE ||
control == META_FRAME_CONTROL_MENU))
{
MetaGrabOp op = META_GRAB_OP_NONE;
@@ -1326,6 +1330,9 @@ meta_frames_button_press_event (GtkWidget *widget,
case META_FRAME_CONTROL_MENU:
op = META_GRAB_OP_CLICKING_MENU;
break;
+ case META_FRAME_CONTROL_SHADE:
+ op = META_GRAB_OP_CLICKING_SHADE;
+ break;
default:
g_assert_not_reached ();
break;
@@ -1580,6 +1587,22 @@ meta_frames_button_release_event (GtkWidget *widget,
end_grab = TRUE;
break;
+ case META_GRAB_OP_CLICKING_SHADE:
+ {
+ MetaFrameFlags flags;
+
+ flags = meta_core_get_frame_flags (gdk_display, frame->xwindow);
+
+ if (flags & META_FRAME_SHADED)
+ meta_core_unshade (gdk_display,
+ frame->xwindow);
+ else
+ meta_core_shade (gdk_display,
+ frame->xwindow);
+ end_grab = TRUE;
+ }
+ break;
+
default:
break;
}
@@ -1599,9 +1622,6 @@ meta_frames_update_prelit_control (MetaFrames *frames,
MetaFrameControl old_control;
MetaCursor cursor;
- meta_verbose ("Updating prelit control from %u to %u\n",
- frame->prelit_control, control);
-
cursor = META_CURSOR_DEFAULT;
switch (control)
@@ -1622,6 +1642,8 @@ meta_frames_update_prelit_control (MetaFrames *frames,
break;
case META_FRAME_CONTROL_UNMAXIMIZE:
break;
+ case META_FRAME_CONTROL_SHADE:
+ break;
case META_FRAME_CONTROL_RESIZE_SE:
cursor = META_CURSOR_SE_RESIZE;
break;
@@ -1659,6 +1681,7 @@ meta_frames_update_prelit_control (MetaFrames *frames,
case META_FRAME_CONTROL_MINIMIZE:
case META_FRAME_CONTROL_MAXIMIZE:
case META_FRAME_CONTROL_DELETE:
+ case META_FRAME_CONTROL_SHADE:
case META_FRAME_CONTROL_UNMAXIMIZE:
/* leave control set */
break;
@@ -1707,6 +1730,7 @@ meta_frames_motion_notify_event (GtkWidget *widget,
case META_GRAB_OP_CLICKING_MINIMIZE:
case META_GRAB_OP_CLICKING_MAXIMIZE:
case META_GRAB_OP_CLICKING_UNMAXIMIZE:
+ case META_GRAB_OP_CLICKING_SHADE:
{
MetaFrameControl control;
int x, y;
@@ -1721,7 +1745,9 @@ meta_frames_motion_notify_event (GtkWidget *widget,
grab_op == META_GRAB_OP_CLICKING_MENU) ||
(control == META_FRAME_CONTROL_DELETE &&
grab_op == META_GRAB_OP_CLICKING_DELETE) ||
- (control == META_FRAME_CONTROL_MINIMIZE &&
+ (control == META_FRAME_CONTROL_SHADE &&
+ grab_op == META_GRAB_OP_CLICKING_SHADE) ||
+ (control == META_FRAME_CONTROL_MINIMIZE &&
grab_op == META_GRAB_OP_CLICKING_MINIMIZE) ||
(control == META_FRAME_CONTROL_MAXIMIZE &&
(grab_op == META_GRAB_OP_CLICKING_MAXIMIZE ||
@@ -2106,6 +2132,12 @@ meta_frames_paint_to_drawable (MetaFrames *frames,
else
button_states[META_BUTTON_TYPE_MAXIMIZE] = META_BUTTON_STATE_PRELIGHT;
break;
+ case META_FRAME_CONTROL_SHADE:
+ if (grab_op == META_GRAB_OP_CLICKING_SHADE)
+ button_states[META_BUTTON_TYPE_SHADE] = META_BUTTON_STATE_PRESSED;
+ else
+ button_states[META_BUTTON_TYPE_SHADE] = META_BUTTON_STATE_PRELIGHT;
+ break;
case META_FRAME_CONTROL_DELETE:
if (grab_op == META_GRAB_OP_CLICKING_DELETE)
button_states[META_BUTTON_TYPE_CLOSE] = META_BUTTON_STATE_PRESSED;
@@ -2268,7 +2300,10 @@ control_rect (MetaFrameControl control,
case META_FRAME_CONTROL_UNMAXIMIZE:
rect = &fgeom->max_rect;
break;
- case META_FRAME_CONTROL_RESIZE_SE:
+ case META_FRAME_CONTROL_SHADE:
+ rect = &fgeom->shade_rect;
+ break;
+ case META_FRAME_CONTROL_RESIZE_SE:
break;
case META_FRAME_CONTROL_RESIZE_S:
break;
@@ -2327,6 +2362,9 @@ get_control (MetaFrames *frames,
if (POINT_IN_RECT (x, y, fgeom.menu_rect))
return META_FRAME_CONTROL_MENU;
+ if (POINT_IN_RECT (x, y, fgeom.shade_rect))
+ return META_FRAME_CONTROL_SHADE;
+
flags = meta_core_get_frame_flags (gdk_display, frame->xwindow);
has_vert = (flags & META_FRAME_ALLOWS_VERTICAL_RESIZE) != 0;
diff --git a/src/frames.h b/src/frames.h
index d7db935e..96c8b799 100644
--- a/src/frames.h
+++ b/src/frames.h
@@ -36,6 +36,7 @@ typedef enum
META_FRAME_CONTROL_MINIMIZE,
META_FRAME_CONTROL_MAXIMIZE,
META_FRAME_CONTROL_UNMAXIMIZE,
+ META_FRAME_CONTROL_SHADE,
META_FRAME_CONTROL_RESIZE_SE,
META_FRAME_CONTROL_RESIZE_S,
META_FRAME_CONTROL_RESIZE_SW,
diff --git a/src/prefs.c b/src/prefs.c
index 6f5263cd..792260fc 100644
--- a/src/prefs.c
+++ b/src/prefs.c
@@ -1379,7 +1379,11 @@ button_function_from_string (const char *str)
return META_BUTTON_FUNCTION_MAXIMIZE;
else if (strcmp (str, "close") == 0)
return META_BUTTON_FUNCTION_CLOSE;
- else
+ else if (strcmp (str, "shade") == 0 &&
+ META_THEME_ALLOWS (META_THEME_SHADE_BUTTONS))
+ return META_BUTTON_FUNCTION_SHADE;
+ else
+ /* don't know; give up */
return META_BUTTON_FUNCTION_LAST;
}
diff --git a/src/theme.c b/src/theme.c
index 41dec9f4..d3e48882 100644
--- a/src/theme.c
+++ b/src/theme.c
@@ -416,7 +416,12 @@ rect_for_function (MetaFrameGeometry *fgeom,
return &fgeom->close_rect;
else
return NULL;
- case META_BUTTON_FUNCTION_LAST:
+ case META_BUTTON_FUNCTION_SHADE:
+ if (flags & META_FRAME_ALLOWS_SHADE)
+ return &fgeom->shade_rect;
+ else
+ return NULL;
+ case META_BUTTON_FUNCTION_LAST:
return NULL;
}
@@ -608,10 +613,16 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout *layout,
break; /* Everything fits, bail out */
/* Otherwise we need to shave out a button. Shave
- * min, max, close, then menu (menu is most useful);
+ * shade, min, max, close, then menu (menu is most useful);
* prefer the default button locations.
*/
if (strip_button (left_func_rects, left_bg_rects,
+ &n_left, &fgeom->shade_rect))
+ continue;
+ else if (strip_button (right_func_rects, right_bg_rects,
+ &n_right, &fgeom->shade_rect))
+ continue;
+ else if (strip_button (left_func_rects, left_bg_rects,
&n_left, &fgeom->min_rect))
continue;
else if (strip_button (right_func_rects, right_bg_rects,
@@ -3871,6 +3882,10 @@ button_rect (MetaButtonType type,
*rect = fgeom->close_rect;
break;
+ case META_BUTTON_TYPE_SHADE:
+ *rect = fgeom->shade_rect;
+ break;
+
case META_BUTTON_TYPE_MAXIMIZE:
*rect = fgeom->max_rect;
break;
@@ -5150,6 +5165,8 @@ meta_button_type_from_string (const char *str)
return META_BUTTON_TYPE_MINIMIZE;
else if (strcmp ("menu", str) == 0)
return META_BUTTON_TYPE_MENU;
+ else if (strcmp ("shade", str) == 0 && META_THEME_ALLOWS(META_THEME_SHADE_BUTTONS))
+ return META_BUTTON_TYPE_SHADE;
else if (strcmp ("left_left_background", str) == 0)
return META_BUTTON_TYPE_LEFT_LEFT_BACKGROUND;
else if (strcmp ("left_middle_background", str) == 0)
@@ -5177,6 +5194,8 @@ meta_button_type_to_string (MetaButtonType type)
return "maximize";
case META_BUTTON_TYPE_MINIMIZE:
return "minimize";
+ case META_BUTTON_TYPE_SHADE:
+ return "shade";
case META_BUTTON_TYPE_MENU:
return "menu";
case META_BUTTON_TYPE_LEFT_LEFT_BACKGROUND:
diff --git a/src/theme.h b/src/theme.h
index ef307797..a3966212 100644
--- a/src/theme.h
+++ b/src/theme.h
@@ -131,6 +131,7 @@ struct _MetaFrameGeometry
GdkRectangle max_rect;
GdkRectangle min_rect;
GdkRectangle menu_rect;
+ GdkRectangle shade_rect;
#define MAX_MIDDLE_BACKGROUNDS (MAX_BUTTONS_PER_CORNER - 2)
GdkRectangle left_left_background;
@@ -424,6 +425,7 @@ typedef enum
META_BUTTON_TYPE_MAXIMIZE,
META_BUTTON_TYPE_MINIMIZE,
META_BUTTON_TYPE_MENU,
+ META_BUTTON_TYPE_SHADE,
META_BUTTON_TYPE_LAST
} MetaButtonType;
@@ -837,5 +839,4 @@ const char* meta_gtk_arrow_to_string (GtkArrowType a
MetaImageFillType meta_image_fill_type_from_string (const char *str);
const char* meta_image_fill_type_to_string (MetaImageFillType fill_type);
-
#endif