diff options
author | Thomas James Alexander Thurman <tthurman@src.gnome.org> | 2006-04-30 00:48:57 +0000 |
---|---|---|
committer | Thomas James Alexander Thurman <tthurman@src.gnome.org> | 2006-04-30 00:48:57 +0000 |
commit | ef92520c72e0d70b36ada2f4e749381e8cb63e90 (patch) | |
tree | b1324130585fe343da6430fa1ee9998f2d03ff40 | |
parent | 2e1e23ecd0190b20c9e7c67dcd09c7ab619ae5ce (diff) | |
download | metacity-ef92520c72e0d70b36ada2f4e749381e8cb63e90.tar.gz |
More work on the new buttons. Now mostly works to toggle them. Still a few bugs remaining.
-rw-r--r-- | src/common.h | 6 | ||||
-rw-r--r-- | src/frame.c | 3 | ||||
-rw-r--r-- | src/frames.c | 78 | ||||
-rw-r--r-- | src/prefs.c | 37 | ||||
-rw-r--r-- | src/theme.c | 70 | ||||
-rw-r--r-- | src/theme.h | 6 |
6 files changed, 157 insertions, 43 deletions
diff --git a/src/common.h b/src/common.h index e2e28b7b..1c1eb129 100644 --- a/src/common.h +++ b/src/common.h @@ -44,7 +44,8 @@ typedef enum META_FRAME_ALLOWS_SHADE = 1 << 10, META_FRAME_ALLOWS_MOVE = 1 << 11, META_FRAME_FULLSCREEN = 1 << 12, - META_FRAME_IS_FLASHING = 1 << 13 + META_FRAME_IS_FLASHING = 1 << 13, + META_FRAME_ABOVE = 1 << 14 } MetaFrameFlags; typedef enum @@ -235,6 +236,9 @@ typedef enum META_BUTTON_FUNCTION_SHADE, META_BUTTON_FUNCTION_ABOVE, META_BUTTON_FUNCTION_STICK, + META_BUTTON_FUNCTION_UNSHADE, + META_BUTTON_FUNCTION_UNABOVE, + META_BUTTON_FUNCTION_UNSTICK, META_BUTTON_FUNCTION_LAST } MetaButtonFunction; diff --git a/src/frame.c b/src/frame.c index 445f89c7..d7b8e9ac 100644 --- a/src/frame.c +++ b/src/frame.c @@ -277,6 +277,9 @@ meta_frame_get_flags (MetaFrame *frame) if (frame->is_flashing) flags |= META_FRAME_IS_FLASHING; + if (frame->window->wm_state_above) + flags |= META_FRAME_ABOVE; + return flags; } diff --git a/src/frames.c b/src/frames.c index a5b23e5b..289ecd72 100644 --- a/src/frames.c +++ b/src/frames.c @@ -1639,7 +1639,7 @@ meta_frames_button_release_event (GtkWidget *widget, event->x, event->y)) meta_core_unshade (gdk_display, frame->xwindow); redraw_control (frames, frame, - META_FRAME_CONTROL_SHADE); + META_FRAME_CONTROL_UNSHADE); end_grab = TRUE; break; @@ -1661,7 +1661,7 @@ meta_frames_button_release_event (GtkWidget *widget, meta_window_unmake_above (meta_display_lookup_x_window ( meta_display_for_x_display (gdk_display), frame->xwindow)); redraw_control (frames, frame, - META_FRAME_CONTROL_ABOVE); + META_FRAME_CONTROL_UNABOVE); end_grab = TRUE; break; @@ -1681,7 +1681,7 @@ meta_frames_button_release_event (GtkWidget *widget, event->x, event->y)) meta_core_unstick (gdk_display, frame->xwindow); redraw_control (frames, frame, - META_FRAME_CONTROL_STICK); + META_FRAME_CONTROL_UNSTICK); end_grab = TRUE; break; @@ -1853,14 +1853,17 @@ meta_frames_motion_notify_event (GtkWidget *widget, (grab_op == META_GRAB_OP_CLICKING_MAXIMIZE || grab_op == META_GRAB_OP_CLICKING_UNMAXIMIZE)) || (control == META_FRAME_CONTROL_SHADE && - (grab_op == META_GRAB_OP_CLICKING_SHADE || - grab_op == META_GRAB_OP_CLICKING_UNSHADE)) || + grab_op == META_GRAB_OP_CLICKING_SHADE) || + (control == META_FRAME_CONTROL_UNSHADE && + grab_op == META_GRAB_OP_CLICKING_UNSHADE) || (control == META_FRAME_CONTROL_ABOVE && - (grab_op == META_GRAB_OP_CLICKING_ABOVE || - grab_op == META_GRAB_OP_CLICKING_UNABOVE)) || + grab_op == META_GRAB_OP_CLICKING_ABOVE) || + (control == META_FRAME_CONTROL_UNABOVE && + grab_op == META_GRAB_OP_CLICKING_UNABOVE) || (control == META_FRAME_CONTROL_STICK && - (grab_op == META_GRAB_OP_CLICKING_STICK || - grab_op == META_GRAB_OP_CLICKING_UNSTICK)))) + grab_op == META_GRAB_OP_CLICKING_STICK) || + (control == META_FRAME_CONTROL_UNSTICK && + grab_op == META_GRAB_OP_CLICKING_UNSTICK))) control = META_FRAME_CONTROL_NONE; /* Update prelit control and cursor */ @@ -2249,9 +2252,9 @@ meta_frames_paint_to_drawable (MetaFrames *frames, break; case META_FRAME_CONTROL_UNSHADE: if (grab_op == META_GRAB_OP_CLICKING_UNSHADE) - button_states[META_BUTTON_TYPE_SHADE] = META_BUTTON_STATE_PRESSED; + button_states[META_BUTTON_TYPE_UNSHADE] = META_BUTTON_STATE_PRESSED; else - button_states[META_BUTTON_TYPE_SHADE] = META_BUTTON_STATE_PRELIGHT; + button_states[META_BUTTON_TYPE_UNSHADE] = META_BUTTON_STATE_PRELIGHT; break; case META_FRAME_CONTROL_ABOVE: if (grab_op == META_GRAB_OP_CLICKING_ABOVE) @@ -2261,9 +2264,9 @@ meta_frames_paint_to_drawable (MetaFrames *frames, break; case META_FRAME_CONTROL_UNABOVE: if (grab_op == META_GRAB_OP_CLICKING_UNABOVE) - button_states[META_BUTTON_TYPE_ABOVE] = META_BUTTON_STATE_PRESSED; + button_states[META_BUTTON_TYPE_UNABOVE] = META_BUTTON_STATE_PRESSED; else - button_states[META_BUTTON_TYPE_ABOVE] = META_BUTTON_STATE_PRELIGHT; + button_states[META_BUTTON_TYPE_UNABOVE] = META_BUTTON_STATE_PRELIGHT; break; case META_FRAME_CONTROL_STICK: if (grab_op == META_GRAB_OP_CLICKING_STICK) @@ -2273,9 +2276,9 @@ meta_frames_paint_to_drawable (MetaFrames *frames, break; case META_FRAME_CONTROL_UNSTICK: if (grab_op == META_GRAB_OP_CLICKING_UNSTICK) - button_states[META_BUTTON_TYPE_STICK] = META_BUTTON_STATE_PRESSED; + button_states[META_BUTTON_TYPE_UNSTICK] = META_BUTTON_STATE_PRESSED; else - button_states[META_BUTTON_TYPE_STICK] = META_BUTTON_STATE_PRELIGHT; + button_states[META_BUTTON_TYPE_UNSTICK] = META_BUTTON_STATE_PRELIGHT; break; case META_FRAME_CONTROL_DELETE: if (grab_op == META_GRAB_OP_CLICKING_DELETE) @@ -2440,17 +2443,23 @@ control_rect (MetaFrameControl control, rect = &fgeom->max_rect; break; case META_FRAME_CONTROL_SHADE: - case META_FRAME_CONTROL_UNSHADE: rect = &fgeom->shade_rect; break; + case META_FRAME_CONTROL_UNSHADE: + rect = &fgeom->unshade_rect; + break; case META_FRAME_CONTROL_ABOVE: - case META_FRAME_CONTROL_UNABOVE: rect = &fgeom->above_rect; break; + case META_FRAME_CONTROL_UNABOVE: + rect = &fgeom->unabove_rect; + break; case META_FRAME_CONTROL_STICK: - case META_FRAME_CONTROL_UNSTICK: rect = &fgeom->stick_rect; break; + case META_FRAME_CONTROL_UNSTICK: + rect = &fgeom->unstick_rect; + break; case META_FRAME_CONTROL_RESIZE_SE: break; case META_FRAME_CONTROL_RESIZE_S: @@ -2533,31 +2542,32 @@ get_control (MetaFrames *frames, if (POINT_IN_RECT (x, y, fgeom.shade_rect)) { - if (flags & META_FRAME_SHADED) - return META_FRAME_CONTROL_UNSHADE; - else - return META_FRAME_CONTROL_SHADE; + return META_FRAME_CONTROL_SHADE; + } + + if (POINT_IN_RECT (x, y, fgeom.unshade_rect)) + { + return META_FRAME_CONTROL_UNSHADE; } if (POINT_IN_RECT (x, y, fgeom.above_rect)) { - MetaWindow *our_window = - meta_display_lookup_x_window ( - meta_display_for_x_display (gdk_display), - frame->xwindow); + return META_FRAME_CONTROL_ABOVE; + } - if (our_window->wm_state_above) - return META_FRAME_CONTROL_UNABOVE; - else - return META_FRAME_CONTROL_ABOVE; + if (POINT_IN_RECT (x, y, fgeom.unabove_rect)) + { + return META_FRAME_CONTROL_UNABOVE; } if (POINT_IN_RECT (x, y, fgeom.stick_rect)) { - if (flags & META_FRAME_STUCK) - return META_FRAME_CONTROL_UNSTICK; - else - return META_FRAME_CONTROL_STICK; + return META_FRAME_CONTROL_STICK; + } + + if (POINT_IN_RECT (x, y, fgeom.unstick_rect)) + { + return META_FRAME_CONTROL_UNSTICK; } /* South resize always has priority over north resize, diff --git a/src/prefs.c b/src/prefs.c index 91cc65e3..10056b93 100644 --- a/src/prefs.c +++ b/src/prefs.c @@ -1390,6 +1390,31 @@ button_function_from_string (const char *str) return META_BUTTON_FUNCTION_LAST; } +static MetaButtonFunction +button_opposite_function (MetaButtonFunction ofwhat) +{ + switch (ofwhat) + { + case META_BUTTON_FUNCTION_SHADE: + return META_BUTTON_FUNCTION_UNSHADE; + case META_BUTTON_FUNCTION_UNSHADE: + return META_BUTTON_FUNCTION_SHADE; + + case META_BUTTON_FUNCTION_ABOVE: + return META_BUTTON_FUNCTION_UNABOVE; + case META_BUTTON_FUNCTION_UNABOVE: + return META_BUTTON_FUNCTION_ABOVE; + + case META_BUTTON_FUNCTION_STICK: + return META_BUTTON_FUNCTION_UNSTICK; + case META_BUTTON_FUNCTION_UNSTICK: + return META_BUTTON_FUNCTION_STICK; + + default: + return META_BUTTON_FUNCTION_LAST; + } +} + static gboolean update_button_layout (const char *value) { @@ -1440,6 +1465,11 @@ update_button_layout (const char *value) new_layout.left_buttons[i] = f; used[f] = TRUE; ++i; + + f = button_opposite_function (f); + + if (f != META_BUTTON_FUNCTION_LAST) + new_layout.left_buttons[i++] = f; } else { @@ -1478,7 +1508,12 @@ update_button_layout (const char *value) new_layout.right_buttons[i] = f; used[f] = TRUE; ++i; - } + + f = button_opposite_function (f); + + if (f != META_BUTTON_FUNCTION_LAST) + new_layout.right_buttons[i++] = f; + } else { meta_topic (META_DEBUG_PREFS, "Ignoring unknown or already-used button name \"%s\"\n", diff --git a/src/theme.c b/src/theme.c index a8041a32..b0cff5ba 100644 --- a/src/theme.c +++ b/src/theme.c @@ -417,15 +417,32 @@ rect_for_function (MetaFrameGeometry *fgeom, else return NULL; case META_BUTTON_FUNCTION_SHADE: - if (flags & META_FRAME_ALLOWS_SHADE) + if ((flags & META_FRAME_ALLOWS_SHADE) && !(flags & META_FRAME_SHADED)) return &fgeom->shade_rect; else return NULL; case META_BUTTON_FUNCTION_ABOVE: - return &fgeom->above_rect; + if (!(flags & META_FRAME_ABOVE)) + return &fgeom->above_rect; + else + return NULL; case META_BUTTON_FUNCTION_STICK: - return &fgeom->stick_rect; - case META_BUTTON_FUNCTION_LAST: + if (!(flags & META_FRAME_STUCK)) + return &fgeom->stick_rect; + case META_BUTTON_FUNCTION_UNSHADE: + if ((flags & META_FRAME_ALLOWS_SHADE) && (flags & META_FRAME_SHADED)) + return &fgeom->unshade_rect; + else + return NULL; + case META_BUTTON_FUNCTION_UNABOVE: + if (flags & META_FRAME_ABOVE) + return &fgeom->unabove_rect; + else + return NULL; + case META_BUTTON_FUNCTION_UNSTICK: + if (flags & META_FRAME_STUCK) + return &fgeom->unstick_rect; + case META_BUTTON_FUNCTION_LAST: return NULL; } @@ -617,10 +634,22 @@ meta_frame_layout_calc_geometry (const MetaFrameLayout *layout, break; /* Everything fits, bail out */ /* Otherwise we need to shave out a button. Shave - * shade, min, max, close, then menu (menu is most useful); + * above, stick, 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->above_rect)) + continue; + else if (strip_button (right_func_rects, right_bg_rects, + &n_right, &fgeom->above_rect)) + continue; + else if (strip_button (left_func_rects, left_bg_rects, + &n_left, &fgeom->stick_rect)) + continue; + else if (strip_button (right_func_rects, right_bg_rects, + &n_right, &fgeom->stick_rect)) + continue; + else 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, @@ -3893,14 +3922,26 @@ button_rect (MetaButtonType type, *rect = fgeom->shade_rect; break; + case META_BUTTON_TYPE_UNSHADE: + *rect = fgeom->unshade_rect; + break; + case META_BUTTON_TYPE_ABOVE: *rect = fgeom->above_rect; break; + case META_BUTTON_TYPE_UNABOVE: + *rect = fgeom->unabove_rect; + break; + case META_BUTTON_TYPE_STICK: *rect = fgeom->stick_rect; break; + case META_BUTTON_TYPE_UNSTICK: + *rect = fgeom->unstick_rect; + break; + case META_BUTTON_TYPE_MAXIMIZE: *rect = fgeom->max_rect; break; @@ -5186,6 +5227,12 @@ meta_button_type_from_string (const char *str) return META_BUTTON_TYPE_ABOVE; else if (strcmp ("stick", str) == 0) return META_BUTTON_TYPE_STICK; + else if (strcmp ("unshade", str) == 0) + return META_BUTTON_TYPE_UNSHADE; + else if (strcmp ("unabove", str) == 0) + return META_BUTTON_TYPE_UNABOVE; + else if (strcmp ("unstick", str) == 0) + return META_BUTTON_TYPE_UNSTICK; else if (strcmp ("left_left_background", str) == 0) return META_BUTTON_TYPE_LEFT_LEFT_BACKGROUND; else if (strcmp ("left_middle_background", str) == 0) @@ -5214,12 +5261,18 @@ meta_button_type_to_string (MetaButtonType type) case META_BUTTON_TYPE_MINIMIZE: return "minimize"; case META_BUTTON_TYPE_SHADE: - return "shade"; + return "shade"; case META_BUTTON_TYPE_ABOVE: return "above"; case META_BUTTON_TYPE_STICK: return "stick"; - case META_BUTTON_TYPE_MENU: + case META_BUTTON_TYPE_UNSHADE: + return "unshade"; + case META_BUTTON_TYPE_UNABOVE: + return "unabove"; + case META_BUTTON_TYPE_UNSTICK: + return "unstick"; + case META_BUTTON_TYPE_MENU: return "menu"; case META_BUTTON_TYPE_LEFT_LEFT_BACKGROUND: return "left_left_background"; @@ -6067,6 +6120,9 @@ meta_theme_earliest_version_with_button (MetaButtonType type) case META_BUTTON_TYPE_SHADE: case META_BUTTON_TYPE_ABOVE: case META_BUTTON_TYPE_STICK: + case META_BUTTON_TYPE_UNSHADE: + case META_BUTTON_TYPE_UNABOVE: + case META_BUTTON_TYPE_UNSTICK: return 2; default: diff --git a/src/theme.h b/src/theme.h index a15169c1..d6ccf181 100644 --- a/src/theme.h +++ b/src/theme.h @@ -134,6 +134,9 @@ struct _MetaFrameGeometry GdkRectangle shade_rect; GdkRectangle above_rect; GdkRectangle stick_rect; + GdkRectangle unshade_rect; + GdkRectangle unabove_rect; + GdkRectangle unstick_rect; #define MAX_MIDDLE_BACKGROUNDS (MAX_BUTTONS_PER_CORNER - 2) GdkRectangle left_left_background; @@ -430,6 +433,9 @@ typedef enum META_BUTTON_TYPE_SHADE, META_BUTTON_TYPE_ABOVE, META_BUTTON_TYPE_STICK, + META_BUTTON_TYPE_UNSHADE, + META_BUTTON_TYPE_UNABOVE, + META_BUTTON_TYPE_UNSTICK, META_BUTTON_TYPE_LAST } MetaButtonType; |