]> code.delx.au - gnu-emacs/blobdiff - src/widget.c
Fix comments.
[gnu-emacs] / src / widget.c
index c96405e020526cd20380270af8f38cb8cb88c613..ab4c4f869b523a6c5d22c0210fe3fffbfb490400 100644 (file)
@@ -1,5 +1,5 @@
 /* The emacs frame widget.
 /* The emacs frame widget.
-   Copyright (C) 1992, 1993 Free Software Foundation, Inc.
+   Copyright (C) 1992, 1993, 2000 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
 
 This file is part of GNU Emacs.
 
@@ -20,12 +20,24 @@ Boston, MA 02111-1307, USA.  */
 
 /* Emacs 19 face widget ported by Fred Pierresteguy */
 
 
 /* Emacs 19 face widget ported by Fred Pierresteguy */
 
+/* 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 <stdio.h>
 #include "lisp.h"
 #include "xterm.h"
 
 #include <config.h>
 #include <stdio.h>
 #include "lisp.h"
 #include "xterm.h"
 
+#include "keyboard.h"
 #include "frame.h"
 #include "frame.h"
+#include "window.h"
 
 #include "dispextern.h"
 #include "blockinput.h"
 
 #include "dispextern.h"
 #include "blockinput.h"
@@ -39,7 +51,8 @@ Boston, MA 02111-1307, USA.  */
 #include <X11/ShellP.h>
 #include "../lwlib/lwlib.h"
 
 #include <X11/ShellP.h>
 #include "../lwlib/lwlib.h"
 
-#define max(a, b) ((a) > (b) ? (a) : (b))
+#include <signal.h>
+#include "syssignal.h"
 
 /* This sucks: this is the first default that x-faces.el tries.  This won't
    be used unless neither the "Emacs.EmacsFrame" resource nor the
 
 /* This sucks: this is the first default that x-faces.el tries.  This won't
    be used unless neither the "Emacs.EmacsFrame" resource nor the
@@ -183,8 +196,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
@@ -227,6 +240,8 @@ get_wm_shell (w)
   return wmshell;
 }
 
   return wmshell;
 }
 
+#if 0 /* Currently not used.  */
+
 static void
 mark_shell_size_user_specified (wmshell)
      Widget wmshell;
 static void
 mark_shell_size_user_specified (wmshell)
      Widget wmshell;
@@ -237,6 +252,8 @@ mark_shell_size_user_specified (wmshell)
   ((WMShellWidget) wmshell)->wm.size_hints.flags |= USSize;
 }
 
   ((WMShellWidget) wmshell)->wm.size_hints.flags |= USSize;
 }
 
+#endif
+
 
 /* Can't have static frame locals because of some broken compilers.
    Normally, initializing a variable like this doesn't work in emacs,
 
 /* Can't have static frame locals because of some broken compilers.
    Normally, initializing a variable like this doesn't work in emacs,
@@ -244,7 +261,9 @@ mark_shell_size_user_specified (wmshell)
    thus have its data not go into text space) because Xt needs to
    write to initialized data objects too.
  */
    thus have its data not go into text space) because Xt needs to
    write to initialized data objects too.
  */
+#if 0
 static Boolean first_frame_p = True;
 static Boolean first_frame_p = True;
+#endif
 
 static void
 set_frame_size (ew)
 
 static void
 set_frame_size (ew)
@@ -285,30 +304,12 @@ set_frame_size (ew)
 
    */
 
 
    */
 
-  /* Geometry of the AppShell */
-  int app_flags = 0;
-  int app_x = 0;
-  int app_y = 0;
-  unsigned int app_w = 0;
-  unsigned int app_h = 0;
-  
-  /* Geometry of the EmacsFrame */
-  int frame_flags = 0;
-  int frame_x = 0;
-  int frame_y = 0;
-  unsigned int frame_w = 0;
-  unsigned int frame_h = 0;
-  
   /* Hairily merged geometry */
   /* Hairily merged geometry */
-  int x = 0;
-  int y = 0;
   unsigned int w = ew->emacs_frame.frame->width;
   unsigned int h = ew->emacs_frame.frame->height;
   unsigned int w = ew->emacs_frame.frame->width;
   unsigned int h = ew->emacs_frame.frame->height;
