]> code.delx.au - gnu-emacs/blobdiff - src/widget.c
Fix comments.
[gnu-emacs] / src / widget.c
index 47f78786741112141e4a6f64ca834015107025c8..ab4c4f869b523a6c5d22c0210fe3fffbfb490400 100644 (file)
@@ -1,5 +1,5 @@
 /* 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.
 
@@ -35,6 +35,7 @@ Boston, MA 02111-1307, USA.  */
 #include "lisp.h"
 #include "xterm.h"
 
+#include "keyboard.h"
 #include "frame.h"
 #include "window.h"
 
@@ -50,7 +51,8 @@ Boston, MA 02111-1307, USA.  */
 #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
@@ -318,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)
-    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)
-    XtVaGetValues (wmshell, XtNiconic, &ew->emacs_frame.iconic, 0);
+    XtVaGetValues (wmshell, XtNiconic, &ew->emacs_frame.iconic, NULL);
   
   
   {
     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);
   }
@@ -378,7 +380,7 @@ set_frame_size (ew)
 
       /* 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;
     }
@@ -432,8 +434,7 @@ set_frame_size (ew)
         : (FRAME_SCROLL_BAR_COLS (frame)
            * FONT_WIDTH (frame->output_data.x->font)));
 
-    frame->output_data.x->flags_areas_extra
-      = FRAME_FLAGS_AREA_WIDTH (frame);
+    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);
@@ -456,7 +457,7 @@ set_frame_size (ew)
        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))
       {
@@ -466,7 +467,7 @@ set_frame_size (ew)
        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
@@ -476,7 +477,7 @@ set_frame_size (ew)
 
     /* 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 */
   }
 }
@@ -524,13 +525,13 @@ update_wm_hints (ew)
 /*  ((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
@@ -757,10 +758,7 @@ EmacsFrameDestroy (widget)
   if (! s->output_data.x->normal_gc) abort ();
 
   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)
@@ -855,7 +853,8 @@ EmacsFrameSetValues (cur_widget, req_widget, new_widget, dum1, dum2)
   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;
@@ -903,8 +902,6 @@ EmacsFrameSetCharSize (widget, columns, rows)
   EmacsFrame ew = (EmacsFrame) widget;
   Dimension pixel_width, pixel_height;
   struct frame *f = ew->emacs_frame.frame;
-  Arg al[10];
-  int ac = 0;
   
   if (columns < 3) columns = 3;  /* no way buddy */
 
@@ -914,8 +911,7 @@ EmacsFrameSetCharSize (widget, columns, rows)
        ? 0
        : (FRAME_SCROLL_BAR_COLS (f) * FONT_WIDTH (f->output_data.x->font)));
 
-  f->output_data.x->flags_areas_extra
-    = FRAME_FLAGS_AREA_WIDTH (f);
+  x_compute_fringe_widths (f, 0);
 
   char_to_pixel_size (ew, columns, rows, &pixel_width, &pixel_height);
 
@@ -943,21 +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;
 
+      /* 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;
 
-      /* Do parents first, otherwise LessTif's geometry
-        management enters an infinite loop (as of 2000-01-15).  */
+      /* 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, outer_widget_height + hdelta,
-                    XtNwidth, outer_widget_width + wdelta, NULL);
+                    XtNheight, (XtArgVal) (outer_widget_height + hdelta),
+                    XtNwidth, (XtArgVal) (outer_widget_width + wdelta),
+                    NULL);
       XtVaSetValues (f->output_data.x->column_widget,
-                    XtNheight, column_widget_height + hdelta,
-                    XtNwidth, column_widget_width + wdelta, NULL);
+                    XtNheight, (XtArgVal) (column_widget_height + hdelta),
+                    XtNwidth, (XtArgVal) column_widget_width + wdelta,
+                    NULL);
       XtVaSetValues ((Widget) ew,
-                     XtNheight, pixel_height,
-                    XtNwidth, pixel_width, NULL);
+                     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;