Comment fixes.
[bpt/emacs.git] / src / widget.c
index c7f9acc..66dd9c0 100644 (file)
@@ -19,15 +19,15 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 /* Emacs 19 face widget ported by Fred Pierresteguy */
 
-#include <stdio.h>
 #include <config.h>
+#include <stdio.h>
 #include "lisp.h"
 #include "xterm.h"
 
 #include "frame.h"
 
 #include "dispextern.h"
-
+#include "blockinput.h"
 
 #include <X11/StringDefs.h>
 #include <X11/IntrinsicP.h>
@@ -36,6 +36,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 "../lwlib/lwlib.h"
 
 #define max(a, b) ((a) > (b) ? (a) : (b))
 
@@ -168,8 +169,8 @@ get_default_char_pixel_size (ew, pixel_width, pixel_height)
      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
@@ -305,12 +306,12 @@ set_frame_size (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 (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,
@@ -422,18 +423,20 @@ set_frame_size (ew)
     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;
 
-#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.)
      */
@@ -474,6 +477,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)
@@ -490,7 +496,12 @@ update_wm_hints (ew)
   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);
+#endif
 
   pixel_to_char_size (ew, ew->core.width, ew->core.height,
                      &char_width, &char_height);
@@ -522,16 +533,27 @@ static void
 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;
@@ -540,14 +562,6 @@ setup_frame_gcs (ew)
   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.
@@ -557,17 +571,20 @@ setup_frame_gcs (ew)
      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!
    */
-  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;
@@ -576,7 +593,7 @@ setup_frame_gcs (ew)
   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);
@@ -588,7 +605,7 @@ setup_frame_gcs (ew)
   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);
@@ -599,11 +616,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.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);
@@ -613,7 +630,7 @@ static void
 update_various_frame_slots (ew)
      EmacsFrame ew;
 {
-  struct x_display* x = ew->emacs_frame.frame->display.x;
+  struct x_output *x = ew->emacs_frame.frame->output_data.x;
   x->pixel_height = ew->core.height;
   x->pixel_width = ew->core.width;
   x->internal_border_width = ew->emacs_frame.internal_border_width;
@@ -624,7 +641,7 @@ static void
 update_from_various_frame_slots (ew)
      EmacsFrame ew;
 {
-  struct x_display* x = ew->emacs_frame.frame->display.x;
+  struct x_output *x = ew->emacs_frame.frame->output_data.x;
   ew->core.height = x->pixel_height;
   ew->core.width = x->pixel_width;
   ew->core.background_pixel = x->background_pixel;
@@ -685,7 +702,7 @@ EmacsFrameInitialize (request, new, dum1, dum2)
   }
 
 /* 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);
@@ -727,18 +744,20 @@ EmacsFrameDestroy (widget)
   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);
 
+  BLOCK_INPUT;
   /* 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
@@ -875,55 +894,60 @@ EmacsFrameSetCharSize (widget, columns, rows)
   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 (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);
-  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);
 
-/* 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;
-      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);
-#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);
+
+      /* 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
@@ -931,11 +955,4 @@ 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);
-
-  /* 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);
 }