-  int flags = 0;
   
   Widget wmshell = get_wm_shell ((Widget) ew);
   /* Each Emacs shell is now independent and top-level.  */
   
   Widget wmshell = get_wm_shell ((Widget) ew);
   /* Each Emacs shell is now independent and top-level.  */
-  Widget app_shell = wmshell;
   
   if (! XtIsSubclass (wmshell, shellWidgetClass)) abort ();
 
   
   if (! XtIsSubclass (wmshell, shellWidgetClass)) abort ();
 
@@ -319,17 +320,17 @@ set_frame_size (ew)
      treat that as the geometry of the frame.  (Is this bogus?
      I'm not sure.) */
   if (ew->emacs_frame.geometry == 0)
      treat that as the geometry of the frame.  (Is this bogus?
      I'm not sure.) */
   if (ew->emacs_frame.geometry == 0)
-    XtVaGetValues (wmshell, XtNgeometry, &ew->emacs_frame.geometry, 0);
+    XtVaGetValues (wmshell, XtNgeometry, &ew->emacs_frame.geometry, NULL);
 
   /* If the Shell is iconic, then the EmacsFrame is iconic.  (Is
      this bogus? I'm not sure.) */
   if (!ew->emacs_frame.iconic)
 
   /* If the Shell is iconic, then the EmacsFrame is iconic.  (Is
      this bogus? I'm not sure.) */
   if (!ew->emacs_frame.iconic)
-    XtVaGetValues (wmshell, XtNiconic, &ew->emacs_frame.iconic, 0);
+    XtVaGetValues (wmshell, XtNiconic, &ew->emacs_frame.iconic, NULL);
   
   
   {
     char *geom = 0;
   
   
   {
     char *geom = 0;
-    XtVaGetValues (app_shell, XtNgeometry, &geom, 0);
+    XtVaGetValues (app_shell, XtNgeometry, &geom, NULL);
     if (geom)
       app_flags = XParseGeometry (geom, &app_x, &app_y, &app_w, &app_h);
   }
     if (geom)
       app_flags = XParseGeometry (geom, &app_x, &app_y, &app_w, &app_h);
   }
@@ -379,7 +380,7 @@ set_frame_size (ew)
 
       /* If the AppShell is iconic, then the EmacsFrame is iconic. */
       if (!ew->emacs_frame.iconic)
 
       /* If the AppShell is iconic, then the EmacsFrame is iconic. */
       if (!ew->emacs_frame.iconic)
-       XtVaGetValues (app_shell, XtNiconic, &ew->emacs_frame.iconic, 0);
+       XtVaGetValues (app_shell, XtNiconic, &ew->emacs_frame.iconic, NULL);
 
       first_frame_p = False;
     }
 
       first_frame_p = False;
     }
@@ -421,18 +422,21 @@ set_frame_size (ew)
   {
     struct frame* frame = ew->emacs_frame.frame;
     Dimension pixel_width, pixel_height;
   {
     struct frame* frame = ew->emacs_frame.frame;
     Dimension pixel_width, pixel_height;
-    char shell_position [32];
 
 
-    /* Take into account the size of the scrollbar */
+    /* Take into account the size of the scrollbar.  Always use the
+       number of columns occupied by the scroll bar here otherwise we
+       might end up with a frame width that is not a multiple of the
+       frame's character width which is bad for vertically split
+       windows.  */
     frame->output_data.x->vertical_scroll_bar_extra
       = (!FRAME_HAS_VERTICAL_SCROLL_BARS (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)));
 
         : (FRAME_SCROLL_BAR_COLS (frame)
            * FONT_WIDTH (frame->output_data.x->font)));
 
-    change_frame_size (frame, h, w, 1, 0);
+    x_compute_fringe_widths (frame, 0);
+
+    change_frame_size (frame, h, w, 1, 0, 0);
     char_to_pixel_size (ew, w, h, &pixel_width, &pixel_height);
     ew->core.width = pixel_width;
     ew->core.height = pixel_height;
     char_to_pixel_size (ew, w, h, &pixel_width, &pixel_height);
     ew->core.width = pixel_width;
     ew->core.height = pixel_height;
