summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas James Alexander Thurman <tthurman@src.gnome.org>2006-04-30 00:48:57 +0000
committerThomas James Alexander Thurman <tthurman@src.gnome.org>2006-04-30 00:48:57 +0000
commitef92520c72e0d70b36ada2f4e749381e8cb63e90 (patch)
treeb1324130585fe343da6430fa1ee9998f2d03ff40
parent2e1e23ecd0190b20c9e7c67dcd09c7ab619ae5ce (diff)
downloadmetacity-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.h6
-rw-r--r--src/frame.c3
-rw-r--r--src/frames.c78
-rw-r--r--src/prefs.c37
-rw-r--r--src/theme.c70
-rw-r--r--src/theme.h6
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;