(fix_submap_inheritance, get_keyelt, store_in_keymap,
[bpt/emacs.git] / src / widget.c
index 09fc0f3..31edf1e 100644 (file)
@@ -15,19 +15,30 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 /* Emacs 19 face widget ported by Fred Pierresteguy */
 
 
 /* Emacs 19 face widget ported by Fred Pierresteguy */
 
-#include <stdio.h>
+/* This file has been censored by the Communications Decency Act.
+   That law was passed under the guise of a ban on pornography, but
+   it bans far more than that.  This file did not contain pornography,
+   but it was censored nonetheless.
+
+   For information on US government censorship of the Internet, and
+   what you can do to bring back freedom of the press, see the web
+   site http://www.vtw.org/
+   */
+
 #include <config.h>
 #include <config.h>
+#include <stdio.h>
 #include "lisp.h"
 #include "xterm.h"
 
 #include "frame.h"
 
 #include "dispextern.h"
 #include "lisp.h"
 #include "xterm.h"
 
 #include "frame.h"
 
 #include "dispextern.h"
-
+#include "blockinput.h"
 
 #include <X11/StringDefs.h>
 #include <X11/IntrinsicP.h>
 
 #include <X11/StringDefs.h>
 #include <X11/IntrinsicP.h>
@@ -36,6 +47,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <X11/ObjectP.h>
 #include <X11/Shell.h>
 #include <X11/ShellP.h>
 #include <X11/ObjectP.h>
 #include <X11/Shell.h>
 #include <X11/ShellP.h>
+#include "../lwlib/lwlib.h"
 
 #define max(a, b) ((a) > (b) ? (a) : (b))
 
 
 #define max(a, b) ((a) > (b) ? (a) : (b))
 
@@ -168,8 +180,8 @@ get_default_char_pixel_size (ew, pixel_width, pixel_height)
      int* pixel_height;
 {
   struct frame* f = ew->emacs_frame.frame;
      int* pixel_height;
 {
   struct frame* f = ew->emacs_frame.frame;
-  *pixel_width = FONT_WIDTH (f->display.x->font);
-  *pixel_height = FONT_HEIGHT (f->display.x->font);
+  *pixel_width = FONT_WIDTH (f->output_data.x->font);
+  *pixel_height = f->output_data.x->line_height;
 }
 
 static void
 }
 
 static void
@@ -181,8 +193,8 @@ pixel_to_char_size (ew, pixel_width, pixel_height, char_width, char_height)
      int* char_height;
 {
   struct frame* f = ew->emacs_frame.frame;
      int* char_height;
 {
   struct frame* f = ew->emacs_frame.frame;
-  *char_width = PIXEL_TO_CHAR_WIDTH (f, pixel_width);
-  *char_height = PIXEL_TO_CHAR_HEIGHT (f, pixel_height);
+  *char_width = PIXEL_TO_CHAR_WIDTH (f, (int) pixel_width);
+  *char_height = PIXEL_TO_CHAR_HEIGHT (f, (int) pixel_height);
 }
 
 static void
 }
 
 static void
@@ -305,12 +317,12 @@ set_frame_size (ew)
   int flags = 0;
   
   Widget wmshell = get_wm_shell ((Widget) ew);
   int flags = 0;
   
   Widget wmshell = get_wm_shell ((Widget) ew);
-  Widget app_shell = XtParent ((Widget) wmshell);
+  /* Each Emacs shell is now independent and top-level.  */
+  Widget app_shell = wmshell;
   
   if (! XtIsSubclass (wmshell, shellWidgetClass)) abort ();
   
   if (! XtIsSubclass (wmshell, shellWidgetClass)) abort ();
-  if (! XtIsSubclass (app_shell, shellWidgetClass)) abort ();
 
 
-  /* We don't need this for the momment. The geometry is computed in 
+  /* We don't need this for the moment. The geometry is computed in 
      xfns.c.  */
 #if 0
   /* If the EmacsFrame doesn't have a geometry but the shell does,
      xfns.c.  */
 #if 0
   /* If the EmacsFrame doesn't have a geometry but the shell does,
@@ -422,34 +434,20 @@ set_frame_size (ew)
     char shell_position [32];
 
     /* Take into account the size of the scrollbar */
     char shell_position [32];
 
     /* Take into account the size of the scrollbar */
-    frame->display.x->vertical_scroll_bar_extra
-      = (FRAME_HAS_VERTICAL_SCROLL_BARS (frame)
-        ? VERTICAL_SCROLL_BAR_PIXEL_WIDTH (frame)
-        : 0);
-
+    frame->output_data.x->vertical_scroll_bar_extra
+      = (!FRAME_HAS_VERTICAL_SCROLL_BARS (frame)
+        ? 0
+        : FRAME_SCROLL_BAR_PIXEL_WIDTH (frame) > 0
+        ? FRAME_SCROLL_BAR_PIXEL_WIDTH (frame)
+        : (FRAME_SCROLL_BAR_COLS (frame)
+           * FONT_WIDTH (frame->output_data.x->font)));
 
     change_frame_size (frame, h, w, 1, 0);
     char_to_pixel_size (ew, w, h, &pixel_width, &pixel_height);
     ew->core.width = pixel_width;
     ew->core.height = pixel_height;
 
 
     change_frame_size (frame, h, w, 1, 0);
     char_to_pixel_size (ew, w, h, &pixel_width, &pixel_height);
     ew->core.width = pixel_width;
     ew->core.height = pixel_height;
 
-    /* Compute the geometry of the toplevel shell because on some platforms
-       when the geometry is not set, the widget children are resized.  */
-    {
-      int len;
-      char *tem;
-      Arg al[2];
-      int ac = 0;
-
-      sprintf (shell_position, "=%dx%d", pixel_width, pixel_height);
-      len = strlen (shell_position) + 1;
-      tem = (char *) xmalloc (len);
-      strncpy (tem, shell_position, len);
-      XtSetArg (al[ac], XtNgeometry, tem); ac++;
-      XtSetValues (wmshell, al, ac);
-    }
-
-#if 0 /* We don't need this also.  */
+#if 0 /* xfns.c takes care of this now.  */
     /* If a position was specified, assign it to the shell widget.
        (Else WM won't do anything with it.)
      */
     /* If a position was specified, assign it to the shell widget.
        (Else WM won't do anything with it.)
      */
@@ -490,6 +488,9 @@ set_frame_size (ew)
   }
 }
 
   }
 }
 
