ULabel.c revision 3a72f200
19027f4a0Smrg/* $XConsortium: Label.c,v 1.97 94/04/17 20:12:12 kaleb Exp $ */ 29027f4a0Smrg 39027f4a0Smrg/*********************************************************** 49027f4a0Smrg 59027f4a0SmrgCopyright (c) 1987, 1988, 1994 X Consortium 69027f4a0Smrg 79027f4a0SmrgPermission is hereby granted, free of charge, to any person obtaining a copy 89027f4a0Smrgof this software and associated documentation files (the "Software"), to deal 99027f4a0Smrgin the Software without restriction, including without limitation the rights 109027f4a0Smrgto use, copy, modify, merge, publish, distribute, sublicense, and/or sell 119027f4a0Smrgcopies of the Software, and to permit persons to whom the Software is 129027f4a0Smrgfurnished to do so, subject to the following conditions: 139027f4a0Smrg 149027f4a0SmrgThe above copyright notice and this permission notice shall be included in 159027f4a0Smrgall copies or substantial portions of the Software. 169027f4a0Smrg 179027f4a0SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 189027f4a0SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 199027f4a0SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 209027f4a0SmrgX CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 219027f4a0SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 229027f4a0SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 239027f4a0Smrg 249027f4a0SmrgExcept as contained in this notice, the name of the X Consortium shall not be 259027f4a0Smrgused in advertising or otherwise to promote the sale, use or other dealings 269027f4a0Smrgin this Software without prior written authorization from the X Consortium. 279027f4a0Smrg 289027f4a0Smrg 299027f4a0SmrgCopyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts. 309027f4a0Smrg 319027f4a0Smrg All Rights Reserved 329027f4a0Smrg 339027f4a0SmrgPermission to use, copy, modify, and distribute this software and its 349027f4a0Smrgdocumentation for any purpose and without fee is hereby granted, 359027f4a0Smrgprovided that the above copyright notice appear in all copies and that 369027f4a0Smrgboth that copyright notice and this permission notice appear in 379027f4a0Smrgsupporting documentation, and that the name of Digital not be 389027f4a0Smrgused in advertising or publicity pertaining to distribution of the 399027f4a0Smrgsoftware without specific, written prior permission. 409027f4a0Smrg 419027f4a0SmrgDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 429027f4a0SmrgALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 439027f4a0SmrgDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 449027f4a0SmrgANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 459027f4a0SmrgWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 469027f4a0SmrgARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 479027f4a0SmrgSOFTWARE. 489027f4a0Smrg 499027f4a0Smrg******************************************************************/ 509027f4a0Smrg/* $XFree86: xc/programs/xfontsel/ULabel.c,v 1.3tsi Exp $ */ 519027f4a0Smrg 529027f4a0Smrg/* 539027f4a0Smrg * ULabel.c - UCSLabel widget 549027f4a0Smrg * 559027f4a0Smrg */ 569027f4a0Smrg 579027f4a0Smrg#include <X11/IntrinsicP.h> 589027f4a0Smrg#include <X11/StringDefs.h> 599027f4a0Smrg#include <X11/Xos.h> 609027f4a0Smrg#include <X11/Xaw/XawInit.h> 619027f4a0Smrg#include "ULabelP.h" 629027f4a0Smrg#include <X11/Xmu/Converters.h> 639027f4a0Smrg#include <X11/Xmu/Drawing.h> 649027f4a0Smrg#include <stdio.h> 659027f4a0Smrg#include <ctype.h> 669027f4a0Smrg/* needed for abs() */ 679027f4a0Smrg#include <stdlib.h> 689027f4a0Smrg 699027f4a0Smrg#define streq(a,b) (strcmp( (a), (b) ) == 0) 709027f4a0Smrg 719027f4a0Smrg#define MULTI_LINE_LABEL 32767 729027f4a0Smrg 739027f4a0Smrg#ifdef CRAY 749027f4a0Smrg#define WORD64 759027f4a0Smrg#endif 769027f4a0Smrg 779027f4a0Smrg/**************************************************************** 789027f4a0Smrg * 799027f4a0Smrg * Full class record constant 809027f4a0Smrg * 819027f4a0Smrg ****************************************************************/ 829027f4a0Smrg 839027f4a0Smrg/* Private Data */ 849027f4a0Smrg 859027f4a0Smrg#define offset(field) XtOffsetOf(UCSLabelRec, field) 869027f4a0Smrgstatic XtResource resources[] = { 879027f4a0Smrg {XtNforeground, XtCForeground, XtRPixel, sizeof(Pixel), 889027f4a0Smrg offset(label.foreground), XtRString, XtDefaultForeground}, 899027f4a0Smrg {XtNfont, XtCFont, XtRFontStruct, sizeof(XFontStruct *), 909027f4a0Smrg offset(label.font),XtRString, XtDefaultFont}, 919027f4a0Smrg {XtNfontSet, XtCFontSet, XtRFontSet, sizeof(XFontSet ), 929027f4a0Smrg offset(label.fontset),XtRString, XtDefaultFontSet}, 939027f4a0Smrg {XtNlabel, XtCLabel, XtRString, sizeof(String), 949027f4a0Smrg offset(label.label), XtRString, NULL}, 959027f4a0Smrg {XtNencoding, XtCEncoding, XtRUnsignedChar, sizeof(unsigned char), 969027f4a0Smrg offset(label.encoding), XtRImmediate, (XtPointer)XawTextEncoding8bit}, 979027f4a0Smrg {XtNjustify, XtCJustify, XtRJustify, sizeof(XtJustify), 989027f4a0Smrg offset(label.justify), XtRImmediate, (XtPointer)XtJustifyCenter}, 999027f4a0Smrg {XtNinternalWidth, XtCWidth, XtRDimension, sizeof(Dimension), 1009027f4a0Smrg offset(label.internal_width), XtRImmediate, (XtPointer)4}, 1019027f4a0Smrg {XtNinternalHeight, XtCHeight, XtRDimension, sizeof(Dimension), 1029027f4a0Smrg offset(label.internal_height), XtRImmediate, (XtPointer)2}, 1039027f4a0Smrg {XtNleftBitmap, XtCLeftBitmap, XtRBitmap, sizeof(Pixmap), 1049027f4a0Smrg offset(label.left_bitmap), XtRImmediate, (XtPointer) None}, 1059027f4a0Smrg {XtNbitmap, XtCPixmap, XtRBitmap, sizeof(Pixmap), 1069027f4a0Smrg offset(label.pixmap), XtRImmediate, (XtPointer)None}, 1079027f4a0Smrg {XtNresize, XtCResize, XtRBoolean, sizeof(Boolean), 1089027f4a0Smrg offset(label.resize), XtRImmediate, (XtPointer)True}, 1099027f4a0Smrg}; 1109027f4a0Smrg#undef offset 1119027f4a0Smrg 1123a72f200Smrgstatic void Initialize(Widget request, Widget new, 1133a72f200Smrg ArgList args, Cardinal *num_args); 1143a72f200Smrgstatic void Resize(Widget w); 1153a72f200Smrgstatic void Redisplay(Widget gw, XEvent *event, Region region); 1163a72f200Smrgstatic Boolean SetValues(Widget current, Widget request, Widget new, 1173a72f200Smrg ArgList args, Cardinal *num_args); 1183a72f200Smrgstatic void ClassInitialize(void); 1193a72f200Smrgstatic void Destroy(Widget w); 1203a72f200Smrgstatic XtGeometryResult QueryGeometry(Widget w, XtWidgetGeometry *intended, 1213a72f200Smrg XtWidgetGeometry *preferred); 1229027f4a0Smrg 1239027f4a0SmrgUCSLabelClassRec ucsLabelClassRec = { 1249027f4a0Smrg { 1259027f4a0Smrg/* core_class fields */ 1269027f4a0Smrg /* superclass */ (WidgetClass) &simpleClassRec, 1279027f4a0Smrg /* class_name */ "UCSLabel", 1289027f4a0Smrg /* widget_size */ sizeof(UCSLabelRec), 1299027f4a0Smrg /* class_initialize */ ClassInitialize, 1309027f4a0Smrg /* class_part_initialize */ NULL, 1319027f4a0Smrg /* class_inited */ FALSE, 1329027f4a0Smrg /* initialize */ Initialize, 1339027f4a0Smrg /* initialize_hook */ NULL, 1349027f4a0Smrg /* realize */ XtInheritRealize, 1359027f4a0Smrg /* actions */ NULL, 1369027f4a0Smrg /* num_actions */ 0, 1379027f4a0Smrg /* resources */ resources, 1389027f4a0Smrg /* num_resources */ XtNumber(resources), 1399027f4a0Smrg /* xrm_class */ NULLQUARK, 1409027f4a0Smrg /* compress_motion */ TRUE, 1419027f4a0Smrg /* compress_exposure */ TRUE, 1429027f4a0Smrg /* compress_enterleave */ TRUE, 1439027f4a0Smrg /* visible_interest */ FALSE, 1449027f4a0Smrg /* destroy */ Destroy, 1459027f4a0Smrg /* resize */ Resize, 1469027f4a0Smrg /* expose */ Redisplay, 1479027f4a0Smrg /* set_values */ SetValues, 1489027f4a0Smrg /* set_values_hook */ NULL, 1499027f4a0Smrg /* set_values_almost */ XtInheritSetValuesAlmost, 1509027f4a0Smrg /* get_values_hook */ NULL, 1519027f4a0Smrg /* accept_focus */ NULL, 1529027f4a0Smrg /* version */ XtVersion, 1539027f4a0Smrg /* callback_private */ NULL, 1549027f4a0Smrg /* tm_table */ NULL, 1559027f4a0Smrg /* query_geometry */ QueryGeometry, 1569027f4a0Smrg /* display_accelerator */ XtInheritDisplayAccelerator, 1579027f4a0Smrg /* extension */ NULL 1589027f4a0Smrg }, 1599027f4a0Smrg/* Simple class fields initialization */ 1609027f4a0Smrg { 1619027f4a0Smrg /* change_sensitive */ XtInheritChangeSensitive 1629027f4a0Smrg }, 1639027f4a0Smrg/* UCSLabel class fields initialization */ 1649027f4a0Smrg { 1659027f4a0Smrg /* ignore */ 0 1669027f4a0Smrg } 1679027f4a0Smrg}; 1689027f4a0SmrgWidgetClass ucsLabelWidgetClass = (WidgetClass)&ucsLabelClassRec; 1699027f4a0Smrg/**************************************************************** 1709027f4a0Smrg * 1719027f4a0Smrg * Private Procedures 1729027f4a0Smrg * 1739027f4a0Smrg ****************************************************************/ 1749027f4a0Smrg 1753a72f200Smrgstatic void ClassInitialize(void) 1769027f4a0Smrg{ 1779027f4a0Smrg XawInitializeWidgetSet(); 1789027f4a0Smrg XtAddConverter( XtRString, XtRJustify, XmuCvtStringToJustify, 1799027f4a0Smrg (XtConvertArgList)NULL, 0 ); 1809027f4a0Smrg} 1819027f4a0Smrg 1829027f4a0Smrgstatic XChar2b *buf2b; 1839027f4a0Smrgstatic int buf2blen = 0; 1849027f4a0Smrg 1859027f4a0Smrg#ifndef WORD64 1869027f4a0Smrg 1879027f4a0Smrg#define TXT16 XChar2b 1889027f4a0Smrg 1899027f4a0Smrg#else 1909027f4a0Smrg 1919027f4a0Smrg#define TXT16 char 1929027f4a0Smrg 1933a72f200Smrgstatic int _XawLabelWidth16(XFontStruct *fs, char *str, int n) 1949027f4a0Smrg{ 1959027f4a0Smrg int i; 1969027f4a0Smrg XChar2b *ptr; 1979027f4a0Smrg 1989027f4a0Smrg if (n > buf2blen) { 1999027f4a0Smrg buf2b = (XChar2b *)XtRealloc((char *)buf2b, n * sizeof(XChar2b)); 2009027f4a0Smrg buf2blen = n; 2019027f4a0Smrg } 2029027f4a0Smrg for (ptr = buf2b, i = n; --i >= 0; ptr++) { 2039027f4a0Smrg ptr->byte1 = *str++; 2049027f4a0Smrg ptr->byte2 = *str++; 2059027f4a0Smrg } 2069027f4a0Smrg return XTextWidth16(fs, buf2b, n); 2079027f4a0Smrg} 2089027f4a0Smrg 2093a72f200Smrgstatic void _XawLabelDraw16(Display *dpy, Drawable d, GC gc, 2103a72f200Smrg int x, int y, char *str, int n) 2119027f4a0Smrg{ 2129027f4a0Smrg int i; 2139027f4a0Smrg XChar2b *ptr; 2149027f4a0Smrg 2159027f4a0Smrg if (n > buf2blen) { 2169027f4a0Smrg buf2b = (XChar2b *)XtRealloc((char *)buf2b, n * sizeof(XChar2b)); 2179027f4a0Smrg buf2blen = n; 2189027f4a0Smrg } 2199027f4a0Smrg for (ptr = buf2b, i = n; --i >= 0; ptr++) { 2209027f4a0Smrg ptr->byte1 = *str++; 2219027f4a0Smrg ptr->byte2 = *str++; 2229027f4a0Smrg } 2239027f4a0Smrg XDrawString16(dpy, d, gc, x, y, buf2b, n); 2249027f4a0Smrg} 2259027f4a0Smrg 2269027f4a0Smrg#define XTextWidth16 _XawLabelWidth16 2279027f4a0Smrg#define XDrawString16 _XawLabelDraw16 2289027f4a0Smrg 2299027f4a0Smrg#endif /* WORD64 */ 2309027f4a0Smrg 2313a72f200Smrgstatic void _XawLabelDrawUCS(Display *dpy, Drawable d, GC gc, 2323a72f200Smrg int x, int y, char *str, int n) 2339027f4a0Smrg{ 2349027f4a0Smrg char *ep; 2359027f4a0Smrg unsigned short codepoint; 2369027f4a0Smrg XChar2b *ptr; 2379027f4a0Smrg 2389027f4a0Smrg /* 2399027f4a0Smrg * Convert to UCS2 string on the fly. 2409027f4a0Smrg */ 2419027f4a0Smrg 2429027f4a0Smrg if (n > buf2blen) { 2439027f4a0Smrg buf2b = (XChar2b *)XtRealloc((char *)buf2b, n * sizeof(XChar2b)); 2449027f4a0Smrg buf2blen = n; 2459027f4a0Smrg } 2469027f4a0Smrg ep = str + n; 2479027f4a0Smrg for (ptr = buf2b; str < ep; ptr++) { 2489027f4a0Smrg if((str[0]&0x80)==0) { 2499027f4a0Smrg codepoint=str[0]; 2509027f4a0Smrg str++; 2519027f4a0Smrg } else if((str[0]&0x20)==0) { 2529027f4a0Smrg codepoint=(str[0]&0x1F)<<6 | (str[1]&0x3F); 2539027f4a0Smrg str+=2; 2549027f4a0Smrg } else if((str[0]&0x10)==0) { 2559027f4a0Smrg codepoint=(str[0]&0x0F)<<12 | (str[1]&0x3F)<<6 | (str[2]&0x3F); 2569027f4a0Smrg str+=3; 2579027f4a0Smrg } else { /* wrong UTF-8 */ 2589027f4a0Smrg codepoint=(unsigned)'?'; 2599027f4a0Smrg str++; 2609027f4a0Smrg } 2619027f4a0Smrg ptr->byte1 = (codepoint >> 8) & 0xff;; 2629027f4a0Smrg ptr->byte2 = codepoint & 0xff; 2639027f4a0Smrg } 2649027f4a0Smrg XDrawString16(dpy, d, gc, x, y, buf2b, ptr - buf2b); 2659027f4a0Smrg} 2669027f4a0Smrg 2679027f4a0Smrgstatic int _XawLabelWidthUCS( 2689027f4a0Smrg XFontStruct *fs, 2699027f4a0Smrg char *str, 2709027f4a0Smrg int n 2719027f4a0Smrg) 2729027f4a0Smrg{ 2739027f4a0Smrg char *ep; 2749027f4a0Smrg unsigned short codepoint; 2759027f4a0Smrg XChar2b *ptr; 2769027f4a0Smrg 2779027f4a0Smrg /* 2789027f4a0Smrg * Convert to UCS2 string on the fly. 2799027f4a0Smrg */ 2809027f4a0Smrg 2819027f4a0Smrg if (n > buf2blen) { 2829027f4a0Smrg buf2b = (XChar2b *)XtRealloc((char *)buf2b, n * sizeof(XChar2b)); 2839027f4a0Smrg buf2blen = n; 2849027f4a0Smrg } 2859027f4a0Smrg ep = str + n; 2869027f4a0Smrg for (ptr = buf2b; str < ep; ptr++) { 2879027f4a0Smrg if((str[0]&0x80)==0) { 2889027f4a0Smrg codepoint=str[0]; 2899027f4a0Smrg str++; 2909027f4a0Smrg } else if((str[0]&0x20)==0) { 2919027f4a0Smrg codepoint=(str[0]&0x1F)<<6 | (str[1]&0x3F); 2929027f4a0Smrg str+=2; 2939027f4a0Smrg } else if((str[0]&0x10)==0) { 2949027f4a0Smrg codepoint=(str[0]&0x0F)<<12 | (str[1]&0x3F)<<6 | (str[2]&0x3F); 2959027f4a0Smrg str+=3; 2969027f4a0Smrg } else { /* wrong UTF-8 */ 2979027f4a0Smrg codepoint=(unsigned)'?'; 2989027f4a0Smrg str++; 2999027f4a0Smrg } 3009027f4a0Smrg ptr->byte1 = (codepoint >> 8) & 0xff;; 3019027f4a0Smrg ptr->byte2 = codepoint & 0xff; 3029027f4a0Smrg } 3039027f4a0Smrg return XTextWidth16(fs, buf2b, ptr - buf2b); 3049027f4a0Smrg} 3059027f4a0Smrg 3069027f4a0Smrg#define XTextWidthUCS _XawLabelWidthUCS 3079027f4a0Smrg#define XDrawStringUCS _XawLabelDrawUCS 3089027f4a0Smrg 3099027f4a0Smrg/* 3109027f4a0Smrg * Calculate width and height of displayed text in pixels 3119027f4a0Smrg */ 3129027f4a0Smrg 3133a72f200Smrgstatic void SetTextWidthAndHeight(UCSLabelWidget lw) 3149027f4a0Smrg{ 3159027f4a0Smrg XFontStruct *fs = lw->label.font; 3169027f4a0Smrg 3179027f4a0Smrg char *nl; 3189027f4a0Smrg 3199027f4a0Smrg if (lw->label.pixmap != None) { 3209027f4a0Smrg Window root; 3219027f4a0Smrg int x, y; 3229027f4a0Smrg unsigned int width, height, bw, depth; 3239027f4a0Smrg if (XGetGeometry(XtDisplay(lw), lw->label.pixmap, &root, &x, &y, 3249027f4a0Smrg &width, &height, &bw, &depth)) { 3259027f4a0Smrg lw->label.label_height = height; 3269027f4a0Smrg lw->label.label_width = width; 3279027f4a0Smrg lw->label.label_len = depth; 3289027f4a0Smrg return; 3299027f4a0Smrg } 3309027f4a0Smrg } 3319027f4a0Smrg if ( lw->simple.international == True ) { 3329027f4a0Smrg 3339027f4a0Smrg XFontSet fset = lw->label.fontset; 3349027f4a0Smrg XFontSetExtents *ext = XExtentsOfFontSet(fset); 3359027f4a0Smrg 3369027f4a0Smrg lw->label.label_height = ext->max_ink_extent.height; 3379027f4a0Smrg if (lw->label.label == NULL) { 3389027f4a0Smrg lw->label.label_len = 0; 3399027f4a0Smrg lw->label.label_width = 0; 3409027f4a0Smrg } 3419027f4a0Smrg else if ((nl = index(lw->label.label, '\n')) != NULL) { 3429027f4a0Smrg char *label; 3439027f4a0Smrg lw->label.label_len = MULTI_LINE_LABEL; 3449027f4a0Smrg lw->label.label_width = 0; 3459027f4a0Smrg for (label = lw->label.label; nl != NULL; nl = index(label, '\n')) { 3469027f4a0Smrg int width = XmbTextEscapement(fset, label, (int)(nl - label)); 3479027f4a0Smrg 3489027f4a0Smrg if (width > (int)lw->label.label_width) 3499027f4a0Smrg lw->label.label_width = width; 3509027f4a0Smrg label = nl + 1; 3519027f4a0Smrg if (*label) 3529027f4a0Smrg lw->label.label_height += 3539027f4a0Smrg ext->max_ink_extent.height; 3549027f4a0Smrg } 3559027f4a0Smrg if (*label) { 3569027f4a0Smrg int width = XmbTextEscapement(fset, label, strlen(label)); 3579027f4a0Smrg 3589027f4a0Smrg if (width > (int) lw->label.label_width) 3599027f4a0Smrg lw->label.label_width = width; 3609027f4a0Smrg } 3619027f4a0Smrg } else { 3629027f4a0Smrg lw->label.label_len = strlen(lw->label.label); 3639027f4a0Smrg lw->label.label_width = 3649027f4a0Smrg XmbTextEscapement(fset, lw->label.label, (int) lw->label.label_len); 3659027f4a0Smrg } 3669027f4a0Smrg 3679027f4a0Smrg } else { 3689027f4a0Smrg 3699027f4a0Smrg lw->label.label_height = fs->max_bounds.ascent + fs->max_bounds.descent; 3709027f4a0Smrg if (lw->label.label == NULL) { 3719027f4a0Smrg lw->label.label_len = 0; 3729027f4a0Smrg lw->label.label_width = 0; 3739027f4a0Smrg } 3749027f4a0Smrg else if ((nl = index(lw->label.label, '\n')) != NULL) { 3759027f4a0Smrg char *label; 3769027f4a0Smrg lw->label.label_len = MULTI_LINE_LABEL; 3779027f4a0Smrg lw->label.label_width = 0; 3789027f4a0Smrg for (label = lw->label.label; nl != NULL; nl = index(label, '\n')) { 3799027f4a0Smrg int width; 3809027f4a0Smrg 3819027f4a0Smrg if (lw->label.encoding == XawTextEncodingChar2b) 3829027f4a0Smrg width = XTextWidth16(fs, (TXT16*)label, (int)(nl - label)/2); 3839027f4a0Smrg else if (lw->label.encoding == XawTextEncodingUCS) 3849027f4a0Smrg width = XTextWidthUCS(fs, label, nl - label); 3859027f4a0Smrg else 3869027f4a0Smrg width = XTextWidth(fs, label, (int)(nl - label)); 3879027f4a0Smrg if (width > (int)lw->label.label_width) 3889027f4a0Smrg lw->label.label_width = width; 3899027f4a0Smrg label = nl + 1; 3909027f4a0Smrg if (*label) 3919027f4a0Smrg lw->label.label_height += 3929027f4a0Smrg fs->max_bounds.ascent + fs->max_bounds.descent; 3939027f4a0Smrg } 3949027f4a0Smrg if (*label) { 3959027f4a0Smrg int width; 3969027f4a0Smrg 3979027f4a0Smrg if (lw->label.encoding == XawTextEncodingChar2b) 3989027f4a0Smrg width = XTextWidth16(fs, (TXT16*)label, (int)strlen(label)/2); 3999027f4a0Smrg else if (lw->label.encoding == XawTextEncodingUCS) 4009027f4a0Smrg width = XTextWidthUCS(fs, label, strlen(label)); 4019027f4a0Smrg else 4029027f4a0Smrg width = XTextWidth(fs, label, strlen(label)); 4039027f4a0Smrg if (width > (int) lw->label.label_width) 4049027f4a0Smrg lw->label.label_width = width; 4059027f4a0Smrg } 4069027f4a0Smrg } else { 4079027f4a0Smrg lw->label.label_len = strlen(lw->label.label); 4089027f4a0Smrg if (lw->label.encoding == XawTextEncodingChar2b) 4099027f4a0Smrg lw->label.label_width = 4109027f4a0Smrg XTextWidth16(fs, (TXT16*)lw->label.label, 4119027f4a0Smrg (int) lw->label.label_len/2); 4129027f4a0Smrg else if (lw->label.encoding == XawTextEncodingUCS) 4139027f4a0Smrg lw->label.label_width = XTextWidthUCS(fs, lw->label.label, 4149027f4a0Smrg lw->label.label_len); 4159027f4a0Smrg else 4169027f4a0Smrg lw->label.label_width = 4179027f4a0Smrg XTextWidth(fs, lw->label.label, (int) lw->label.label_len); 4189027f4a0Smrg } 4199027f4a0Smrg 4209027f4a0Smrg } 4219027f4a0Smrg} 4229027f4a0Smrg 4233a72f200Smrgstatic void GetnormalGC(UCSLabelWidget lw) 4249027f4a0Smrg{ 4259027f4a0Smrg XGCValues values; 4269027f4a0Smrg 4279027f4a0Smrg values.foreground = lw->label.foreground; 4289027f4a0Smrg values.background = lw->core.background_pixel; 4299027f4a0Smrg values.font = lw->label.font->fid; 4309027f4a0Smrg values.graphics_exposures = False; 4319027f4a0Smrg 4329027f4a0Smrg if ( lw->simple.international == True ) 4339027f4a0Smrg /* Since Xmb/wcDrawString eats the font, I must use XtAllocateGC. */ 4349027f4a0Smrg lw->label.normal_GC = XtAllocateGC( 4359027f4a0Smrg (Widget)lw, 0, 4369027f4a0Smrg (unsigned) GCForeground | GCBackground | GCGraphicsExposures, 4379027f4a0Smrg &values, GCFont, 0 ); 4389027f4a0Smrg else 4399027f4a0Smrg lw->label.normal_GC = XtGetGC( 4409027f4a0Smrg (Widget)lw, 4419027f4a0Smrg (unsigned) GCForeground | GCBackground | GCFont | GCGraphicsExposures, 4429027f4a0Smrg &values); 4439027f4a0Smrg} 4449027f4a0Smrg 4453a72f200Smrgstatic void GetgrayGC(UCSLabelWidget lw) 4469027f4a0Smrg{ 4479027f4a0Smrg XGCValues values; 4489027f4a0Smrg 4499027f4a0Smrg values.foreground = lw->label.foreground; 4509027f4a0Smrg values.background = lw->core.background_pixel; 4519027f4a0Smrg values.font = lw->label.font->fid; 4529027f4a0Smrg values.fill_style = FillTiled; 4539027f4a0Smrg values.tile = XmuCreateStippledPixmap(XtScreen((Widget)lw), 4549027f4a0Smrg lw->label.foreground, 4559027f4a0Smrg lw->core.background_pixel, 4569027f4a0Smrg lw->core.depth); 4579027f4a0Smrg values.graphics_exposures = False; 4589027f4a0Smrg 4599027f4a0Smrg lw->label.stipple = values.tile; 4609027f4a0Smrg if ( lw->simple.international == True ) 4619027f4a0Smrg /* Since Xmb/wcDrawString eats the font, I must use XtAllocateGC. */ 4629027f4a0Smrg lw->label.gray_GC = XtAllocateGC((Widget)lw, 0, 4639027f4a0Smrg (unsigned) GCForeground | GCBackground | 4649027f4a0Smrg GCTile | GCFillStyle | 4659027f4a0Smrg GCGraphicsExposures, 4669027f4a0Smrg &values, GCFont, 0); 4679027f4a0Smrg else 4689027f4a0Smrg lw->label.gray_GC = XtGetGC((Widget)lw, 4699027f4a0Smrg (unsigned) GCForeground | GCBackground | 4709027f4a0Smrg GCFont | GCTile | GCFillStyle | 4719027f4a0Smrg GCGraphicsExposures, 4729027f4a0Smrg &values); 4739027f4a0Smrg} 4749027f4a0Smrg 4753a72f200Smrgstatic void compute_bitmap_offsets(UCSLabelWidget lw) 4769027f4a0Smrg{ 4779027f4a0Smrg /* 4789027f4a0Smrg * bitmap will be eventually be displayed at 4799027f4a0Smrg * (internal_width, internal_height + lbm_y) 4809027f4a0Smrg */ 4819027f4a0Smrg if (lw->label.lbm_height != 0) { 4829027f4a0Smrg lw->label.lbm_y = (lw->core.height - 4839027f4a0Smrg (lw->label.internal_height * 2 + 4849027f4a0Smrg lw->label.lbm_height)) / 2; 4859027f4a0Smrg } else { 4869027f4a0Smrg lw->label.lbm_y = 0; 4879027f4a0Smrg } 4889027f4a0Smrg} 4899027f4a0Smrg 4909027f4a0Smrg 4913a72f200Smrgstatic void set_bitmap_info(UCSLabelWidget lw) 4929027f4a0Smrg{ 4939027f4a0Smrg Window root; 4949027f4a0Smrg int x, y; 4959027f4a0Smrg unsigned int bw, depth; 4969027f4a0Smrg 4979027f4a0Smrg if (!(lw->label.left_bitmap && 4989027f4a0Smrg XGetGeometry (XtDisplay(lw), lw->label.left_bitmap, &root, &x, &y, 4999027f4a0Smrg &lw->label.lbm_width, &lw->label.lbm_height, 5009027f4a0Smrg &bw, &depth))) { 5019027f4a0Smrg lw->label.lbm_width = lw->label.lbm_height = 0; 5029027f4a0Smrg } 5039027f4a0Smrg compute_bitmap_offsets (lw); 5049027f4a0Smrg} 5059027f4a0Smrg 5069027f4a0Smrg 5079027f4a0Smrg 5089027f4a0Smrg/* ARGSUSED */ 5093a72f200Smrgstatic void 5103a72f200SmrgInitialize(Widget request, Widget new, ArgList args, Cardinal *num_args) 5119027f4a0Smrg{ 5129027f4a0Smrg UCSLabelWidget lw = (UCSLabelWidget) new; 5139027f4a0Smrg 5149027f4a0Smrg if (lw->label.label == NULL) 5159027f4a0Smrg lw->label.label = XtNewString(lw->core.name); 5169027f4a0Smrg else { 5179027f4a0Smrg lw->label.label = XtNewString(lw->label.label); 5189027f4a0Smrg } 5199027f4a0Smrg 5209027f4a0Smrg GetnormalGC(lw); 5219027f4a0Smrg GetgrayGC(lw); 5229027f4a0Smrg 5239027f4a0Smrg SetTextWidthAndHeight(lw); 5249027f4a0Smrg 5259027f4a0Smrg if (lw->core.height == 0) 5269027f4a0Smrg lw->core.height = lw->label.label_height + 5279027f4a0Smrg 2 * lw->label.internal_height; 5289027f4a0Smrg 5299027f4a0Smrg set_bitmap_info (lw); /* need core.height */ 5309027f4a0Smrg 5319027f4a0Smrg if (lw->core.width == 0) /* need label.lbm_width */ 5329027f4a0Smrg lw->core.width = (lw->label.label_width + 5339027f4a0Smrg 2 * lw->label.internal_width + 5349027f4a0Smrg LEFT_OFFSET(lw)); 5359027f4a0Smrg 5369027f4a0Smrg lw->label.label_x = lw->label.label_y = 0; 5379027f4a0Smrg (*XtClass(new)->core_class.resize) ((Widget)lw); 5389027f4a0Smrg 5399027f4a0Smrg} /* Initialize */ 5409027f4a0Smrg 5419027f4a0Smrg/* 5429027f4a0Smrg * Repaint the widget window 5439027f4a0Smrg */ 5449027f4a0Smrg 5459027f4a0Smrg/* ARGSUSED */ 5463a72f200Smrgstatic void Redisplay(Widget gw, XEvent *event, Region region) 5479027f4a0Smrg{ 5489027f4a0Smrg UCSLabelWidget w = (UCSLabelWidget) gw; 5499027f4a0Smrg GC gc; 5509027f4a0Smrg 5519027f4a0Smrg /* 5529027f4a0Smrg * now we'll see if we need to draw the rest of the label 5539027f4a0Smrg */ 5549027f4a0Smrg if (region != NULL) { 5559027f4a0Smrg int x = w->label.label_x; 5569027f4a0Smrg unsigned int width = w->label.label_width; 5579027f4a0Smrg if (w->label.lbm_width) { 5589027f4a0Smrg if (w->label.label_x > (x = w->label.internal_width)) 5599027f4a0Smrg width += w->label.label_x - x; 5609027f4a0Smrg } 5619027f4a0Smrg if (XRectInRegion(region, x, w->label.label_y, 5629027f4a0Smrg width, w->label.label_height) == RectangleOut){ 5639027f4a0Smrg return; 5649027f4a0Smrg } 5659027f4a0Smrg } 5669027f4a0Smrg 5679027f4a0Smrg gc = XtIsSensitive(gw) ? w->label.normal_GC : w->label.gray_GC; 5689027f4a0Smrg#ifdef notdef 5699027f4a0Smrg if (region != NULL) 5709027f4a0Smrg XSetRegion(XtDisplay(gw), gc, region); 5719027f4a0Smrg#endif /*notdef*/ 5729027f4a0Smrg 5739027f4a0Smrg if (w->label.pixmap == None) { 5749027f4a0Smrg int len = w->label.label_len; 5759027f4a0Smrg char *label = w->label.label; 5769027f4a0Smrg Position y = w->label.label_y + w->label.font->max_bounds.ascent; 5779027f4a0Smrg Position ksy = w->label.label_y; 5789027f4a0Smrg 5799027f4a0Smrg /* display left bitmap */ 5809027f4a0Smrg if (w->label.left_bitmap && w->label.lbm_width != 0) { 5819027f4a0Smrg XCopyPlane (XtDisplay(gw), w->label.left_bitmap, XtWindow(gw), gc, 5829027f4a0Smrg 0, 0, w->label.lbm_width, w->label.lbm_height, 5839027f4a0Smrg (int) w->label.internal_width, 5849027f4a0Smrg (int) w->label.internal_height + w->label.lbm_y, 5859027f4a0Smrg (unsigned long) 1L); 5869027f4a0Smrg } 5879027f4a0Smrg 5889027f4a0Smrg if ( w->simple.international == True ) { 5899027f4a0Smrg 5909027f4a0Smrg XFontSetExtents *ext = XExtentsOfFontSet(w->label.fontset); 5919027f4a0Smrg 5929027f4a0Smrg ksy += abs(ext->max_ink_extent.y); 5939027f4a0Smrg 5949027f4a0Smrg if (len == MULTI_LINE_LABEL) { 5959027f4a0Smrg char *nl; 5969027f4a0Smrg while ((nl = index(label, '\n')) != NULL) { 5979027f4a0Smrg XmbDrawString(XtDisplay(w), XtWindow(w), w->label.fontset, gc, 5989027f4a0Smrg w->label.label_x, ksy, label, (int)(nl - label)); 5999027f4a0Smrg ksy += ext->max_ink_extent.height; 6009027f4a0Smrg label = nl + 1; 6019027f4a0Smrg } 6029027f4a0Smrg len = strlen(label); 6039027f4a0Smrg } 6049027f4a0Smrg if (len) 6059027f4a0Smrg XmbDrawString(XtDisplay(w), XtWindow(w), w->label.fontset, gc, 6069027f4a0Smrg w->label.label_x, ksy, label, len); 6079027f4a0Smrg 6089027f4a0Smrg } else { /*international false, so use R5 routine */ 6099027f4a0Smrg 6109027f4a0Smrg if (len == MULTI_LINE_LABEL) { 6119027f4a0Smrg char *nl; 6129027f4a0Smrg while ((nl = index(label, '\n')) != NULL) { 6139027f4a0Smrg if (w->label.encoding == XawTextEncodingChar2b) 6149027f4a0Smrg XDrawString16(XtDisplay(gw), XtWindow(gw), gc, 6159027f4a0Smrg w->label.label_x, y, 6169027f4a0Smrg (TXT16*)label, (int)(nl - label)/2); 6179027f4a0Smrg else if (w->label.encoding == XawTextEncodingUCS) 6189027f4a0Smrg XDrawStringUCS(XtDisplay(gw), XtWindow(gw), gc, 6199027f4a0Smrg w->label.label_x, y, label, (int)(nl - label)); 6209027f4a0Smrg else 6219027f4a0Smrg XDrawString(XtDisplay(gw), XtWindow(gw), gc, 6229027f4a0Smrg w->label.label_x, y, label, (int)(nl - label)); 6239027f4a0Smrg y += w->label.font->max_bounds.ascent + 6249027f4a0Smrg w->label.font->max_bounds.descent; 6259027f4a0Smrg label = nl + 1; 6269027f4a0Smrg } 6279027f4a0Smrg len = strlen(label); 6289027f4a0Smrg } 6299027f4a0Smrg if (len) { 6309027f4a0Smrg if (w->label.encoding == XawTextEncodingChar2b) 6319027f4a0Smrg XDrawString16(XtDisplay(gw), XtWindow(gw), gc, 6329027f4a0Smrg w->label.label_x, y, (TXT16*)label, len/2); 6339027f4a0Smrg else if (w->label.encoding == XawTextEncodingUCS) 6349027f4a0Smrg XDrawStringUCS(XtDisplay(gw), XtWindow(gw), gc, 6359027f4a0Smrg w->label.label_x, y, label, len); 6369027f4a0Smrg else 6379027f4a0Smrg XDrawString(XtDisplay(gw), XtWindow(gw), gc, 6389027f4a0Smrg w->label.label_x, y, label, len); 6399027f4a0Smrg } 6409027f4a0Smrg 6419027f4a0Smrg } /*endif international*/ 6429027f4a0Smrg 6439027f4a0Smrg } else if (w->label.label_len == 1) { /* depth */ 6449027f4a0Smrg XCopyPlane(XtDisplay(gw), w->label.pixmap, XtWindow(gw), gc, 6459027f4a0Smrg 0, 0, w->label.label_width, w->label.label_height, 6469027f4a0Smrg w->label.label_x, w->label.label_y, 1L); 6479027f4a0Smrg } else { 6489027f4a0Smrg XCopyArea(XtDisplay(gw), w->label.pixmap, XtWindow(gw), gc, 6499027f4a0Smrg 0, 0, w->label.label_width, w->label.label_height, 6509027f4a0Smrg w->label.label_x, w->label.label_y); 6519027f4a0Smrg } 6529027f4a0Smrg 6539027f4a0Smrg#ifdef notdef 6549027f4a0Smrg if (region != NULL) 6559027f4a0Smrg XSetClipMask(XtDisplay(gw), gc, (Pixmap)None); 6569027f4a0Smrg#endif /* notdef */ 6579027f4a0Smrg} 6589027f4a0Smrg 6593a72f200Smrgstatic void _Reposition(UCSLabelWidget lw, Dimension width, Dimension height, 6603a72f200Smrg Position *dx, Position *dy) 6619027f4a0Smrg{ 6629027f4a0Smrg Position newPos; 6639027f4a0Smrg Position leftedge = lw->label.internal_width + LEFT_OFFSET(lw); 6649027f4a0Smrg 6659027f4a0Smrg switch (lw->label.justify) { 6669027f4a0Smrg 6679027f4a0Smrg case XtJustifyLeft : 6689027f4a0Smrg newPos = leftedge; 6699027f4a0Smrg break; 6709027f4a0Smrg 6719027f4a0Smrg case XtJustifyRight : 6729027f4a0Smrg newPos = width - 6739027f4a0Smrg (lw->label.label_width + lw->label.internal_width); 6749027f4a0Smrg break; 6759027f4a0Smrg 6769027f4a0Smrg case XtJustifyCenter : 6779027f4a0Smrg default: 6789027f4a0Smrg newPos = (int)(width - lw->label.label_width) / 2; 6799027f4a0Smrg break; 6809027f4a0Smrg } 6819027f4a0Smrg if (newPos < (Position)leftedge) 6829027f4a0Smrg newPos = leftedge; 6839027f4a0Smrg *dx = newPos - lw->label.label_x; 6849027f4a0Smrg lw->label.label_x = newPos; 6859027f4a0Smrg *dy = (newPos = (int)(height - lw->label.label_height) / 2) 6869027f4a0Smrg - lw->label.label_y; 6879027f4a0Smrg lw->label.label_y = newPos; 6889027f4a0Smrg return; 6899027f4a0Smrg} 6909027f4a0Smrg 6913a72f200Smrgstatic void Resize(Widget w) 6929027f4a0Smrg{ 6939027f4a0Smrg UCSLabelWidget lw = (UCSLabelWidget)w; 6949027f4a0Smrg Position dx, dy; 6959027f4a0Smrg 6969027f4a0Smrg _Reposition(lw, w->core.width, w->core.height, &dx, &dy); 6979027f4a0Smrg compute_bitmap_offsets (lw); 6989027f4a0Smrg} 6999027f4a0Smrg 7009027f4a0Smrg/* 7019027f4a0Smrg * Set specified arguments into widget 7029027f4a0Smrg */ 7039027f4a0Smrg 7049027f4a0Smrg#define PIXMAP 0 7059027f4a0Smrg#define WIDTH 1 7069027f4a0Smrg#define HEIGHT 2 7079027f4a0Smrg#define NUM_CHECKS 3 7089027f4a0Smrg 7093a72f200Smrgstatic Boolean 7103a72f200SmrgSetValues(Widget current, Widget request, Widget new, 7113a72f200Smrg ArgList args, Cardinal *num_args) 7129027f4a0Smrg{ 7139027f4a0Smrg UCSLabelWidget curlw = (UCSLabelWidget) current; 7149027f4a0Smrg UCSLabelWidget reqlw = (UCSLabelWidget) request; 7159027f4a0Smrg UCSLabelWidget newlw = (UCSLabelWidget) new; 7169027f4a0Smrg int i; 7179027f4a0Smrg Boolean was_resized = False, redisplay = False, checks[NUM_CHECKS]; 7189027f4a0Smrg 7199027f4a0Smrg for (i = 0; i < NUM_CHECKS; i++) 7209027f4a0Smrg checks[i] = FALSE; 7219027f4a0Smrg 7229027f4a0Smrg for (i = 0; i < *num_args; i++) { 7239027f4a0Smrg if (streq(XtNbitmap, args[i].name)) 7249027f4a0Smrg checks[PIXMAP] = TRUE; 7259027f4a0Smrg if (streq(XtNwidth, args[i].name)) 7269027f4a0Smrg checks[WIDTH] = TRUE; 7279027f4a0Smrg if (streq(XtNheight, args[i].name)) 7289027f4a0Smrg checks[HEIGHT] = TRUE; 7299027f4a0Smrg } 7309027f4a0Smrg 7319027f4a0Smrg if (newlw->label.label == NULL) { 7329027f4a0Smrg newlw->label.label = newlw->core.name; 7339027f4a0Smrg } 7349027f4a0Smrg 7359027f4a0Smrg /* 7369027f4a0Smrg * resize on bitmap change 7379027f4a0Smrg */ 7389027f4a0Smrg if (curlw->label.left_bitmap != newlw->label.left_bitmap) { 7399027f4a0Smrg was_resized = True; 7409027f4a0Smrg } 7419027f4a0Smrg 7429027f4a0Smrg if (curlw->label.encoding != newlw->label.encoding) 7439027f4a0Smrg was_resized = True; 7449027f4a0Smrg 7459027f4a0Smrg if ( (curlw->label.fontset != newlw->label.fontset) && 7469027f4a0Smrg curlw->simple.international ){ 7479027f4a0Smrg was_resized = True; 7489027f4a0Smrg } 7499027f4a0Smrg if (curlw->label.label != newlw->label.label) { 7509027f4a0Smrg if (curlw->label.label != curlw->core.name) 7519027f4a0Smrg XtFree( (char *)curlw->label.label ); 7529027f4a0Smrg 7539027f4a0Smrg if (newlw->label.label != newlw->core.name) { 7549027f4a0Smrg newlw->label.label = XtNewString( newlw->label.label ); 7559027f4a0Smrg } 7569027f4a0Smrg was_resized = True; 7579027f4a0Smrg } 7589027f4a0Smrg 7599027f4a0Smrg if (was_resized || (curlw->label.font != newlw->label.font) || 7609027f4a0Smrg (curlw->label.justify != newlw->label.justify) || checks[PIXMAP]) { 7619027f4a0Smrg 7629027f4a0Smrg SetTextWidthAndHeight(newlw); 7639027f4a0Smrg was_resized = True; 7649027f4a0Smrg } 7659027f4a0Smrg 7669027f4a0Smrg /* recalculate the window size if something has changed. */ 7679027f4a0Smrg if (newlw->label.resize && was_resized) { 7689027f4a0Smrg if ((curlw->core.height == reqlw->core.height) && !checks[HEIGHT]) 7699027f4a0Smrg newlw->core.height = (newlw->label.label_height + 7709027f4a0Smrg 2 * newlw->label.internal_height); 7719027f4a0Smrg 7729027f4a0Smrg set_bitmap_info (newlw); 7739027f4a0Smrg 7749027f4a0Smrg if ((curlw->core.width == reqlw->core.width) && !checks[WIDTH]) 7759027f4a0Smrg newlw->core.width = (newlw->label.label_width + 7769027f4a0Smrg LEFT_OFFSET(newlw) + 7779027f4a0Smrg 2 * newlw->label.internal_width); 7789027f4a0Smrg } 7799027f4a0Smrg 7809027f4a0Smrg if (curlw->label.foreground != newlw->label.foreground 7819027f4a0Smrg || curlw->core.background_pixel != newlw->core.background_pixel 7829027f4a0Smrg || curlw->label.font->fid != newlw->label.font->fid ) { 7839027f4a0Smrg 7849027f4a0Smrg /* The Fontset is not in the GC - don't make a new GC if FS changes! */ 7859027f4a0Smrg 7869027f4a0Smrg XtReleaseGC(new, curlw->label.normal_GC); 7879027f4a0Smrg XtReleaseGC(new, curlw->label.gray_GC); 7889027f4a0Smrg XmuReleaseStippledPixmap( XtScreen(current), curlw->label.stipple ); 7899027f4a0Smrg GetnormalGC(newlw); 7909027f4a0Smrg GetgrayGC(newlw); 7919027f4a0Smrg redisplay = True; 7929027f4a0Smrg } 7939027f4a0Smrg 7949027f4a0Smrg if ((curlw->label.internal_width != newlw->label.internal_width) 7959027f4a0Smrg || (curlw->label.internal_height != newlw->label.internal_height) 7969027f4a0Smrg || was_resized) { 7979027f4a0Smrg /* Resize() will be called if geometry changes succeed */ 7989027f4a0Smrg Position dx, dy; 7999027f4a0Smrg _Reposition(newlw, curlw->core.width, curlw->core.height, &dx, &dy); 8009027f4a0Smrg } 8019027f4a0Smrg 8029027f4a0Smrg return was_resized || redisplay || 8039027f4a0Smrg XtIsSensitive(current) != XtIsSensitive(new); 8049027f4a0Smrg} 8059027f4a0Smrg 8063a72f200Smrgstatic void Destroy(Widget w) 8079027f4a0Smrg{ 8089027f4a0Smrg UCSLabelWidget lw = (UCSLabelWidget)w; 8099027f4a0Smrg 8109027f4a0Smrg if ( lw->label.label != lw->core.name ) 8119027f4a0Smrg XtFree( lw->label.label ); 8129027f4a0Smrg XtReleaseGC( w, lw->label.normal_GC ); 8139027f4a0Smrg XtReleaseGC( w, lw->label.gray_GC); 8149027f4a0Smrg XmuReleaseStippledPixmap( XtScreen(w), lw->label.stipple ); 8159027f4a0Smrg} 8169027f4a0Smrg 8179027f4a0Smrg 8183a72f200Smrgstatic XtGeometryResult 8193a72f200SmrgQueryGeometry(Widget w, XtWidgetGeometry *intended, XtWidgetGeometry *preferred) 8209027f4a0Smrg{ 8219027f4a0Smrg UCSLabelWidget lw = (UCSLabelWidget)w; 8229027f4a0Smrg 8239027f4a0Smrg preferred->request_mode = CWWidth | CWHeight; 8249027f4a0Smrg preferred->width = (lw->label.label_width + 8259027f4a0Smrg 2 * lw->label.internal_width + 8269027f4a0Smrg LEFT_OFFSET(lw)); 8279027f4a0Smrg preferred->height = lw->label.label_height + 8289027f4a0Smrg 2 * lw->label.internal_height; 8299027f4a0Smrg if ( ((intended->request_mode & (CWWidth | CWHeight)) 8309027f4a0Smrg == (CWWidth | CWHeight)) && 8319027f4a0Smrg intended->width == preferred->width && 8329027f4a0Smrg intended->height == preferred->height) 8339027f4a0Smrg return XtGeometryYes; 8349027f4a0Smrg else if (preferred->width == w->core.width && 8359027f4a0Smrg preferred->height == w->core.height) 8369027f4a0Smrg return XtGeometryNo; 8379027f4a0Smrg else 8389027f4a0Smrg return XtGeometryAlmost; 8399027f4a0Smrg} 840