# HG changeset patch # User Richard M. Stallman # Date 768431173 0 # Node ID fe56a02838bac56558ab25f2af12acc5457d8768 # Parent 65c133b66371240d3fa8af004d69c8142d2a69c5 (x_set_offset): Set gravity and size hint before moving the window. (XTread_socket): For ReparentNotify, use x_top_window_to_frame. Also recompute frame position using x_real_positions. For ConfigureNotify, don't ignore send_events. Also recompute frame position using x_real_positions. diff -r 65c133b66371 -r fe56a02838ba src/xterm.c --- a/src/xterm.c Sun May 08 21:03:21 1994 +0000 +++ b/src/xterm.c Sun May 08 21:06:13 1994 +0000 @@ -3530,9 +3530,15 @@ break; case ReparentNotify: - f = x_window_to_frame (event.xreparent.window); + f = x_top_window_to_frame (event.xreparent.window); if (f) - f->display.x->parent_desc = event.xreparent.parent; + { + int x, y; + f->display.x->parent_desc = event.xreparent.parent; + x_real_positions (f, &x, &y); + f->display.x->left_pos = x; + f->display.x->top_pos = y; + } break; case Expose: @@ -4027,7 +4033,9 @@ f = x_any_window_to_frame (event.xconfigure.window); #ifdef USE_X_TOOLKIT if (f +#if 0 && ! event.xconfigure.send_event +#endif && (event.xconfigure.window == XtWindow (f->display.x->widget))) { Window win, child; @@ -4058,6 +4066,15 @@ f->display.x->pixel_height = event.xconfigure.height; f->display.x->left_pos = event.xconfigure.x; f->display.x->top_pos = event.xconfigure.y; + + /* What we have now is the position of Emacs's own window. + Convert that to the position of the window manager window. */ + { + int x, y; + x_real_positions (f, &x, &y); + f->display.x->left_pos = x; + f->display.x->top_pos = y; + } } goto OTHER; #else /* not USE_X_TOOLKIT */ @@ -4109,6 +4126,15 @@ f->display.x->pixel_height = event.xconfigure.height; f->display.x->left_pos = event.xconfigure.x; f->display.x->top_pos = event.xconfigure.y; + + /* What we have now is the position of Emacs's own window. + Convert that to the position of the window manager window. */ + { + int x, y; + x_real_positions (f, &x, &y); + f->display.x->left_pos = x; + f->display.x->top_pos = y; + } } #endif /* not USE_X_TOOLKIT */ break; @@ -5148,6 +5174,10 @@ - 2 * f->display.x->border_width - win_y - PIXEL_HEIGHT (f) + f->display.x->top_pos); + /* The left_pos and top_pos + are now relative to the top and left screen edges, + so the flags should correspond. */ + f->display.x->size_hint_flags &= ~ (XNegative | YNegative); #else /* ! defined (HAVE_X11) */ WINDOWINFO_TYPE parentinfo; @@ -5163,21 +5193,32 @@ #endif /* ! defined (HAVE_X11) */ } +/* CHANGE_GRAVITY is 1 when calling from Fset_frame_position, + to really change the position, and 0 when calling from + x_make_frame_visible (in that case, XOFF and YOFF are the current + position values). */ + x_set_offset (f, xoff, yoff, change_gravity) struct frame *f; register int xoff, yoff; int change_gravity; { - f->display.x->top_pos = yoff; - f->display.x->left_pos = xoff; - f->display.x->size_hint_flags &= ~ (XNegative | YNegative); - if (xoff < 0) - f->display.x->size_hint_flags |= XNegative; - if (yoff < 0) - f->display.x->size_hint_flags |= YNegative; + if (change_gravity) + { + f->display.x->top_pos = yoff; + f->display.x->left_pos = xoff; + f->display.x->size_hint_flags &= ~ (XNegative | YNegative); + if (xoff < 0) + f->display.x->size_hint_flags |= XNegative; + if (yoff < 0) + f->display.x->size_hint_flags |= YNegative; + f->display.x->win_gravity = NorthWestGravity; + } x_calc_absolute_position (f); BLOCK_INPUT; + x_wm_set_size_hint (f, 0, 0); + #ifdef USE_X_TOOLKIT XMoveWindow (XDISPLAY XtWindow (f->display.x->widget), f->display.x->left_pos, f->display.x->top_pos); @@ -5185,12 +5226,6 @@ XMoveWindow (XDISPLAY FRAME_X_WINDOW (f), f->display.x->left_pos, f->display.x->top_pos); #endif /* not USE_X_TOOLKIT */ -#ifdef HAVE_X11 - if (change_gravity) - f->display.x->win_gravity = NorthWestGravity; - - x_wm_set_size_hint (f, 0, 0); -#endif /* ! defined (HAVE_X11) */ UNBLOCK_INPUT; }