+/* Nonzero tells update_wm_hints not to do anything
+   (the caller should call update_wm_hints explicitly later.)  */
+int update_hints_inhibit;
 
 static void
 update_wm_hints (ew)
 
 static void
 update_wm_hints (ew)
@@ -506,7 +507,12 @@ update_wm_hints (ew)
   int base_height;
   int min_rows = 0, min_cols = 0;
 
   int base_height;
   int min_rows = 0, min_cols = 0;
 
+  if (update_hints_inhibit)
+    return;
+
+#if 0
   check_frame_size (ew->emacs_frame.frame, &min_rows, &min_cols);
   check_frame_size (ew->emacs_frame.frame, &min_rows, &min_cols);
+#endif
 
   pixel_to_char_size (ew, ew->core.width, ew->core.height,
                      &char_width, &char_height);
 
   pixel_to_char_size (ew, ew->core.width, ew->core.height,
                      &char_width, &char_height);
@@ -538,16 +544,27 @@ static void
 create_frame_gcs (ew)
      EmacsFrame ew;
 {
 create_frame_gcs (ew)
      EmacsFrame ew;
 {
-  struct frame* s = ew->emacs_frame.frame;
-
-  s->display.x->normal_gc =
-    XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)), 0, 0);
-  s->display.x->reverse_gc =
-    XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)), 0, 0);
-  s->display.x->cursor_gc =
-    XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)), 0, 0);
+  struct frame *s = ew->emacs_frame.frame;
+
+  s->output_data.x->normal_gc
+    = XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)),
+                (unsigned long)0, (XGCValues *)0);
+  s->output_data.x->reverse_gc
+    = XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)),
+                (unsigned long)0, (XGCValues *)0);
+  s->output_data.x->cursor_gc
+    = XCreateGC (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)),
+                (unsigned long)0, (XGCValues *)0);
 }
 
 }
 
