Patch from Erwann Chenede for raise_or_lower keybinding
2002-05-28 Havoc Pennington <hp@pobox.com> Patch from Erwann Chenede for raise_or_lower keybinding * src/display.c, src/common.h: POINT_IN_RECT moved to a common location, removed from here (meta_rectangle_intersect): move here and make it public * src/prefs.c: add raise_or_lower keybinding * src/stack.c (meta_stack_get_below, meta_stack_get_above): add an arg to only get windows within the same layer * src/keybindings.c (handle_raise_or_lower): add handling for a "raise window if obscured, else lower" keybinding
This commit is contained in:
parent
4b5eda0b0a
commit
0498d55314
12 changed files with 161 additions and 57 deletions
16
ChangeLog
16
ChangeLog
|
@ -1,3 +1,19 @@
|
||||||
|
2002-05-28 Havoc Pennington <hp@pobox.com>
|
||||||
|
|
||||||
|
Patch from Erwann Chenede for raise_or_lower keybinding
|
||||||
|
|
||||||
|
* src/display.c, src/common.h: POINT_IN_RECT moved to a common
|
||||||
|
location, removed from here
|
||||||
|
(meta_rectangle_intersect): move here and make it public
|
||||||
|
|
||||||
|
* src/prefs.c: add raise_or_lower keybinding
|
||||||
|
|
||||||
|
* src/stack.c (meta_stack_get_below, meta_stack_get_above): add an
|
||||||
|
arg to only get windows within the same layer
|
||||||
|
|
||||||
|
* src/keybindings.c (handle_raise_or_lower): add handling for a
|
||||||
|
"raise window if obscured, else lower" keybinding
|
||||||
|
|
||||||
2002-05-28 Havoc Pennington <hp@pobox.com>
|
2002-05-28 Havoc Pennington <hp@pobox.com>
|
||||||
|
|
||||||
* src/window.c (meta_window_configure_request): handle CWStackMode
|
* src/window.c (meta_window_configure_request): handle CWStackMode
|
||||||
|
|
|
@ -151,6 +151,12 @@ typedef enum
|
||||||
#define META_PRIORITY_PREFS_NOTIFY (G_PRIORITY_DEFAULT_IDLE + 10)
|
#define META_PRIORITY_PREFS_NOTIFY (G_PRIORITY_DEFAULT_IDLE + 10)
|
||||||
#define META_PRIORITY_WORK_AREA_HINT (G_PRIORITY_DEFAULT_IDLE + 15)
|
#define META_PRIORITY_WORK_AREA_HINT (G_PRIORITY_DEFAULT_IDLE + 15)
|
||||||
|
|
||||||
|
#define POINT_IN_RECT(xcoord, ycoord, rect) \
|
||||||
|
((xcoord) >= (rect).x && \
|
||||||
|
(xcoord) < ((rect).x + (rect).width) && \
|
||||||
|
(ycoord) >= (rect).y && \
|
||||||
|
(ycoord) < ((rect).y + (rect).height))
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -810,12 +810,6 @@ reset_ignores (MetaDisplay *display)
|
||||||
display->ungrab_should_not_cause_focus_window = None;
|
display->ungrab_should_not_cause_focus_window = None;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define POINT_IN_RECT(xcoord, ycoord, rect) \
|
|
||||||
((xcoord) >= (rect).x && \
|
|
||||||
(xcoord) < ((rect).x + (rect).width) && \
|
|
||||||
(ycoord) >= (rect).y && \
|
|
||||||
(ycoord) < ((rect).y + (rect).height))
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
window_raise_with_delay_callback (void *data)
|
window_raise_with_delay_callback (void *data)
|
||||||
{
|
{
|
||||||
|
@ -2926,3 +2920,40 @@ meta_resize_gravity_from_grab_op (MetaGrabOp op)
|
||||||
return gravity;
|
return gravity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_rectangle_intersect (MetaRectangle *src1,
|
||||||
|
MetaRectangle *src2,
|
||||||
|
MetaRectangle *dest)
|
||||||
|
{
|
||||||
|
int dest_x, dest_y;
|
||||||
|
int dest_w, dest_h;
|
||||||
|
int return_val;
|
||||||
|
|
||||||
|
g_return_val_if_fail (src1 != NULL, FALSE);
|
||||||
|
g_return_val_if_fail (src2 != NULL, FALSE);
|
||||||
|
g_return_val_if_fail (dest != NULL, FALSE);
|
||||||
|
|
||||||
|
return_val = FALSE;
|
||||||
|
|
||||||
|
dest_x = MAX (src1->x, src2->x);
|
||||||
|
dest_y = MAX (src1->y, src2->y);
|
||||||
|
dest_w = MIN (src1->x + src1->width, src2->x + src2->width) - dest_x;
|
||||||
|
dest_h = MIN (src1->y + src1->height, src2->y + src2->height) - dest_y;
|
||||||
|
|
||||||
|
if (dest_w > 0 && dest_h > 0)
|
||||||
|
{
|
||||||
|
dest->x = dest_x;
|
||||||
|
dest->y = dest_y;
|
||||||
|
dest->width = dest_w;
|
||||||
|
dest->height = dest_h;
|
||||||
|
return_val = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dest->width = 0;
|
||||||
|
dest->height = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return return_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -318,4 +318,8 @@ MetaWindow* meta_display_get_tab_next (MetaDisplay *display,
|
||||||
|
|
||||||
int meta_resize_gravity_from_grab_op (MetaGrabOp op);
|
int meta_resize_gravity_from_grab_op (MetaGrabOp op);
|
||||||
|
|
||||||
|
gboolean meta_rectangle_intersect (MetaRectangle *src1,
|
||||||
|
MetaRectangle *src2,
|
||||||
|
MetaRectangle *dest);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1596,12 +1596,6 @@ control_rect (MetaFrameControl control,
|
||||||
return rect;
|
return rect;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define POINT_IN_RECT(xcoord, ycoord, rect) \
|
|
||||||
((xcoord) >= (rect).x && \
|
|
||||||
(xcoord) < ((rect).x + (rect).width) && \
|
|
||||||
(ycoord) >= (rect).y && \
|
|
||||||
(ycoord) < ((rect).y + (rect).height))
|
|
||||||
|
|
||||||
#define RESIZE_EXTENDS 15
|
#define RESIZE_EXTENDS 15
|
||||||
static MetaFrameControl
|
static MetaFrameControl
|
||||||
get_control (MetaFrames *frames,
|
get_control (MetaFrames *frames,
|
||||||
|
|
|
@ -94,7 +94,10 @@ static void handle_move_to_workspace (MetaDisplay *display,
|
||||||
MetaWindow *window,
|
MetaWindow *window,
|
||||||
XEvent *event,
|
XEvent *event,
|
||||||
MetaKeyBinding *binding);
|
MetaKeyBinding *binding);
|
||||||
|
static void handle_raise_or_lower (MetaDisplay *display,
|
||||||
|
MetaWindow *window,
|
||||||
|
XEvent *event,
|
||||||
|
MetaKeyBinding *binding);
|
||||||
|
|
||||||
/* debug */
|
/* debug */
|
||||||
static void handle_spew_mark (MetaDisplay *display,
|
static void handle_spew_mark (MetaDisplay *display,
|
||||||
|
@ -217,6 +220,7 @@ static const MetaKeyHandler window_handlers[] = {
|
||||||
GINT_TO_POINTER (META_MOTION_UP) },
|
GINT_TO_POINTER (META_MOTION_UP) },
|
||||||
{ META_KEYBINDING_MOVE_WORKSPACE_DOWN, handle_move_to_workspace,
|
{ META_KEYBINDING_MOVE_WORKSPACE_DOWN, handle_move_to_workspace,
|
||||||
GINT_TO_POINTER (META_MOTION_DOWN) },
|
GINT_TO_POINTER (META_MOTION_DOWN) },
|
||||||
|
{ META_KEYBINDING_RAISE_OR_LOWER, handle_raise_or_lower, NULL},
|
||||||
{ NULL, NULL, NULL }
|
{ NULL, NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1696,6 +1700,57 @@ handle_move_to_workspace (MetaDisplay *display,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_raise_or_lower (MetaDisplay *display,
|
||||||
|
MetaWindow *window,
|
||||||
|
XEvent *event,
|
||||||
|
MetaKeyBinding *binding)
|
||||||
|
{
|
||||||
|
/* Get window at pointer */
|
||||||
|
|
||||||
|
MetaScreen *screen;
|
||||||
|
|
||||||
|
screen = meta_display_screen_for_root (display, event->xbutton.root);
|
||||||
|
if (screen == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (window)
|
||||||
|
{
|
||||||
|
MetaWindow *above = NULL;
|
||||||
|
|
||||||
|
/* Check if top */
|
||||||
|
if (meta_stack_get_top (window->screen->stack) == window)
|
||||||
|
{
|
||||||
|
meta_window_lower (window);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* else check if windows in same layer are intersecting it */
|
||||||
|
|
||||||
|
above = meta_stack_get_above (window->screen->stack, window, TRUE);
|
||||||
|
|
||||||
|
while (above)
|
||||||
|
{
|
||||||
|
MetaRectangle tmp, win_rect, above_rect;
|
||||||
|
|
||||||
|
meta_window_get_outer_rect (window, &win_rect);
|
||||||
|
meta_window_get_outer_rect (above, &above_rect);
|
||||||
|
|
||||||
|
/* Check if obscured */
|
||||||
|
if (meta_rectangle_intersect (&win_rect, &above_rect, &tmp))
|
||||||
|
{
|
||||||
|
meta_window_raise (window);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
above = meta_stack_get_above (window->screen->stack, above, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* window is not obscured */
|
||||||
|
meta_window_lower (window);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handle_spew_mark (MetaDisplay *display,
|
handle_spew_mark (MetaDisplay *display,
|
||||||
MetaWindow *window,
|
MetaWindow *window,
|
||||||
|
@ -1720,5 +1775,3 @@ meta_set_keybindings_disabled (gboolean setting)
|
||||||
"Ignoring keybindings disable message, not in debug mode\n");
|
"Ignoring keybindings disable message, not in debug mode\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -690,6 +690,33 @@ you set
|
||||||
</locale>
|
</locale>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
|
|
||||||
|
<schema>
|
||||||
|
<key>/schemas/apps/metacity/window_keybindings/raise_or_lower</key>
|
||||||
|
<applyto>/apps/metacity/window_keybindings/raise_or_lower</applyto>
|
||||||
|
<owner>metacity</owner>
|
||||||
|
<type>string</type>
|
||||||
|
<!-- no default for this one -->
|
||||||
|
<locale name="C">
|
||||||
|
<short>Raise window if obscured, lowers it otherwise</short>
|
||||||
|
<long>
|
||||||
|
This keybinding changes whether a window is above or below
|
||||||
|
other windows. If the window is covered by another window, it raises
|
||||||
|
the window above other windows. If the window is already fully visible,
|
||||||
|
it lowers the window below other windows.
|
||||||
|
|
||||||
|
The format looks like "<Control>a" or
|
||||||
|
"<Shift><Alt>F1.
|
||||||
|
|
||||||
|
The parser is fairly liberal and allows lower or upper case,
|
||||||
|
and also abbreviations such as "<Ctl>" and
|
||||||
|
"<Ctrl>". If you set the option to the special string
|
||||||
|
"disabled", then there will be no keybinding for this
|
||||||
|
action.
|
||||||
|
</long>
|
||||||
|
</locale>
|
||||||
|
</schema>
|
||||||
|
|
||||||
<!-- Global Keybindings -->
|
<!-- Global Keybindings -->
|
||||||
|
|
||||||
|
|
||||||
|
@ -1179,7 +1206,6 @@ you set
|
||||||
</locale>
|
</locale>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
|
|
||||||
<!-- Not used and/or crackrock -->
|
<!-- Not used and/or crackrock -->
|
||||||
|
|
||||||
<schema>
|
<schema>
|
||||||
|
|
|
@ -850,6 +850,7 @@ static MetaKeyPref window_bindings[] = {
|
||||||
{ META_KEYBINDING_MOVE_WORKSPACE_RIGHT, 0, 0 },
|
{ META_KEYBINDING_MOVE_WORKSPACE_RIGHT, 0, 0 },
|
||||||
{ META_KEYBINDING_MOVE_WORKSPACE_UP, 0, 0 },
|
{ META_KEYBINDING_MOVE_WORKSPACE_UP, 0, 0 },
|
||||||
{ META_KEYBINDING_MOVE_WORKSPACE_DOWN, 0, 0 },
|
{ META_KEYBINDING_MOVE_WORKSPACE_DOWN, 0, 0 },
|
||||||
|
{ META_KEYBINDING_RAISE_OR_LOWER, 0, 0 },
|
||||||
{ NULL, 0, 0 }
|
{ NULL, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -111,6 +111,7 @@ void meta_prefs_set_num_workspaces (int n_workspaces);
|
||||||
#define META_KEYBINDING_MOVE_WORKSPACE_RIGHT "move_to_workspace_right"
|
#define META_KEYBINDING_MOVE_WORKSPACE_RIGHT "move_to_workspace_right"
|
||||||
#define META_KEYBINDING_MOVE_WORKSPACE_UP "move_to_workspace_up"
|
#define META_KEYBINDING_MOVE_WORKSPACE_UP "move_to_workspace_up"
|
||||||
#define META_KEYBINDING_MOVE_WORKSPACE_DOWN "move_to_workspace_down"
|
#define META_KEYBINDING_MOVE_WORKSPACE_DOWN "move_to_workspace_down"
|
||||||
|
#define META_KEYBINDING_RAISE_OR_LOWER "raise_or_lower"
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
|
37
src/screen.c
37
src/screen.c
|
@ -800,43 +800,6 @@ meta_screen_focus_top_window (MetaScreen *screen,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
meta_rectangle_intersect (MetaRectangle *src1,
|
|
||||||
MetaRectangle *src2,
|
|
||||||
MetaRectangle *dest)
|
|
||||||
{
|
|
||||||
int dest_x, dest_y;
|
|
||||||
int dest_w, dest_h;
|
|
||||||
int return_val;
|
|
||||||
|
|
||||||
g_return_val_if_fail (src1 != NULL, FALSE);
|
|
||||||
g_return_val_if_fail (src2 != NULL, FALSE);
|
|
||||||
g_return_val_if_fail (dest != NULL, FALSE);
|
|
||||||
|
|
||||||
return_val = FALSE;
|
|
||||||
|
|
||||||
dest_x = MAX (src1->x, src2->x);
|
|
||||||
dest_y = MAX (src1->y, src2->y);
|
|
||||||
dest_w = MIN (src1->x + src1->width, src2->x + src2->width) - dest_x;
|
|
||||||
dest_h = MIN (src1->y + src1->height, src2->y + src2->height) - dest_y;
|
|
||||||
|
|
||||||
if (dest_w > 0 && dest_h > 0)
|
|
||||||
{
|
|
||||||
dest->x = dest_x;
|
|
||||||
dest->y = dest_y;
|
|
||||||
dest->width = dest_w;
|
|
||||||
dest->height = dest_h;
|
|
||||||
return_val = TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dest->width = 0;
|
|
||||||
dest->height = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return return_val;
|
|
||||||
}
|
|
||||||
|
|
||||||
const MetaXineramaScreenInfo*
|
const MetaXineramaScreenInfo*
|
||||||
meta_screen_get_xinerama_for_window (MetaScreen *screen,
|
meta_screen_get_xinerama_for_window (MetaScreen *screen,
|
||||||
MetaWindow *window)
|
MetaWindow *window)
|
||||||
|
|
10
src/stack.c
10
src/stack.c
|
@ -938,7 +938,8 @@ meta_stack_get_bottom (MetaStack *stack)
|
||||||
|
|
||||||
MetaWindow*
|
MetaWindow*
|
||||||
meta_stack_get_above (MetaStack *stack,
|
meta_stack_get_above (MetaStack *stack,
|
||||||
MetaWindow *window)
|
MetaWindow *window,
|
||||||
|
gboolean only_within_layer)
|
||||||
{
|
{
|
||||||
GList *link;
|
GList *link;
|
||||||
|
|
||||||
|
@ -951,13 +952,16 @@ meta_stack_get_above (MetaStack *stack,
|
||||||
|
|
||||||
if (link->prev)
|
if (link->prev)
|
||||||
return link->prev->data;
|
return link->prev->data;
|
||||||
|
else if (only_within_layer)
|
||||||
|
return NULL;
|
||||||
else
|
else
|
||||||
return find_next_above_layer (stack, window->layer);
|
return find_next_above_layer (stack, window->layer);
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaWindow*
|
MetaWindow*
|
||||||
meta_stack_get_below (MetaStack *stack,
|
meta_stack_get_below (MetaStack *stack,
|
||||||
MetaWindow *window)
|
MetaWindow *window,
|
||||||
|
gboolean only_within_layer)
|
||||||
{
|
{
|
||||||
GList *link;
|
GList *link;
|
||||||
|
|
||||||
|
@ -970,6 +974,8 @@ meta_stack_get_below (MetaStack *stack,
|
||||||
|
|
||||||
if (link->next)
|
if (link->next)
|
||||||
return link->next->data;
|
return link->next->data;
|
||||||
|
else if (only_within_layer)
|
||||||
|
return NULL;
|
||||||
else
|
else
|
||||||
return find_prev_below_layer (stack, window->layer);
|
return find_prev_below_layer (stack, window->layer);
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,13 +93,16 @@ void meta_stack_thaw (MetaStack *stack);
|
||||||
MetaWindow* meta_stack_get_top (MetaStack *stack);
|
MetaWindow* meta_stack_get_top (MetaStack *stack);
|
||||||
MetaWindow* meta_stack_get_bottom (MetaStack *stack);
|
MetaWindow* meta_stack_get_bottom (MetaStack *stack);
|
||||||
MetaWindow* meta_stack_get_above (MetaStack *stack,
|
MetaWindow* meta_stack_get_above (MetaStack *stack,
|
||||||
MetaWindow *window);
|
MetaWindow *window,
|
||||||
|
gboolean only_within_layer);
|
||||||
MetaWindow* meta_stack_get_below (MetaStack *stack,
|
MetaWindow* meta_stack_get_below (MetaStack *stack,
|
||||||
MetaWindow *window);
|
MetaWindow *window,
|
||||||
|
gboolean only_within_layer);
|
||||||
MetaWindow* meta_stack_get_default_focus_window (MetaStack *stack,
|
MetaWindow* meta_stack_get_default_focus_window (MetaStack *stack,
|
||||||
MetaWorkspace *workspace,
|
MetaWorkspace *workspace,
|
||||||
MetaWindow *not_this_one);
|
MetaWindow *not_this_one);
|
||||||
|
|
||||||
|
|
||||||
/* -1 if a < b, etc. */
|
/* -1 if a < b, etc. */
|
||||||
int meta_stack_windows_cmp (MetaStack *stack,
|
int meta_stack_windows_cmp (MetaStack *stack,
|
||||||
MetaWindow *window_a,
|
MetaWindow *window_a,
|
||||||
|
|
Loading…
Reference in a new issue