summaryrefslogtreecommitdiff
path: root/src/SmeLine.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/SmeLine.c')
-rw-r--r--src/SmeLine.c288
1 files changed, 288 insertions, 0 deletions
diff --git a/src/SmeLine.c b/src/SmeLine.c
new file mode 100644
index 0000000..e5d1f25
--- /dev/null
+++ b/src/SmeLine.c
@@ -0,0 +1,288 @@
+/* $Xorg: SmeLine.c,v 1.4 2001/02/09 02:03:45 xorgcvs Exp $ */
+
+/*
+Copyright 1989, 1998 The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+ *
+ * Author: Chris D. Peterson, MIT X Consortium
+ */
+
+/*
+ * Sme.c - Source code for the generic menu entry
+ *
+ * Date: September 26, 1989
+ *
+ * By: Chris D. Peterson
+ * MIT X Consortium
+ * kit@expo.lcs.mit.edu
+ */
+
+#include <stdio.h>
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+
+#include <X11/Xaw/XawInit.h>
+#include <X11/Xaw/SmeLineP.h>
+#include <X11/Xaw/Cardinals.h>
+
+#define offset(field) XtOffsetOf(SmeLineRec, sme_line.field)
+static XtResource resources[] = {
+ {XtNlineWidth, XtCLineWidth, XtRDimension, sizeof(Dimension),
+ offset(line_width), XtRImmediate, (XtPointer) 1},
+ {XtNstipple, XtCStipple, XtRBitmap, sizeof(Pixmap),
+ offset(stipple), XtRImmediate, (XtPointer) XtUnspecifiedPixmap},
+ {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel),
+ offset(foreground), XtRString, XtDefaultForeground},
+};
+#undef offset
+
+/*
+ * Function definitions.
+ */
+
+static void Redisplay(), Initialize();
+static void DestroyGC(), CreateGC();
+static Boolean SetValues();
+static XtGeometryResult QueryGeometry();
+
+
+#define SUPERCLASS (&smeClassRec)
+
+SmeLineClassRec smeLineClassRec = {
+ {
+ /* superclass */ (WidgetClass) SUPERCLASS,
+ /* class_name */ "SmeLine",
+ /* size */ sizeof(SmeLineRec),
+ /* class_initialize */ XawInitializeWidgetSet,
+ /* class_part_initialize*/ NULL,
+ /* Class init'ed */ FALSE,
+ /* initialize */ Initialize,
+ /* initialize_hook */ NULL,
+ /* realize */ NULL,
+ /* actions */ NULL,
+ /* num_actions */ ZERO,
+ /* resources */ resources,
+ /* resource_count */ XtNumber(resources),
+ /* xrm_class */ NULLQUARK,
+ /* compress_motion */ FALSE,
+ /* compress_exposure */ FALSE,
+ /* compress_enterleave*/ FALSE,
+ /* visible_interest */ FALSE,
+ /* destroy */ DestroyGC,
+ /* resize */ NULL,
+ /* expose */ Redisplay,
+ /* set_values */ SetValues,
+ /* set_values_hook */ NULL,
+ /* set_values_almost */ XtInheritSetValuesAlmost,
+ /* get_values_hook */ NULL,
+ /* accept_focus */ NULL,
+ /* intrinsics version */ XtVersion,
+ /* callback offsets */ NULL,
+ /* tm_table */ NULL,
+ /* query_geometry */ QueryGeometry,
+ /* display_accelerator*/ NULL,
+ /* extension */ NULL
+ },{
+ /* Menu Entry Fields */
+
+ /* highlight */ XtInheritHighlight,
+ /* unhighlight */ XtInheritUnhighlight,
+ /* notify */ XtInheritNotify,
+ /* extension */ NULL
+ },{
+ /* Line Menu Entry Fields */
+ /* extension */ NULL
+ }
+};
+
+WidgetClass smeLineObjectClass = (WidgetClass) &smeLineClassRec;
+
+/************************************************************
+ *
+ * Semi-Public Functions.
+ *
+ ************************************************************/
+
+/* Function Name: Initialize
+ * Description: Initializes the simple menu widget
+ * Arguments: request - the widget requested by the argument list.
+ * new - the new widget with both resource and non
+ * resource values.
+ * Returns: none.
+ */
+
+/* ARGSUSED */
+static void
+Initialize(request, new, args, num_args)
+Widget request, new;
+ArgList args;
+Cardinal *num_args;
+{
+ SmeLineObject entry = (SmeLineObject) new;
+
+ if (entry->rectangle.height == 0)
+ entry->rectangle.height = entry->sme_line.line_width;
+
+ CreateGC(new);
+}
+
+/* Function Name: CreateGC
+ * Description: Creates the GC for the line entry widget.
+ * Arguments: w - the Line entry widget.
+ * Returns: none
+ *
+ * We can only share the GC if there is no stipple, because
+ * we need to change the stipple origin when drawing.
+ */
+
+static void
+CreateGC(w)
+Widget w;
+{
+ SmeLineObject entry = (SmeLineObject) w;
+ XGCValues values;
+ XtGCMask mask = GCForeground | GCGraphicsExposures | GCLineWidth ;
+
+ values.foreground = entry->sme_line.foreground;
+ values.graphics_exposures = FALSE;
+ values.line_width = entry->sme_line.line_width;
+
+ if (entry->sme_line.stipple != XtUnspecifiedPixmap) {
+ values.stipple = entry->sme_line.stipple;
+ values.fill_style = FillStippled;
+ mask |= GCStipple | GCFillStyle;
+
+ entry->sme_line.gc = XCreateGC(XtDisplayOfObject(w),
+ RootWindowOfScreen(XtScreenOfObject(w)),
+ mask, &values);
+ }
+ else
+ entry->sme_line.gc = XtGetGC(w, mask, &values);
+}
+
+/* Function Name: DestroyGC
+ * Description: Destroys the GC when we are done with it.
+ * Arguments: w - the Line entry widget.
+ * Returns: none
+ */
+
+static void
+DestroyGC(w)
+Widget w;
+{
+ SmeLineObject entry = (SmeLineObject) w;
+
+ if (entry->sme_line.stipple != XtUnspecifiedPixmap)
+ XFreeGC(XtDisplayOfObject(w), entry->sme_line.gc);
+ else
+ XtReleaseGC(w, entry->sme_line.gc);
+}
+
+/* Function Name: Redisplay
+ * Description: Paints the Line
+ * Arguments: w - the menu entry.
+ * event, region - NOT USED.
+ * Returns: none
+ */
+
+/*ARGSUSED*/
+static void
+Redisplay(w, event, region)
+Widget w;
+XEvent * event;
+Region region;
+{
+ SmeLineObject entry = (SmeLineObject) w;
+ int y = entry->rectangle.y +
+ (int)(entry->rectangle.height - entry->sme_line.line_width) / 2;
+
+ if (entry->sme_line.stipple != XtUnspecifiedPixmap)
+ XSetTSOrigin(XtDisplayOfObject(w), entry->sme_line.gc, 0, y);
+
+ XFillRectangle(XtDisplayOfObject(w), XtWindowOfObject(w),
+ entry->sme_line.gc,
+ 0, y, (unsigned int) entry->rectangle.width,
+ (unsigned int) entry->sme_line.line_width );
+}
+
+/* Function Name: SetValues
+ * Description: Relayout the menu when one of the resources is changed.
+ * Arguments: current - current state of the widget.
+ * request - what was requested.
+ * new - what the widget will become.
+ * Returns: none
+ */
+
+/* ARGSUSED */
+static Boolean
+SetValues(current, request, new, args, num_args)
+Widget current, request, new;
+ArgList args;
+Cardinal *num_args;
+{
+ SmeLineObject entry = (SmeLineObject) new;
+ SmeLineObject old_entry = (SmeLineObject) current;
+
+ if ( (entry->sme_line.line_width != old_entry->sme_line.line_width) &&
+ (entry->sme_line.stipple != old_entry->sme_line.stipple) ) {
+ DestroyGC(current);
+ CreateGC(new);
+ return(TRUE);
+ }
+ return(FALSE);
+}
+
+/* Function Name: QueryGeometry.
+ * Description: Returns the preferred geometry for this widget.
+ * Arguments: w - the menu entry object.
+ * itended, return - the intended and return geometry info.
+ * Returns: A Geometry Result.
+ *
+ * See the Intrinsics manual for details on what this function is for.
+ *
+ * I just return the height and a width of 1.
+ */
+
+static XtGeometryResult
+QueryGeometry(w, intended, return_val)
+Widget w;
+XtWidgetGeometry *intended, *return_val;
+{
+ SmeObject entry = (SmeObject) w;
+ Dimension width;
+ XtGeometryResult ret_val = XtGeometryYes;
+ XtGeometryMask mode = intended->request_mode;
+
+ width = 1; /* we can be really small. */
+
+ if ( ((mode & CWWidth) && (intended->width != width)) ||
+ !(mode & CWWidth) ) {
+ return_val->request_mode |= CWWidth;
+ return_val->width = width;
+ mode = return_val->request_mode;
+
+ if ( (mode & CWWidth) && (width == entry->rectangle.width) )
+ return(XtGeometryNo);
+ return(XtGeometryAlmost);
+ }
+ return(ret_val);
+}