Mercurial > hg > xemacs-beta
diff src/EmacsManager.c @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | ac2d302a0011 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/EmacsManager.c Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,256 @@ +/* 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 */ TRUE, + /* 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 mask = request->request_mode & (CWWidth | CWHeight); + + struc.request_mode = mask; + struc.proposed_width = request->width; + struc.proposed_height = request->height; + 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 (((mask & CWWidth) && (request->width != reply->width)) + || ((mask & 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. */ +#define COPY(field, mask) \ + if (request->request_mode & mask) w->core.field = request->field + + /* 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. */ +#ifdef LWLIB_MENUBARS_MOTIF + if (!(XtClass (w) == xmRowColumnWidgetClass)) +#endif /* LWLIB_MENUBARS_MOTIF */ + { + COPY (width, CWWidth); + COPY (height, CWHeight); + } + COPY (border_width, CWBorderWidth); + COPY (x, CWX); + COPY (y, CWY); +#undef COPY + + return XtGeometryYes; +} + +static void +ChangeManaged (Widget w) +{ + if (!XtIsRealized (w)) + { + XtWidgetGeometry req, repl; + + /* find out how big we'd like to be ... */ + + req.request_mode = 0; + XtQueryGeometry (w, &req, &repl); + EmacsManagerChangeSize (w, repl.width, repl.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) +{ + Dimension realwidth, realheight; + XtGeometryResult res; + + 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) + { + res = XtMakeResizeRequest (w, width, height, &realwidth, &realheight); + if (res == XtGeometryAlmost) + XtMakeResizeRequest (w, realwidth, realheight, NULL, NULL); + w->core.width = realwidth; + w->core.height = realheight; + } + + Resize (w); +} + +