aboutsummaryrefslogtreecommitdiff
path: root/libXaw/src/Label.c
diff options
context:
space:
mode:
authormarha <marha@users.sourceforge.net>2009-11-06 06:59:46 +0000
committermarha <marha@users.sourceforge.net>2009-11-06 06:59:46 +0000
commitace7902333b6f61aab5a6035dbcb222763bff186 (patch)
tree28445e829d5f04c8d79bda2514be37d5fb29738e /libXaw/src/Label.c
parentc9179017c7e70703b7cac46c2df8b950506319e0 (diff)
downloadvcxsrv-ace7902333b6f61aab5a6035dbcb222763bff186.tar.gz
vcxsrv-ace7902333b6f61aab5a6035dbcb222763bff186.tar.bz2
vcxsrv-ace7902333b6f61aab5a6035dbcb222763bff186.zip
Added libXaw-1.0.7
Diffstat (limited to 'libXaw/src/Label.c')
-rw-r--r--libXaw/src/Label.c824
1 files changed, 824 insertions, 0 deletions
diff --git a/libXaw/src/Label.c b/libXaw/src/Label.c
new file mode 100644
index 000000000..0a4c6ea2a
--- /dev/null
+++ b/libXaw/src/Label.c
@@ -0,0 +1,824 @@
+/* $Xorg: Label.c,v 1.5 2001/02/09 02:03:43 xorgcvs Exp $ */
+
+/***********************************************************
+
+Copyright 1987, 1988, 1994, 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.
+
+
+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
+
+ All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Digital not be
+used in advertising or publicity pertaining to distribution of the
+software without specific, written prior permission.
+
+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+******************************************************************/
+/* $XFree86: xc/lib/Xaw/Label.c,v 1.12 2001/01/17 19:42:27 dawes Exp $ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <ctype.h>
+#include <X11/IntrinsicP.h>
+#include <X11/StringDefs.h>
+#include <X11/Xos.h>
+#include <X11/Xmu/Converters.h>
+#include <X11/Xmu/Drawing.h>
+#include <X11/Xaw/LabelP.h>
+#include <X11/Xaw/XawInit.h>
+#include "Private.h"
+
+#define streq(a, b) (strcmp((a), (b)) == 0)
+
+#define MULTI_LINE_LABEL 32767
+
+#ifdef CRAY
+#define WORD64
+#endif
+
+/*
+ * Class Methods
+ */
+static void XawLabelClassInitialize(void);
+static void XawLabelDestroy(Widget);
+static void XawLabelInitialize(Widget, Widget, ArgList, Cardinal*);
+static XtGeometryResult XawLabelQueryGeometry(Widget, XtWidgetGeometry*,
+ XtWidgetGeometry*);
+static void XawLabelRedisplay(Widget, XEvent*, Region);
+static void XawLabelResize(Widget);
+static Boolean XawLabelSetValues(Widget, Widget, Widget,
+ ArgList, Cardinal*);
+
+/*
+ * Prototypes
+ */
+#ifdef WORD64
+static int _XawLabelWidth16(XFontStruct*, char*, int);
+static void _XawLabelDraw16(Display*, Drawable, GC, int, int, char*, int);
+#endif
+static void compute_bitmap_offsets(LabelWidget);
+static void GetGrayGC(LabelWidget);
+static void GetNormalGC(LabelWidget);
+static void _Reposition(LabelWidget, unsigned int, unsigned int,
+ Position*, Position*);
+static void set_bitmap_info(LabelWidget);
+static void SetTextWidthAndHeight(LabelWidget);
+
+/*
+ * Initialization
+ */
+#define offset(field) XtOffsetOf(LabelRec, field)
+static XtResource resources[] = {
+ {
+ XtNforeground,
+ XtCForeground,
+ XtRPixel,
+ sizeof(Pixel),
+ offset(label.foreground),
+ XtRString,
+ XtDefaultForeground
+ },
+ {
+ XtNfont,
+ XtCFont,
+ XtRFontStruct,
+ sizeof(XFontStruct*),
+ offset(label.font),
+ XtRString,
+ XtDefaultFont
+ },
+ {
+ XtNfontSet,
+ XtCFontSet,
+ XtRFontSet,
+ sizeof(XFontSet),
+ offset(label.fontset),
+ XtRString,
+ XtDefaultFontSet
+ },
+ {
+ XtNlabel,
+ XtCLabel,
+ XtRString,
+ sizeof(String),
+ offset(label.label),
+ XtRString,
+ NULL
+ },
+ {
+ XtNencoding,
+ XtCEncoding,
+ XtRUnsignedChar,
+ sizeof(unsigned char),
+ offset(label.encoding),
+ XtRImmediate,
+ (XtPointer)XawTextEncoding8bit
+ },
+ {
+ XtNjustify,
+ XtCJustify,
+ XtRJustify,
+ sizeof(XtJustify),
+ offset(label.justify),
+ XtRImmediate,
+ (XtPointer)XtJustifyCenter
+ },
+ {
+ XtNinternalWidth,
+ XtCWidth,
+ XtRDimension,
+ sizeof(Dimension),
+ offset(label.internal_width),
+ XtRImmediate,
+ (XtPointer)4
+ },
+ {
+ XtNinternalHeight,
+ XtCHeight,
+ XtRDimension,
+ sizeof(Dimension),
+ offset(label.internal_height),
+ XtRImmediate,
+ (XtPointer)2
+ },
+ {
+ XtNleftBitmap,
+ XtCLeftBitmap,
+ XtRBitmap,
+ sizeof(Pixmap),
+ offset(label.left_bitmap),
+ XtRImmediate,
+ (XtPointer)None
+ },
+ {
+ XtNbitmap,
+ XtCPixmap,
+ XtRBitmap,
+ sizeof(Pixmap),
+ offset(label.pixmap),
+ XtRImmediate,
+ (XtPointer)None
+ },
+ {
+ XtNresize,
+ XtCResize,
+ XtRBoolean,
+ sizeof(Boolean),
+ offset(label.resize),
+ XtRImmediate,
+ (XtPointer)True
+ },
+ {
+ XtNlabelX,
+ XtCPosition,
+ XtRPosition,
+ sizeof(Position),
+ offset(label.label_x),
+ XtRImmediate,
+ (XtPointer)0
+ },
+ {
+ XtNlabelY,
+ XtCPosition,
+ XtRPosition,
+ sizeof(Position),
+ offset(label.label_y),
+ XtRImmediate,
+ (XtPointer)0
+ },
+};
+#undef offset
+
+#define Superclass (&simpleClassRec)
+LabelClassRec labelClassRec = {
+ /* core */
+ {
+ (WidgetClass)&simpleClassRec, /* superclass */
+ "Label", /* class_name */
+ sizeof(LabelRec), /* widget_size */
+ XawLabelClassInitialize, /* class_initialize */
+ NULL, /* class_part_initialize */
+ False, /* class_inited */
+ XawLabelInitialize, /* initialize */
+ NULL, /* initialize_hook */
+ XtInheritRealize, /* realize */
+ NULL, /* actions */
+ 0, /* num_actions */
+ resources, /* resources */
+ XtNumber(resources), /* num_resources */
+ NULLQUARK, /* xrm_class */
+ True, /* compress_motion */
+ True, /* compress_exposure */
+ True, /* compress_enterleave */
+ False, /* visible_interest */
+ XawLabelDestroy, /* destroy */
+ XawLabelResize, /* resize */
+ XawLabelRedisplay, /* expose */
+ XawLabelSetValues, /* 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 */
+ XawLabelQueryGeometry, /* query_geometry */
+ XtInheritDisplayAccelerator, /* display_accelerator */
+ NULL, /* extension */
+ },
+ /* simple */
+ {
+ XtInheritChangeSensitive, /* change_sensitive */
+ },
+ /* label */
+ {
+ NULL, /* extension */
+ }
+};
+
+WidgetClass labelWidgetClass = (WidgetClass)&labelClassRec;
+
+/*
+ * Implementation
+ */
+static void
+XawLabelClassInitialize(void)
+{
+ XawInitializeWidgetSet();
+ XtAddConverter(XtRString, XtRJustify, XmuCvtStringToJustify, NULL, 0);
+ XtSetTypeConverter(XtRJustify, XtRString, XmuCvtJustifyToString,
+ NULL, 0, XtCacheNone, NULL);
+}
+
+#ifndef WORD64
+#define TXT16 XChar2b
+#else
+#define TXT16 char
+
+static XChar2b *buf2b;
+static int buf2blen = 0;
+
+static int
+_XawLabelWidth16(XFontStruct *fs, char *str, int n)
+{
+ int i;
+ XChar2b *ptr;
+
+ if (n > buf2blen) {
+ buf2b = (XChar2b *)XtRealloc((char *)buf2b, n * sizeof(XChar2b));
+ buf2blen = n;
+ }
+ for (ptr = buf2b, i = n; --i >= 0; ptr++) {
+ ptr->byte1 = *str++;
+ ptr->byte2 = *str++;
+ }
+
+ return (XTextWidth16(fs, buf2b, n));
+}
+
+static void
+_XawLabelDraw16(Display *dpy, Drawable d, GC gc, int x, int y,
+ char *str, int n)
+{
+ int i;
+ XChar2b *ptr;
+
+ if (n > buf2blen) {
+ buf2b = (XChar2b *)XtRealloc((char *)buf2b, n * sizeof(XChar2b));
+ buf2blen = n;
+ }
+ for (ptr = buf2b, i = n; --i >= 0; ptr++) {
+ ptr->byte1 = *str++;
+ ptr->byte2 = *str++;
+ }
+ XDrawString16(dpy, d, gc, x, y, buf2b, n);
+}
+
+#define XTextWidth16 _XawLabelWidth16
+#define XDrawString16 _XawLabelDraw16
+#endif /* WORD64 */
+
+/*
+ * Calculate width and height of displayed text in pixels
+ */
+static void
+SetTextWidthAndHeight(LabelWidget lw)
+{
+ XFontStruct *fs = lw->label.font;
+ char *nl;
+
+ if (lw->label.pixmap != None) {
+ Window root;
+ int x, y;
+ unsigned int width, height, bw, depth;
+
+ if (XGetGeometry(XtDisplay(lw), lw->label.pixmap, &root, &x, &y,
+ &width, &height, &bw, &depth)) {
+ lw->label.label_height = height;
+ lw->label.label_width = width;
+ lw->label.label_len = depth;
+ return;
+ }
+ }
+ if (lw->simple.international == True) {
+ XFontSet fset = lw->label.fontset;
+ XFontSetExtents *ext = XExtentsOfFontSet(fset);
+
+ lw->label.label_height = ext->max_ink_extent.height;
+ if (lw->label.label == NULL) {
+ lw->label.label_len = 0;
+ lw->label.label_width = 0;
+ }
+ else if ((nl = index(lw->label.label, '\n')) != NULL) {
+ char *label;
+
+ lw->label.label_len = MULTI_LINE_LABEL;
+ lw->label.label_width = 0;
+ for (label = lw->label.label; nl != NULL; nl = index(label, '\n')) {
+ int width = XmbTextEscapement(fset, label, (int)(nl - label));
+
+ if (width > (int)lw->label.label_width)
+ lw->label.label_width = width;
+ label = nl + 1;
+ if (*label)
+ lw->label.label_height += ext->max_ink_extent.height;
+ }
+ if (*label) {
+ int width = XmbTextEscapement(fset, label, strlen(label));
+
+ if (width > (int)lw->label.label_width)
+ lw->label.label_width = width;
+ }
+ }
+ else {
+ lw->label.label_len = strlen(lw->label.label);
+ lw->label.label_width =
+ XmbTextEscapement(fset, lw->label.label, lw->label.label_len);
+ }
+ }
+ else {
+ lw->label.label_height = fs->max_bounds.ascent + fs->max_bounds.descent;
+ if (lw->label.label == NULL) {
+ lw->label.label_len = 0;
+ lw->label.label_width = 0;
+ }
+ else if ((nl = index(lw->label.label, '\n')) != NULL) {
+ char *label;
+
+ lw->label.label_len = MULTI_LINE_LABEL;
+ lw->label.label_width = 0;
+ for (label = lw->label.label; nl != NULL; nl = index(label, '\n')) {
+ int width;
+
+ if (lw->label.encoding)
+ width = XTextWidth16(fs, (TXT16*)label, (int)(nl - label) / 2);
+ else
+ width = XTextWidth(fs, label, (int)(nl - label));
+ if (width > (int)lw->label.label_width)
+ lw->label.label_width = width;
+ label = nl + 1;
+ if (*label)
+ lw->label.label_height +=
+ fs->max_bounds.ascent + fs->max_bounds.descent;
+ }
+ if (*label) {
+ int width = XTextWidth(fs, label, strlen(label));
+
+ if (lw->label.encoding)
+ width = XTextWidth16(fs, (TXT16*)label, strlen(label) / 2);
+ else
+ width = XTextWidth(fs, label, strlen(label));
+ if (width > (int) lw->label.label_width)
+ lw->label.label_width = width;
+ }
+ }
+ else {
+ lw->label.label_len = strlen(lw->label.label);
+ if (lw->label.encoding)
+ lw->label.label_width =
+ XTextWidth16(fs, (TXT16*)lw->label.label,
+ (int)lw->label.label_len / 2);
+ else
+ lw->label.label_width =
+ XTextWidth(fs, lw->label.label, (int)lw->label.label_len);
+ }
+ }
+}
+
+static void
+GetNormalGC(LabelWidget lw)
+{
+ XGCValues values;
+
+ values.foreground = lw->label.foreground;
+ values.background = lw->core.background_pixel;
+ values.font = lw->label.font->fid;
+ values.graphics_exposures = False;
+
+ if (lw->simple.international == True)
+ /* Since Xmb/wcDrawString eats the font, I must use XtAllocateGC */
+ lw->label.normal_GC = XtAllocateGC((Widget)lw, 0,
+ GCForeground | GCBackground |
+ GCGraphicsExposures,
+ &values, GCFont, 0);
+ else
+ lw->label.normal_GC = XtGetGC((Widget)lw,
+ GCForeground | GCBackground | GCFont |
+ GCGraphicsExposures, &values);
+}
+
+static void
+GetGrayGC(LabelWidget lw)
+{
+ XGCValues values;
+
+ values.foreground = lw->label.foreground;
+ values.background = lw->core.background_pixel;
+ values.font = lw->label.font->fid;
+ values.fill_style = FillTiled;
+ values.tile = XmuCreateStippledPixmap(XtScreen((Widget)lw),
+ lw->label.foreground,
+ lw->core.background_pixel,
+ lw->core.depth);
+ values.graphics_exposures = False;
+
+ lw->label.stipple = values.tile;
+ if (lw->simple.international == True)
+ /* Since Xmb/wcDrawString eats the font, I must use XtAllocateGC */
+ lw->label.gray_GC = XtAllocateGC((Widget)lw, 0,
+ GCForeground | GCBackground |
+ GCTile | GCFillStyle |
+ GCGraphicsExposures,
+ &values, GCFont, 0);
+ else
+ lw->label.gray_GC = XtGetGC((Widget)lw,
+ GCForeground | GCBackground |
+ GCFont | GCTile | GCFillStyle |
+ GCGraphicsExposures,
+ &values);
+}
+
+static void
+compute_bitmap_offsets(LabelWidget lw)
+{
+ /*
+ * bitmap will be eventually be displayed at
+ * (internal_width, internal_height + lbm_y)
+ */
+ if (lw->label.lbm_height != 0)
+ lw->label.lbm_y = (XtHeight(lw) - (lw->label.internal_height * 2 +
+ lw->label.lbm_height)) / 2;
+ else
+ lw->label.lbm_y = 0;
+}
+
+static void
+set_bitmap_info(LabelWidget lw)
+{
+ Window root;
+ int x, y;
+ unsigned int bw, depth;
+
+ if (!(lw->label.left_bitmap
+ && XGetGeometry(XtDisplay(lw), lw->label.left_bitmap, &root, &x, &y,
+ &lw->label.lbm_width, &lw->label.lbm_height,
+ &bw, &depth)))
+ lw->label.lbm_width = lw->label.lbm_height = 0;
+
+ compute_bitmap_offsets(lw);
+}
+
+/*ARGSUSED*/
+static void
+XawLabelInitialize(Widget request, Widget cnew,
+ ArgList args, Cardinal *num_args)
+{
+ LabelWidget lw = (LabelWidget)cnew;
+
+ if (!lw->label.font) XtError("Aborting: no font found\n");
+ if (lw->simple.international && !lw->label.fontset)
+ XtError("Aborting: no fontset found\n");
+
+ if (lw->label.label == NULL)
+ lw->label.label = XtNewString(lw->core.name);
+ else
+ lw->label.label = XtNewString(lw->label.label);
+
+ GetNormalGC(lw);
+ GetGrayGC(lw);
+
+ SetTextWidthAndHeight(lw);
+
+ if (XtHeight(lw) == 0)
+ XtHeight(lw) = lw->label.label_height + 2 * lw->label.internal_height;
+
+ set_bitmap_info(lw); /* need core.height */
+
+ if (XtWidth(lw) == 0) /* need label.lbm_width */
+ XtWidth(lw) = lw->label.label_width + 2 * lw->label.internal_width +
+ LEFT_OFFSET(lw);
+
+ lw->label.label_x = lw->label.label_y = 0;
+ (*XtClass(cnew)->core_class.resize)((Widget)lw);
+}
+
+/*ARGSUSED*/
+static void
+XawLabelRedisplay(Widget gw, XEvent *event, Region region)
+{
+ LabelWidget w = (LabelWidget)gw;
+ GC gc;
+
+ if (*Superclass->core_class.expose != NULL)
+ (*Superclass->core_class.expose)(gw, event, region);
+
+ gc = XtIsSensitive(gw) ? w->label.normal_GC : w->label.gray_GC;
+#ifdef notdef
+ if (region != NULL)
+ XSetRegion(XtDisplay(gw), gc, region);
+#endif /*notdef*/
+
+ if (w->label.pixmap == None) {
+ int len = w->label.label_len;
+ char *label = w->label.label;
+ Position y = w->label.label_y + w->label.font->max_bounds.ascent;
+ Position ksy = w->label.label_y;
+
+ /* display left bitmap */
+ if (w->label.left_bitmap && w->label.lbm_width != 0)
+ XCopyPlane (XtDisplay(gw), w->label.left_bitmap, XtWindow(gw), gc,
+ 0, 0, w->label.lbm_width, w->label.lbm_height,
+ w->label.internal_width,
+ w->label.internal_height + w->label.lbm_y, 1L);
+
+ if (w->simple.international == True) {
+ XFontSetExtents *ext = XExtentsOfFontSet(w->label.fontset);
+
+ ksy += XawAbs(ext->max_ink_extent.y);
+
+ if (len == MULTI_LINE_LABEL) {
+ char *nl;
+
+ while ((nl = index(label, '\n')) != NULL) {
+ XmbDrawString(XtDisplay(w), XtWindow(w), w->label.fontset,
+ gc, w->label.label_x, ksy, label,
+ (int)(nl - label));
+ ksy += ext->max_ink_extent.height;
+ label = nl + 1;
+ }
+ len = strlen(label);
+ }
+ if (len)
+ XmbDrawString(XtDisplay(w), XtWindow(w), w->label.fontset, gc,
+ w->label.label_x, ksy, label, len);
+ }
+ else {
+ if (len == MULTI_LINE_LABEL) {
+ char *nl;
+
+ while ((nl = index(label, '\n')) != NULL) {
+ if (w->label.encoding)
+ XDrawString16(XtDisplay(gw), XtWindow(gw), gc,
+ w->label.label_x, y,
+ (TXT16*)label, (int)(nl - label) / 2);
+ else
+ XDrawString(XtDisplay(gw), XtWindow(gw), gc,
+ w->label.label_x, y, label, (int)(nl - label));
+ y += w->label.font->max_bounds.ascent +
+ w->label.font->max_bounds.descent;
+ label = nl + 1;
+ }
+ len = strlen(label);
+ }
+ if (len) {
+ if (w->label.encoding)
+ XDrawString16(XtDisplay(gw), XtWindow(gw), gc,
+ w->label.label_x, y, (TXT16*)label, len / 2);
+ else
+ XDrawString(XtDisplay(gw), XtWindow(gw), gc,
+ w->label.label_x, y, label, len);
+ }
+ }
+ }
+ else if (w->label.label_len == 1)
+ XCopyPlane(XtDisplay(gw), w->label.pixmap, XtWindow(gw), gc,
+ 0, 0, w->label.label_width, w->label.label_height,
+ w->label.label_x, w->label.label_y, 1L);
+ else
+ XCopyArea(XtDisplay(gw), w->label.pixmap, XtWindow(gw), gc,
+ 0, 0, w->label.label_width, w->label.label_height,
+ w->label.label_x, w->label.label_y);
+
+#ifdef notdef
+ if (region != NULL)
+ XSetClipMask(XtDisplay(gw), gc, (Pixmap)None);
+#endif /* notdef */
+}
+
+static void
+_Reposition(LabelWidget lw, unsigned int width, unsigned int height,
+ Position *dx, Position *dy)
+{
+ Position newPos;
+ Position leftedge = lw->label.internal_width + LEFT_OFFSET(lw);
+
+ switch (lw->label.justify) {
+ case XtJustifyLeft:
+ newPos = leftedge;
+ break;
+ case XtJustifyRight:
+ newPos = width - (lw->label.label_width + lw->label.internal_width);
+ break;
+ case XtJustifyCenter:
+ /*FALLTRHOUGH*/
+ default:
+ newPos = (int)(width - lw->label.label_width) >> 1;
+ break;
+ }
+ if (newPos < (Position)leftedge)
+ newPos = leftedge;
+ *dx = newPos - lw->label.label_x;
+ lw->label.label_x = newPos;
+
+ newPos = (height - lw->label.label_height) >> 1;
+ *dy = newPos - lw->label.label_y;
+ lw->label.label_y = newPos;
+}
+
+static void
+XawLabelResize(Widget w)
+{
+ LabelWidget lw = (LabelWidget)w;
+ Position dx, dy;
+
+ _Reposition(lw, XtWidth(w), XtHeight(w), &dx, &dy);
+ compute_bitmap_offsets(lw);
+}
+
+#define PIXMAP 0
+#define WIDTH 1
+#define HEIGHT 2
+#define NUM_CHECKS 3
+static Boolean
+XawLabelSetValues(Widget current, Widget request, Widget cnew,
+ ArgList args, Cardinal *num_args)
+{
+ LabelWidget curlw = (LabelWidget)current;
+ LabelWidget reqlw = (LabelWidget)request;
+ LabelWidget newlw = (LabelWidget)cnew;
+ unsigned int i;
+ Boolean was_resized = False, redisplay = False, checks[NUM_CHECKS];
+
+ for (i = 0; i < NUM_CHECKS; i++)
+ checks[i] = False;
+
+ for (i = 0; i < *num_args; i++) {
+ if (streq(XtNbitmap, args[i].name))
+ checks[PIXMAP] = True;
+ else if (streq(XtNwidth, args[i].name))
+ checks[WIDTH] = True;
+ else if (streq(XtNheight, args[i].name))
+ checks[HEIGHT] = True;
+ }
+
+ if (newlw->label.label == NULL)
+ newlw->label.label = newlw->core.name;
+
+ /*
+ * resize on bitmap change
+ */
+ if (curlw->label.left_bitmap != newlw->label.left_bitmap)
+ was_resized = True;
+
+ if (curlw->label.encoding != newlw->label.encoding)
+ was_resized = True;
+
+ if (curlw->simple.international
+ && curlw->label.fontset != newlw->label.fontset)
+ was_resized = True;
+
+ if (curlw->label.label != newlw->label.label) {
+ if (curlw->label.label != curlw->core.name)
+ XtFree((char *)curlw->label.label);
+
+ if (newlw->label.label != newlw->core.name)
+ newlw->label.label = XtNewString(newlw->label.label);
+
+ was_resized = True;
+ }
+
+ if (was_resized || (curlw->label.font != newlw->label.font) ||
+ curlw->label.justify != newlw->label.justify || checks[PIXMAP]) {
+ SetTextWidthAndHeight(newlw);
+ was_resized = True;
+ }
+
+ /* recalculate the window size if something has changed */
+ if (newlw->label.resize && was_resized) {
+ if (XtHeight(curlw) == XtHeight(reqlw) && !checks[HEIGHT])
+ XtHeight(newlw) = newlw->label.label_height +
+ (newlw->label.internal_height << 1);
+
+ set_bitmap_info(newlw);
+
+ if (XtWidth(curlw) == XtWidth(reqlw) && !checks[WIDTH])
+ XtWidth(newlw) = newlw->label.label_width + LEFT_OFFSET(newlw) +
+ (newlw->label.internal_width << 1);
+ }
+
+ if (curlw->label.foreground != newlw->label.foreground
+ || curlw->core.background_pixel != newlw->core.background_pixel
+ || curlw->label.font->fid != newlw->label.font->fid) {
+ /* The Fontset is not in the GC - don't make a new GC if FS changes! */
+ XtReleaseGC(cnew, curlw->label.normal_GC);
+ XtReleaseGC(cnew, curlw->label.gray_GC);
+ XmuReleaseStippledPixmap(XtScreen(current), curlw->label.stipple);
+ GetNormalGC(newlw);
+ GetGrayGC(newlw);
+ redisplay = True;
+ }
+
+ if (curlw->label.label_x != newlw->label.label_x ||
+ curlw->label.label_y != newlw->label.label_y)
+ redisplay = True;
+
+ if (curlw->label.internal_width != newlw->label.internal_width
+ || curlw->label.internal_height != newlw->label.internal_height
+ || was_resized) {
+ /* Resize() will be called if geometry changes succeed */
+ Position dx, dy;
+
+ _Reposition(newlw, XtWidth(curlw), XtHeight(curlw), &dx, &dy);
+ }
+
+ return (was_resized || redisplay ||
+ XtIsSensitive(current) != XtIsSensitive(cnew));
+}
+
+static void
+XawLabelDestroy(Widget w)
+{
+ LabelWidget lw = (LabelWidget)w;
+
+ if (lw->label.label != lw->core.name)
+ XtFree(lw->label.label);
+ XtReleaseGC(w, lw->label.normal_GC);
+ XtReleaseGC(w, lw->label.gray_GC);
+ XmuReleaseStippledPixmap(XtScreen(w), lw->label.stipple);
+}
+
+static XtGeometryResult
+XawLabelQueryGeometry(Widget w, XtWidgetGeometry *intended,
+ XtWidgetGeometry *preferred)
+{
+ LabelWidget lw = (LabelWidget)w;
+
+ preferred->request_mode = CWWidth | CWHeight;
+ preferred->width = lw->label.label_width +
+ (lw->label.internal_width << 1) + LEFT_OFFSET(lw);
+ preferred->height = lw->label.label_height +
+ (lw->label.internal_height << 1);
+
+ if (((intended->request_mode & (CWWidth | CWHeight)) == (CWWidth | CWHeight))
+ && intended->width == preferred->width
+ && intended->height == preferred->height)
+ return (XtGeometryYes);
+ else if (preferred->width == XtWidth(w) && preferred->height == XtHeight(w))
+ return (XtGeometryNo);
+
+ return (XtGeometryAlmost);
+}