749N/A#if ( !defined(lint) && !defined(SABER) )
749N/Astatic char Xrcsid[] = "$XConsortium: SmeLine.c,v 1.8 90/02/08 13:50:13 jim Exp $";
749N/A#endif
749N/A
749N/A/*
749N/A * Copyright 1989 Massachusetts Institute of Technology
749N/A *
749N/A * Permission to use, copy, modify, distribute, and sell this software and its
749N/A * documentation for any purpose is hereby granted without fee, provided that
749N/A * the above copyright notice appear in all copies and that both that
749N/A * copyright notice and this permission notice appear in supporting
749N/A * documentation, and that the name of M.I.T. not be used in advertising or
749N/A * publicity pertaining to distribution of the software without specific,
749N/A * written prior permission. M.I.T. makes no representations about the
749N/A * suitability of this software for any purpose. It is provided "as is"
749N/A * without express or implied warranty.
749N/A *
749N/A * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
749N/A * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
749N/A * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
749N/A * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
749N/A * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
749N/A * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
749N/A *
749N/A * Author: Chris D. Peterson, MIT X Consortium
749N/A */
749N/A
749N/A/*
749N/A * Sme.c - Source code for the generic menu entry
749N/A *
749N/A * Date: September 26, 1989
749N/A *
749N/A * By: Chris D. Peterson
749N/A * MIT X Consortium
749N/A * kit@expo.lcs.mit.edu
749N/A */
749N/A
749N/A#include <stdio.h>
749N/A#include <X11/IntrinsicP.h>
749N/A#include <X11/StringDefs.h>
749N/A
749N/A#include <./Xaw3_1XawInit.h>
749N/A#include <./Xaw3_1SmeLineP.h>
749N/A#include <./Xaw3_1Cardinals.h>
749N/A
749N/A#define offset(field) XtOffset(SmeLineObject, sme_line.field)
749N/Astatic XtResource resources[] = {
749N/A {XtNlineWidth, XtCLineWidth, XtRDimension, sizeof(Dimension),
749N/A offset(line_width), XtRImmediate, (XtPointer) 1},
749N/A {XtNstipple, XtCStipple, XtRBitmap, sizeof(Pixmap),
749N/A offset(stipple), XtRImmediate, (XtPointer) XtUnspecifiedPixmap},
749N/A {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
749N/A offset(foreground), XtRString, "XtDefaultForeground"},
749N/A};
749N/A#undef offset
749N/A
749N/A/*
749N/A * Function definitions.
749N/A */
749N/A
749N/Astatic void Redisplay(), ClassInitialize(), Initialize();
749N/Astatic void DestroyGC(), CreateGC();
749N/Astatic Boolean SetValues();
749N/Astatic XtGeometryResult QueryGeometry();
749N/A
749N/A
749N/A#define SUPERCLASS (&smeClassRec)
749N/A
749N/ASmeLineClassRec smeLineClassRec = {
749N/A {
749N/A /* superclass */ (WidgetClass) SUPERCLASS,
749N/A /* class_name */ "SmeLine",
749N/A /* size */ sizeof(SmeLineRec),
749N/A /* class_initialize */ ClassInitialize,
749N/A /* class_part_initialize*/ NULL,
749N/A /* Class init'ed */ FALSE,
749N/A /* initialize */ Initialize,
749N/A /* initialize_hook */ NULL,
749N/A /* realize */ NULL,
749N/A /* actions */ NULL,
749N/A /* num_actions */ ZERO,
749N/A /* resources */ resources,
749N/A /* resource_count */ XtNumber(resources),
749N/A /* xrm_class */ NULLQUARK,
749N/A /* compress_motion */ FALSE,
749N/A /* compress_exposure */ FALSE,
749N/A /* compress_enterleave*/ FALSE,
749N/A /* visible_interest */ FALSE,
749N/A /* destroy */ DestroyGC,
749N/A /* resize */ NULL,
749N/A /* expose */ Redisplay,
749N/A /* set_values */ SetValues,
749N/A /* set_values_hook */ NULL,
749N/A /* set_values_almost */ XtInheritSetValuesAlmost,
749N/A /* get_values_hook */ NULL,
749N/A /* accept_focus */ NULL,
749N/A /* intrinsics version */ XtVersion,
749N/A /* callback offsets */ NULL,
749N/A /* tm_table */ NULL,
749N/A /* query_geometry */ QueryGeometry,
749N/A /* display_accelerator*/ NULL,
749N/A /* extension */ NULL
749N/A },{
749N/A /* Menu Entry Fields */
749N/A
749N/A /* highlight */ XtInheritHighlight,
749N/A /* unhighlight */ XtInheritUnhighlight,
749N/A /* notify */ XtInheritNotify,
749N/A /* extension */ NULL
749N/A },{
749N/A /* Line Menu Entry Fields */
749N/A /* extension */ NULL
749N/A }
749N/A};
749N/A
749N/AWidgetClass smeLineObjectClass = (WidgetClass) &smeLineClassRec;
749N/A
749N/A/************************************************************
749N/A *
749N/A * Semi-Public Functions.
749N/A *
749N/A ************************************************************/
749N/A
749N/A/* Function Name: ClassInitialize
749N/A * Description: The Line Menu Entry Object's class initialization proc.
749N/A * Arguments: none.
749N/A * Returns: none.
749N/A */
749N/A
749N/Astatic void
749N/AClassInitialize()
749N/A{
749N/A static XtConvertArgRec screenConvertArg[] = {
749N/A {XtWidgetBaseOffset, (caddr_t) XtOffset(Widget, core.screen),
749N/A sizeof(Screen *)}
749N/A };
749N/A
749N/A XawInitializeWidgetSet();
749N/A XtAddConverter(XtRString, XtRBitmap, XmuCvtStringToBitmap,
749N/A screenConvertArg, XtNumber(screenConvertArg));
749N/A}
749N/A
749N/A/* Function Name: Initialize
749N/A * Description: Initializes the simple menu widget
749N/A * Arguments: request - the widget requested by the argument list.
749N/A * new - the new widget with both resource and non
749N/A * resource values.
749N/A * Returns: none.
749N/A */
749N/A
749N/A/* ARGSUSED */
749N/Astatic void
749N/AInitialize(request, new)
749N/AWidget request, new;
749N/A{
749N/A SmeLineObject entry = (SmeLineObject) new;
749N/A
749N/A if (entry->rectangle.height == 0)
749N/A entry->rectangle.height = entry->sme_line.line_width;
749N/A
749N/A CreateGC(new);
749N/A}
749N/A
749N/A/* Function Name: CreateGC
749N/A * Description: Creates the GC for the line entry widget.
749N/A * Arguments: w - the Line entry widget.
749N/A * Returns: none
749N/A *
749N/A * We can only share the GC if there is no stipple, because
749N/A * we need to change the stipple origin when drawing.
749N/A */
749N/A
749N/Astatic void
749N/ACreateGC(w)
749N/AWidget w;
749N/A{
749N/A SmeLineObject entry = (SmeLineObject) w;
749N/A XGCValues values;
749N/A XtGCMask mask = GCForeground | GCGraphicsExposures | GCLineWidth ;
749N/A
749N/A values.foreground = entry->sme_line.foreground;
749N/A values.graphics_exposures = FALSE;
749N/A values.line_width = entry->sme_line.line_width;
749N/A
749N/A if (entry->sme_line.stipple != XtUnspecifiedPixmap) {
749N/A values.stipple = entry->sme_line.stipple;
749N/A values.fill_style = FillStippled;
749N/A mask |= GCStipple | GCFillStyle;
749N/A
749N/A entry->sme_line.gc = XCreateGC(XtDisplayOfObject(w),
749N/A RootWindowOfScreen(XtScreenOfObject(w)),
749N/A mask, &values);
749N/A }
749N/A else
749N/A entry->sme_line.gc = XtGetGC(w, mask, &values);
749N/A}
749N/A
749N/A/* Function Name: DestroyGC
749N/A * Description: Destroys the GC when we are done with it.
749N/A * Arguments: w - the Line entry widget.
749N/A * Returns: none
749N/A */
749N/A
749N/Astatic void
749N/ADestroyGC(w)
749N/AWidget w;
749N/A{
749N/A SmeLineObject entry = (SmeLineObject) w;
749N/A
749N/A if (entry->sme_line.stipple != XtUnspecifiedPixmap)
749N/A XFreeGC(XtDisplayOfObject(w), entry->sme_line.gc);
749N/A else
749N/A XtReleaseGC(w, entry->sme_line.gc);
749N/A}
749N/A
749N/A/* Function Name: Redisplay
749N/A * Description: Paints the Line
749N/A * Arguments: w - the menu entry.
749N/A * event, region - NOT USED.
749N/A * Returns: none
749N/A */
749N/A
749N/Astatic void
749N/ARedisplay(w, event, region)
749N/AWidget w;
749N/AXEvent * event;
749N/ARegion region;
749N/A{
749N/A SmeLineObject entry = (SmeLineObject) w;
749N/A int y = entry->rectangle.y +
749N/A (entry->rectangle.height - entry->sme_line.line_width) / 2;
749N/A
749N/A if (entry->sme_line.stipple != XtUnspecifiedPixmap)
749N/A XSetTSOrigin(XtDisplayOfObject(w), entry->sme_line.gc, 0, y);
749N/A
749N/A XFillRectangle(XtDisplayOfObject(w), XtWindowOfObject(w),
749N/A entry->sme_line.gc,
749N/A 0, y, (unsigned int) entry->rectangle.width,
749N/A (unsigned int) entry->sme_line.line_width );
749N/A}
749N/A
749N/A/* Function Name: SetValues
749N/A * Description: Relayout the menu when one of the resources is changed.
749N/A * Arguments: current - current state of the widget.
749N/A * request - what was requested.
749N/A * new - what the widget will become.
749N/A * Returns: none
749N/A */
749N/A
749N/A/* ARGSUSED */
749N/Astatic Boolean
749N/ASetValues(current, request, new)
749N/AWidget current, request, new;
749N/A{
749N/A SmeLineObject entry = (SmeLineObject) new;
749N/A SmeLineObject old_entry = (SmeLineObject) current;
749N/A
749N/A if ( (entry->sme_line.line_width != old_entry->sme_line.line_width) &&
749N/A (entry->sme_line.stipple != old_entry->sme_line.stipple) ) {
749N/A DestroyGC(current);
749N/A CreateGC(new);
749N/A return(TRUE);
749N/A }
749N/A return(FALSE);
749N/A}
749N/A
749N/A/* Function Name: QueryGeometry.
749N/A * Description: Returns the preferred geometry for this widget.
749N/A * Arguments: w - the menu entry object.
749N/A * itended, return - the intended and return geometry info.
749N/A * Returns: A Geometry Result.
749N/A *
749N/A * See the Intrinsics manual for details on what this function is for.
749N/A *
749N/A * I just return the height and a width of 1.
749N/A */
749N/A
749N/Astatic XtGeometryResult
749N/AQueryGeometry(w, intended, return_val)
749N/AWidget w;
749N/AXtWidgetGeometry *intended, *return_val;
749N/A{
749N/A SmeObject entry = (SmeObject) w;
749N/A Dimension width;
749N/A XtGeometryResult ret_val = XtGeometryYes;
749N/A XtGeometryMask mode = intended->request_mode;
749N/A
749N/A width = 1; /* we can be really small. */
749N/A
749N/A if ( ((mode & CWWidth) && (intended->width != width)) ||
749N/A !(mode & CWWidth) ) {
749N/A return_val->request_mode |= CWWidth;
749N/A return_val->width = width;
749N/A mode = return_val->request_mode;
749N/A
749N/A if ( (mode & CWWidth) && (width == entry->rectangle.width) )
749N/A return(XtGeometryNo);
749N/A return(XtGeometryAlmost);
749N/A }
749N/A return(ret_val);
749N/A}