@@ -453,7 +457,7 @@ set_frame_size (ew)
        len = strlen (shell_position) + 1;
        tem = (char *) xmalloc (len);
        strncpy (tem, shell_position, len);
        len = strlen (shell_position) + 1;
        tem = (char *) xmalloc (len);
        strncpy (tem, shell_position, len);
-       XtVaSetValues (wmshell, XtNgeometry, tem, 0);
+       XtVaSetValues (wmshell, XtNgeometry, tem, NULL);
       }
     else if (flags & (WidthValue | HeightValue))
       {
       }
     else if (flags & (WidthValue | HeightValue))
       {
@@ -463,7 +467,7 @@ set_frame_size (ew)
        len = strlen (shell_position) + 1;
        tem = (char *) xmalloc (len);
        strncpy (tem, shell_position, len);
        len = strlen (shell_position) + 1;
        tem = (char *) xmalloc (len);
        strncpy (tem, shell_position, len);
-       XtVaSetValues (wmshell, XtNgeometry, tem, 0);
+       XtVaSetValues (wmshell, XtNgeometry, tem, NULL);
       }
 
     /* If the geometry spec we're using has W/H components, mark the size
       }
 
     /* If the geometry spec we're using has W/H components, mark the size
@@ -473,7 +477,7 @@ set_frame_size (ew)
 
     /* Also assign the iconic status of the frame to the Shell, so that
        the WM sees it. */
 
     /* Also assign the iconic status of the frame to the Shell, so that
        the WM sees it. */
-    XtVaSetValues (wmshell, XtNiconic, ew->emacs_frame.iconic, 0);
+    XtVaSetValues (wmshell, XtNiconic, ew->emacs_frame.iconic, NULL);
 #endif /* 0 */
   }
 }
 #endif /* 0 */
   }
 }
@@ -521,15 +525,17 @@ update_wm_hints (ew)
 /*  ((WMShellWidget) wmshell)->wm.size_hints.flags |= USSize;*/
 
   XtVaSetValues (wmshell,
 /*  ((WMShellWidget) wmshell)->wm.size_hints.flags |= USSize;*/
 
   XtVaSetValues (wmshell,
-                XtNbaseWidth, base_width,
-                XtNbaseHeight, base_height,
-                XtNwidthInc, cw, 
-                XtNheightInc, ch,
-                XtNminWidth, base_width + min_cols * cw,
-                XtNminHeight, base_height + min_rows * ch,
-                0);
+                XtNbaseWidth, (XtArgVal) base_width,
+                XtNbaseHeight, (XtArgVal) base_height,
+                XtNwidthInc, (XtArgVal) cw, 
+                XtNheightInc, (XtArgVal) ch,
+                XtNminWidth, (XtArgVal) (base_width + min_cols * cw),
+                XtNminHeight, (XtArgVal) (base_height + min_rows * ch),
+                NULL);
 }
 
 }
 
+#if 0
+
 static void
 create_frame_gcs (ew)
      EmacsFrame ew;
 static void
 create_frame_gcs (ew)
      EmacsFrame ew;
@@ -545,8 +551,12 @@ create_frame_gcs (ew)
   s->output_data.x->cursor_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);
+  s->output_data.x->black_relief.gc = 0;
+  s->output_data.x->white_relief.gc = 0;
 }
 
 }
 
