diff options
author | Thomas James Alexander Thurman <tthurman@src.gnome.org> | 2006-04-23 04:36:49 +0000 |
---|---|---|
committer | Thomas James Alexander Thurman <tthurman@src.gnome.org> | 2006-04-23 04:36:49 +0000 |
commit | fc8cdfd162ca05c9430131fc8e4fa14d1ccc4765 (patch) | |
tree | 67d4a4af5ff28ba4e6fb4c202b47c4fddd76046d | |
parent | 8bc7afb635d0407fe51ded70c08c9942dbc14f07 (diff) | |
download | metacity-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.h | 20 | ||||
-rw-r--r-- | src/frames.c | 48 | ||||
-rw-r--r-- | src/frames.h | 1 | ||||
-rw-r--r-- | src/prefs.c | 6 | ||||
-rw-r--r-- | src/theme.c | 23 | ||||
-rw-r--r-- | src/theme.h | 3 |
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 |