+static char setup_frame_cursor_bits[] =
+{
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
 static void
 setup_frame_gcs (ew)
      EmacsFrame ew;
 static void
 setup_frame_gcs (ew)
      EmacsFrame ew;
@@ -556,14 +573,6 @@ setup_frame_gcs (ew)
   struct frame* s = ew->emacs_frame.frame;
   Pixmap blank_stipple, blank_tile;
 
   struct frame* s = ew->emacs_frame.frame;
   Pixmap blank_stipple, blank_tile;
 
-  static char cursor_bits[] =
-    {
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-    };
-
   /* We have to initialize all of our GCs to have a stipple/tile, otherwise
      XGetGCValues returns uninitialized data when we query the stipple
      (instead of None or something sensible) and it makes things hard.
   /* We have to initialize all of our GCs to have a stipple/tile, otherwise
      XGetGCValues returns uninitialized data when we query the stipple
      (instead of None or something sensible) and it makes things hard.
@@ -573,17 +582,20 @@ setup_frame_gcs (ew)
      effectively cache all of the GC settings we need to use.
    */
 
      effectively cache all of the GC settings we need to use.
    */
 
-  blank_stipple = 
-    XCreateBitmapFromData (XtDisplay (ew), RootWindowOfScreen (XtScreen (ew)),
-                          cursor_bits, 2, 2);
+  blank_stipple
+    = XCreateBitmapFromData (XtDisplay (ew),
+                            RootWindowOfScreen (XtScreen (ew)),
+                            setup_frame_cursor_bits, 2, 2);
 
   /* use fg = 0, bg = 1 below, but it's irrelevant since this pixmap should
      never actually get used as a background tile!
    */
 
   /* use fg = 0, bg = 1 below, but it's irrelevant since this pixmap should
      never actually get used as a background tile!
    */
-  blank_tile =
-    XCreatePixmapFromBitmapData (XtDisplay(ew),
-                                RootWindowOfScreen (XtScreen (ew)),
-                                cursor_bits, 2, 2, 0, 1, ew->core.depth);
+  blank_tile
+    = XCreatePixmapFromBitmapData (XtDisplay(ew),
+                                  RootWindowOfScreen (XtScreen (ew)),
+                                  setup_frame_cursor_bits, 2, 2,
+                                  (unsigned long)0, (unsigned long)1,
+                                  ew->core.depth);
 
   /* Normal video */
   gc_values.font = ew->emacs_frame.font->fid;
 
   /* Normal video */
   gc_values.font = ew->emacs_frame.font->fid;
@@ -592,7 +604,7 @@ setup_frame_gcs (ew)
   gc_values.graphics_exposures = False;
   gc_values.stipple = blank_stipple;
   gc_values.tile = blank_tile;
   gc_values.graphics_exposures = False;
   gc_values.stipple = blank_stipple;
   gc_values.tile = blank_tile;
-  XChangeGC (XtDisplay (ew), s->display.x->normal_gc,
+  XChangeGC (XtDisplay (ew), s->output_data.x->normal_gc,
             (GCFont | GCForeground | GCBackground | GCGraphicsExposures
              | GCStipple | GCTile),
             &gc_values);
             (GCFont | GCForeground | GCBackground | GCGraphicsExposures
              | GCStipple | GCTile),
             &gc_values);
@@ -604,7 +616,7 @@ setup_frame_gcs (ew)
   gc_values.graphics_exposures = False;
   gc_values.stipple = blank_stipple;
   gc_values.tile = blank_tile;
   gc_values.graphics_exposures = False;
   gc_values.stipple = blank_stipple;
   gc_values.tile = blank_tile;
-  XChangeGC (XtDisplay (ew), s->display.x->reverse_gc,
+  XChangeGC (XtDisplay (ew), s->output_data.x->reverse_gc,
             (GCFont | GCForeground | GCBackground | GCGraphicsExposures
              | GCStipple | GCTile),
             &gc_values);
             (GCFont | GCForeground | GCBackground | GCGraphicsExposures
              | GCStipple | GCTile),
             &gc_values);
@@ -615,11 +627,11 @@ setup_frame_gcs (ew)
   gc_values.background = ew->emacs_frame.cursor_color;
   gc_values.graphics_exposures = False;
   gc_values.tile = blank_tile;
   gc_values.background = ew->emacs_frame.cursor_color;
   gc_values.graphics_exposures = False;
   gc_values.tile = blank_tile;
-  gc_values.stipple =
-    XCreateBitmapFromData (XtDisplay (ew),
-                          RootWindowOfScreen (XtScreen (ew)),
-                          cursor_bits, 16, 16);
-  XChangeGC (XtDisplay (ew), s->display.x->cursor_gc,
+  gc_values.stipple
+    XCreateBitmapFromData (XtDisplay (ew),
+                            RootWindowOfScreen (XtScreen (ew)),
+                            setup_frame_cursor_bits, 16, 16);
+  XChangeGC (XtDisplay (ew), s->output_data.x->cursor_gc,
             (GCFont | GCForeground | GCBackground | GCGraphicsExposures
              | GCStipple | GCTile),
             &gc_values);
             (GCFont | GCForeground | GCBackground | GCGraphicsExposures
              | GCStipple | GCTile),
             &gc_values);
@@ -629,8 +641,8 @@ static void
 update_various_frame_slots (ew)
      EmacsFrame ew;
 {
 update_various_frame_slots (ew)
      EmacsFrame ew;
 {
-  struct x_display* x = ew->emacs_frame.frame->display.x;
-  x->pixel_height = ew->core.height;
+  struct x_output *x = ew->emacs_frame.frame->output_data.x;
+  x->pixel_height = ew->core.height + x->menubar_height;
   x->pixel_width = ew->core.width;
   x->internal_border_width = ew->emacs_frame.internal_border_width;
 
   x->pixel_width = ew->core.width;
   x->internal_border_width = ew->emacs_frame.internal_border_width;
 
@@ -640,8 +652,8 @@ static void
 update_from_various_frame_slots (ew)
      EmacsFrame ew;
 {
 update_from_various_frame_slots (ew)
      EmacsFrame ew;
 {
-  struct x_display* x = ew->emacs_frame.frame->display.x;
-  ew->core.height = x->pixel_height;
+  struct x_output *x = ew->emacs_frame.frame->output_data.x;
+  ew->core.height = x->pixel_height - x->menubar_height;
   ew->core.width = x->pixel_width;
   ew->core.background_pixel = x->background_pixel;
   ew->emacs_frame.internal_border_width = x->internal_border_width;
   ew->core.width = x->pixel_width;
   ew->core.background_pixel = x->background_pixel;
   ew->emacs_frame.internal_border_width = x->internal_border_width;
@@ -701,7 +713,7 @@ EmacsFrameInitialize (request, new, dum1, dum2)
   }
 
 /* Update the font field in frame */
   }
 
 /* Update the font field in frame */
-  ew->emacs_frame.frame->display.x->font = ew->emacs_frame.font;
+  ew->emacs_frame.frame->output_data.x->font = ew->emacs_frame.font;
 #endif
 
   update_from_various_frame_slots (ew);
 #endif
 
   update_from_various_frame_slots (ew);
@@ -720,13 +732,8 @@ EmacsFrameRealize (widget, mask, attrs)
 {
   EmacsFrame ew = (EmacsFrame)widget;
 
 {
   EmacsFrame ew = (EmacsFrame)widget;
 
-  attrs->event_mask = (KeyPressMask | ExposureMask | ButtonPressMask |
-                      ButtonReleaseMask | StructureNotifyMask |
-                      FocusChangeMask | PointerMotionHintMask |
-                      PointerMotionMask | LeaveWindowMask | EnterWindowMask |
-                      VisibilityChangeMask | PropertyChangeMask |
-                      StructureNotifyMask | SubstructureNotifyMask |
-                      SubstructureRedirectMask);
+  attrs->event_mask = (STANDARD_EVENT_SET | PropertyChangeMask
+                      | SubstructureNotifyMask | SubstructureRedirectMask);
   *mask |= CWEventMask;
   XtCreateWindow (widget, InputOutput, (Visual *)CopyFromParent, *mask,
                  attrs);
   *mask |= CWEventMask;
   XtCreateWindow (widget, InputOutput, (Visual *)CopyFromParent, *mask,
                  attrs);
@@ -743,18 +750,20 @@ EmacsFrameDestroy (widget)
   struct frame* s = ew->emacs_frame.frame;
 
   if (! s) abort ();
   struct frame* s = ew->emacs_frame.frame;
 
   if (! s) abort ();
-  if (! s->display.x) abort ();
-  if (! s->display.x->normal_gc) abort ();
+  if (! s->output_data.x) abort ();
+  if (! s->output_data.x->normal_gc) abort ();
 
   /* this would be called from Fdelete_frame() but it needs to free some
      stuff after the widget has been finalized but before the widget has
      been freed. */
   free_frame_faces (s);
 
 
   /* this would be called from Fdelete_frame() but it needs to free some
      stuff after the widget has been finalized but before the widget has
      been freed. */
   free_frame_faces (s);
 
+  BLOCK_INPUT;
   /* need to be careful that the face-freeing code doesn't free these too */
   /* need to be careful that the face-freeing code doesn't free these too */
-  XFreeGC (XtDisplay (widget), s->display.x->normal_gc);
-  XFreeGC (XtDisplay (widget), s->display.x->reverse_gc);
-  XFreeGC (XtDisplay (widget), s->display.x->cursor_gc);
+  XFreeGC (XtDisplay (widget), s->output_data.x->normal_gc);
+  XFreeGC (XtDisplay (widget), s->output_data.x->reverse_gc);
+  XFreeGC (XtDisplay (widget), s->output_data.x->cursor_gc);
+  UNBLOCK_INPUT;
 }
 
 void
 }
 
 void
@@ -767,9 +776,11 @@ EmacsFrameResize (widget)
   int rows;
 
   pixel_to_char_size (ew, ew->core.width, ew->core.height, &columns, &rows);
   int rows;
 
   pixel_to_char_size (ew, ew->core.width, ew->core.height, &columns, &rows);
-  change_frame_size (f, rows, columns, 1, 0);
+  change_frame_size (f, rows, columns, 0, 1);
   update_wm_hints (ew); 
   update_various_frame_slots (ew);
   update_wm_hints (ew); 
   update_various_frame_slots (ew);
+
+  cancel_mouse_face (f);
 }
 
 static Boolean
 }
 
 static Boolean
@@ -835,9 +846,9 @@ EmacsFrameSetValues (cur_widget, req_widget, new_widget, dum1, dum2)
   /* #### This doesn't work, I haven't been able to find ANY kludge that
      will let (x-create-frame '((iconic . t))) work.  It seems that changes
      to wm_shell's iconic slot have no effect after it has been realized,
   /* #### This doesn't work, I haven't been able to find ANY kludge that
      will let (x-create-frame '((iconic . t))) work.  It seems that changes
      to wm_shell's iconic slot have no effect after it has been realized,
-     and calling XIconifyWindow doesn't work either (even thought the window
+     and calling XIconifyWindow doesn't work either (even though the window
      has been created.)  Perhaps there is some property we could smash
      has been created.)  Perhaps there is some property we could smash
-     directly, but I'm sick of this for now.  Xt is a steaming pile of shit!
+     directly, but I'm sick of this for now.
    */
   if (cur->emacs_frame.iconic != new->emacs_frame.iconic)
     {
    */
   if (cur->emacs_frame.iconic != new->emacs_frame.iconic)
     {
@@ -891,55 +902,62 @@ EmacsFrameSetCharSize (widget, columns, rows)
   Dimension pixel_width, pixel_height, granted_width, granted_height;
   XtGeometryResult result;
   struct frame *f = ew->emacs_frame.frame;
   Dimension pixel_width, pixel_height, granted_width, granted_height;
   XtGeometryResult result;
   struct frame *f = ew->emacs_frame.frame;
-
+  Arg al[2];
+  int ac = 0;
+  
   if (columns < 3) columns = 3;  /* no way buddy */
   if (columns < 3) columns = 3;  /* no way buddy */
-  if (rows < 3) rows = 3;
-
-  f->display.x->left_pos = f->display.x->widget->core.x;
-  f->display.x->top_pos = f->display.x->widget->core.y;
 
   check_frame_size (f, &rows, &columns);
 
   check_frame_size (f, &rows, &columns);
-  f->display.x->vertical_scroll_bar_extra
-    = (FRAME_HAS_VERTICAL_SCROLL_BARS (f)
-       ? VERTICAL_SCROLL_BAR_PIXEL_WIDTH (f)
-       : 0);
+  f->output_data.x->vertical_scroll_bar_extra
+    = (!FRAME_HAS_VERTICAL_SCROLL_BARS (f)
+       ? 0
+       : FRAME_SCROLL_BAR_PIXEL_WIDTH (f) > 0
+       ? FRAME_SCROLL_BAR_PIXEL_WIDTH (f)
+       : (FRAME_SCROLL_BAR_COLS (f) * FONT_WIDTH (f->output_data.x->font)));
+
   char_to_pixel_size (ew, columns, rows, &pixel_width, &pixel_height);
 
   char_to_pixel_size (ew, columns, rows, &pixel_width, &pixel_height);
 
-/* Dont call XtMakeResize Request. This appears to not work for all
-   the cases.
-   Use XtVaSetValues instead.  */
-#if 0
-result = XtMakeResizeRequest ((Widget)ew,
-                               pixel_width, pixel_height,
-                               &granted_width, &granted_height);
-  if (result == XtGeometryAlmost)
-    XtMakeResizeRequest ((Widget) ew, granted_width, granted_height,
-                        NULL, NULL);
-#endif
-  /* Recompute the entire geometry management.  */
+  /* Manually change the height and width of all our widgets,
+     adjusting each widget by the same increments.  */
   if (ew->core.width != pixel_width || ew->core.height != pixel_height)
     {
       int hdelta = pixel_height - ew->core.height;
   if (ew->core.width != pixel_width || ew->core.height != pixel_height)
     {
       int hdelta = pixel_height - ew->core.height;
-      int column_widget_height = f->display.x->column_widget->core.height;
-      Arg al[2];
-      int ac = 0;
-
-      XawPanedSetRefigureMode (f->display.x->column_widget, False);
-
+      int wdelta = pixel_width - ew->core.width;
+      int column_widget_height = f->output_data.x->column_widget->core.height;
+      int column_widget_width = f->output_data.x->column_widget->core.width;
+      int outer_widget_height = f->output_data.x->widget->core.height;
+      int outer_widget_width = f->output_data.x->widget->core.width;
+      int old_left = f->output_data.x->widget->core.x;
+      int old_top = f->output_data.x->widget->core.y;
+
+      lw_refigure_widget (f->output_data.x->column_widget, False);
+      update_hints_inhibit = 1;
+
+      ac = 0;
       XtSetArg (al[ac], XtNheight, pixel_height); ac++;
       XtSetArg (al[ac], XtNwidth, pixel_width); ac++;
       XtSetValues ((Widget) ew, al, ac);
       XtSetArg (al[ac], XtNheight, pixel_height); ac++;
       XtSetArg (al[ac], XtNwidth, pixel_width); ac++;
       XtSetValues ((Widget) ew, al, ac);
-#if 0
-      XtVaSetValues ((Widget) ew, 
-                         XtNheight, pixel_height,
-                         XtNwidth, pixel_width,
-                         0);
-#endif
-      XtVaSetValues (f->display.x->column_widget,
-                         XtNwidth, pixel_width,
-                         XtNheight, column_widget_height + hdelta, 
-                         0);
-      XawPanedSetRefigureMode (f->display.x->column_widget, True);
+      ac = 0;
+      XtSetArg (al[ac], XtNheight, column_widget_height + hdelta); ac++;
+      XtSetArg (al[ac], XtNwidth, column_widget_width + wdelta); ac++;
+      XtSetValues (f->output_data.x->column_widget, al, ac);
+
+      ac = 0;
+      XtSetArg (al[ac], XtNheight, outer_widget_height + hdelta); ac++;
+      XtSetArg (al[ac], XtNwidth, outer_widget_width + wdelta); ac++;
+      XtSetValues (f->output_data.x->widget, al, ac);
+
+      lw_refigure_widget (f->output_data.x->column_widget, True);
+
+      update_hints_inhibit = 0;
+      update_wm_hints (ew);
+
+      do_pending_window_change ();
+
+      /* These seem to get clobbered.  I don't know why. - rms.  */
+      f->output_data.x->widget->core.x = old_left;
+      f->output_data.x->widget->core.y = old_top;
     }
 
   /* We've set {FRAME,PIXEL}_{WIDTH,HEIGHT} to the values we hope to
     }
 
   /* We've set {FRAME,PIXEL}_{WIDTH,HEIGHT} to the values we hope to
@@ -947,11 +965,14 @@ result = XtMakeResizeRequest ((Widget)ew,
      for, then the event won't cause the screen to become garbaged, so
      we have to make sure to do it here.  */
   SET_FRAME_GARBAGED (f);
      for, then the event won't cause the screen to become garbaged, so
      we have to make sure to do it here.  */
   SET_FRAME_GARBAGED (f);
+}
+\f
+widget_store_internal_border (widget)
+     Widget widget;
+{
+  EmacsFrame ew = (EmacsFrame) widget;
+  FRAME_PTR f = ew->emacs_frame.frame;
 
 
-  /* Coordinates of the toplevel widget seem to have been lost.
-     So set it to the rignt values.  */
-  XtVaSetValues (f->display.x->widget, 
-               XtNx, f->display.x->left_pos,
-               XtNy, f->display.x->top_pos,
-               0);
+  ew->emacs_frame.internal_border_width
+    = f->output_data.x->internal_border_width;
 }
 }