+#endif /* 0 */
+
 static char setup_frame_cursor_bits[] =
 {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 static char setup_frame_cursor_bits[] =
 {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -632,7 +642,7 @@ update_various_frame_slots (ew)
      EmacsFrame ew;
 {
   struct x_output *x = ew->emacs_frame.frame->output_data.x;
      EmacsFrame ew;
 {
   struct x_output *x = ew->emacs_frame.frame->output_data.x;
-  x->pixel_height = ew->core.height;
+  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;
 
@@ -643,7 +653,7 @@ update_from_various_frame_slots (ew)
      EmacsFrame ew;
 {
   struct x_output *x = ew->emacs_frame.frame->output_data.x;
      EmacsFrame ew;
 {
   struct x_output *x = ew->emacs_frame.frame->output_data.x;
-  ew->core.height = x->pixel_height;
+  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;
@@ -722,13 +732,12 @@ 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);
+  /* This used to contain SubstructureRedirectMask, but this turns out
+     to be a problem with XIM on Solaris, and events from that mask
+     don't seem to be used.  Let's check that.  */
+  attrs->event_mask = (STANDARD_EVENT_SET
+                      | PropertyChangeMask
+                      | SubstructureNotifyMask);
   *mask |= CWEventMask;
   XtCreateWindow (widget, InputOutput, (Visual *)CopyFromParent, *mask,
                  attrs);
   *mask |= CWEventMask;
   XtCreateWindow (widget, InputOutput, (Visual *)CopyFromParent, *mask,
                  attrs);
@@ -748,16 +757,12 @@ EmacsFrameDestroy (widget)
   if (! s->output_data.x) abort ();
   if (! s->output_data.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);
-
   BLOCK_INPUT;
   BLOCK_INPUT;
-  /* need to be careful that the face-freeing code doesn't free these too */
-  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);
+  x_free_gcs (s);
+  if (s->output_data.x->white_relief.gc)
+    XFreeGC (XtDisplay (widget), s->output_data.x->white_relief.gc);
+  if (s->output_data.x->black_relief.gc)
+    XFreeGC (XtDisplay (widget), s->output_data.x->black_relief.gc);
   UNBLOCK_INPUT;
 }
 
   UNBLOCK_INPUT;
 }
 
@@ -771,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, 0);
   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
@@ -827,7 +834,7 @@ EmacsFrameSetValues (cur_widget, req_widget, new_widget, dum1, dum2)
       new->core.height = pixel_height;
 
       change_frame_size (new->emacs_frame.frame, char_height, char_width,
       new->core.height = pixel_height;
 
       change_frame_size (new->emacs_frame.frame, char_height, char_width,
-                         1, 0);
+                         1, 0, 0);
       needs_a_refresh = True;
     }
 
       needs_a_refresh = True;
     }
 
@@ -839,14 +846,15 @@ 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)
     {
       Widget wmshell = get_wm_shell ((Widget) cur);
    */
   if (cur->emacs_frame.iconic != new->emacs_frame.iconic)
     {
       Widget wmshell = get_wm_shell ((Widget) cur);
-      XtVaSetValues (wmshell, XtNiconic, new->emacs_frame.iconic, 0);
+      XtVaSetValues (wmshell, XtNiconic,
+                    (XtArgVal) new->emacs_frame.iconic, NULL);
     }
 
   return needs_a_refresh;
     }
 
   return needs_a_refresh;
@@ -892,11 +900,8 @@ EmacsFrameSetCharSize (widget, columns, rows)
      int rows;
 {
   EmacsFrame ew = (EmacsFrame) widget;
      int rows;
 {
   EmacsFrame ew = (EmacsFrame) widget;
-  Dimension pixel_width, pixel_height, granted_width, granted_height;
-  XtGeometryResult result;
+  Dimension pixel_width, pixel_height;
   struct frame *f = ew->emacs_frame.frame;
   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 */
 
@@ -904,15 +909,26 @@ EmacsFrameSetCharSize (widget, columns, rows)
   f->output_data.x->vertical_scroll_bar_extra
     = (!FRAME_HAS_VERTICAL_SCROLL_BARS (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)));
 
        : (FRAME_SCROLL_BAR_COLS (f) * FONT_WIDTH (f->output_data.x->font)));
 
+  x_compute_fringe_widths (f, 0);
+
   char_to_pixel_size (ew, columns, rows, &pixel_width, &pixel_height);
 
   char_to_pixel_size (ew, columns, rows, &pixel_width, &pixel_height);
 
