#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <X11/IntrinsicP.h>
#include <X11/StringDefs.h>
#include <X11/Xaw/Cardinals.h>
#include <X11/Xaw/SmeLineP.h>
#include <X11/Xaw/XawInit.h>
#include "Private.h"
static void XawSmeLineDestroy(Widget);
static void XawSmeLineInitialize(Widget, Widget, ArgList, Cardinal*);
static void XawSmeLineRedisplay(Widget, XEvent*, Region);
static Boolean XawSmeLineSetValues(Widget, Widget, Widget,
ArgList, Cardinal*);
static void CreateGC(Widget);
static void DestroyGC(Widget);
#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
#define Superclass (&smeClassRec)
SmeLineClassRec smeLineClassRec = {
{
(WidgetClass)Superclass,
"SmeLine",
sizeof(SmeLineRec),
XawInitializeWidgetSet,
NULL,
False,
XawSmeLineInitialize,
NULL,
NULL,
NULL,
0,
resources,
XtNumber(resources),
NULLQUARK,
False,
False,
False,
False,
XawSmeLineDestroy,
NULL,
XawSmeLineRedisplay,
XawSmeLineSetValues,
NULL,
XtInheritSetValuesAlmost,
NULL,
NULL,
XtVersion,
NULL,
NULL,
XtInheritQueryGeometry,
NULL,
NULL,
},
{
XtInheritHighlight,
XtInheritUnhighlight,
XtInheritNotify,
NULL,
},
{
NULL,
}
};
WidgetClass smeLineObjectClass = (WidgetClass)&smeLineClassRec;
static void
XawSmeLineInitialize(Widget request, Widget cnew,
ArgList args, Cardinal *num_args)
{
SmeLineObject entry = (SmeLineObject)cnew;
if (XtHeight(entry) == 0)
XtHeight(entry) = entry->sme_line.line_width;
CreateGC(cnew);
}
static void
CreateGC(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);
}
static void
XawSmeLineDestroy(Widget w)
{
DestroyGC(w);
}
static void
DestroyGC(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);
}
static void
XawSmeLineRedisplay(Widget w, XEvent *event, Region region)
{
SmeLineObject entry = (SmeLineObject)w;
int y = XtY(w) + (((int)XtHeight(w) - entry->sme_line.line_width) >> 1);
if (entry->sme_line.stipple != XtUnspecifiedPixmap)
XSetTSOrigin(XtDisplayOfObject(w), entry->sme_line.gc, 0, y);
XFillRectangle(XtDisplayOfObject(w), XtWindowOfObject(w),
entry->sme_line.gc, XtX(w), y,
XtWidth(w), entry->sme_line.line_width);
}
static Boolean
XawSmeLineSetValues(Widget current, Widget request, Widget cnew,
ArgList args, Cardinal *num_args)
{
SmeLineObject entry = (SmeLineObject)cnew;
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(cnew);
return (True);
}
return (False);
}