2
* @OPENGROUP_COPYRIGHT@
4
* Copyright (c) 1990, 1991, 1992, 1993 Open Software Foundation, Inc.
5
* Copyright (c) 1996, 1997, 1998, 1999, 2000 The Open Group
6
* ALL RIGHTS RESERVED (MOTIF). See the file named COPYRIGHT.MOTIF for
7
* the full copyright text.
9
* This software is subject to an open license. It may only be
10
* used on, with or for operating systems which are themselves open
11
* source systems. You must contact The Open Group for a license
12
* allowing distribution and sublicensing of this software on, with,
13
* or for operating systems which are not Open Source programs.
15
* See http://www.opengroup.org/openmotif/license for full
16
* details of the license agreement. Any use, reproduction, or
17
* distribution of the program constitutes recipient's acceptance of
20
* EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
21
* PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
22
* KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
23
* WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
24
* OR FITNESS FOR A PARTICULAR PURPOSE
26
* EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
27
* NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT,
28
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29
* DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED
30
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32
* ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
33
* EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
34
* POSSIBILITY OF SUCH DAMAGES.
41
static char rcsid[] = "$TOG: LabelG.c /main/24 1999/01/26 15:31:18 mgreess $"
44
/* (c) Copyright 1989, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
45
/* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
54
#include <X11/IntrinsicP.h>
55
#include <X11/ShellP.h>
56
#include <X11/Xatom.h>
57
#include <X11/keysymdef.h>
58
#include <Xm/AccColorT.h>
59
#include <Xm/AccTextT.h>
60
#include <Xm/AtomMgr.h>
61
#include <Xm/BaseClassP.h>
62
#include <Xm/CacheP.h>
63
#include <Xm/CareVisualT.h>
64
#include <Xm/CascadeBGP.h>
65
#include <Xm/DisplayP.h>
67
#include <Xm/DragIcon.h>
68
#include <Xm/DragIconP.h>
70
#include <Xm/ManagerP.h>
72
#include <Xm/RowColumnP.h>
73
#include <Xm/ScreenP.h>
74
#include <Xm/TraitP.h>
75
#include <Xm/TransferT.h>
76
#include <Xm/VaSimpleP.h>
77
#include "BaseClassI.h"
80
#include "ExtObjectI.h"
81
#include "GadgetUtiI.h"
83
#include "MessagesI.h"
84
#include "MenuProcI.h"
88
#include "SyntheticI.h"
92
#include "XmStringI.h"
94
#define Pix(w) LabG_Pixmap(w)
95
#define Pix_insen(w) LabG_PixmapInsensitive(w)
97
/* Warning Messages */
99
#define CS_STRING_MESSAGE _XmMMsgLabel_0003
100
#define ACC_MESSAGE _XmMMsgLabel_0004
102
/******** Static Function Declarations ********/
104
static Pixmap GetTopShadowPixmapDefault(Widget);
105
static Pixmap GetLabelHighlightPixmapDefault(Widget);
106
static void ClassInitialize(void);
107
static void ClassPartInitialize(WidgetClass cl);
108
static void SecondaryObjectCreate(Widget req, Widget new_w,
109
ArgList args, Cardinal *num_args);
110
static void InitializePosthook(Widget req, Widget new_w,
111
ArgList args, Cardinal *num_args);
112
static Boolean SetValuesPrehook(Widget oldParent,
117
static void GetValuesPrehook(Widget newParent,
120
static void GetValuesPosthook(Widget new_w,
123
static Boolean SetValuesPosthook(Widget current,
128
static void BorderHighlight(Widget w);
129
static void SetNormalGC(XmLabelGadget lw);
130
static void Resize(Widget wid);
131
static void Initialize(Widget req, Widget new_w,
132
ArgList args, Cardinal *num_args);
133
static XtGeometryResult QueryGeometry(Widget wid,
134
XtWidgetGeometry *intended,
135
XtWidgetGeometry *reply);
136
static void Destroy(Widget w);
137
static void Redisplay(Widget wid, XEvent *event, Region region);
138
static Boolean SetValues(Widget cw, Widget rw, Widget nw,
139
ArgList args, Cardinal *num_args);
140
static void InputDispatch(Widget wid, XEvent *event, Mask event_mask);
141
static void Help(Widget w, XEvent *event);
142
static void GetLabelString(Widget wid, int offset, XtArgVal *value);
143
static void GetAccelerator(Widget wid, int offset, XtArgVal *value);
144
static void GetAcceleratorText(Widget wid, int offset, XtArgVal *value);
145
static XmStringCharSet _XmStringCharsetCreate(XmStringCharSet stringcharset);
146
static void GetMnemonicCharset(Widget wid, int resource, XtArgVal *value);
147
static void QualifyLabelLocalCache(XmLabelGadget w);
148
static void SetOverrideCallback(Widget w);
149
static Cardinal GetLabelBGClassSecResData(WidgetClass w_class,
150
XmSecondaryResourceData **data_rtn);
151
static XtPointer GetLabelClassResBase(Widget widget, XtPointer client_data);
152
static void SetValuesAlmost(Widget cw, Widget nw,
153
XtWidgetGeometry *request, XtWidgetGeometry *reply);
154
static Boolean XmLabelGadgetGetBaselines(Widget wid,
155
Dimension **baselines,
157
static Boolean XmLabelGadgetGetDisplayRect(Widget w,
158
XRectangle *displayrect);
159
static void XmLabelGadgetMarginsProc(Widget w,
160
XmBaselineMargins *margins_rec);
161
static Widget GetPixmapDragIcon(Widget w);
162
static void SetGadgetActivateCallbackState(Widget w, XmActivateState state);
163
static void CheckSetRenderTable(Widget wid, int offset, XrmValue *value);
164
static void FromPaddingPixels(Widget, int, XtArgVal *);
165
static XmImportOperator ToPaddingPixels(Widget, int, XtArgVal*);
166
static Boolean HandleRedraw(Widget kid,
170
static void InitNewColorBehavior(XmLabelGadget lw);
171
static void DealWithColors(XmLabelGadget lw);
172
static void DealWithPixmaps(XmLabelGadget lw);
173
static void InitNewPixmapBehavior(XmLabelGadget lw);
174
static char* GetLabelGadgetAccelerator(Widget);
175
static KeySym GetLabelGadgetMnemonic(Widget);
176
static void GetColors(Widget widget, XmAccessColorData color_data);
178
/******** End Static Function Declarations ********/
180
void _XmLabelConvert(Widget w, XtPointer ignore, XmConvertCallbackStruct*);
182
/* Transfer trait record */
183
static XmConst XmTransferTraitRec LabelGTransfer =
186
(XmConvertCallbackProc) _XmLabelConvert, /* convertProc */
187
NULL, /* destinationProc */
188
NULL /* destinationPreHookProc */
191
/* Menu Savvy trait record */
192
static XmConst XmMenuSavvyTraitRec MenuSavvyGadgetRecord =
195
SetGadgetActivateCallbackState, /* disableCallback */
196
GetLabelGadgetAccelerator, /* getAccelerator */
197
GetLabelGadgetMnemonic, /* getMnemonic */
198
NULL /* getActivateCBName */
202
extern XmConst XmAccessTextualTraitRec _XmLabel_AccessTextualRecord;
203
but that was giving a linkage undefined with g++.
204
It looks like a G++ bug. */
205
extern XmAccessTextualTraitRec _XmLabel_AccessTextualRecord;
207
static XmConst XmCareVisualTraitRec LabelGCVT =
210
HandleRedraw /* redraw */
213
/* Access Colors Trait record for label gadget */
214
static XmConst XmAccessColorsTraitRec labACT =
217
GetColors, /* getColors */
222
* Uncached resources for Label Gadget
225
static XtResource resources[] =
227
/* The following hackery is a way in Xt to see if a widget has been
228
* initialized. We need to know whether or not the gadget cache is
229
* valid. We use "." in the name so that an end user cannot access
230
* it from a resource file. With that in place, we just need to
231
* check label.cache != NULL to see if the gadget has been
232
* initialized and that we can access the colors for instance. */
234
XmNdotCache, XmCDotCache, XmRPointer,
235
sizeof(XtPointer), XtOffsetOf(XmLabelGadgetRec, label.cache),
236
XtRImmediate, (XtPointer) NULL
240
XmNshadowThickness, XmCShadowThickness, XmRHorizontalDimension,
241
sizeof(Dimension), XtOffsetOf(XmLabelGadgetRec, gadget.shadow_thickness),
242
XmRImmediate, (XtPointer) 0
246
XmNlabelPixmap, XmCLabelPixmap, XmRDynamicPixmap,
247
sizeof(Pixmap), XtOffsetOf(XmLabelGadgetRec, label.pixmap),
248
XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP
252
XmNlabelInsensitivePixmap, XmCLabelInsensitivePixmap, XmRDynamicPixmap,
253
sizeof(Pixmap), XtOffsetOf(XmLabelGadgetRec, label.pixmap_insen),
254
XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP
258
XmNlabelString, XmCXmString, XmRXmString,
259
sizeof(XmString), XtOffsetOf(XmLabelGadgetRec, label._label),
260
XmRImmediate, (XtPointer) NULL
264
"pri.vate","Pri.vate", XmRBoolean,
265
sizeof(Boolean), XtOffsetOf(XmLabelGadgetRec,
266
label.check_set_render_table),
267
XmRImmediate, (XtPointer) False
271
XmNfontList, XmCFontList, XmRFontList,
272
sizeof(XmFontList), XtOffsetOf(XmLabelGadgetRec, label.font),
273
XmRCallProc, (XtPointer)CheckSetRenderTable
277
XmNrenderTable, XmCRenderTable, XmRRenderTable,
278
sizeof(XmRenderTable), XtOffsetOf(XmLabelGadgetRec, label.font),
279
XmRCallProc, (XtPointer)CheckSetRenderTable
283
XmNmnemonic, XmCMnemonic, XmRKeySym,
284
sizeof(KeySym), XtOffsetOf(XmLabelGadgetRec, label.mnemonic),
285
XmRImmediate, (XtPointer) XK_VoidSymbol
289
XmNmnemonicCharSet, XmCMnemonicCharSet, XmRString,
290
sizeof(XmStringCharSet), XtOffsetOf(XmLabelGadgetRec,label.mnemonicCharset),
291
XmRImmediate, (XtPointer) XmFONTLIST_DEFAULT_TAG
295
XmNaccelerator, XmCAccelerator, XmRString,
296
sizeof(char *), XtOffsetOf(XmLabelGadgetRec, label.accelerator),
297
XmRImmediate, (XtPointer) NULL
301
XmNacceleratorText, XmCAcceleratorText, XmRXmString,
302
sizeof(XmString), XtOffsetOf(XmLabelGadgetRec, label._acc_text),
303
XmRImmediate, (XtPointer) NULL
307
XmNtraversalOn, XmCTraversalOn, XmRBoolean,
308
sizeof(Boolean), XtOffsetOf(XmGadgetRec, gadget.traversal_on),
309
XmRImmediate, (XtPointer) False
313
XmNhighlightThickness, XmCHighlightThickness, XmRHorizontalDimension,
314
sizeof(Dimension), XtOffsetOf(XmGadgetRec, gadget.highlight_thickness),
315
XmRImmediate, (XtPointer) 0
319
XmNpixmapPlacement, XmCPixmapPlacement, XmRPixmapPlacement,
320
sizeof(XmPixmapPlacement), XtOffsetOf(XmLabelGadgetRec, label.pixmap_placement),
321
XmRImmediate, (XtPointer) XmPIXMAP_LEFT
325
XmNpixmapTextPadding, XmCSpace, XmRVerticalDimension,
326
sizeof(Dimension), XtOffsetOf(XmLabelGadgetRec, label.pixmap_text_padding),
327
XmRImmediate, (XtPointer) 2
331
/* These 2 slots are needed for the delayed conversion. */
332
static XtResource label_pixmap_resource[] =
335
XmNlabelPixmap, XmCLabelPixmap, XmRDynamicPixmap,
336
sizeof(Pixmap), XtOffsetOf(XmLabelGadgetRec, label.pixmap),
337
XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP
341
static XtResource label_pixmap_insen_resource[] =
344
XmNlabelInsensitivePixmap, XmCLabelInsensitivePixmap, XmRDynamicPixmap,
345
sizeof(Pixmap), XtOffsetOf(XmLabelGadgetRec, label.pixmap_insen),
346
XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP
351
* Cached resources for Label Gadget
353
static XtResource cache_resources[] =
356
XmNlabelType, XmCLabelType, XmRLabelType,
357
sizeof(unsigned char),
358
XtOffsetOf(XmLabelGCacheObjRec, label_cache.label_type),
359
XmRImmediate, (XtPointer) XmSTRING
363
XmNalignment, XmCAlignment, XmRAlignment,
364
sizeof(unsigned char),
365
XtOffsetOf(XmLabelGCacheObjRec, label_cache.alignment),
366
XmRImmediate, (XtPointer) XmALIGNMENT_CENTER
370
XmNmarginWidth, XmCMarginWidth, XmRHorizontalDimension,
372
XtOffsetOf(XmLabelGCacheObjRec, label_cache.margin_width),
373
XmRImmediate, (XtPointer) 2
377
XmNmarginHeight, XmCMarginHeight, XmRVerticalDimension,
379
XtOffsetOf(XmLabelGCacheObjRec, label_cache.margin_height),
380
XmRImmediate, (XtPointer) 2
384
XmNmarginLeft, XmCMarginLeft, XmRHorizontalDimension,
386
XtOffsetOf(XmLabelGCacheObjRec, label_cache.margin_left),
387
XmRImmediate, (XtPointer) 0
391
XmNmarginRight, XmCMarginRight, XmRHorizontalDimension,
393
XtOffsetOf(XmLabelGCacheObjRec, label_cache.margin_right),
394
XmRImmediate, (XtPointer) 0
398
XmNmarginTop, XmCMarginTop, XmRVerticalDimension,
400
XtOffsetOf(XmLabelGCacheObjRec, label_cache.margin_top),
401
XmRImmediate, (XtPointer) 0
405
XmNmarginBottom, XmCMarginBottom, XmRVerticalDimension,
407
XtOffsetOf(XmLabelGCacheObjRec, label_cache.margin_bottom),
408
XmRImmediate, (XtPointer) 0
412
XmNrecomputeSize, XmCRecomputeSize, XmRBoolean,
414
XtOffsetOf(XmLabelGCacheObjRec, label_cache.recompute_size),
415
XmRImmediate, (XtPointer) True
419
XmNstringDirection, XmCStringDirection, XmRStringDirection,
420
sizeof(unsigned char),
421
XtOffsetOf(XmLabelGCacheObjRec, label_cache.string_direction),
422
XmRImmediate, (XtPointer) XmDEFAULT_DIRECTION
426
XmNlayoutDirection, XmCLayoutDirection, XmRDirection,
428
XtOffsetOf(XmGadgetRec, gadget.layout_direction),
429
XmRImmediate, (XtPointer) XmDEFAULT_DIRECTION
433
XmNbackground, XmCBackground, XmRPixel,
435
XtOffsetOf(XmLabelGCacheObjRec, label_cache.background),
436
XmRImmediate, (XtPointer) INVALID_PIXEL
440
XmNforeground, XmCForeground, XmRPixel,
442
XtOffsetOf(XmLabelGCacheObjRec, label_cache.foreground),
443
XmRImmediate, (XtPointer) INVALID_PIXEL
447
XmNtopShadowColor, XmCTopShadowColor, XmRPixel,
449
XtOffsetOf(XmLabelGCacheObjRec, label_cache.top_shadow_color),
450
XmRImmediate, (XtPointer) INVALID_PIXEL
454
XmNtopShadowPixmap, XmCTopShadowPixmap, XmRNoScalingDynamicPixmap,
456
XtOffsetOf(XmLabelGCacheObjRec, label_cache.top_shadow_pixmap),
457
XmRImmediate, (XtPointer) INVALID_PIXMAP
461
XmNbottomShadowColor, XmCBottomShadowColor, XmRPixel,
463
XtOffsetOf(XmLabelGCacheObjRec, label_cache.bottom_shadow_color),
464
XmRImmediate, (XtPointer) INVALID_PIXEL
468
XmNbottomShadowPixmap, XmCBottomShadowPixmap, XmRNoScalingDynamicPixmap,
470
XtOffsetOf(XmLabelGCacheObjRec, label_cache.bottom_shadow_pixmap),
471
XmRImmediate, (XtPointer) XmUNSPECIFIED_PIXMAP
475
XmNhighlightColor, XmCHighlightColor, XmRPixel,
477
XtOffsetOf(XmLabelGCacheObjRec, label_cache.highlight_color),
478
XmRImmediate, (XtPointer) INVALID_PIXEL
482
XmNhighlightPixmap, XmCHighlightPixmap, XmRNoScalingDynamicPixmap,
484
XtOffsetOf(XmLabelGCacheObjRec, label_cache.highlight_pixmap),
485
XmRImmediate, (XtPointer) INVALID_PIXMAP
489
/* Definition for resources that need special processing in get values */
491
static XmSyntheticResource syn_resources[] =
495
sizeof(XmString), XtOffsetOf(XmLabelGadgetRec, label._label),
501
sizeof(String), XtOffsetOf(XmLabelGadgetRec, label.accelerator),
507
sizeof(XmString), XtOffsetOf(XmLabelGadgetRec, label._acc_text),
508
GetAcceleratorText, NULL
513
sizeof(XmStringCharSet), XtOffsetOf(XmLabelGadgetRec,label.mnemonicCharset),
514
GetMnemonicCharset, NULL
518
XmNpixmapTextPadding,
519
sizeof(Dimension), XtOffsetOf(XmLabelGadgetRec, label.pixmap_text_padding),
520
FromPaddingPixels, (XmImportProc) ToPaddingPixels
524
static XmSyntheticResource cache_syn_resources[] =
529
XtOffsetOf(XmLabelGCacheObjRec, label_cache.margin_width),
530
XmeFromHorizontalPixels, XmeToHorizontalPixels
536
XtOffsetOf(XmLabelGCacheObjRec, label_cache.margin_height),
537
XmeFromVerticalPixels, XmeToVerticalPixels
543
XtOffsetOf(XmLabelGCacheObjRec, label_cache.margin_left),
544
XmeFromHorizontalPixels, XmeToHorizontalPixels
550
XtOffsetOf(XmLabelGCacheObjRec, label_cache.margin_right),
551
XmeFromHorizontalPixels, XmeToHorizontalPixels
557
XtOffsetOf(XmLabelGCacheObjRec, label_cache.margin_top),
558
XmeFromVerticalPixels, XmeToVerticalPixels
564
XtOffsetOf(XmLabelGCacheObjRec, label_cache.margin_bottom),
565
XmeFromVerticalPixels, XmeToVerticalPixels
569
static XmCacheClassPart LabelClassCachePart =
571
{ /* head of class cache list */
574
_XmCacheCopy, /* Copy routine */
575
_XmCacheDelete, /* Delete routine */
576
_XmLabelCacheCompare /* Comparison routine */
579
static XmBaseClassExtRec labelBaseClassExtRec =
581
NULL, /* Next extension */
582
NULLQUARK, /* record type XmQmotif */
583
XmBaseClassExtVersion, /* version */
584
sizeof(XmBaseClassExtRec), /* size */
585
XmInheritInitializePrehook, /* initialize prehook */
586
SetValuesPrehook, /* set_values prehook */
587
InitializePosthook, /* initialize posthook */
588
SetValuesPosthook, /* set_values posthook */
589
(WidgetClass)&xmLabelGCacheObjClassRec, /* secondary class */
590
SecondaryObjectCreate, /* creation proc */
591
GetLabelBGClassSecResData, /* getSecResData */
592
{ /* fast subclass */
595
GetValuesPrehook, /* get_values prehook */
596
GetValuesPosthook, /* get_values posthook */
597
NULL, /* classPartInitPrehook */
598
NULL, /* classPartInitPosthook */
599
NULL, /* ext_resources */
600
NULL, /* compiled_ext_resources */
601
0, /* num_ext_resources */
602
FALSE, /* use_sub_resources */
603
XmInheritWidgetNavigable, /* widgetNavigable */
604
XmInheritFocusChange /* focusChange */
607
externaldef (xmlabelgcacheobjclassrec)
608
XmLabelGCacheObjClassRec xmLabelGCacheObjClassRec =
611
(WidgetClass) &xmExtClassRec, /* superclass */
612
"XmLabelGadget", /* class_name */
613
sizeof(XmLabelGCacheObjRec), /* widget_size */
614
NULL, /* class_initialize */
615
NULL, /* chained class init */
616
False, /* class_inited */
617
NULL, /* initialize */
618
NULL, /* initialize hook */
622
cache_resources, /* resources */
623
XtNumber(cache_resources), /* num_resources */
624
NULLQUARK, /* xrm_class */
625
False, /* compress_motion */
626
False, /* compress_exposure */
627
False, /* compress enter/exit */
628
False, /* visible_interest */
632
NULL, /* set_values */
633
NULL, /* set values hook */
634
NULL, /* set values almost */
635
NULL, /* get values hook */
636
NULL, /* accept_focus */
637
XtVersion, /* version */
638
NULL, /* callback offsetlst */
639
NULL, /* default trans */
640
NULL, /* query geo proc */
641
NULL, /* display accelerator */
642
NULL /* extension record */
646
cache_syn_resources, /* synthetic resources */
647
XtNumber(cache_syn_resources), /* num_syn_resources */
652
/* This is the class record that gets set at compile/link time */
653
/* this is what is passed to the widget create routine as the */
654
/* the class. All fields must be inited at compile time. */
656
static XmGadgetClassExtRec _XmLabelGadClassExtRec =
658
NULL, /* next_extension */
659
NULLQUARK, /* record_type */
660
XmGadgetClassExtVersion, /* version */
661
sizeof(XmGadgetClassExtRec), /* record_size */
662
XmLabelGadgetGetBaselines, /* widget_baseline */
663
XmLabelGadgetGetDisplayRect, /* widget_display_rect */
664
XmLabelGadgetMarginsProc, /* widget_margins */
667
externaldef (xmlabelgadgetclassrec)
668
XmLabelGadgetClassRec xmLabelGadgetClassRec =
671
(WidgetClass) &xmGadgetClassRec, /* superclass */
672
"XmLabelGadget", /* class_name */
673
sizeof(XmLabelGadgetRec), /* widget_size */
674
ClassInitialize, /* class_initialize */
675
ClassPartInitialize, /* chained class init */
676
False, /* class_inited */
677
Initialize, /* initialize */
678
NULL, /* initialize hook */
682
resources, /* resources */
683
XtNumber(resources), /* num_resources */
684
NULLQUARK, /* xrm_class */
685
True, /* compress_motion */
686
XtExposeCompressMaximal, /* compress_exposure */
687
True, /* compress enter/exit */
688
False, /* visible_interest */
689
Destroy, /* destroy */
691
Redisplay, /* expose */
692
SetValues, /* set_values */
693
NULL, /* set values hook */
694
SetValuesAlmost, /* set values almost */
695
NULL, /* get values hook */
696
NULL, /* accept_focus */
697
XtVersion, /* version */
698
NULL, /* callback offsetlst */
699
NULL, /* default trans */
700
QueryGeometry, /* query geo proc */
701
NULL, /* display accelerator */
702
(XtPointer)&labelBaseClassExtRec /* extension record */
705
{ /* XmGadgetClassPart */
706
BorderHighlight, /* border_highlight */
707
XmInheritBorderUnhighlight, /* border_unhighlight */
708
NULL, /* arm_and_activate */
709
InputDispatch, /* input dispatch */
710
XmInheritVisualChange, /* visual_change */
711
syn_resources, /* syn resources */
712
XtNumber(syn_resources), /* num syn_resources */
713
&LabelClassCachePart, /* class cache part */
714
(XtPointer)&_XmLabelGadClassExtRec /* extension */
717
{ /* XmLabelGadgetClassPart */
718
SetOverrideCallback, /* override_callback */
719
NULL, /* menu procedure interface */
720
NULL /* extension record */
724
externaldef(xmlabelgadgetclass) WidgetClass xmLabelGadgetClass =
725
(WidgetClass) &xmLabelGadgetClassRec;
729
GetTopShadowPixmapDefault(Widget widget)
731
XmLabelGadget lg = (XmLabelGadget) widget;
732
XmManagerWidget mw = (XmManagerWidget)XtParent(lg);
733
Pixmap result = XmUNSPECIFIED_PIXMAP;
735
if (LabG_TopShadowColor(lg) == LabG_Background(lg))
736
result = XmGetPixmapByDepth (XtScreen (lg), XmS50_foreground,
737
LabG_TopShadowColor(lg),
741
else if (DefaultDepthOfScreen (XtScreen (widget)) == 1)
742
result = XmGetPixmapByDepth (XtScreen (lg), XmS50_foreground,
743
LabG_TopShadowColor(lg),
753
GetLabelHighlightPixmapDefault(Widget widget)
755
XmLabelGadget lg = (XmLabelGadget) widget;
756
XmManagerWidget mw = (XmManagerWidget)XtParent(lg);
757
Pixmap result = XmUNSPECIFIED_PIXMAP;
759
if (LabG_HighlightColor(lg) == LabG_Background(lg))
760
result = XmGetPixmapByDepth (XtScreen (lg), XmS50_foreground,
761
LabG_HighlightColor(lg),
769
/*******************************************************************
771
* _XmLabelCacheCompare
773
*******************************************************************/
776
_XmLabelCacheCompare(
780
XmLabelGCacheObjPart *label_inst = (XmLabelGCacheObjPart *) A;
781
XmLabelGCacheObjPart *label_cache_inst = (XmLabelGCacheObjPart *) B;
783
if ((label_inst->label_type == label_cache_inst->label_type) &&
784
(label_inst->alignment == label_cache_inst->alignment) &&
785
(label_inst->string_direction == label_cache_inst->string_direction) &&
786
(label_inst->margin_height == label_cache_inst->margin_height) &&
787
(label_inst->margin_width == label_cache_inst->margin_width) &&
788
(label_inst->margin_left == label_cache_inst->margin_left) &&
789
(label_inst->margin_right == label_cache_inst->margin_right) &&
790
(label_inst->margin_top == label_cache_inst->margin_top) &&
791
(label_inst->margin_bottom == label_cache_inst->margin_bottom) &&
792
(label_inst->recompute_size == label_cache_inst->recompute_size) &&
793
(label_inst->skipCallback == label_cache_inst->skipCallback) &&
794
(label_inst->menu_type == label_cache_inst->menu_type) &&
795
(label_inst->background_GC == label_cache_inst->background_GC) &&
796
(label_inst->top_shadow_GC == label_cache_inst->top_shadow_GC) &&
797
(label_inst->bottom_shadow_GC == label_cache_inst->bottom_shadow_GC) &&
798
(label_inst->highlight_GC == label_cache_inst->highlight_GC) &&
799
(label_inst->foreground == label_cache_inst->foreground) &&
800
(label_inst->background == label_cache_inst->background) &&
801
(label_inst->top_shadow_color == label_cache_inst->top_shadow_color) &&
802
(label_inst->top_shadow_pixmap == label_cache_inst->top_shadow_pixmap) &&
803
(label_inst->bottom_shadow_color ==
804
label_cache_inst->bottom_shadow_color) &&
805
(label_inst->bottom_shadow_pixmap ==
806
label_cache_inst->bottom_shadow_pixmap) &&
807
(label_inst->highlight_color == label_cache_inst->highlight_color) &&
808
(label_inst->highlight_pixmap == label_cache_inst->highlight_pixmap))
815
/***********************************************************
819
************************************************************/
822
ClassInitialize(void)
824
labelBaseClassExtRec.record_type = XmQmotif;
826
/* Install menu savvy on just this class */
827
XmeTraitSet((XtPointer) &xmLabelGadgetClassRec,
828
XmQTmenuSavvy, (XtPointer) &MenuSavvyGadgetRecord);
834
_XmLabelGCloneMenuSavvy(WidgetClass wc,
835
XmMenuSavvyTrait mst)
837
/* Modify and reinstall menu savvy trait */
838
if (mst->version == -1)
840
mst->version = MenuSavvyGadgetRecord.version;
841
mst->disableCallback = MenuSavvyGadgetRecord.disableCallback;
842
mst->getAccelerator = MenuSavvyGadgetRecord.getAccelerator;
843
mst->getMnemonic = MenuSavvyGadgetRecord.getMnemonic;
846
/* Install the new record */
847
XmeTraitSet((XtPointer) wc, XmQTmenuSavvy, (XtPointer) mst);
851
/************************************************************************
853
* ClassPartInitialize
854
* Processes the class fields which need to be inherited.
856
************************************************************************/
859
ClassPartInitialize(WidgetClass cl)
861
register XmLabelGadgetClass wc = (XmLabelGadgetClass) cl;
862
XmLabelGadgetClass super = (XmLabelGadgetClass)wc->rect_class.superclass;
863
XmGadgetClassExt *wcePtr, *scePtr;
865
if (wc->label_class.setOverrideCallback == XmInheritSetOverrideCallback)
866
wc->label_class.setOverrideCallback =
867
super->label_class.setOverrideCallback;
869
if (wc->rect_class.resize == XmInheritResize)
870
wc->rect_class.resize = super->rect_class.resize;
872
wcePtr = _XmGetGadgetClassExtPtr(wc, NULLQUARK);
873
scePtr = _XmGetGadgetClassExtPtr(super, NULLQUARK);
875
if ((*wcePtr)->widget_baseline == XmInheritBaselineProc)
876
(*wcePtr)->widget_baseline = (*scePtr)->widget_baseline;
878
if ((*wcePtr)->widget_display_rect == XmInheritDisplayRectProc)
879
(*wcePtr)->widget_display_rect = (*scePtr)->widget_display_rect;
881
_XmFastSubclassInit (((WidgetClass)wc), XmLABEL_GADGET_BIT);
883
/* Install transfer trait */
884
XmeTraitSet((XtPointer)cl, XmQTtransfer, (XtPointer) &LabelGTransfer);
885
XmeTraitSet((XtPointer) cl, XmQTaccessTextual, (XtPointer)
886
&_XmLabel_AccessTextualRecord);
888
/* Install the careParentVisual trait for all subclasses as well. */
889
XmeTraitSet((XtPointer)cl, XmQTcareParentVisual, (XtPointer)&LabelGCVT);
891
/* Install the accessColors trait for all subclasses as well. */
892
XmeTraitSet((XtPointer)cl, XmQTaccessColors, (XtPointer)&labACT);
896
/************************************************************************
898
* SecondaryObjectCreate
900
************************************************************************/
904
SecondaryObjectCreate(Widget req,
909
XmBaseClassExt *cePtr;
910
XmWidgetExtData extData;
913
XtPointer newSec, reqSec;
916
cePtr = _XmGetBaseClassExtPtr(XtClass(new_w), XmQmotif);
918
wc = (*cePtr)->secondaryObjectClass;
919
size = wc->core_class.widget_size;
921
newSec = _XmExtObjAlloc(size);
922
reqSec = _XmExtObjAlloc(size);
926
* Update pointers in instance records now so references to resources
927
* in the cache record will be valid for use in CallProcs.
928
* CallProcs are invoked by XtGetSubresources().
930
LabG_Cache(new_w) = &(((XmLabelGCacheObject)newSec)->label_cache);
931
LabG_Cache(req) = &(((XmLabelGCacheObject)reqSec)->label_cache);
934
* Fetch the resources in superclass to subclass order
937
XtGetSubresources(new_w, newSec, NULL, NULL,
938
wc->core_class.resources,
939
wc->core_class.num_resources,
942
extData = (XmWidgetExtData) XtCalloc(1, sizeof(XmWidgetExtDataRec));
943
extData->widget = (Widget)newSec;
944
extData->reqWidget = (Widget)reqSec;
946
((XmLabelGCacheObject)newSec)->ext.extensionType = XmCACHE_EXTENSION;
947
((XmLabelGCacheObject)newSec)->ext.logicalParent = new_w;
949
_XmPushWidgetExtData((Widget) new_w, extData,
950
((XmLabelGCacheObject)newSec)->ext.extensionType);
951
memcpy(reqSec, newSec, size);
955
/************************************************************************
959
************************************************************************/
963
InitializePosthook(Widget req,
969
XmLabelGadget lw = (XmLabelGadget)new_w;
972
* - register parts in cache.
973
* - update cache pointers
978
LabG_Cache(lw) = (XmLabelGCacheObjPart *)
979
_XmCachePart(LabG_ClassCachePart(lw),
980
(XtPointer) LabG_Cache(lw),
981
sizeof(XmLabelGCacheObjPart));
984
* Might want to break up into per-class work that gets explicitly
985
* chained. For right now, each class has to replicate all
986
* superclass logic in hook routine.
990
* free the req subobject used for comparisons
992
_XmPopWidgetExtData((Widget) lw, &ext, XmCACHE_EXTENSION);
993
_XmExtObjFree((XtPointer)ext->widget);
994
_XmExtObjFree((XtPointer)ext->reqWidget);
996
XtFree((char *) ext);
1000
/************************************************************************
1004
************************************************************************/
1008
SetValuesPrehook(Widget oldParent,
1014
XmWidgetExtData extData;
1015
XmBaseClassExt *cePtr;
1017
XmLabelGCacheObject newSec, reqSec;
1021
cePtr = _XmGetBaseClassExtPtr(XtClass(newParent), XmQmotif);
1022
ec = (*cePtr)->secondaryObjectClass;
1023
size = ec->core_class.widget_size;
1025
newSec = (XmLabelGCacheObject)_XmExtObjAlloc(size);
1026
reqSec = (XmLabelGCacheObject)_XmExtObjAlloc(size);
1029
newSec->object.self = (Widget)newSec;
1030
newSec->object.widget_class = ec;
1031
newSec->object.parent = XtParent(newParent);
1032
newSec->object.xrm_name = newParent->core.xrm_name;
1033
newSec->object.being_destroyed = False;
1034
newSec->object.destroy_callbacks = NULL;
1035
newSec->object.constraints = NULL;
1037
newSec->ext.logicalParent = newParent;
1038
newSec->ext.extensionType = XmCACHE_EXTENSION;
1040
memcpy(&(newSec->label_cache),
1041
LabG_Cache(newParent),
1042
sizeof(XmLabelGCacheObjPart));
1044
extData = (XmWidgetExtData) XtCalloc(1, sizeof(XmWidgetExtDataRec));
1045
extData->widget = (Widget)newSec;
1046
extData->reqWidget = (Widget)reqSec;
1047
_XmPushWidgetExtData(newParent, extData, XmCACHE_EXTENSION);
1049
XtSetSubvalues((XtPointer)newSec,
1050
ec->core_class.resources,
1051
ec->core_class.num_resources,
1054
_XmExtImportArgs((Widget)newSec, args, num_args);
1056
memcpy((XtPointer)reqSec, (XtPointer)newSec, size);
1058
LabG_Cache(newParent) = &((newSec)->label_cache);
1059
LabG_Cache(refParent) = &((reqSec)->label_cache);
1065
/************************************************************************
1069
************************************************************************/
1073
GetValuesPrehook(Widget newParent,
1077
XmWidgetExtData extData;
1078
XmBaseClassExt *cePtr;
1080
XmLabelGCacheObject newSec;
1084
cePtr = _XmGetBaseClassExtPtr(XtClass(newParent), XmQmotif);
1085
ec = (*cePtr)->secondaryObjectClass;
1086
size = ec->core_class.widget_size;
1088
newSec = (XmLabelGCacheObject)_XmExtObjAlloc(size);
1091
newSec->object.self = (Widget)newSec;
1092
newSec->object.widget_class = ec;
1093
newSec->object.parent = XtParent(newParent);
1094
newSec->object.xrm_name = newParent->core.xrm_name;
1095
newSec->object.being_destroyed = False;
1096
newSec->object.destroy_callbacks = NULL;
1097
newSec->object.constraints = NULL;
1099
newSec->ext.logicalParent = newParent;
1100
newSec->ext.extensionType = XmCACHE_EXTENSION;
1102
memcpy(&(newSec->label_cache),
1103
LabG_Cache(newParent),
1104
sizeof(XmLabelGCacheObjPart));
1106
extData = (XmWidgetExtData) XtCalloc(1, sizeof(XmWidgetExtDataRec));
1107
extData->widget = (Widget)newSec;
1108
_XmPushWidgetExtData(newParent, extData, XmCACHE_EXTENSION);
1110
XtGetSubvalues((XtPointer)newSec,
1111
ec->core_class.resources,
1112
ec->core_class.num_resources,
1115
_XmExtGetValuesHook((Widget)newSec, args, num_args);
1119
/************************************************************************
1123
************************************************************************/
1127
GetValuesPosthook(Widget new_w,
1131
XmWidgetExtData ext;
1133
_XmPopWidgetExtData(new_w, &ext, XmCACHE_EXTENSION);
1136
_XmExtObjFree((XtPointer)ext->widget);
1139
XtFree((char *) ext);
1143
/************************************************************************
1147
************************************************************************/
1151
SetValuesPosthook(Widget current,
1157
XmWidgetExtData ext;
1160
* - register parts in cache.
1161
* - update cache pointers
1165
/* assign if changed! */
1167
if (!_XmLabelCacheCompare((XtPointer)LabG_Cache(new_w),
1168
(XtPointer)LabG_Cache(current)))
1171
/* delete the old one */
1172
_XmCacheDelete((XtPointer) LabG_Cache(current));
1173
LabG_Cache(new_w) = (XmLabelGCacheObjPart *)
1174
_XmCachePart(LabG_ClassCachePart(new_w),
1175
(XtPointer) LabG_Cache(new_w),
1176
sizeof(XmLabelGCacheObjPart));
1179
LabG_Cache(new_w) = LabG_Cache(current);
1181
_XmPopWidgetExtData(new_w, &ext, XmCACHE_EXTENSION);
1183
_XmExtObjFree((XtPointer)ext->widget);
1184
_XmExtObjFree((XtPointer)ext->reqWidget);
1186
XtFree((char *) ext);
1194
BorderHighlight(Widget w)
1196
XmLabelGadget lg = (XmLabelGadget) w;
1198
if (lg->rectangle.width == 0 ||
1199
lg->rectangle.height == 0 ||
1200
lg->gadget.highlight_thickness == 0)
1205
lg->gadget.highlighted = True;
1206
lg->gadget.highlight_drawn = True;
1208
/* CR 7330: Use XmeDrawHighlight, not _XmDrawHighlight. */
1209
XmeDrawHighlight(XtDisplay((Widget) lg), XtWindow((Widget) lg),
1210
LabG_HighlightGC(lg),
1211
lg->rectangle.x, lg->rectangle.y,
1212
lg->rectangle.width, lg->rectangle.height,
1213
lg->gadget.highlight_thickness);
1217
/************************************************************************
1220
* Create the normal and insensitive GC's for the gadget.
1222
************************************************************************/
1225
SetNormalGC(XmLabelGadget lw)
1228
XtGCMask valueMask, dynamicMask;
1230
XFontStruct *fs = (XFontStruct *) NULL;
1232
mw = (XmManagerWidget) XtParent(lw);
1234
valueMask = GCForeground | GCBackground | GCGraphicsExposures;
1235
dynamicMask = GCClipXOrigin | GCClipYOrigin | GCClipMask;
1237
values.foreground = LabG_Foreground(lw);
1238
values.background = LabG_Background(lw);
1239
values.graphics_exposures = FALSE;
1241
if (XmeRenderTableGetDefaultFont(LabG_Font(lw), &fs))
1243
valueMask |= GCFont;
1244
values.font = fs->fid;
1247
LabG_NormalGC(lw) = XtAllocateGC((Widget) mw, 0, valueMask, &values,
1250
valueMask |= GCFillStyle | GCStipple;
1251
values.foreground = LabG_Background(lw);
1252
values.background = LabG_Foreground(lw);
1253
values.fill_style = FillOpaqueStippled;
1255
values.stipple = _XmGetInsensitiveStippleBitmap((Widget) lw);
1257
LabG_InsensitiveGC(lw) = XtAllocateGC((Widget) mw, 0, valueMask, &values,
1262
/************************************************************************
1264
* _XmLabelSetBackgroundGC
1265
* Get the graphics context used for drawing the shadows.
1267
************************************************************************/
1270
_XmLabelSetBackgroundGC(XmLabelGadget lw)
1275
XFontStruct *fs = (XFontStruct *) NULL;
1277
mw = (XmManagerWidget) XtParent(lw);
1279
if (lw->label.fill_bg_box != _XmALWAYS_FILL_BG_BOX)
1281
if ((mw->core.background_pixel != LabG_Background(lw)) &&
1282
(mw->core.background_pixmap == XmUNSPECIFIED_PIXMAP))
1283
lw->label.fill_bg_box = _XmFILL_BG_BOX;
1285
lw->label.fill_bg_box = _XmPLAIN_BG_BOX;
1288
valueMask = GCForeground | GCBackground | GCGraphicsExposures | GCClipMask;
1289
values.foreground = LabG_Background(lw);
1290
values.background = LabG_Foreground(lw);
1291
values.graphics_exposures = FALSE;
1292
values.clip_mask = None;
1294
/* CR 8980: Use parent's background_pixmap if possible. */
1295
if (mw->core.background_pixmap != XmUNSPECIFIED_PIXMAP)
1299
XmeGetPixmapData(XtScreen((Widget)lw), mw->core.background_pixmap,
1300
NULL, &depth, NULL, NULL, NULL, NULL, NULL, NULL);
1304
valueMask |= GCFillStyle | GCStipple ;
1305
values.fill_style = FillOpaqueStippled;
1306
values.stipple = mw->core.background_pixmap;
1310
valueMask |= GCFillStyle | GCTile ;
1311
values.fill_style = FillTiled;
1312
values.tile = mw->core.background_pixmap;
1316
if (XmeRenderTableGetDefaultFont(LabG_Font(lw), &fs))
1318
valueMask |= GCFont;
1319
values.font = fs->fid;
1322
LabG_BackgroundGC(lw) = XtGetGC ((Widget) mw, valueMask, &values);
1326
/************************************************************************
1328
* _XmCalcLabelGDimensions()
1329
* Calculates the dimensionsof the label text and pixmap, and updates
1330
* the TextRect fields appropriately. Called at Initialize and SetValues.
1331
* This is also called by the subclasses to recalculate label dimensions.
1333
*************************************************************************/
1336
_XmCalcLabelGDimensions(Widget wid)
1338
XmLabelGadget newlw = (XmLabelGadget) wid;
1339
unsigned int w = 0 , h = 0;
1341
/* initialize TextRect width and height to 0, reset if needed */
1343
LabG_AccTextRect(newlw).width = 0;
1344
LabG_AccTextRect(newlw).height = 0;
1345
LabG_StringRect(newlw).x = 0;
1346
LabG_StringRect(newlw).y = 0;
1347
LabG_StringRect(newlw).width = 0;
1348
LabG_StringRect(newlw).height = 0;
1349
LabG_PixmapRect(newlw).x = 0;
1350
LabG_PixmapRect(newlw).y = 0;
1351
LabG_PixmapRect(newlw).width = 0;
1352
LabG_PixmapRect(newlw).height = 0;
1354
if (LabG_IsPixmap(newlw) || LabG_IsPixmapAndText(newlw))
1356
if (XtIsSensitive(wid))
1358
if (Pix (newlw) != XmUNSPECIFIED_PIXMAP)
1360
XmeGetPixmapData(XtScreen(newlw), Pix(newlw),
1361
NULL, NULL, NULL, NULL, NULL, NULL,
1364
LabG_PixmapRect(newlw).width = (unsigned short) w;
1365
LabG_PixmapRect(newlw).height = (unsigned short) h;
1370
Pixmap pix_use = Pix_insen (newlw) ;
1372
if (pix_use == XmUNSPECIFIED_PIXMAP)
1373
pix_use = Pix(newlw);
1375
if (pix_use != XmUNSPECIFIED_PIXMAP)
1377
XmeGetPixmapData(XtScreen(newlw), pix_use,
1378
NULL, NULL, NULL, NULL, NULL, NULL,
1381
LabG_PixmapRect(newlw).width = (unsigned short) w;
1382
LabG_PixmapRect(newlw).height = (unsigned short) h;
1387
if (LabG_IsText (newlw) || LabG_IsPixmapAndText(newlw))
1391
/* If we have a string then size it. */
1392
if (!XmStringEmpty (LabG__label(newlw)))
1394
XmStringExtent (LabG_Font(newlw), LabG__label(newlw), &w, &h);
1395
LabG_StringRect(newlw).width = (unsigned short)w;
1396
LabG_StringRect(newlw).height = (unsigned short)h;
1400
_XmLabelGCalcTextRect(wid);
1402
if (LabG__acceleratorText(newlw) != NULL)
1404
/* If we have a string then size it. */
1407
if (!XmStringEmpty (LabG__acceleratorText(newlw)))
1409
XmStringExtent(LabG_Font(newlw),
1410
LabG__acceleratorText(newlw), &w, &h);
1411
LabG_AccTextRect(newlw).width = (unsigned short)w;
1412
LabG_AccTextRect(newlw).height = (unsigned short)h;
1418
_XmLabelGCalcTextRect(Widget wid)
1420
LabG_TextRect(wid).width = 0;
1421
LabG_TextRect(wid).height = 0;
1423
if (LabG_IsPixmap(wid))
1425
LabG_TextRect(wid).width = LabG_PixmapRect(wid).width;
1426
LabG_TextRect(wid).height = LabG_PixmapRect(wid).height;
1428
else if (LabG_IsText(wid))
1430
LabG_TextRect(wid).width = LabG_StringRect(wid).width;
1431
LabG_TextRect(wid).height = LabG_StringRect(wid).height;
1433
else if (LabG_IsPixmapAndText(wid))
1435
if (LabG_PixmapPlacement(wid) == XmPIXMAP_TOP ||
1436
LabG_PixmapPlacement(wid) == XmPIXMAP_BOTTOM)
1438
LabG_TextRect(wid).height = LabG_PixmapRect(wid).height +
1439
LabG_StringRect(wid).height + LabG_PixmapTextPadding(wid);
1440
LabG_TextRect(wid).width =
1441
MAX(LabG_StringRect(wid).width, LabG_PixmapRect(wid).width);
1443
else if (LabG_PixmapPlacement(wid) == XmPIXMAP_LEFT ||
1444
LabG_PixmapPlacement(wid) == XmPIXMAP_RIGHT)
1446
LabG_TextRect(wid).width = LabG_PixmapRect(wid).width +
1447
LabG_StringRect(wid).width + LabG_PixmapTextPadding(wid);
1448
LabG_TextRect(wid).height =
1449
MAX(LabG_StringRect(wid).height, LabG_PixmapRect(wid).height);
1452
if (LabG_PixmapPlacement(wid) == XmPIXMAP_TOP)
1454
LabG_PixmapRect(wid).y = 0;
1455
LabG_StringRect(wid).y =
1456
LabG_PixmapRect(wid).height + LabG_PixmapTextPadding(wid);
1458
else if (LabG_PixmapPlacement(wid) == XmPIXMAP_BOTTOM)
1460
LabG_StringRect(wid).y = 0;
1461
LabG_PixmapRect(wid).y =
1462
LabG_StringRect(wid).height + LabG_PixmapTextPadding(wid);
1464
else if ((LabG_PixmapPlacement(wid) == XmPIXMAP_RIGHT &&
1465
LayoutIsRtoLG(wid)) ||
1466
(LabG_PixmapPlacement(wid) == XmPIXMAP_LEFT &&
1467
!LayoutIsRtoLG(wid)))
1469
LabG_PixmapRect(wid).x = 0;
1470
LabG_StringRect(wid).x =
1471
LabG_PixmapRect(wid).width + LabG_PixmapTextPadding(wid);
1473
else if ((LabG_PixmapPlacement(wid) == XmPIXMAP_LEFT &&
1474
LayoutIsRtoLG(wid)) ||
1475
(LabG_PixmapPlacement(wid) == XmPIXMAP_RIGHT &&
1476
!LayoutIsRtoLG(wid)))
1478
LabG_StringRect(wid).x = 0;
1479
LabG_PixmapRect(wid).x =
1480
LabG_StringRect(wid).width + LabG_PixmapTextPadding(wid);
1483
if (LabG_PixmapPlacement(wid) == XmPIXMAP_RIGHT ||
1484
LabG_PixmapPlacement(wid) == XmPIXMAP_LEFT)
1486
LabG_PixmapRect(wid).y =
1487
(LabG_TextRect(wid).height - LabG_PixmapRect(wid).height) / 2;
1488
LabG_StringRect(wid).y =
1489
(LabG_TextRect(wid).height - LabG_StringRect(wid).height) / 2;
1493
if (LabG_Alignment(wid) == XmALIGNMENT_CENTER)
1495
LabG_PixmapRect(wid).x =
1496
(LabG_TextRect(wid).width - LabG_PixmapRect(wid).width) / 2;
1497
LabG_StringRect(wid).x =
1498
(LabG_TextRect(wid).width - LabG_StringRect(wid).width) / 2;
1500
else if ((LabG_Alignment(wid) == XmALIGNMENT_END &&
1501
!LayoutIsRtoLG(wid)) ||
1502
(LabG_Alignment(wid) == XmALIGNMENT_BEGINNING &&
1503
LayoutIsRtoLG(wid)))
1505
LabG_PixmapRect(wid).x =
1506
LabG_TextRect(wid).width - LabG_PixmapRect(wid).width;
1507
LabG_StringRect(wid).x =
1508
LabG_TextRect(wid).width - LabG_StringRect(wid).width;
1515
/************************************************************************
1518
* Sets new width, new height, and new label.TextRect
1519
* appropriately. It is called by Initialize and SetValues.
1521
************************************************************************/
1526
XmLabelGadget newlw = (XmLabelGadget) wid;
1529
/* increase margin width if necessary to accomodate accelerator text */
1530
if (LabG__acceleratorText(newlw) != NULL)
1532
if (LayoutIsRtoLG(newlw))
1534
if (LabG_MarginLeft(newlw) <
1535
LabG_AccTextRect(newlw).width + LABELG_ACC_PAD)
1537
int delta = LabG_AccTextRect(newlw).width + LABELG_ACC_PAD -
1538
LabG_MarginLeft(newlw);
1539
newlw->label.acc_left_delta += delta;
1540
LabG_MarginLeft(newlw) += delta;
1545
if (LabG_MarginRight(newlw) <
1546
LabG_AccTextRect(newlw).width + LABELG_ACC_PAD)
1548
int delta = LabG_AccTextRect(newlw).width + LABELG_ACC_PAD -
1549
LabG_MarginRight(newlw);
1550
newlw->label.acc_right_delta += delta;
1551
LabG_MarginRight(newlw) += delta;
1555
/* Has a width been specified? */
1556
if (newlw->rectangle.width == 0)
1557
newlw->rectangle.width =
1558
LabG_TextRect(newlw).width +
1559
LabG_MarginLeft(newlw) + LabG_MarginRight(newlw) +
1560
(2 * (LabG_MarginWidth(newlw) +
1561
newlw->gadget.highlight_thickness
1562
+ newlw->gadget.shadow_thickness));
1564
leftx = newlw->gadget.highlight_thickness +
1565
newlw->gadget.shadow_thickness + LabG_MarginWidth(newlw) +
1566
LabG_MarginLeft(newlw);
1568
rightx = newlw->rectangle.width - newlw->gadget.highlight_thickness -
1569
newlw->gadget.shadow_thickness - LabG_MarginWidth(newlw) -
1570
LabG_MarginRight(newlw);
1572
switch (LabG_Alignment(newlw))
1574
case XmALIGNMENT_BEGINNING:
1575
if (LayoutIsRtoLG(newlw))
1576
LabG_TextRect(newlw).x = rightx - LabG_TextRect(newlw).width;
1578
LabG_TextRect(newlw).x = leftx;
1581
case XmALIGNMENT_END:
1582
if (LayoutIsRtoLG(newlw))
1583
LabG_TextRect(newlw).x = leftx;
1585
LabG_TextRect(newlw).x = rightx - LabG_TextRect(newlw).width;
1589
/* XmALIGNMENT_CENTER */
1590
LabG_TextRect(newlw).x = leftx +
1591
(rightx - leftx - (int)LabG_TextRect(newlw).width) / 2;
1595
/* Has a height been specified? */
1596
if (newlw->rectangle.height == 0)
1597
newlw->rectangle.height = MAX(LabG_TextRect(newlw).height,
1598
LabG_AccTextRect(newlw).height)
1599
+ LabG_MarginTop(newlw)
1600
+ LabG_MarginBottom(newlw)
1601
+ (2 * (LabG_MarginHeight(newlw)
1602
+ newlw->gadget.highlight_thickness
1603
+ newlw->gadget.shadow_thickness));
1605
LabG_TextRect(newlw).y =
1606
(short) (newlw->gadget.highlight_thickness
1607
+ newlw->gadget.shadow_thickness
1608
+ LabG_MarginHeight(newlw) + LabG_MarginTop(newlw) +
1609
((int) (newlw->rectangle.height - LabG_MarginTop(newlw)
1610
- LabG_MarginBottom(newlw)
1611
- (2 * (LabG_MarginHeight(newlw)
1612
+ newlw->gadget.highlight_thickness
1613
+ newlw->gadget.shadow_thickness))
1614
- LabG_TextRect(newlw).height) / 2));
1616
if (LabG__acceleratorText(newlw) != NULL)
1618
Dimension base_label, base_accText, diff;
1620
if (LayoutIsRtoLG(newlw))
1621
LabG_AccTextRect(newlw).x = newlw->rectangle .x +
1622
(newlw->gadget.highlight_thickness +
1623
newlw->gadget.shadow_thickness +
1624
LabG_MarginWidth(newlw));
1626
LabG_AccTextRect(newlw).x = (newlw->rectangle.width -
1627
newlw->gadget.highlight_thickness -
1628
newlw->gadget.shadow_thickness -
1629
LabG_MarginWidth(newlw) -
1630
LabG_MarginRight(newlw) +
1633
LabG_AccTextRect(newlw).y = newlw->gadget.highlight_thickness
1634
+ newlw->gadget.shadow_thickness
1635
+ LabG_MarginHeight(newlw) + LabG_MarginTop(newlw) +
1636
((int) (newlw->rectangle.height - LabG_MarginTop(newlw)
1637
- LabG_MarginBottom(newlw)
1638
- (2 * (LabG_MarginHeight(newlw)
1639
+ newlw->gadget.highlight_thickness
1640
+ newlw->gadget.shadow_thickness))
1641
- LabG_AccTextRect(newlw).height) / 2);
1643
/* make sure the label and accelerator text line up */
1644
/* when the fonts are different */
1646
if (LabG_IsText (newlw))
1649
XmStringBaseline (LabG_Font(newlw), LabG__label(newlw));
1651
XmStringBaseline (LabG_Font(newlw),
1652
LabG__acceleratorText(newlw));
1654
if (base_label > base_accText)
1656
diff = base_label - base_accText;
1657
LabG_AccTextRect(newlw).y = LabG_TextRect(newlw).y + diff - 1;
1659
else if (base_label < base_accText)
1661
diff = base_accText - base_label;
1662
LabG_TextRect(newlw).y = LabG_AccTextRect(newlw).y + diff - 1;
1667
/* Set core dimensions so we don't get a Toolkit error. */
1668
if (newlw->rectangle.width == 0)
1669
newlw->rectangle.width = 1;
1670
if (newlw->rectangle.height == 0)
1671
newlw->rectangle.height = 1;
1675
/************************************************************************
1678
* This is the widget's instance initialize routine. It is
1679
* called once for each widget.
1680
* Changes: Treat label, pixmap, labeltype, mnemoniccharset as independently
1682
************************************************************************/
1686
Initialize(Widget req,
1691
XmMenuSystemTrait menuSTrait;
1693
XmLabelGadget lw = (XmLabelGadget) new_w;
1694
XmLabelGadget rw = (XmLabelGadget) req;
1696
lw->label.baselines = NULL;
1698
/* Before doing anything with the pixmap, check if we have to
1699
* re-ask for a conversion */
1700
if (Pix (new_w) == XmDELAYED_PIXMAP)
1702
/* This test means that a conversion was asked for
1703
* but failed because the colors were not accessible
1704
* prior to Initialize, because the cache wasn't there yet.
1705
* We have to try again from here. */
1707
XtGetSubresources(new_w, new_w,
1709
label_pixmap_resource, 1,
1713
if (Pix_insen (new_w) == XmDELAYED_PIXMAP)
1715
XtGetSubresources(new_w, new_w,
1717
label_pixmap_insen_resource, 1,
1721
/* If menuProcs is not set up yet, try again */
1723
if (xmLabelGadgetClassRec.label_class.menuProcs == NULL)
1724
xmLabelGadgetClassRec.label_class.menuProcs =
1725
(XmMenuProc) _XmGetMenuProcContext();
1728
LabG_SkipCallback(new_w) = FALSE;
1730
/* Check for Invalid enumerated types */
1732
if (!XmRepTypeValidValue(XmRID_LABEL_TYPE, LabG_LabelType(new_w), new_w))
1733
LabG_LabelType(new_w) = XmSTRING;
1735
if (!XmRepTypeValidValue(XmRID_ALIGNMENT, LabG_Alignment(new_w), new_w))
1736
LabG_Alignment(new_w) = XmALIGNMENT_CENTER;
1738
if (!XmRepTypeValidValue(XmRID_PIXMAP_PLACEMENT, LabG_PixmapPlacement(new_w), new_w))
1739
LabG_PixmapPlacement(new_w) = XmPIXMAP_LEFT;
1741
#ifndef NO_XM_1_2_BC
1743
* Some pre-Motif 2.0 XmManager subclasses may be bypassing the
1744
* synthetic resouce GetValues hook and passing us the manager's raw
1745
* string_direction field (which is now a layout_direction). Fixup
1746
* the common/simple cases.
1748
switch (LabG_StringDirection(lw))
1750
case XmLEFT_TO_RIGHT:
1751
case XmRIGHT_TO_LEFT:
1752
/* These string directions are erroneous uses of layout directions. */
1753
LabG_StringDirection(lw) =
1754
XmDirectionToStringDirection(LabG_StringDirection(lw));
1757
/* Other unknown layout directions will still get a warning. */
1762
/* If layout_direction is set, it overrides string_direction.
1763
* If string_direction is set, but not layout_direction, use
1764
* string_direction value.
1765
* If neither is set, get from parent.
1767
if (lw->gadget.layout_direction != XmDEFAULT_DIRECTION)
1769
if (LabG_StringDirection(lw) == XmDEFAULT_DIRECTION)
1770
LabG_StringDirection(lw) =
1771
XmDirectionToStringDirection(lw->gadget.layout_direction);
1773
else if (LabG_StringDirection(lw) != XmDEFAULT_DIRECTION)
1775
lw->gadget.layout_direction =
1776
XmStringDirectionToDirection(LabG_StringDirection(lw));
1780
lw->gadget.layout_direction = _XmGetLayoutDirection(XtParent(new_w));
1781
LabG_StringDirection(lw) =
1782
XmDirectionToStringDirection(lw->gadget.layout_direction);
1785
if (!XmRepTypeValidValue(XmRID_STRING_DIRECTION,
1786
LabG_StringDirection(new_w), new_w))
1787
LabG_StringDirection(new_w) = XmSTRING_DIRECTION_L_TO_R;
1789
/* Make a local copy of the font list */
1790
if (LabG_Font(new_w) == NULL)
1792
/* CR 2990: Let subclasses choose their own default font. */
1793
LabG_Font(new_w) = XmeGetDefaultRenderTable (new_w, XmLABEL_FONTLIST);
1795
LabG_Font(new_w) = XmFontListCopy(LabG_Font(new_w));
1797
menuSTrait = (XmMenuSystemTrait)
1798
XmeTraitGet((XtPointer) XtClass((Widget) XtParent(new_w)), XmQTmenuSystem);
1800
if (menuSTrait != (XmMenuSystemTrait) NULL)
1801
LabG_MenuType(new_w) = menuSTrait->type(XtParent(new_w));
1803
LabG_MenuType(new_w) = XmWORK_AREA;
1805
/* Handle the label string :
1806
* If no label string is given accept widget's name as default.
1807
* convert the widgets name to an XmString before storing;
1809
* save a copy of the given string.
1810
* If the given string is not an XmString issue an warning.
1813
if (LabG__label(new_w) == NULL)
1816
LabG__label(new_w) = XmeGetLocalizedString ((char *) NULL,
1819
XrmQuarkToString(lw->object.xrm_name));
1821
else if (XmeStringIsValid((XmString) LabG__label(new_w)))
1823
LabG__label(new_w) = XmStringCopy((XmString) LabG__label(new_w));
1827
XmeWarning((Widget) lw, CS_STRING_MESSAGE);
1828
LabG__label(new_w) =
1829
XmStringCreateLocalized(XrmQuarkToString(lw->object.xrm_name));
1833
* Convert the given mnemonicCharset to the internal Xm-form.
1835
if (LabG_MnemonicCharset(new_w) != NULL)
1837
LabG_MnemonicCharset (new_w) =
1838
_XmStringCharsetCreate (LabG_MnemonicCharset (new_w));
1841
LabG_MnemonicCharset (new_w) =
1842
_XmStringCharsetCreate (XmFONTLIST_DEFAULT_TAG);
1844
/* Accelerators are currently only supported in menus */
1845
if ((LabG__acceleratorText(new_w) != NULL) && LabG_IsMenupane(new_w))
1847
if (XmeStringIsValid((XmString) LabG__acceleratorText(new_w)))
1849
/* Copy the input string into local space if not a Cascade Button. */
1850
if (XmIsCascadeButtonGadget(new_w))
1851
LabG__acceleratorText(new_w) = NULL;
1853
LabG__acceleratorText(new_w)=
1854
XmStringCopy((XmString) LabG__acceleratorText(new_w));
1858
XmeWarning((Widget) lw, ACC_MESSAGE);
1859
LabG__acceleratorText(new_w) = NULL;
1863
LabG__acceleratorText(new_w) = NULL;
1865
if ((LabG_Accelerator(new_w) != NULL) && LabG_IsMenupane(new_w))
1867
/* Copy the accelerator into local space */
1868
LabG_Accelerator(lw) = XtNewString(LabG_Accelerator(new_w));
1871
LabG_Accelerator(lw) = NULL;
1873
LabG_SkipCallback(lw) = FALSE;
1875
lw->label.acc_left_delta = 0;
1876
lw->label.acc_right_delta = 0;
1878
/* If zero width and height was requested by the application, */
1879
/* reset new's width and height to zero to allow Resize() */
1880
/* to operate properly. */
1882
if (rw->rectangle.width == 0)
1883
lw->rectangle.width = 0;
1885
if (rw->rectangle.height == 0)
1886
lw->rectangle.height = 0;
1888
/* CR 6267: Suppress highlight thickness before sizing also. */
1889
if ((LabG_MenuType(new_w) == XmMENU_POPUP) ||
1890
(LabG_MenuType(new_w) == XmMENU_PULLDOWN) ||
1891
(LabG_MenuType(new_w) == XmMENU_BAR))
1892
lw->gadget.highlight_thickness = 0;
1894
_XmCalcLabelGDimensions(new_w);
1896
/* CR 7283: Can't use the resize method pointer here because */
1897
/* subclasses haven't been initialized. */
1898
Resize((Widget) lw);
1901
DealWithPixmaps(lw);
1903
/* Initialize only; set properly in _XmLabelSetBackgroundGC(). */
1904
lw->label.fill_bg_box = _XmPLAIN_BG_BOX;
1907
_XmLabelSetBackgroundGC (lw);
1908
LabG_HighlightGC(lw) =
1909
_XmGetPixmapBasedGC (XtParent(new_w),
1910
LabG_HighlightColor(lw),
1911
LabG_Background(lw),
1912
LabG_HighlightPixmap(lw));
1913
LabG_TopShadowGC(lw) =
1914
_XmGetPixmapBasedGC (XtParent(new_w),
1915
LabG_TopShadowColor(lw),
1916
LabG_Background(lw),
1917
LabG_TopShadowPixmap(lw));
1918
LabG_BottomShadowGC(lw) =
1919
_XmGetPixmapBasedGC (XtParent(new_w),
1920
LabG_BottomShadowColor(lw),
1921
LabG_Background(lw),
1922
LabG_BottomShadowPixmap(lw));
1924
/* Force the label traversal flag when in a menu */
1925
if ((XtClass(lw) == xmLabelGadgetClass) &&
1926
((LabG_MenuType(new_w) == XmMENU_POPUP) ||
1927
(LabG_MenuType(new_w) == XmMENU_PULLDOWN) ||
1928
(LabG_MenuType(new_w) == XmMENU_OPTION)))
1930
lw->gadget.traversal_on = False;
1931
lw->gadget.highlight_on_enter = False;
1934
/* Initialize the interesting input types. */
1935
lw->gadget.event_mask = XmHELP_EVENT | XmFOCUS_IN_EVENT | XmFOCUS_OUT_EVENT
1936
| XmENTER_EVENT | XmLEAVE_EVENT | XmBDRAG_EVENT;
1942
* Deal with compatibility.
1946
DealWithColors(XmLabelGadget lw)
1948
XmManagerWidget mw = (XmManagerWidget) XtParent(lw);
1951
* If the gadget color is set to the tag value or it is the
1952
* same as the manager color; bc mode is enabled otherwise
1953
* initialize like a widget.
1955
if ((LabG_Background(lw) == INVALID_PIXEL ||
1956
LabG_Background(lw) == mw->core.background_pixel) &&
1957
(LabG_Foreground(lw) == INVALID_PIXEL ||
1958
LabG_Foreground(lw) == mw->manager.foreground) &&
1959
(LabG_TopShadowColor(lw) == INVALID_PIXEL ||
1960
LabG_TopShadowColor(lw) == mw->manager.top_shadow_color) &&
1961
(LabG_BottomShadowColor(lw) == INVALID_PIXEL ||
1962
LabG_BottomShadowColor(lw) == mw->manager.bottom_shadow_color) &&
1963
(LabG_HighlightColor(lw) == INVALID_PIXEL ||
1964
LabG_HighlightColor(lw) == mw->manager.highlight_color))
1966
LabG_Background(lw) = mw->core.background_pixel;
1967
LabG_Foreground(lw) = mw->manager.foreground;
1968
LabG_TopShadowColor(lw) = mw->manager.top_shadow_color;
1969
LabG_BottomShadowColor(lw) = mw->manager.bottom_shadow_color;
1970
LabG_HighlightColor(lw) = mw->manager.highlight_color;
1974
InitNewColorBehavior(lw);
1980
* InitNewColorBehavior
1981
* Initialize colors like a widget. These are CallProcs so
1982
* they should be called with a correct offset. However offset
1983
* isn't used by these functions. Even so I supply offset.
1984
* You make the call.
1988
InitNewColorBehavior(XmLabelGadget lw)
1992
value.size = sizeof(Pixel);
1994
if (LabG_Background(lw) == INVALID_PIXEL)
1996
_XmBackgroundColorDefault
1998
XtOffsetOf(struct _XmLabelGCacheObjRec, label_cache.background),
2000
memcpy((char*) &LabG_Background(lw), value.addr, value.size);
2003
if (LabG_Foreground(lw) == INVALID_PIXEL)
2005
_XmForegroundColorDefault
2007
XtOffsetOf(struct _XmLabelGCacheObjRec, label_cache.foreground),
2009
memcpy((char*) &LabG_Foreground(lw), value.addr, value.size);
2012
if (LabG_TopShadowColor(lw) == INVALID_PIXEL)
2014
_XmTopShadowColorDefault
2016
XtOffsetOf(struct _XmLabelGCacheObjRec, label_cache.top_shadow_color),
2018
memcpy((char*) &LabG_TopShadowColor(lw), value.addr, value.size);
2021
if (LabG_BottomShadowColor(lw) == INVALID_PIXEL)
2023
_XmBottomShadowColorDefault
2025
XtOffsetOf(struct _XmLabelGCacheObjRec,
2026
label_cache.bottom_shadow_color),
2028
memcpy((char*) &LabG_BottomShadowColor(lw), value.addr, value.size);
2031
if (LabG_HighlightColor(lw) == INVALID_PIXEL)
2033
_XmHighlightColorDefault
2035
XtOffsetOf(struct _XmLabelGCacheObjRec, label_cache.highlight_color),
2037
memcpy((char*) &LabG_HighlightColor(lw), value.addr, value.size);
2044
* Deal with compatibility. If any resource is set initialize
2045
* like a widget otherwise get everything from the parent.
2049
DealWithPixmaps(XmLabelGadget lw)
2051
XmManagerWidget mw = (XmManagerWidget) XtParent(lw);
2053
if ((LabG_TopShadowPixmap(lw) == INVALID_PIXMAP ||
2054
LabG_TopShadowPixmap(lw) == mw->manager.top_shadow_pixmap) &&
2055
(LabG_HighlightPixmap(lw) == INVALID_PIXMAP ||
2056
LabG_HighlightPixmap(lw) == mw->manager.highlight_pixmap))
2058
LabG_TopShadowPixmap(lw) = mw->manager.top_shadow_pixmap;
2059
LabG_HighlightPixmap(lw) = mw->manager.highlight_pixmap;
2063
InitNewPixmapBehavior(lw);
2069
* InitNewPixmapBehavior
2070
* Initialize colors like a widget.
2074
InitNewPixmapBehavior(XmLabelGadget lw)
2076
if (LabG_TopShadowPixmap(lw) == INVALID_PIXMAP)
2077
LabG_TopShadowColor(lw) = GetTopShadowPixmapDefault((Widget)lw);
2079
if (LabG_HighlightPixmap(lw) == INVALID_PIXMAP)
2080
LabG_HighlightPixmap(lw) = GetLabelHighlightPixmapDefault((Widget)lw);
2084
/************************************************************************
2088
************************************************************************/
2090
static XtGeometryResult
2091
QueryGeometry(Widget wid,
2092
XtWidgetGeometry *intended,
2093
XtWidgetGeometry *reply)
2095
XmLabelGadget lg = (XmLabelGadget) wid;
2096
reply->request_mode = 0;
2098
/* Don't really know what to do with queries about x,y,border,stacking.
2099
* Since we are interpreting unset bits as a request for information
2100
* (asking about neither height or width does the old 0-0 request)
2101
* a caller asking about x,y should not get back width and height,
2102
* especially since it is an expensive operation. So x, y, border, stack
2103
* all return No, this indicates we'd prefer to remain as is. Parent
2104
* is free to change it anyway...
2107
if (GMode(intended) & ~(CWWidth | CWHeight))
2108
return XtGeometryNo;
2110
if (LabG_RecomputeSize(lg) == FALSE)
2111
return XtGeometryNo;
2113
/* pre-load the reply with input values */
2115
reply->request_mode = (CWWidth | CWHeight);
2117
reply->width = LabG_TextRect(lg).width +
2118
(2 * (LabG_MarginWidth(lg) +
2119
lg->gadget.highlight_thickness +
2120
lg->gadget.shadow_thickness)) +
2121
LabG_MarginLeft(lg) +
2122
LabG_MarginRight(lg);
2124
if (reply->width == 0)
2127
reply->height = MAX(LabG_TextRect(lg).height,
2128
LabG_AccTextRect(lg).height) +
2129
(2 * (LabG_MarginHeight(lg) +
2130
lg->gadget.highlight_thickness +
2131
lg->gadget.shadow_thickness)) +
2132
LabG_MarginTop(lg) +
2133
LabG_MarginBottom(lg);
2135
if (reply->height == 0)
2138
if ((IsWidth(intended) && (reply->width != intended->width)) ||
2139
(IsHeight(intended) && (reply->height != intended->height)) ||
2140
(GMode(intended) != GMode(reply)))
2142
return XtGeometryAlmost;
2146
reply->request_mode = 0;
2147
return XtGeometryYes;
2152
/************************************************************************
2155
* Free up the label gadget allocated space. This includes
2156
* the label, and GC's.
2158
************************************************************************/
2163
if (LabG__label(w) != NULL)
2164
XmStringFree (LabG__label(w));
2165
if (LabG__acceleratorText(w) != NULL)
2166
XmStringFree (LabG__acceleratorText(w));
2167
XtFree (LabG_Accelerator(w));
2168
if (LabG_Font(w) != NULL)
2169
XmFontListFree (LabG_Font(w));
2170
XtFree (LabG_MnemonicCharset (w));
2172
XtFree ((char*) ((XmLabelGadget)w)->label.baselines);
2174
XtReleaseGC (XtParent(w), LabG_NormalGC(w));
2175
XtReleaseGC (XtParent(w), LabG_InsensitiveGC(w));
2177
XtReleaseGC (XtParent(w), LabG_BackgroundGC(w));
2178
XtReleaseGC (XtParent(w), LabG_HighlightGC(w));
2179
XtReleaseGC (XtParent(w), LabG_TopShadowGC(w));
2180
XtReleaseGC (XtParent(w), LabG_BottomShadowGC(w));
2182
/* CR 6571: Free cache *after* making all references. */
2184
_XmCacheDelete((XtPointer) LabG_Cache(w));
2191
LabelDrawBackground(Widget wid,
2192
XEvent *event, /* unused */
2193
Region region, /* unused */
2194
LRectangle *background_box)
2196
XmLabelGadget lw = (XmLabelGadget) wid;
2198
switch (lw->label.fill_bg_box)
2200
case _XmPLAIN_BG_BOX:
2205
case _XmFILL_BG_BOX:
2206
case _XmALWAYS_FILL_BG_BOX:
2212
* Background_box is a parameter because subclasses like
2213
* PushBG and ToggleBG need to be able to adjust this rectangle.
2216
if (background_box->width < 0)
2217
background_box->width = 0;
2219
if (background_box->height < 0)
2220
background_box->height = 0;
2222
XFillRectangle(XtDisplay(lw),
2223
XtWindow((Widget) lw),
2224
LabG_BackgroundGC(lw),
2227
background_box->width,
2228
background_box->height);
2232
/************************************************************************
2236
************************************************************************/
2239
Redisplay(Widget wid,
2243
XmLabelGadget lw = (XmLabelGadget) wid;
2244
LRectangle background_box;
2246
background_box.x = lw->rectangle.x + LabG_Highlight(lw);
2247
background_box.y = lw->rectangle.y + LabG_Highlight(lw);
2248
background_box.width = lw->rectangle.width - (2 * LabG_Highlight(lw));
2249
background_box.height = lw->rectangle.height - (2 * LabG_Highlight(lw));
2251
_XmRedisplayLabG(wid, event, region, &background_box);
2256
_XmRedisplayLabG(Widget wid,
2259
LRectangle *background_box)
2261
XmLabelGadget lw = (XmLabelGadget) wid;
2264
XRectangle clip_rect;
2265
Dimension availW, availH, marginal_width, marginal_height, max_text_height;
2267
if (!XtIsRealized(wid)) return ;
2269
if (LabG_IsMenupane(lw))
2271
ShellWidget mshell = (ShellWidget) XtParent(XtParent(lw));
2272
if (! mshell->shell.popped_up)
2276
availH = lw->rectangle.height;
2277
availW = lw->rectangle.width;
2280
* Don't count MarginWidth to be consistent with Label Widget.
2282
* Adjust definitions of temporary variables
2284
marginal_width = LabG_MarginLeft(lw) + LabG_MarginRight(lw) +
2285
(2 * (lw->gadget.highlight_thickness + lw->gadget.shadow_thickness));
2287
marginal_height = LabG_MarginTop(lw) + LabG_MarginBottom(lw) +
2288
(2 * (lw->gadget.highlight_thickness + lw->gadget.shadow_thickness));
2290
max_text_height = MAX(LabG_TextRect(lw).height, LabG_AccTextRect(lw).height);
2292
if (XtIsSensitive(wid))
2293
clipgc = LabG_NormalGC(lw);
2295
clipgc = LabG_InsensitiveGC(lw);
2297
/* Clip should include critical margins (see Label.c) */
2298
if (availH < (marginal_height + max_text_height) ||
2299
availW < (marginal_width + LabG_TextRect(lw).width))
2301
clip_rect.x = lw->rectangle.x + lw->gadget.highlight_thickness +
2302
lw->gadget.shadow_thickness + LabG_MarginLeft(lw);
2303
clip_rect.y = lw->rectangle.y + lw->gadget.highlight_thickness +
2304
lw->gadget.shadow_thickness + LabG_MarginTop(lw);
2306
/* Don't allow negative dimensions */
2307
if (availW > marginal_width)
2308
clip_rect.width = availW - marginal_width;
2310
clip_rect.width = 0;
2312
if (availH > marginal_height)
2313
clip_rect.height = availH - marginal_height;
2315
clip_rect.height = 0;
2317
XSetClipRectangles(XtDisplay(lw), clipgc, 0,0, &clip_rect, 1, Unsorted);
2319
XSetClipMask (XtDisplay (lw), clipgc, None);
2321
/* Draw the pixmap or text */
2322
LabelDrawBackground((Widget)lw, event, region, background_box);
2324
if (LabG_IsPixmap(lw) || LabG_IsPixmapAndText(lw))
2328
/* moved before the condition: LabelDrawBackground((Widget)lw, event, region, background_box); */
2329
if (XtIsSensitive(wid))
2331
if (Pix (lw) != XmUNSPECIFIED_PIXMAP)
2333
gc = LabG_NormalGC(lw);
2335
XmeGetPixmapData(XtScreen(lw), Pix(lw), NULL, &depth,
2336
NULL, NULL, NULL, NULL, NULL, NULL);
2338
if (depth == XtParent(lw)->core.depth)
2339
XCopyArea (XtDisplay(lw), Pix(lw), XtWindow(lw), gc, 0, 0,
2340
LabG_PixmapRect(lw).width, LabG_PixmapRect(lw).height,
2341
lw->rectangle.x + LabG_TextRect(lw).x +
2342
LabG_PixmapRect(lw).x,
2343
lw->rectangle.y + LabG_TextRect(lw).y +
2344
LabG_PixmapRect(lw).y);
2345
else if (depth == 1)
2346
XCopyPlane (XtDisplay(lw), Pix(lw), XtWindow(lw), gc, 0, 0,
2347
LabG_PixmapRect(lw).width,
2348
LabG_PixmapRect(lw).height,
2349
lw->rectangle.x + LabG_TextRect(lw).x +
2350
LabG_PixmapRect(lw).x,
2351
lw->rectangle.y + LabG_TextRect(lw).y +
2352
LabG_PixmapRect(lw).y,
2358
Pixmap pix_use = Pix_insen (lw) ;
2360
if (pix_use == XmUNSPECIFIED_PIXMAP)
2363
if (pix_use != XmUNSPECIFIED_PIXMAP)
2365
gc = LabG_InsensitiveGC(lw);
2367
XmeGetPixmapData(XtScreen(lw), pix_use, NULL, &depth,
2368
NULL, NULL, NULL, NULL, NULL, NULL);
2370
if (depth == XtParent(lw)->core.depth)
2371
XCopyArea (XtDisplay(lw), pix_use, XtWindow(lw), gc, 0, 0,
2372
LabG_PixmapRect(lw).width, LabG_PixmapRect(lw).height,
2373
lw->rectangle.x + LabG_TextRect(lw).x +
2374
LabG_PixmapRect(lw).x,
2375
lw->rectangle.y + LabG_TextRect(lw).y +
2376
LabG_PixmapRect(lw).y);
2377
else if (depth == 1)
2378
XCopyPlane (XtDisplay(lw), pix_use, XtWindow(lw), gc, 0, 0,
2379
LabG_PixmapRect(lw).width,
2380
LabG_PixmapRect(lw).height,
2381
lw->rectangle.x + LabG_TextRect(lw).x + LabG_PixmapRect(lw).x,
2382
lw->rectangle.y + LabG_TextRect(lw).y + LabG_PixmapRect(lw).y,
2385
/* if no insensitive pixmap but a regular one, we need
2386
to do the stipple manually, since copyarea doesn't */
2387
if (pix_use == Pix(lw))
2389
/* need fill stipple, not opaque */
2390
XSetFillStyle(XtDisplay(lw), gc, FillStippled);
2391
XFillRectangle(XtDisplay(lw), XtWindow(lw),
2393
lw->rectangle.x + LabG_TextRect(lw).x +
2394
LabG_PixmapRect(lw).x,
2395
lw->rectangle.y + LabG_TextRect(lw).y +
2396
LabG_PixmapRect(lw).y,
2397
LabG_PixmapRect(lw).width,
2398
LabG_PixmapRect(lw).height);
2399
XSetFillStyle(XtDisplay(lw), gc, FillOpaqueStippled);
2405
if ((LabG_IsText(lw) || LabG_IsPixmapAndText(lw)) && (LabG__label(lw) != NULL))
2407
/* TODO this clears the pixmap, but this is needed to draw background */
2408
/* LabelDrawBackground((Widget)lw, event, region, background_box); */
2410
if (LabG_Mnemonic(lw) != XK_VoidSymbol)
2412
/* CR 5181: Convert the mnemonic keysym to a character string. */
2413
char tmp[MB_LEN_MAX * 2];
2416
tmp[_XmOSKeySymToCharacter(LabG_Mnemonic(lw), NULL, tmp)] = '\0';
2417
underline = XmStringCreate(tmp, LabG_MnemonicCharset(lw));
2419
XmStringDrawUnderline(XtDisplay(lw), XtWindow(lw),
2420
LabG_Font(lw), LabG__label(lw),
2421
(XtIsSensitive(wid) ?
2422
LabG_NormalGC(lw) : LabG_InsensitiveGC(lw)),
2423
lw->rectangle.x + LabG_TextRect(lw).x + LabG_StringRect(lw).x,
2424
lw->rectangle.y + LabG_TextRect(lw).y + LabG_StringRect(lw).y,
2425
LabG_StringRect(lw).width, LabG_Alignment(lw),
2426
LayoutG(lw), NULL, underline);
2427
XmStringFree(underline);
2430
XmStringDraw (XtDisplay(lw), XtWindow(lw),
2431
LabG_Font(lw), LabG__label(lw),
2432
(XtIsSensitive(wid) ?
2433
LabG_NormalGC(lw) : LabG_InsensitiveGC(lw)),
2434
lw->rectangle.x + LabG_TextRect(lw).x + LabG_StringRect(lw).x,
2435
lw->rectangle.y + LabG_TextRect(lw).y + LabG_StringRect(lw).y,
2436
LabG_StringRect(lw).width,
2437
LabG_Alignment(lw), LayoutG(lw), NULL);
2439
if (!XtIsSensitive(wid)) {
2440
XSetFillStyle(XtDisplay(lw), LabG_InsensitiveGC(lw), FillStippled);
2441
XFillRectangle(XtDisplay(lw), XtWindow(lw), LabG_InsensitiveGC(lw),
2442
lw->rectangle.x + LabG_TextRect(lw).x +
2443
LabG_StringRect(lw).x,
2444
lw->rectangle.y + LabG_TextRect(lw).y +
2445
LabG_StringRect(lw).y,
2446
LabG_StringRect(lw).width,
2447
LabG_StringRect(lw).height);
2448
XSetFillStyle(XtDisplay(lw), LabG_InsensitiveGC(lw), FillOpaqueStippled);
2453
if (LabG__acceleratorText(lw) != NULL)
2455
/* Since accelerator text is drawn by moving in from the right,
2456
* it is possible to overwrite label text when there is clipping,
2457
* Therefore draw accelerator text only if there is enough
2458
* room for everything */
2460
if ((lw->rectangle.width) >=
2461
(2 * (lw->gadget.highlight_thickness +
2462
lw->gadget.shadow_thickness +
2463
LabG_MarginWidth(lw)) +
2464
LabG_MarginLeft(lw) + LabG_TextRect(lw).width +
2465
LabG_MarginRight(lw)))
2467
XmStringDraw (XtDisplay(lw), XtWindow(lw),
2468
LabG_Font(lw), LabG__acceleratorText(lw),
2469
(XtIsSensitive(wid) ?
2470
LabG_NormalGC(lw) : LabG_InsensitiveGC(lw)),
2471
lw->rectangle.x + LabG_AccTextRect(lw).x,
2472
lw->rectangle.y + LabG_AccTextRect(lw).y,
2473
LabG_AccTextRect(lw).width, XmALIGNMENT_END,
2478
/* Redraw the proper highlight */
2479
if (! LabG_IsMenupane(lw) && LabG_MenuType(lw) != XmMENU_BAR)
2481
if (lw->gadget.highlighted)
2483
(*((XmGadgetClass) XtClass(lw))->gadget_class.border_highlight)
2490
/************************************************************************
2493
* This routine will take care of any changes that have been made
2495
************************************************************************/
2499
SetValues(Widget cw,
2502
ArgList args, /* unused */
2503
Cardinal *num_args) /* unused */
2505
XmLabelGadget current = (XmLabelGadget) cw;
2506
XmLabelGadget req = (XmLabelGadget) rw;
2507
XmLabelGadget new_w = (XmLabelGadget) nw;
2508
Boolean flag = False;
2509
Boolean newstring = False;
2510
Boolean ProcessFlag = FALSE;
2511
Boolean CleanupFontFlag = FALSE;
2512
Boolean Call_Resize = False;
2513
XmMenuSystemTrait menuSTrait;
2515
/* Invalidate the basline cache if necessary. */
2516
if ((LabG__label(new_w) != LabG__label(current)) ||
2517
(LabG_Font(new_w) != LabG_Font(current)))
2519
if (new_w->label.baselines)
2521
XtFree ((char*) new_w->label.baselines);
2522
new_w->label.baselines = NULL;
2526
/* If the label has changed, make a copy of the new label, */
2527
/* and free the old label. */
2529
if (LabG__label(new_w)!= LabG__label(current))
2532
if (LabG__label(new_w) == NULL)
2534
LabG__label(new_w) =
2535
XmStringCreateLocalized(XrmQuarkToString (current->object.xrm_name));
2539
if (XmeStringIsValid((XmString) LabG__label(new_w)))
2541
LabG__label(new_w) = XmStringCopy((XmString) LabG__label(new_w));
2545
XmeWarning((Widget) new_w, CS_STRING_MESSAGE);
2546
LabG__label(new_w) =
2547
XmStringCreateLocalized(XrmQuarkToString(new_w->object.xrm_name));
2551
XmStringFree(LabG__label(current));
2552
LabG__label(current)= NULL;
2553
LabG__label(req)= NULL;
2556
if (LabG_MarginRight(new_w) != LabG_MarginRight(current))
2557
new_w->label.acc_right_delta = 0;
2558
if (LabG_MarginLeft(new_w) != LabG_MarginLeft(current))
2559
new_w->label.acc_left_delta = 0;
2561
if ((LabG__acceleratorText(new_w) != LabG__acceleratorText(current)) &&
2562
LabG_IsMenupane(new_w))
2564
/* BEGIN OSF Fix pir 1098 */
2566
/* END OSF Fix pir 1098 */
2567
if (LabG__acceleratorText(new_w) != NULL)
2569
if (XmeStringIsValid((XmString) LabG__acceleratorText(new_w)))
2571
if ((XmIsCascadeButtonGadget(new_w)) &&
2572
(LabG__acceleratorText(new_w) != NULL))
2573
LabG__acceleratorText(new_w) = NULL;
2575
LabG__acceleratorText(new_w) =
2576
XmStringCopy(LabG__acceleratorText(new_w));
2577
XmStringFree(LabG__acceleratorText(current));
2578
LabG__acceleratorText(current)= NULL;
2579
LabG__acceleratorText(req)= NULL;
2583
XmeWarning((Widget) new_w, ACC_MESSAGE);
2584
LabG__acceleratorText(new_w) = NULL;
2585
XmStringFree(LabG__acceleratorText(current));
2586
LabG__acceleratorText(current)= NULL;
2587
LabG__acceleratorText(req)= NULL;
2590
/* BEGIN OSF Fix pir 1098 */
2591
else if (LabG__acceleratorText(current))
2593
/* CR 3481: Don't blindly force the margin back to 0; */
2594
/* try to preserve the user specified value. */
2595
if (LayoutIsRtoLG(new_w))
2597
LabG_MarginLeft(new_w) -= new_w->label.acc_left_delta;
2598
new_w->label.acc_left_delta = 0;
2602
LabG_MarginRight(new_w) -= new_w->label.acc_right_delta;
2603
new_w->label.acc_right_delta = 0;
2606
/* END OSF Fix pir 1098 */
2609
LabG__acceleratorText(new_w) = LabG__acceleratorText(current);
2611
if (LabG_Font(new_w) != LabG_Font(current))
2613
CleanupFontFlag = True;
2614
if (LabG_Font(new_w) == NULL)
2616
/* CR 2990: let subclasses pick their own default fonts. */
2618
XmeGetDefaultRenderTable((Widget) new_w, XmLABEL_FONTLIST);
2620
LabG_Font(new_w) = XmFontListCopy (LabG_Font(new_w));
2623
/* Reinitialize the interesting input types. */
2625
new_w->gadget.event_mask = XmHELP_EVENT;
2627
new_w->gadget.event_mask |=
2628
XmFOCUS_IN_EVENT | XmFOCUS_OUT_EVENT | XmENTER_EVENT | XmLEAVE_EVENT |
2631
if ((LabG_MenuType(new_w) == XmMENU_POPUP) ||
2632
(LabG_MenuType(new_w) == XmMENU_PULLDOWN) ||
2633
(LabG_MenuType(new_w) == XmMENU_BAR))
2634
new_w->gadget.highlight_thickness = 0;
2636
if (!XmRepTypeValidValue(XmRID_LABEL_TYPE, LabG_LabelType(new_w),
2639
LabG_LabelType(new_w) = LabG_LabelType(current);
2642
if (!XmRepTypeValidValue(XmRID_PIXMAP_PLACEMENT, LabG_PixmapPlacement(new_w),
2645
LabG_PixmapPlacement(new_w) = LabG_PixmapPlacement(current);
2648
if (LayoutG(new_w) != LayoutG(current))
2650
/* If no new margins specified swap them */
2651
if ((LayoutIsRtoLG(current) != LayoutIsRtoLG(new_w)) &&
2652
(LabG_MarginLeft(current) == LabG_MarginLeft(new_w)) &&
2653
(LabG_MarginRight(current) == LabG_MarginRight(new_w)))
2655
LabG_MarginLeft(new_w) = LabG_MarginRight(current);
2656
LabG_MarginRight(new_w) = LabG_MarginLeft(current);
2661
/* ValidateInputs(new_w); */
2663
if (((LabG_IsText(new_w) || LabG_IsPixmapAndText(new_w)) &&
2664
(newstring || (LabG_Font(new_w) != LabG_Font(current)))) ||
2665
((LabG_IsPixmap(new_w) || LabG_IsPixmapAndText(new_w)) &&
2666
((LabG_Pixmap(new_w) != LabG_Pixmap(current)) ||
2667
(LabG_PixmapInsensitive(new_w) != LabG_PixmapInsensitive(current)) ||
2668
/* When you have different sized pixmaps for sensitive and */
2669
/* insensitive states and sensitivity changes, */
2670
/* the right size is chosen. (osfP2560) */
2671
(XtIsSensitive(nw) != XtIsSensitive(cw)))) ||
2672
(LabG_IsPixmapAndText(new_w) &&
2673
LabG_PixmapPlacement(new_w) != LabG_PixmapPlacement(current)) ||
2674
(LabG_LabelType(new_w) != LabG_LabelType(current)))
2676
/* CR 9179: back out CR 5419 changes. */
2677
_XmCalcLabelGDimensions((Widget) new_w);
2679
if (LabG_RecomputeSize(new_w))
2681
if (req->rectangle.width == current->rectangle.width)
2682
new_w->rectangle.width = 0;
2683
if (req->rectangle.height == current->rectangle.height)
2684
new_w->rectangle.height = 0;
2692
if ((LabG_Alignment(new_w)!= LabG_Alignment(current)) ||
2693
(LayoutG(new_w) != LayoutG(current)))
2695
if (!XmRepTypeValidValue(XmRID_ALIGNMENT, LabG_Alignment(new_w),
2698
LabG_Alignment(new_w) = LabG_Alignment(current);
2706
if ((LabG_MarginHeight(new_w) != LabG_MarginHeight(current)) ||
2707
(LabG_MarginWidth(new_w) != LabG_MarginWidth(current)) ||
2708
(LabG_MarginRight(new_w) != LabG_MarginRight(current)) ||
2709
(LabG_MarginLeft(new_w)!= LabG_MarginLeft(current)) ||
2710
(LabG_MarginTop(new_w)!= LabG_MarginTop(current)) ||
2711
(LabG_MarginBottom(new_w)!= LabG_MarginBottom(current)) ||
2712
(new_w->gadget.shadow_thickness != current->gadget.shadow_thickness) ||
2713
(new_w->gadget.highlight_thickness !=
2714
current->gadget.highlight_thickness) ||
2715
((new_w->rectangle.width <= 0) || (new_w->rectangle.height <= 0)) ||
2716
(LabG_PixmapTextPadding(new_w) != LabG_PixmapTextPadding(current)))
2718
if (LabG_RecomputeSize(new_w))
2720
if (req->rectangle.width == current->rectangle.width)
2721
new_w->rectangle.width = 0;
2722
if (req->rectangle.height == current->rectangle.height)
2723
new_w->rectangle.height = 0;
2730
/* Resize is called only if we need to calculate the dimensions or */
2731
/* coordinates for the string. */
2736
XtWidgetProc resize;
2739
resize = (((XmLabelGadgetClassRec *)(new_w->object.widget_class))->
2743
(* (resize)) ((Widget) new_w);
2746
/* If the sensitivity has changed then we must redisplay. */
2747
if (XtIsSensitive(nw) != XtIsSensitive(cw))
2752
/* Force the traversal flag when in a menu. */
2753
if ((XtClass(new_w) == xmLabelGadgetClass) &&
2754
((LabG_MenuType(new_w) == XmMENU_POPUP) ||
2755
(LabG_MenuType(new_w) == XmMENU_PULLDOWN) ||
2756
(LabG_MenuType(new_w) == XmMENU_OPTION)))
2758
new_w->gadget.traversal_on = False;
2759
new_w->gadget.highlight_on_enter = False;
2762
if (LabG_Font(new_w) != LabG_Font(current) ||
2763
LabG_Foreground(new_w) != LabG_Foreground(current) ||
2764
LabG_Background(new_w) != LabG_Background(current))
2766
/* Recreate the GC's if the font has been changed */
2767
XtReleaseGC (XtParent (current), LabG_NormalGC(current));
2768
XtReleaseGC (XtParent (current), LabG_InsensitiveGC(current));
2774
* The test for foreground is done here to allow for subclasses
2775
* to use this gc in a graphix op that may reference the background
2776
* field of the GC (i.e. in this gc background is set to LabG_Foreground.
2779
if (LabG_Background(new_w) != LabG_Background(current) ||
2780
LabG_Foreground(new_w) != LabG_Foreground(current))
2782
XtReleaseGC (XtParent (current), LabG_BackgroundGC(current));
2783
_XmLabelSetBackgroundGC(new_w);
2787
if (LabG_TopShadowColor(new_w) != LabG_TopShadowColor(current) ||
2788
LabG_TopShadowPixmap(new_w) != LabG_TopShadowPixmap(current))
2790
XtReleaseGC (XtParent (current), LabG_TopShadowGC(current));
2791
LabG_TopShadowGC(new_w) =
2792
_XmGetPixmapBasedGC (XtParent(nw),
2793
LabG_TopShadowColor(new_w),
2794
LabG_Background(new_w),
2795
LabG_TopShadowPixmap(new_w));
2799
if (LabG_BottomShadowColor(new_w) != LabG_BottomShadowColor(current) ||
2800
LabG_BottomShadowPixmap(new_w) != LabG_BottomShadowPixmap(current))
2802
XtReleaseGC (XtParent (current), LabG_BottomShadowGC(current));
2803
LabG_BottomShadowGC(new_w) =
2804
_XmGetPixmapBasedGC (XtParent(nw),
2805
LabG_BottomShadowColor(new_w),
2806
LabG_Background(new_w),
2807
LabG_BottomShadowPixmap(new_w));
2811
if (LabG_HighlightColor(new_w) != LabG_HighlightColor(current) ||
2812
LabG_HighlightPixmap(new_w) != LabG_HighlightPixmap(current))
2814
XtReleaseGC (XtParent (current), LabG_HighlightGC(current));
2815
LabG_HighlightGC(new_w) =
2816
_XmGetPixmapBasedGC (XtParent(nw),
2817
LabG_HighlightColor(new_w),
2818
LabG_Background(new_w),
2819
LabG_HighlightPixmap(new_w));
2823
if ((LabG_MenuType(new_w) != XmWORK_AREA) &&
2824
(LabG_Mnemonic(new_w) != LabG_Mnemonic(current)))
2826
/* New grabs only required if mnemonic changes */
2828
if (LabG_LabelType(new_w) == XmSTRING ||
2829
LabG_LabelType(new_w) == XmPIXMAP_AND_STRING)
2833
if (LabG_MnemonicCharset(new_w) != LabG_MnemonicCharset(current))
2835
if (LabG_MnemonicCharset(new_w))
2836
LabG_MnemonicCharset(new_w) =
2837
_XmStringCharsetCreate(LabG_MnemonicCharset (new_w));
2839
LabG_MnemonicCharset(new_w) =
2840
_XmStringCharsetCreate(XmFONTLIST_DEFAULT_TAG);
2842
if (LabG_MnemonicCharset (current) != NULL)
2843
XtFree(LabG_MnemonicCharset(current));
2845
if (LabG_LabelType(new_w) == XmSTRING ||
2846
LabG_LabelType(new_w) == XmPIXMAP_AND_STRING)
2850
if (LabG_IsMenupane(new_w) &&
2851
(LabG_Accelerator(new_w) != LabG_Accelerator(current)))
2853
if (LabG_Accelerator(new_w) != NULL)
2855
/* Copy the accelerator into local space */
2856
LabG_Accelerator(new_w) = XtNewString(LabG_Accelerator(new_w));
2859
if (LabG_Accelerator(current) != NULL)
2860
XtFree(LabG_Accelerator(current));
2862
LabG_Accelerator(current) = NULL;
2863
LabG_Accelerator(req) = NULL;
2867
LabG_Accelerator(new_w) = LabG_Accelerator(current);
2869
menuSTrait = (XmMenuSystemTrait)
2870
XmeTraitGet((XtPointer) XtClass(XtParent(new_w)), XmQTmenuSystem);
2872
if (ProcessFlag && menuSTrait != NULL)
2873
menuSTrait->updateBindings((Widget)new_w, XmREPLACE);
2875
if (flag && (LabG_MenuType(new_w) == XmMENU_PULLDOWN) &&
2877
menuSTrait->updateHistory(XtParent(new_w), (Widget) new_w, True);
2879
if (CleanupFontFlag)
2880
if (LabG_Font(current)) XmFontListFree(LabG_Font(current));
2887
* So complications. HandleRedraw is a wrapper that calls _XmLabelGCVTRedraw
2888
* which does the work for the trait stuff.
2890
* _XmLabelGCVTRedraw returns a boolean which determines if the child, not the
2891
* parent should be redrawn.
2893
* This is done to serve as a form of inheritance. ToggleBG needs all the
2894
* LabelG stuff changed plus some of its own state. Therefore ToggleBG
2895
* will call _XmLabelGCVTRedraw.
2899
HandleRedraw (Widget kid,
2904
Boolean redraw = False;
2905
XtExposeProc expose;
2907
/* Don't change with parent. New Gadget behavior has been enabled. */
2908
redraw = _XmLabelGCVTRedraw (kid, cur_parent, new_parent, visual_flag);
2911
expose = ((XmLabelGadgetClassRec *)(XtClass(kid)))->rect_class.expose;
2916
if (! XtIsRealized(kid))
2922
(* (expose)) ((Widget)kid, NULL, (Region) NULL);
2930
_XmLabelGCVTRedraw(Widget kid,
2935
XmLabelGadget lw = (XmLabelGadget) kid;
2936
XmManagerWidget mw = (XmManagerWidget) new_parent;
2937
XmManagerWidget curmw = (XmManagerWidget) cur_parent;
2938
Boolean redraw = False, do_normal = False, do_background = False;
2939
XmLabelGCacheObjPart oldCopy;
2942
* Since we are here the instance record is going to be changed.
2943
* So break this out out the cache, make the changes and reinsert
2948
_XmCacheCopy((XtPointer) LabG_Cache(lw), (XtPointer) &oldCopy,
2949
sizeof(XmLabelGCacheObjPart));
2950
_XmCacheDelete ((XtPointer) LabG_Cache(lw));
2952
LabG_Cache(lw) = &oldCopy;
2954
if ((visual_flag & VisualBackgroundPixel) &&
2955
(LabG_Background(lw) == curmw->core.background_pixel))
2957
redraw = do_background = do_normal = True;
2958
LabG_Background(lw) = mw->core.background_pixel;
2961
if (visual_flag & VisualBackgroundPixmap)
2963
redraw = do_background = True;
2966
if ((visual_flag & VisualForeground) &&
2967
(LabG_Foreground(lw) == curmw->manager.foreground))
2969
redraw = do_normal = True;
2970
LabG_Foreground(lw) = mw->manager.foreground;
2975
XtReleaseGC (XtParent(lw), LabG_BackgroundGC(lw));
2976
_XmLabelSetBackgroundGC((XmLabelGadget)lw);
2981
XtReleaseGC (XtParent(lw), LabG_NormalGC(lw));
2982
XtReleaseGC (XtParent(lw), LabG_InsensitiveGC(lw));
2983
SetNormalGC((XmLabelGadget)lw);
2986
if (visual_flag & (VisualTopShadowColor | VisualTopShadowPixmap))
2988
XtReleaseGC (XtParent(lw), LabG_TopShadowGC(lw));
2990
if(LabG_TopShadowColor(lw) == curmw->manager.top_shadow_color)
2991
LabG_TopShadowColor(lw) = mw->manager.top_shadow_color;
2993
if(LabG_TopShadowPixmap(lw) == curmw->manager.top_shadow_pixmap &&
2994
(LabG_TopShadowPixmap(lw) != XmUNSPECIFIED_PIXMAP
2995
|| LabG_TopShadowColor(lw) == curmw->manager.top_shadow_color))
2996
LabG_TopShadowPixmap(lw) = mw->manager.top_shadow_pixmap;
2998
LabG_TopShadowGC(lw) =
2999
_XmGetPixmapBasedGC (XtParent(lw),
3000
LabG_TopShadowColor(lw),
3001
LabG_Background(lw),
3002
LabG_TopShadowPixmap(lw));
3007
if (visual_flag & (VisualBottomShadowColor | VisualBottomShadowPixmap))
3009
XtReleaseGC (XtParent(lw), LabG_BottomShadowGC(lw));
3011
if(LabG_BottomShadowColor(lw) == curmw->manager.bottom_shadow_color)
3012
LabG_BottomShadowColor(lw) = mw->manager.bottom_shadow_color;
3014
if(LabG_BottomShadowPixmap(lw) == curmw->manager.bottom_shadow_pixmap &&
3015
(LabG_BottomShadowPixmap(lw) != XmUNSPECIFIED_PIXMAP
3016
|| LabG_BottomShadowColor(lw) == curmw->manager.bottom_shadow_color))
3017
LabG_BottomShadowPixmap(lw) = mw->manager.bottom_shadow_pixmap;
3019
LabG_BottomShadowGC(lw) =
3020
_XmGetPixmapBasedGC (XtParent(lw),
3021
LabG_BottomShadowColor(lw),
3022
LabG_Background(lw),
3023
LabG_BottomShadowPixmap(lw));
3028
if (visual_flag & (VisualHighlightColor | VisualHighlightPixmap))
3030
XtReleaseGC (XtParent(lw), LabG_HighlightGC(lw));
3032
if(LabG_HighlightColor(lw) == curmw->manager.highlight_color)
3033
LabG_HighlightColor(lw) = mw->manager.highlight_color;
3035
if(LabG_HighlightPixmap(lw) == curmw->manager.highlight_pixmap &&
3036
(LabG_HighlightPixmap(lw) != XmUNSPECIFIED_PIXMAP
3037
|| LabG_HighlightColor(lw) == curmw->manager.highlight_color))
3038
LabG_HighlightPixmap(lw) = mw->manager.highlight_pixmap;
3040
LabG_HighlightGC(lw) =
3041
_XmGetPixmapBasedGC (XtParent(lw),
3042
LabG_HighlightColor(lw),
3043
LabG_Background(lw),
3044
LabG_HighlightPixmap(lw));
3050
LabG_Cache(lw) = (XmLabelGCacheObjPart *)
3051
_XmCachePart(LabG_ClassCachePart(lw), (XtPointer) LabG_Cache(lw),
3052
sizeof(XmLabelGCacheObjPart));
3058
/************************************************************************
3061
* This function catches input sent by a manager and dispatches it
3062
* to the individual routines.
3064
************************************************************************/
3067
InputDispatch(Widget wid,
3071
XmLabelGadget lg = (XmLabelGadget) wid;
3073
if (event_mask & XmHELP_EVENT)
3074
Help ((Widget) lg, event);
3075
else if (event_mask & XmENTER_EVENT)
3076
_XmEnterGadget ((Widget) lg, event, NULL, NULL);
3077
else if (event_mask & XmLEAVE_EVENT)
3078
_XmLeaveGadget ((Widget) lg, event, NULL, NULL);
3079
else if (event_mask & XmFOCUS_IN_EVENT)
3080
_XmFocusInGadget ((Widget) lg, event, NULL, NULL);
3081
else if (event_mask & XmFOCUS_OUT_EVENT)
3082
_XmFocusOutGadget ((Widget) lg, event, NULL, NULL);
3083
else if (event_mask & XmBDRAG_EVENT)
3084
_XmProcessDrag ((Widget) lg, event, NULL, NULL);
3088
/************************************************************************
3091
* This routine is called if the user made a help selection
3094
************************************************************************/
3100
XmLabelGadget lg = (XmLabelGadget) w;
3101
XmMenuSystemTrait menuSTrait;
3103
menuSTrait = (XmMenuSystemTrait)
3104
XmeTraitGet((XtPointer) XtClass(XtParent(lg)), XmQTmenuSystem);
3106
if (LabG_IsMenupane(lg) && (menuSTrait != NULL))
3107
menuSTrait->popdown(XtParent(lg), event);
3109
_XmSocorro(w, event, NULL, NULL);
3113
/************************************************************************
3116
* This is a get values hook function that returns the external
3117
* form of the label string from the internal form.
3119
***********************************************************************/
3123
GetLabelString(Widget wid,
3127
XmLabelGadget lw = (XmLabelGadget) wid;
3130
string = XmStringCopy(LabG__label(lw));
3132
*value = (XtArgVal) string;
3136
/************************************************************************
3139
* This is a get values hook function that returns a copy
3140
* of the accelerator string.
3142
***********************************************************************/
3146
GetAccelerator(Widget wid,
3150
XmLabelGadget lw = (XmLabelGadget) wid;
3153
string = XtNewString(LabG_Accelerator(lw));
3155
*value = (XtArgVal) string;
3159
/************************************************************************
3161
* GetAcceleratorText
3162
* This is a get values hook function that returns the external
3163
* form of the accelerator text from the internal form.
3165
***********************************************************************/
3169
GetAcceleratorText(Widget wid,
3173
XmLabelGadget lw = (XmLabelGadget) wid;
3176
string = XmStringCopy(LabG__acceleratorText(lw));
3178
*value = (XtArgVal) string;
3182
/************************************************************************
3184
* _XmStringCharsetCreate
3186
************************************************************************/
3188
static XmStringCharSet
3189
_XmStringCharsetCreate(XmStringCharSet stringcharset)
3191
return (XmStringCharSet) XtNewString((char*) stringcharset);
3195
/************************************************************************
3197
* GetMnemonicCharset
3198
* This is a get values hook function that returns the external
3199
* form of the mnemonicCharset from the internal form.
3200
* : Returns a string containg the mnemonicCharset.
3201
* Caller must free the string .
3203
***********************************************************************/
3207
GetMnemonicCharset(Widget wid,
3208
int resource, /* unused */
3211
XmLabelGadget lw = (XmLabelGadget) wid;
3216
if (LabG_MnemonicCharset (lw))
3218
size = strlen (LabG_MnemonicCharset (lw));
3220
cset = (char *) (_XmStringCharsetCreate(LabG_MnemonicCharset (lw)));
3223
*value = (XtArgVal) cset;
3227
/************************************************************************
3229
* Caching Assignment help
3230
* These routines are for manager widgets that go into Label's
3231
* fields and set them, instead of doing a SetValues.
3233
************************************************************************/
3235
static XmLabelGCacheObjPart local_cache;
3236
static Boolean local_cache_inited = FALSE;
3239
* QualifyLabelLocalCache
3240
* Checks to see if local cache is set up
3243
QualifyLabelLocalCache(XmLabelGadget w)
3245
if (!local_cache_inited)
3247
local_cache_inited = TRUE;
3248
ClassCacheCopy(LabG_ClassCachePart(w))
3249
(LabG_Cache(w), &local_cache, sizeof(local_cache));
3254
/************************************************************************
3257
* Check to see if ReCaching is necessary as a result of fields having
3258
* been set by a mananger widget. This routine is called by the
3259
* manager widget in their SetValues after a change is made to any
3260
* of Label's cached fields.
3262
************************************************************************/
3265
_XmReCacheLabG(Widget wid)
3267
XmLabelGadget lw = (XmLabelGadget) wid;
3270
if (local_cache_inited &&
3271
(!_XmLabelCacheCompare((XtPointer)&local_cache,
3272
(XtPointer)LabG_Cache(lw))))
3274
/* Delete the old one. */
3275
_XmCacheDelete((XtPointer) LabG_Cache(lw));
3276
LabG_Cache(lw) = (XmLabelGCacheObjPart *)
3277
_XmCachePart(LabG_ClassCachePart(lw),
3278
(XtPointer) &local_cache, sizeof(local_cache));
3280
local_cache_inited = FALSE;
3286
_XmAssignLabG_MarginHeight(XmLabelGadget lw,
3287
#if NeedWidePrototypes
3291
#endif /* NeedWidePrototypes */
3294
QualifyLabelLocalCache(lw);
3295
local_cache.margin_height = value;
3301
_XmAssignLabG_MarginWidth(XmLabelGadget lw,
3302
#if NeedWidePrototypes
3306
#endif /* NeedWidePrototypes */
3309
QualifyLabelLocalCache(lw);
3310
local_cache.margin_width = value;
3316
_XmAssignLabG_MarginLeft(XmLabelGadget lw,
3317
#if NeedWidePrototypes
3321
#endif /* NeedWidePrototypes */
3324
QualifyLabelLocalCache(lw);
3325
local_cache.margin_left = value;
3331
_XmAssignLabG_MarginRight(XmLabelGadget lw,
3332
#if NeedWidePrototypes
3336
#endif /* NeedWidePrototypes */
3339
QualifyLabelLocalCache(lw);
3340
local_cache.margin_right = value;
3346
_XmAssignLabG_MarginTop(XmLabelGadget lw,
3347
#if NeedWidePrototypes
3351
#endif /* NeedWidePrototypes */
3354
QualifyLabelLocalCache(lw);
3355
local_cache.margin_top = value;
3361
_XmAssignLabG_MarginBottom(XmLabelGadget lw,
3362
#if NeedWidePrototypes
3366
#endif /* NeedWidePrototypes */
3369
QualifyLabelLocalCache(lw);
3370
local_cache.margin_bottom = value;
3375
/************************************************************************
3377
* SetGadgetActivateCallbackState
3379
* This function is used as the method of the menuSavvy trait. It is
3380
* used by menu savvy parents to set whether or not the child will
3381
* invoke its own activate callback or whether it will defer to the
3382
* entryCallback of the parent.
3384
************************************************************************/
3387
SetGadgetActivateCallbackState(Widget wid,
3388
XmActivateState state)
3390
XmLabelGCacheObjPart localCache;
3392
_XmQualifyLabelLocalCache(&localCache, (XmLabelGadget)wid);
3396
case XmDISABLE_ACTIVATE:
3397
localCache.skipCallback = True;
3400
case XmENABLE_ACTIVATE:
3401
localCache.skipCallback = False;
3405
_XmReCacheLabG_r(&localCache, (XmLabelGadget)wid);
3409
/************************************************************************
3411
* SetOverrideCallback
3413
* Used by subclasses. If this is set true, then there is a RowColumn
3414
* parent with the entryCallback resource set. The subclasses do not
3415
* do their activate callbacks, instead the RowColumn callbacks are called
3417
************************************************************************/
3421
SetOverrideCallback(
3424
XmLabelGCacheObjPart localCache;
3426
_XmQualifyLabelLocalCache(&localCache, (XmLabelGadget)w);
3427
localCache.skipCallback= True;
3428
_XmReCacheLabG_r(&localCache, (XmLabelGadget)w);
3432
/************************************************************************
3434
* XmCreateLabelGadget()
3435
* XmVaCreateLabelGadget()
3436
* XmVaCreateManagedLabelGadget()
3438
* Externally accessable function for creating a label gadget.
3440
************************************************************************/
3443
XmCreateLabelGadget(Widget parent,
3448
return XtCreateWidget(name, xmLabelGadgetClass, parent, arglist, argCount);
3451
XmVaCreateLabelGadget(
3461
count = XmeCountVaListSimple(var);
3465
Va_start(var, name);
3466
w = XmeVLCreateWidget(name,
3475
XmVaCreateManagedLabelGadget(
3484
Va_start(var, name);
3485
count = XmeCountVaListSimple(var);
3488
Va_start(var, name);
3489
w = XmeVLCreateWidget(name,
3499
* GetLabelBGClassSecResData ()
3500
* Class function to be called to copy secondary resource for external
3501
* use. i.e. copy the cached resources and send it back.
3506
GetLabelBGClassSecResData(WidgetClass w_class,
3507
XmSecondaryResourceData **data_rtn)
3510
XmBaseClassExt bcePtr;
3511
String resource_class, resource_name;
3512
XtPointer client_data;
3515
bcePtr = &(labelBaseClassExtRec);
3517
resource_class = NULL;
3518
resource_name = NULL;
3520
_XmSecondaryResourceData(bcePtr, data_rtn, client_data,
3521
resource_name, resource_class,
3522
GetLabelClassResBase);
3529
* GetLabelClassResBase ()
3530
* retrun the address of the base of resources.
3531
* - Not yet implemented.
3536
GetLabelClassResBase(Widget widget,
3537
XtPointer client_data) /* unused */
3539
XtPointer widgetSecdataPtr;
3540
int labg_cache_size = sizeof(XmLabelGCacheObjPart);
3543
widgetSecdataPtr = (XtPointer) (XtMalloc (labg_cache_size +1));
3546
if (widgetSecdataPtr)
3548
cp = (char *) widgetSecdataPtr;
3549
memcpy(cp, LabG_Cache(widget), labg_cache_size);
3553
return widgetSecdataPtr;
3559
SetValuesAlmost(Widget cw, /* unused */
3561
XtWidgetGeometry *request,
3562
XtWidgetGeometry *reply)
3564
XmLabelGadget new_w = (XmLabelGadget) nw;
3565
XtWidgetProc resize;
3568
resize = ((XmLabelGadgetClassRec *)(new_w->object.widget_class))->
3572
(* (resize)) ((Widget) new_w);
3579
XmAccessColorData color_data)
3583
color_data->valueMask = AccessForeground | AccessBackgroundPixel |
3584
AccessHighlightColor | AccessTopShadowColor | AccessBottomShadowColor;
3585
color_data->background = LabG_Background(w);
3586
color_data->foreground = LabG_Foreground(w);
3587
color_data->highlight_color = LabG_HighlightColor(w);
3588
color_data->top_shadow_color = LabG_TopShadowColor(w);
3589
color_data->bottom_shadow_color = LabG_BottomShadowColor(w);
3593
color_data->valueMask = AccessColorInvalid;
3598
/************************************************************************
3600
* XmLabelGadgetGetBaselines
3602
* A Class function which when called returns True, if the widget has
3603
* a baseline and also determines the number of pixels from the y
3604
* origin to the first line of text and assigns it to the variable
3607
************************************************************************/
3610
XmLabelGadgetGetBaselines(Widget wid,
3611
Dimension **baselines,
3614
XmLabelGadget lw = (XmLabelGadget)wid;
3618
if (LabG_IsPixmap(wid))
3621
/* Compute raw baselines if unavailable. */
3622
if (lw->label.baselines == NULL)
3624
_XmStringGetBaselines(LabG_Font(lw), LabG__label(lw),
3625
&(lw->label.baselines), &count);
3626
assert(lw->label.baselines != NULL);
3628
/* Store the current offset in an extra location. */
3629
lw->label.baselines = (Dimension*)
3630
XtRealloc((char*) lw->label.baselines, (count+1) * sizeof(Dimension));
3631
lw->label.baselines[count] = 0;
3635
count = XmStringLineCount(LabG__label(lw));
3638
/* Readjust offsets if necessary. */
3639
delta = LabG_TextRect_y(lw) - lw->label.baselines[count];
3643
for (tmp = 0; tmp <= count; tmp++)
3644
lw->label.baselines[tmp] += delta;
3647
/* Copy the cached data. */
3648
*line_count = count;
3649
*baselines = (Dimension*) XtMalloc(*line_count * sizeof(Dimension));
3650
memcpy((char*) *baselines, (char*) lw->label.baselines,
3651
*line_count * sizeof(Dimension));
3657
/************************************************************************
3659
* XmLabelGadgetGetDisplayRect
3661
* A Class function which returns true if the widget being passed in
3662
* has a display rectangle associated with it. It also determines the
3663
* x,y coordinates of the character cell or pixmap relative to the origin
3664
* and the width and height in pixels of the smallest rectangle that encloses
3665
* the text or pixmap. This is assigned to the variable being passed in
3667
***********************************************************************/
3670
XmLabelGadgetGetDisplayRect(Widget w,
3671
XRectangle *displayrect)
3673
XmLabelGadget wid = (XmLabelGadget) w;
3675
displayrect->x = wid->label.TextRect.x;
3676
displayrect->y = wid->label.TextRect.y;
3677
displayrect->width = wid->label.TextRect.width;
3678
displayrect->height = wid->label.TextRect.height;
3684
/************************************************************************
3686
* XmLabelGadgetMarginsProc
3688
***********************************************************************/
3692
XmLabelGadgetMarginsProc(Widget w,
3693
XmBaselineMargins *margins_rec)
3695
XmLabelGCacheObjPart localCache;
3697
if (margins_rec->get_or_set == XmBASELINE_SET)
3699
_XmQualifyLabelLocalCache(&localCache, (XmLabelGadget)w);
3700
_XmAssignLabG_MarginTop_r((&localCache), margins_rec->margin_top);
3701
_XmAssignLabG_MarginBottom_r((&localCache), margins_rec->margin_bottom);
3702
_XmReCacheLabG_r(&localCache, (XmLabelGadget)w);
3706
margins_rec->margin_top = LabG_MarginTop(w);
3707
margins_rec->margin_bottom = LabG_MarginBottom(w);
3708
margins_rec->shadow = LabG_Shadow(w);
3709
margins_rec->highlight = LabG_Highlight(w);
3710
margins_rec->text_height = LabG_TextRect_height(w);
3711
margins_rec->margin_height = LabG_MarginHeight(w);
3717
GetPixmapDragIcon(Widget w)
3719
XmLabelGadget lw = (XmLabelGadget) w;
3723
Widget screen_object = XmGetXmScreen(XtScreen(w));
3724
unsigned int wid, hei;
3727
/* it's a labelPixmap, use directly the pixmap */
3729
XmeGetPixmapData(XtScreen(lw), Pix(lw), NULL, &d,
3730
NULL, NULL, NULL, NULL, &wid, &hei);
3733
XtSetArg(args[n], XmNhotX, 0), n++;
3734
XtSetArg(args[n], XmNhotY, 0), n++;
3735
XtSetArg(args[n], XmNwidth, wid), n++;
3736
XtSetArg(args[n], XmNheight, hei), n++;
3737
XtSetArg(args[n], XmNmaxWidth, wid), n++;
3738
XtSetArg(args[n], XmNmaxHeight, hei), n++;
3739
XtSetArg(args[n], XmNdepth, d), n++;
3740
XtSetArg(args[n], XmNpixmap, Pix(lw)), n++;
3741
XtSetArg(args[n], XmNforeground, LabG_Background(lw)), n++;
3742
XtSetArg(args[n], XmNbackground, LabG_Foreground(lw)), n++;
3743
assert(n <= XtNumber(args));
3744
drag_icon = XtCreateWidget("drag_icon", xmDragIconObjectClass,
3745
screen_object, args, n);
3752
_XmProcessDrag(Widget w,
3755
Cardinal *num_params)
3757
XmLabelGadget lw = (XmLabelGadget) w;
3762
Time _time = _XmGetDefaultTime(w, event);
3763
XmDisplay dpy = (XmDisplay) XmGetXmDisplay(XtDisplay(w));
3765
mw = (XmManagerWidget) XtParent(lw);
3767
if (LabG_IsMenupane(w))
3768
XAllowEvents(XtDisplay(mw), SyncPointer, _time);
3770
/* Disallow drag if this is a cascade button and armed - Hack alert */
3771
if (XmIsCascadeButtonGadget(w) && CBG_IsArmed(w)) return;
3773
/* CDE - allow user to not drag labels and label subclasses
3774
also, disable drag if enable_btn1_transfer is set to
3775
BUTTON2_ADJUST and the trigger was button2 */
3776
if (! dpy -> display.enable_unselectable_drag ||
3777
(dpy -> display.enable_btn1_transfer == XmBUTTON2_ADJUST &&
3778
event && event -> xany.type == ButtonPress &&
3779
event -> xbutton.button == 2)) return;
3782
XtSetArg(args[n], XmNcursorBackground, LabG_Background(lw)), n++;
3783
XtSetArg(args[n], XmNcursorForeground, LabG_Foreground(lw)), n++;
3785
/* If it's a labelPixmap, only specify the pixmap icon */
3786
if (LabG_IsPixmap(lw) && (Pix(lw) != XmUNSPECIFIED_PIXMAP))
3788
drag_icon = GetPixmapDragIcon(w);
3789
XtSetArg(args[n], XmNsourcePixmapIcon, drag_icon), n++;
3793
drag_icon = XmeGetTextualDragIcon(w);
3794
XtSetArg(args[n], XmNsourceCursorIcon, drag_icon), n++;
3797
XtSetArg(args[n], XmNdragOperations, XmDROP_COPY), n++;
3798
(void) XmeDragSource(w, NULL, event, args, n);
3803
* XmRCallProc routine for checking label.font before setting it to NULL
3804
* If "check_set_render_table" is True, then function has
3805
* been called twice on same widget, thus resource needs to be set NULL,
3806
* otherwise leave it alone.
3811
CheckSetRenderTable(Widget wid,
3815
XmLabelGadget lw = (XmLabelGadget)wid;
3817
/* Check if been here before */
3818
if (lw->label.check_set_render_table)
3822
lw->label.check_set_render_table = True;
3823
value->addr = (char*)&(lw->label.font);
3827
/**************************************************************************
3830
* Converts from pixels to current unit type does either horiz or vert
3831
* depending on icon placement.
3832
* widget - the icon button widget.
3833
* offset, value - passed to correct function based on orientation.
3834
**************************************************************************/
3837
FromPaddingPixels(Widget widget, int offset, XtArgVal *value)
3839
switch(LabG_PixmapPlacement(widget)) {
3841
case XmPIXMAP_BOTTOM:
3842
XmeFromVerticalPixels(widget, offset, value);
3844
default: /* everything else is horiz. */
3845
XmeFromHorizontalPixels(widget, offset, value);
3850
/**************************************************************************
3853
* Converts from pixels to current unit type does either horiz or vert
3854
* depending on icon placement.
3855
* widget - the icon button widget.
3856
* offset, value - passed to correct function based on orientation.
3857
* Returns the import order from _XmTo{Horizontal, Vertical}Pixels.
3858
**************************************************************************/
3860
static XmImportOperator
3861
ToPaddingPixels(Widget widget, int offset, XtArgVal *value)
3863
switch(LabG_PixmapPlacement(widget)) {
3865
case XmPIXMAP_BOTTOM:
3866
return(XmeToVerticalPixels(widget, offset, value));
3868
return(XmeToHorizontalPixels(widget, offset, value));
3874
GetLabelGadgetAccelerator(Widget w)
3876
if (XtClass(w) == xmLabelGadgetClass)
3879
return LabG_Accelerator(w);
3884
GetLabelGadgetMnemonic(Widget w)
3886
if (XtClass(w) == xmLabelGadgetClass)
3887
return XK_VoidSymbol;
3889
return LabG_Mnemonic(w);
3894
_XmQualifyLabelLocalCache(
3895
XmLabelGCacheObjPart *local_cache,
3899
ClassCacheCopy(LabG_ClassCachePart(w))
3902
sizeof(XmLabelGCacheObjPart)
3909
_XmReCacheLabG_r(XmLabelGCacheObjPart *local_cache, XmLabelGadget w)
3912
if (!_XmLabelCacheCompare(local_cache, (XtPointer)LabG_Cache(w)))
3914
_XmCacheDelete((XtPointer)LabG_Cache(w));
3915
LabG_Cache(w) = (XmLabelGCacheObjPart *)_XmCachePart(
3916
LabG_ClassCachePart(w),
3918
sizeof(XmLabelGCacheObjPart));