Mercurial > emacs
view lwlib/lwlib-Xolmb.c @ 19860:c17fd465ea95 libc-970911 libc-970912 libc-970913 libc-970914 libc-970915 libc-970916 libc-970917 libc-970918 libc-970919 libc-970920 libc-970921 libc-970922 libc-970923 libc-970924 libc-970925 libc-970926 libc-970927 libc-970928 libc-970929 libc-970930 libc-971001 libc-971018 libc-971019 libc-971020 libc-971021 libc-971022 libc-971023 libc-971024 libc-971025 libc-971026 libc-971027 libc-971028 libc-971029 libc-971030 libc-971031 libc-971101 libc-971102 libc-971103 libc-971104 libc-971105 libc-971106 libc-971107 libc-971108 libc-971109 libc-971110 libc-971111 libc-971112 libc-971113 libc-971114 libc-971115 libc-971116 libc-971117 libc-971118 libc-971120 libc-971121 libc-971122 libc-971123 libc-971124 libc-971125 libc-971126 libc-971127 libc-971128 libc-971129 libc-971130 libc-971201 libc-971203 libc-971204 libc-971205 libc-971206 libc-971207 libc-971208 libc-971209 libc-971210 libc-971211 libc-971212 libc-971213 libc-971214 libc-971217 libc-971218 libc-971219 libc-971220 libc-971221 libc-971222 libc-971223 libc-971224 libc-971225 libc-971226 libc-971227 libc-971228 libc-971229 libc-971230 libc-971231 libc-980103 libc-980104 libc-980105 libc-980106 libc-980107 libc-980108 libc-980109 libc-980110 libc-980111 libc-980112 libc-980114 libc-980115 libc-980116 libc-980117 libc-980118 libc-980119 libc-980120 libc-980121 libc-980122 libc-980123 libc-980124 libc-980125 libc-980126 libc-980127 libc-980128
typos.
author | Jeff Law <law@redhat.com> |
---|---|
date | Wed, 10 Sep 1997 21:16:20 +0000 |
parents | ee40177f6c68 |
children | 7fb1caba0f51 |
line wrap: on
line source
/* An OLIT menubar widget, by Chuck Thompson <cthomp@cs.uiuc.edu> Copyright (C) 1993 Lucid, Inc. This file is part of the Lucid Widget Library. The Lucid Widget Library 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 1, or (at your option) any later version. The Lucid Widget Library 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 GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <X11/IntrinsicP.h> #include <X11/Intrinsic.h> #include <X11/CompositeP.h> #include <X11/Composite.h> #include "lwlib-Xol-mbP.h" #include "lwlib-Xol-mb.h" #define HORIZ_SPACING 4 #define VERT_SPACING 4 static void Initialize(); static void Resize(); static void ChangeManaged(); static Boolean SetValues(); static XtGeometryResult GeometryManager(); static XtGeometryResult PreferredSize(); static void do_layout(); static XtGeometryResult try_layout(); lwMenuBarClassRec lwMenubarClassRec = { { /* core_class members */ (WidgetClass) &compositeClassRec, /* superclass */ "Menubar", /* class_name */ sizeof(lwMenuBarRec), /* widget_size */ NULL, /* class_initialize */ NULL, /* class_part_initialize */ FALSE, /* class_inited */ Initialize, /* initialize */ NULL, /* initialize_hook */ XtInheritRealize, /* realize */ NULL, /* actions */ 0, /* num_actions */ NULL, /* resources */ 0, /* num_resources */ NULLQUARK, /* xrm_class */ TRUE, /* compress_motion */ XtExposeCompressMaximal, /* compress_exposure */ TRUE, /* compress_enterleave */ FALSE, /* visible_interest */ NULL, /* destroy */ Resize, /* resize */ NULL, /* expose */ NULL, /* set_values */ NULL, /* set_values_hook */ XtInheritSetValuesAlmost, /* set_values_almost */ NULL, /* get_values_hook */ NULL, /* accept_focus */ XtVersion, /* version */ NULL, /* callback_private */ NULL, /* tm_table */ PreferredSize, /* query_geometry */ NULL, /* display_accelerator */ NULL, /* extension */ }, { /* composite_class members */ GeometryManager, /* geometry_manager */ ChangeManaged, /* change_managed */ XtInheritInsertChild, /* insert_child */ XtInheritDeleteChild, /* delete_child */ NULL, /* extension */ }, { /* Menubar class members */ 0, /* empty */ } }; WidgetClass lwMenubarWidgetClass = (WidgetClass) &lwMenubarClassRec; static void Initialize (request, new) lwMenuBarWidget request, new; { if (request->core.width <= 0) new->core.width = 1; if (request->core.height <= 0) new->core.height = 23; } static void Resize (w) lwMenuBarWidget w; { do_layout(w); } static void do_layout (parent) lwMenuBarWidget parent; { Widget child; int cnt; int managed_children = 0; int managed_width = 0; int new_pos = 0; /* * Determine number of children which will fit on one line. * For now we ignore the rest, making sure they are unmanaged. */ cnt = 0; while ((cnt < (int) parent->composite.num_children) && (managed_width < (int) parent->core.width)) { child = parent->composite.children[cnt++]; managed_children++; managed_width += child->core.width + child->core.border_width * 2 + HORIZ_SPACING; } if (managed_width > (int) parent->core.width) managed_children--; /* * Correct positioning of children. */ cnt = 0; while (managed_children) { child = parent->composite.children[cnt++]; if (!child->core.managed) XtManageChild (child); if ((child->core.x != new_pos) || (child->core.y != 0)) XtMoveWidget (child, new_pos, 0); new_pos += child->core.width + child->core.border_width * 2 + HORIZ_SPACING; managed_children--; } /* * Make sure all remaining children are unmanaged. */ while (cnt < parent->composite.num_children) { child = parent->composite.children[cnt]; if (child->core.managed) XtUnmanageChild (child); if ((child->core.x != parent->core.width) || (child->core.y != parent->core.height)) XtMoveWidget (child, parent->core.width, parent->core.height); cnt++; } } static XtGeometryResult PreferredSize (w, request, preferred) lwMenuBarWidget w; XtWidgetGeometry *request, *preferred; { Widget child; int cnt; /* * If no changes are being made to the width or height, just agree. */ if (!(request->request_mode & CWWidth) && !(request->request_mode & CWHeight)) return (XtGeometryYes); /* * Right now assume everything goes in one row. Calculate the * minimum required width and height. */ preferred->width = 0; preferred->height = 0; for (cnt = 0; cnt < w->composite.num_children; cnt++) { child = w->composite.children[cnt]; if (child->core.managed) { preferred->width += child->core.width + child->core.border_width*2 + HORIZ_SPACING; if (preferred->height < (Dimension) (child->core.height + child->core.border_width * 2)) preferred->height = child->core.height + child->core.border_width * 2; } } preferred->request_mode = CWWidth | CWHeight; /* * Case: both height and width requested */ if ((request->request_mode & CWWidth) && (request->request_mode & CWHeight)) { /* * Ok if same or bigger. */ if (preferred->width <= request->width && preferred->height <= request->height) { preferred->width = request->width; return (XtGeometryYes); } /* * If both dimensions are too small, say no. */ else if (preferred->width > request->width && preferred->height > request->height) return (XtGeometryNo); /* * Otherwise one must be right, so say almost. */ else return (XtGeometryAlmost); } /* * If only one dimension is requested, either its OK or it isn't. */ else { if (request->request_mode & CWWidth) { if (preferred->width <= request->width) { preferred->width = request->width; return (XtGeometryYes); } else return (XtGeometryNo); } else if (request->request_mode & CWHeight) { if (preferred->height <= request->height) { return (XtGeometryYes); } else return (XtGeometryNo); } return (XtGeometryYes); } } static XtGeometryResult GeometryManager (w, request, reply) Widget w; XtWidgetGeometry *request; XtWidgetGeometry *reply; { lwMenuBarWidget parent = (lwMenuBarWidget) w->core.parent; /* * If the widget wants to move, just say no. */ if ((request->request_mode & CWX && request->x != w->core.x) || (request->request_mode & CWY && request->y != w->core.y)) return (XtGeometryNo); /* * Since everything "fits" for now, grant all requests. */ 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; do_layout (parent); return (XtGeometryYes); } static XtGeometryResult try_layout (parent) lwMenuBarWidget parent; { Widget child; int cnt; int managed_children = 0; int managed_width = 0; int new_pos = 0; /* * Determine number of children which will fit on one line. * For now we ignore the rest, making sure they are unmanaged. */ cnt = 0; while ((cnt < (int) parent->composite.num_children) && (managed_width < (int) parent->core.width)) { child = parent->composite.children[cnt++]; if (child->core.managed) { managed_children++; managed_width += child->core.width + child->core.border_width * 2 + HORIZ_SPACING; } } if (managed_width > (int) parent->core.width) return (XtGeometryNo); else return (XtGeometryYes); } static void ChangeManaged (w) lwMenuBarWidget w; { XtGeometryResult result; result = try_layout (w); if (result != XtGeometryYes) { XtUnmanageChild (w->composite.children[w->composite.num_children - 1]); XtMoveWidget (w->composite.children[w->composite.num_children-1], w->core.width, w->core.height); } do_layout (w); }