+#if 0  /* This doesn't seem to be right.  The frame gets too wide. --gerd.  */
+  /* Something is really strange here wrt to the border width:
+     Apparently, XtNwidth and XtNheight include the border, so we have
+     to add it here.  But the XtNborderWidth set for the widgets has
+     no similarity to what f->output_data.x->border_width is set to.  */
+  XtVaGetValues (widget, XtNborderWidth, &border_width, NULL);
+  pixel_height += 2 * border_width;
+  pixel_width += 2 * border_width;
+#endif
+
   /* Manually change the height and width of all our widgets,
      adjusting each widget by the same increments.  */
   /* 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)
+  if (ew->core.width != pixel_width
+      || ew->core.height != pixel_height)
     {
       int hdelta = pixel_height - ew->core.height;
       int wdelta = pixel_width - ew->core.width;
     {
       int hdelta = pixel_height - ew->core.height;
       int wdelta = pixel_width - ew->core.width;
@@ -923,24 +939,53 @@ EmacsFrameSetCharSize (widget, columns, rows)
       int old_left = f->output_data.x->widget->core.x;
       int old_top = f->output_data.x->widget->core.y;
 
       int old_left = f->output_data.x->widget->core.x;
       int old_top = f->output_data.x->widget->core.y;
 
+      /* Input is blocked here, and Xt waits for some event to
+         occur.  */
+
       lw_refigure_widget (f->output_data.x->column_widget, False);
       update_hints_inhibit = 1;
 
       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);
-      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);
-
+      /* Xt waits for a ConfigureNotify event from the window manager
+        in EmacsFrameSetCharSize when the shell widget is resized.
+        For some window managers like fvwm2 2.2.5 and KDE 2.1 this
+        event doesn't arrive for an unknown reason and Emacs hangs in
+        Xt when the default font is changed.  Tell Xt not to wait,
+        depending on the value of the frame parameter
+        `wait-for-wm'.  */
+      XtVaSetValues (f->output_data.x->widget,
+                    XtNwaitForWm, (XtArgVal) f->output_data.x->wait_for_wm,
+                    NULL);
+
+      /* Workaround: When a SIGIO or SIGALRM occurs while Xt is
+        waiting for a ConfigureNotify event (see above), this leads
+        to Xt waiting indefinitely instead of using its default
+        timeout (5 seconds).  */
+      turn_on_atimers (0);
+#ifdef SIGIO
+      sigblock (sigmask (SIGIO));
+#endif
+      
+      /* Do parents first, otherwise LessTif's geometry management
+        enters an infinite loop (as of 2000-01-15).  This is fixed in
+        later versions of LessTif (as of 2001-03-13); I'll leave it
+        as is because I think it can't do any harm.  */
+      XtVaSetValues (f->output_data.x->widget,
+                    XtNheight, (XtArgVal) (outer_widget_height + hdelta),
+                    XtNwidth, (XtArgVal) (outer_widget_width + wdelta),
+                    NULL);
+      XtVaSetValues (f->output_data.x->column_widget,
+                    XtNheight, (XtArgVal) (column_widget_height + hdelta),
+                    XtNwidth, (XtArgVal) column_widget_width + wdelta,
+                    NULL);
+      XtVaSetValues ((Widget) ew,
+                     XtNheight, (XtArgVal) pixel_height,
+                    XtNwidth, (XtArgVal) pixel_width,
+                    NULL);
+#ifdef SIGIO
+      sigunblock (sigmask (SIGIO));
+#endif
+      turn_on_atimers (1);
+      
       lw_refigure_widget (f->output_data.x->column_widget, True);
 
       update_hints_inhibit = 0;
       lw_refigure_widget (f->output_data.x->column_widget, True);
 
       update_hints_inhibit = 0;
@@ -957,3 +1002,15 @@ EmacsFrameSetCharSize (widget, columns, rows)
      we have to make sure to do it here.  */
   SET_FRAME_GARBAGED (f);
 }
      we have to make sure to do it here.  */
   SET_FRAME_GARBAGED (f);
 }
+
+\f
+void
+widget_store_internal_border (widget)
+     Widget widget;
+{
+  EmacsFrame ew = (EmacsFrame) widget;
+  FRAME_PTR f = ew->emacs_frame.frame;
+
+  ew->emacs_frame.internal_border_width
+    = f->output_data.x->internal_border_width;
+}