Moveresize emulation for all edges. (#52833)

This commit is contained in:
Matthias Clasen 2002-12-03 21:57:13 +00:00
parent 31ef3456c8
commit 58d7ca8102
7 changed files with 161 additions and 6 deletions

View File

@ -1,5 +1,13 @@
2002-12-03 Matthias Clasen <maclas@gmx.de>
Moveresize emulation for all edges. (#52833)
* gdk/x11/gdkwindow-x11.c (update_pos): Support all edges.
(calculate_unmoving_origin): New function which calculates the
ICCCM reference point for the window depending on the gravity.
(emulate_resize_drag): use calculate_unmoving_origin().
(emulate_move_drag): use calculate_unmoving_origin().
RTL flipping for statusbars. (#96832)
* gtk/gtkstatusbar.c (get_grip_edge): New function returning the

View File

@ -1,5 +1,13 @@
2002-12-03 Matthias Clasen <maclas@gmx.de>
Moveresize emulation for all edges. (#52833)
* gdk/x11/gdkwindow-x11.c (update_pos): Support all edges.
(calculate_unmoving_origin): New function which calculates the
ICCCM reference point for the window depending on the gravity.
(emulate_resize_drag): use calculate_unmoving_origin().
(emulate_move_drag): use calculate_unmoving_origin().
RTL flipping for statusbars. (#96832)
* gtk/gtkstatusbar.c (get_grip_edge): New function returning the

View File

@ -1,5 +1,13 @@
2002-12-03 Matthias Clasen <maclas@gmx.de>
Moveresize emulation for all edges. (#52833)
* gdk/x11/gdkwindow-x11.c (update_pos): Support all edges.
(calculate_unmoving_origin): New function which calculates the
ICCCM reference point for the window depending on the gravity.
(emulate_resize_drag): use calculate_unmoving_origin().
(emulate_move_drag): use calculate_unmoving_origin().
RTL flipping for statusbars. (#96832)
* gtk/gtkstatusbar.c (get_grip_edge): New function returning the

View File

@ -1,5 +1,13 @@
2002-12-03 Matthias Clasen <maclas@gmx.de>
Moveresize emulation for all edges. (#52833)
* gdk/x11/gdkwindow-x11.c (update_pos): Support all edges.
(calculate_unmoving_origin): New function which calculates the
ICCCM reference point for the window depending on the gravity.
(emulate_resize_drag): use calculate_unmoving_origin().
(emulate_move_drag): use calculate_unmoving_origin().
RTL flipping for statusbars. (#96832)
* gtk/gtkstatusbar.c (get_grip_edge): New function returning the

View File

@ -1,5 +1,13 @@
2002-12-03 Matthias Clasen <maclas@gmx.de>
Moveresize emulation for all edges. (#52833)
* gdk/x11/gdkwindow-x11.c (update_pos): Support all edges.
(calculate_unmoving_origin): New function which calculates the
ICCCM reference point for the window depending on the gravity.
(emulate_resize_drag): use calculate_unmoving_origin().
(emulate_move_drag): use calculate_unmoving_origin().
RTL flipping for statusbars. (#96832)
* gtk/gtkstatusbar.c (get_grip_edge): New function returning the

View File

@ -1,5 +1,13 @@
2002-12-03 Matthias Clasen <maclas@gmx.de>
Moveresize emulation for all edges. (#52833)
* gdk/x11/gdkwindow-x11.c (update_pos): Support all edges.
(calculate_unmoving_origin): New function which calculates the
ICCCM reference point for the window depending on the gravity.
(emulate_resize_drag): use calculate_unmoving_origin().
(emulate_move_drag): use calculate_unmoving_origin().
RTL flipping for statusbars. (#96832)
* gtk/gtkstatusbar.c (get_grip_edge): New function returning the

View File

@ -4556,19 +4556,54 @@ update_pos (MoveResizeData *mv_resize,
if (mv_resize->is_resize)
{
gint w, h;
gint x, y, w, h;
x = mv_resize->moveresize_orig_x;
y = mv_resize->moveresize_orig_y;
w = mv_resize->moveresize_orig_width;
h = mv_resize->moveresize_orig_height;
switch (mv_resize->resize_edge)
{
case GDK_WINDOW_EDGE_NORTH_WEST:
x += dx;
y += dy;
w -= dx;
h -= dy;
break;
case GDK_WINDOW_EDGE_NORTH:
y += dy;
h -= dy;
break;
case GDK_WINDOW_EDGE_NORTH_EAST:
y += dy;
h -= dy;
w += dx;
break;
case GDK_WINDOW_EDGE_SOUTH_WEST:
h += dy;
x += dx;
w -= dx;
break;
case GDK_WINDOW_EDGE_SOUTH_EAST:
w += dx;
h += dy;
break;
case GDK_WINDOW_EDGE_SOUTH:
h += dy;
break;
case GDK_WINDOW_EDGE_EAST:
w += dx;
break;
case GDK_WINDOW_EDGE_WEST:
x += dx;
w -= dx;
break;
}
x = MAX (x, 0);
y = MAX (y, 0);
w = MAX (w, 1);
h = MAX (h, 1);
@ -4579,7 +4614,7 @@ update_pos (MoveResizeData *mv_resize,
w, h, &w, &h);
}
gdk_window_resize (mv_resize->moveresize_window, w, h);
gdk_window_move_resize (mv_resize->moveresize_window, x, y, w, h);
}
else
{
@ -4662,7 +4697,7 @@ _gdk_moveresize_handle_event (XEvent *event)
{
guint button_mask = 0;
GdkWindowObject *window_private;
GdkDisplay *display= gdk_x11_lookup_xdisplay (event->xany.display);
GdkDisplay *display = gdk_x11_lookup_xdisplay (event->xany.display);
MoveResizeData *mv_resize = get_move_resize_data (display, FALSE);
if (!mv_resize || !mv_resize->moveresize_window)
@ -4783,6 +4818,78 @@ create_moveresize_window (MoveResizeData *mv_resize,
mv_resize->moveresize_process_time = 0;
}
/*
Calculate mv_resize->moveresize_orig_x and mv_resize->moveresize_orig_y
so that calling XMoveWindow with these coordinates will not move the
window.
Note that this depends on the WM to implement ICCCM-compliant reference
point handling.
*/
static void
calculate_unmoving_origin (MoveResizeData *mv_resize)
{
GdkRectangle rect;
gint width, height;
if (mv_resize->moveresize_geom_mask & GDK_HINT_WIN_GRAVITY &&
mv_resize->moveresize_geometry.win_gravity == GDK_GRAVITY_STATIC)
{
gdk_window_get_origin (mv_resize->moveresize_window,
&mv_resize->moveresize_orig_x,
&mv_resize->moveresize_orig_y);
}
else
{
gdk_window_get_frame_extents (mv_resize->moveresize_window, &rect);
gdk_window_get_geometry (mv_resize->moveresize_window,
NULL, NULL, &width, &height, NULL);
switch (mv_resize->moveresize_geometry.win_gravity)
{
case GDK_GRAVITY_NORTH_WEST:
mv_resize->moveresize_orig_x = rect.x;
mv_resize->moveresize_orig_y = rect.y;
break;
case GDK_GRAVITY_NORTH:
mv_resize->moveresize_orig_x = rect.x + rect.width / 2 - width / 2;
mv_resize->moveresize_orig_y = rect.y;
break;
case GDK_GRAVITY_NORTH_EAST:
mv_resize->moveresize_orig_x = rect.x + rect.width - width;
mv_resize->moveresize_orig_y = rect.y;
break;
case GDK_GRAVITY_WEST:
mv_resize->moveresize_orig_x = rect.x;
mv_resize->moveresize_orig_y = rect.y + rect.height / 2 - height / 2;
break;
case GDK_GRAVITY_CENTER:
mv_resize->moveresize_orig_x = rect.x + rect.width / 2 - width / 2;
mv_resize->moveresize_orig_y = rect.y + rect.height / 2 - height / 2;
break;
case GDK_GRAVITY_EAST:
mv_resize->moveresize_orig_x = rect.x + rect.width - width;
mv_resize->moveresize_orig_y = rect.y + rect.height / 2 - height / 2;
break;
case GDK_GRAVITY_SOUTH_WEST:
mv_resize->moveresize_orig_x = rect.x;
mv_resize->moveresize_orig_y = rect.y + rect.height - height;
break;
case GDK_GRAVITY_SOUTH:
mv_resize->moveresize_orig_x = rect.x + rect.width / 2 - width / 2;
mv_resize->moveresize_orig_y = rect.y + rect.height - height;
break;
case GDK_GRAVITY_SOUTH_EAST:
mv_resize->moveresize_orig_x = rect.x + rect.width - width;
mv_resize->moveresize_orig_y = rect.y + rect.height - height;
break;
default:
mv_resize->moveresize_orig_x = rect.x;
mv_resize->moveresize_orig_y = rect.y;
break;
}
}
}
static void
emulate_resize_drag (GdkWindow *window,
GdkWindowEdge edge,
@ -4809,6 +4916,8 @@ emulate_resize_drag (GdkWindow *window,
&mv_resize->moveresize_geometry,
&mv_resize->moveresize_geom_mask);
calculate_unmoving_origin (mv_resize);
create_moveresize_window (mv_resize, timestamp);
}
@ -4828,9 +4937,7 @@ emulate_move_drag (GdkWindow *window,
mv_resize->moveresize_window = g_object_ref (window);
gdk_window_get_deskrelative_origin (mv_resize->moveresize_window,
&mv_resize->moveresize_orig_x,
&mv_resize->moveresize_orig_y);
calculate_unmoving_origin (mv_resize);
create_moveresize_window (mv_resize, timestamp);
}