This commit was manufactured by cvs2svn to create branch 'chise-r21-4-18'.
[chise/xemacs-chise.git-] / src / EmacsManager.c
diff --git a/src/EmacsManager.c b/src/EmacsManager.c
new file mode 100644 (file)
index 0000000..42398c7
--- /dev/null
@@ -0,0 +1,254 @@
+/* Emacs manager widget.
+   Copyright (C) 1993-1995 Sun Microsystems, Inc.
+   Copyright (C) 1995 Ben Wing.
+
+This file is part of XEmacs.
+
+XEmacs is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+XEmacs is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: Not in FSF. */
+
+/* Written by Ben Wing, May, 1994. */
+
+#include <config.h>
+
+#include <X11/StringDefs.h>
+#include "EmacsManagerP.h"
+#ifdef LWLIB_MENUBARS_MOTIF
+#include <Xm/RowColumn.h>
+#endif /* LWLIB_MENUBARS_MOTIF */
+
+/* For I, Emacs, am a kind god.  Unlike the goddess Athena and the
+   Titan Motif, I require no ritual sacrifices to placate the lesser
+   daemons of geometry management. */
+
+static XtResource resources[] = {
+#define offset(field) XtOffset(EmacsManagerWidget, emacs_manager.field)
+  { XtNresizeCallback, XtCCallback,
+    XtRCallback, sizeof (XtCallbackList),
+    offset(resize_callback), XtRImmediate, (XtPointer) 0 },
+  { XtNqueryGeometryCallback, XtCCallback,
+    XtRCallback, sizeof (XtCallbackList),
+    offset(query_geometry_callback), XtRImmediate, (XtPointer) 0 },
+  { XtNuserData, XtCUserData,
+    XtRPointer, sizeof (XtPointer),
+    offset(user_data), XtRImmediate, (XtPointer) 0 },
+};
+
+/****************************************************************
+ *
+ * Full class record constant
+ *
+ ****************************************************************/
+
+static XtGeometryResult QueryGeometry (Widget wid,
+                                      XtWidgetGeometry *request,
+                                      XtWidgetGeometry *reply);
+static void Resize (Widget w);
+static XtGeometryResult GeometryManager (Widget w, XtWidgetGeometry *request,
+                                        XtWidgetGeometry *reply);
+static void ChangeManaged (Widget w);
+static void Realize (Widget w, Mask *valueMask,
+                    XSetWindowAttributes *attributes);
+static void ClassInitialize (void);
+
+EmacsManagerClassRec emacsManagerClassRec = {
+  {
+/* core_class fields      */
+#ifdef LWLIB_USES_MOTIF
+    /* superclass         */    (WidgetClass) &xmManagerClassRec,
+#else
+    /* superclass         */    (WidgetClass) &compositeClassRec,
+#endif
+    /* class_name         */    "EmacsManager",
+    /* widget_size        */    sizeof (EmacsManagerRec),
+    /* class_initialize   */    ClassInitialize,
+    /* class_part_init    */   NULL,
+    /* class_inited       */   FALSE,
+    /* initialize         */    NULL,
+    /* initialize_hook    */   NULL,
+    /* realize            */    Realize,
+    /* actions            */    NULL,
+    /* num_actions       */    0,
+    /* resources          */    resources,
+    /* num_resources      */    XtNumber(resources),
+    /* xrm_class          */    NULLQUARK,
+    /* compress_motion   */    TRUE,
+    /* compress_exposure  */   XtExposeCompressMaximal | XtExposeNoRegion,
+    /* compress_enterleave*/   TRUE,
+    /* visible_interest   */    FALSE,
+    /* destroy            */    NULL,
+    /* resize             */    Resize,
+    /* expose             */    NULL,
+    /* set_values         */    NULL,
+    /* set_values_hook    */   NULL,
+    /* set_values_almost  */    XtInheritSetValuesAlmost,
+    /* get_values_hook    */   NULL,
+    /* accept_focus       */    NULL,
+    /* version            */   XtVersion,
+    /* callback_private   */    NULL,
+    /* tm_table           */    XtInheritTranslations,
+    /* query_geometry     */   QueryGeometry,
+    /* display_accelerator*/   XtInheritDisplayAccelerator,
+    /* extension          */   NULL
+  },
+  {
+/* composite_class fields */
+    /* geometry_manager   */    GeometryManager,
+    /* change_managed     */    ChangeManaged,
+    /* insert_child      */    XtInheritInsertChild,
+    /* delete_child      */    XtInheritDeleteChild,
+    /* extension          */   NULL
+  },
+#ifdef LWLIB_USES_MOTIF
+  {
+  /* constraint_class fields */
+      NULL,                                     /* resource list        */
+      0,                                        /* num resources        */
+      0,                                        /* constraint size      */
+      (XtInitProc)NULL,                         /* init proc            */
+      (XtWidgetProc)NULL,                       /* destroy proc         */
+      (XtSetValuesFunc)NULL,                    /* set values proc      */
+      NULL,                                     /* extension            */
+  },
+  {
+/* manager_class fields */
+    XtInheritTranslations,                     /* translations           */
+    NULL,                                      /* syn_resources          */
+    0,                                         /* num_syn_resources      */
+    NULL,                                      /* syn_cont_resources     */
+    0,                                         /* num_syn_cont_resources */
+    XmInheritParentProcess,                    /* parent_process         */
+    NULL,                                      /* extension              */
+  },
+#endif
+  {
+/* emacs_manager_class fields */
+    /* empty             */    0,
+  }
+};
+
+WidgetClass emacsManagerWidgetClass = (WidgetClass)&emacsManagerClassRec;
+
+/* What is my preferred size?  A suggested size may be given. */
+
+static XtGeometryResult
+QueryGeometry (Widget w, XtWidgetGeometry *request, XtWidgetGeometry *reply)
+{
+  EmacsManagerWidget emw = (EmacsManagerWidget) w;
+  EmacsManagerQueryGeometryStruct struc;
+  int request_mode = request->request_mode;
+
+  struc.request_mode = request_mode;
+  struc.proposed_width  = (request_mode & CWWidth)  ? request->width  : 0;
+  struc.proposed_height = (request_mode & CWHeight) ? request->height : 0;
+  XtCallCallbackList (w, emw->emacs_manager.query_geometry_callback, &struc);
+  reply->request_mode = CWWidth | CWHeight;
+  reply->width  = struc.proposed_width;
+  reply->height = struc.proposed_height;
+  if (((request_mode & CWWidth)  && (request->width  != reply->width)) ||
+      ((request_mode & CWHeight) && (request->height != reply->height)))
+    return XtGeometryAlmost;
+  return XtGeometryYes;
+}
+
+static void
+Resize (Widget w)
+{
+  EmacsManagerWidget emw = (EmacsManagerWidget) w;
+  EmacsManagerResizeStruct struc;
+
+  struc.width  = w->core.width;
+  struc.height = w->core.height;
+  XtCallCallbackList (w, emw->emacs_manager.resize_callback, &struc);
+}
+
+static XtGeometryResult
+GeometryManager (Widget w, XtWidgetGeometry *request, XtWidgetGeometry *reply)
+{
+  /* Sure, any changes are fine. */
+
+#ifdef LWLIB_MENUBARS_MOTIF
+  /* The Motif menubar will merrily request a new size every time a
+     child is added or deleted.  Blow it off because it doesn't know
+     what it's talking about. */
+  if (XtClass (w) != xmRowColumnWidgetClass)
+#endif /* LWLIB_MENUBARS_MOTIF */
+    {
+      if (request->request_mode & CWWidth)  w->core.width  = request->width;
+      if (request->request_mode & CWHeight) w->core.height = request->height;
+    }
+  if (request->request_mode & CWBorderWidth)
+    w->core.border_width = request->border_width;
+  if (request->request_mode & CWX) w->core.x = request->x;
+  if (request->request_mode & CWY) w->core.y = request->y;
+
+  return XtGeometryYes;
+}
+
+static void
+ChangeManaged (Widget w)
+{
+  if (!XtIsRealized (w))
+    {
+      XtWidgetGeometry request, reply;
+
+      /* find out how big we'd like to be ... */
+
+      request.request_mode = 0;
+      XtQueryGeometry (w, &request, &reply);
+      EmacsManagerChangeSize (w, reply.width, reply.height);
+    }
+}
+
+static void
+Realize (Widget w, Mask *valueMask, XSetWindowAttributes *attributes)
+{
+  attributes->bit_gravity = NorthWestGravity;
+  *valueMask |= CWBitGravity;
+
+  XtCreateWindow (w, (unsigned) InputOutput, (Visual *) CopyFromParent,
+                 *valueMask, attributes);
+}
+
+static void
+ClassInitialize (void)
+{
+  return;
+}
+
+void
+EmacsManagerChangeSize (Widget w, Dimension width, Dimension height)
+{
+  if (width == 0)
+    width = w->core.width;
+  if (height == 0)
+    height = w->core.height;
+
+  /* do nothing if we're already that size */
+  if (w->core.width != width || w->core.height != height)
+    {
+      XtGeometryResult result =
+       XtMakeResizeRequest (w, width, height, &w->core.width, &w->core.height);
+      if (result == XtGeometryNo)
+       return;
+      if (result == XtGeometryAlmost)
+       XtMakeResizeRequest (w, w->core.width, w->core.height, NULL, NULL);
+      Resize (w);
+    }
+}
+
+