Bug Summary

File:Command.c
Location:line 226, column 20
Description:Access to field 'fid' results in a dereference of a null pointer (loaded from field 'font')

Annotated Source Code

1/***********************************************************
2
3Copyright 1987, 1988, 1994, 1998 The Open Group
4
5Permission to use, copy, modify, distribute, and sell this software and its
6documentation for any purpose is hereby granted without fee, provided that
7the above copyright notice appear in all copies and that both that
8copyright notice and this permission notice appear in supporting
9documentation.
10
11The above copyright notice and this permission notice shall be included in
12all copies or substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
21Except as contained in this notice, the name of The Open Group shall not be
22used in advertising or otherwise to promote the sale, use or other dealings
23in this Software without prior written authorization from The Open Group.
24
25
26Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
27
28 All Rights Reserved
29
30Permission to use, copy, modify, and distribute this software and its
31documentation for any purpose and without fee is hereby granted,
32provided that the above copyright notice appear in all copies and that
33both that copyright notice and this permission notice appear in
34supporting documentation, and that the name of Digital not be
35used in advertising or publicity pertaining to distribution of the
36software without specific, written prior permission.
37
38DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
39ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
40DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
41ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
42WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
43ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
44SOFTWARE.
45
46******************************************************************/
47
48/*
49 * Command.c - Command button widget
50 */
51
52#ifdef HAVE_CONFIG_H1
53#include <config.h>
54#endif
55#include <stdio.h>
56#include <X11/IntrinsicP.h>
57#include <X11/StringDefs.h>
58#include <X11/extensions/shape.h>
59#include <X11/Xmu/Converters.h>
60#include <X11/Xmu/Drawing.h>
61#include <X11/Xmu/Misc.h>
62#include <X11/Xaw/CommandP.h>
63#include <X11/Xaw/XawInit.h>
64#include "Private.h"
65
66#define DEFAULT_HIGHLIGHT_THICKNESS2 2
67#define DEFAULT_SHAPE_HIGHLIGHT32767 32767
68#define STR_EQUAL(str1, str2)(str1 == str2 || strcmp(str1, str2) == 0) (str1 == str2 || strcmp(str1, str2) == 0)
69
70/*
71 * Class Methods
72 */
73static void XawCommandClassInitialize(void);
74static void XawCommandDestroy(Widget);
75static void XawCommandInitialize(Widget, Widget, ArgList, Cardinal*);
76static void XawCommandRealize(Widget, Mask*, XSetWindowAttributes*);
77static void XawCommandResize(Widget);
78static void XawCommandRedisplay(Widget, XEvent*, Region);
79static Boolean XawCommandSetValues(Widget, Widget, Widget, ArgList, Cardinal*);
80static void XawCommandGetValuesHook(Widget, ArgList, Cardinal*);
81static Boolint ChangeSensitive(Widget);
82
83/*
84 * Prototypes
85 */
86static GC Get_GC(CommandWidget, Pixel, Pixel);
87static void PaintCommandWidget(Widget, XEvent*, Region, Boolint);
88static Region HighlightRegion(CommandWidget);
89static Boolint ShapeButton(CommandWidget, Boolint);
90static void XawCommandToggle(Widget);
91
92/*
93 * Actions
94 */
95static void Highlight(Widget, XEvent*, String*, Cardinal*);
96static void Notify(Widget, XEvent*, String*, Cardinal*);
97static void Reset(Widget, XEvent*, String*, Cardinal*);
98static void Set(Widget, XEvent*, String*, Cardinal*);
99static void Unhighlight(Widget, XEvent*, String*, Cardinal*);
100static void Unset(Widget, XEvent*, String*, Cardinal*);
101
102/*
103 * Initialization
104 */
105static char defaultTranslations[] =
106"<Enter>:" "highlight()\n"
107"<Leave>:" "reset()\n"
108"<Btn1Down>:" "set()\n"
109"<Btn1Up>:" "notify() unset()\n"
110;
111
112#define offset(field) XtOffsetOf(CommandRec, field)__builtin_offsetof(CommandRec, field)
113static XtResource resources[] = {
114 {
115 XtNcallback((char*)&XtStrings[136]),
116 XtCCallback((char*)&XtStrings[952]),
117 XtRCallback((char*)&XtStrings[1569]),
118 sizeof(XtPointer),
119 offset(command.callbacks),
120 XtRCallback((char*)&XtStrings[1569]),
121 NULL((void*)0)
122 },
123 {
124 XtNhighlightThickness"highlightThickness",
125 XtCThickness((char*)&XtStrings[1468]),
126 XtRDimension((char*)&XtStrings[1618]),
127 sizeof(Dimension),
128 offset(command.highlight_thickness),
129 XtRImmediate((char*)&XtStrings[1695]),
130 (XtPointer)DEFAULT_SHAPE_HIGHLIGHT32767
131 },
132 {
133 XtNshapeStyle"shapeStyle",
134 XtCShapeStyle"ShapeStyle",
135 XtRShapeStyle"ShapeStyle",
136 sizeof(int),
137 offset(command.shape_style),
138 XtRImmediate((char*)&XtStrings[1695]),
139 (XtPointer)XawShapeRectangle1
140 },
141 {
142 XtNcornerRoundPercent"cornerRoundPercent",
143 XtCCornerRoundPercent"CornerRoundPercent",
144 XtRDimension((char*)&XtStrings[1618]),
145 sizeof(Dimension),
146 offset(command.corner_round),
147 XtRImmediate((char*)&XtStrings[1695]),
148 (XtPointer)25
149 },
150};
151#undef offset
152
153static XtActionsRec actionsList[] = {
154 {"set", Set},
155 {"notify", Notify},
156 {"highlight", Highlight},
157 {"reset", Reset},
158 {"unset", Unset},
159 {"unhighlight", Unhighlight}
160};
161
162#define SuperClass((LabelWidgetClass)&labelClassRec) ((LabelWidgetClass)&labelClassRec)
163
164CommandClassRec commandClassRec = {
165 /* core */
166 {
167 (WidgetClass)SuperClass((LabelWidgetClass)&labelClassRec), /* superclass */
168 "Command", /* class_name */
169 sizeof(CommandRec), /* size */
170 XawCommandClassInitialize, /* class_initialize */
171 NULL((void*)0), /* class_part_initialize */
172 False0, /* class_inited */
173 XawCommandInitialize, /* initialize */
174 NULL((void*)0), /* initialize_hook */
175 XawCommandRealize, /* realize */
176 actionsList, /* actions */
177 XtNumber(actionsList)((Cardinal) (sizeof(actionsList) / sizeof(actionsList[0]))), /* num_actions */
178 resources, /* resources */
179 XtNumber(resources)((Cardinal) (sizeof(resources) / sizeof(resources[0]))), /* num_resources */
180 NULLQUARK((XrmQuark) 0), /* xrm_class */
181 False0, /* compress_motion */
182 True1, /* compress_exposure */
183 True1, /* compress_enterleave */
184 False0, /* visible_interest */
185 XawCommandDestroy, /* destroy */
186 XawCommandResize, /* resize */
187 XawCommandRedisplay, /* expose */
188 XawCommandSetValues, /* set_values */
189 NULL((void*)0), /* set_values_hook */
190 XtInheritSetValuesAlmost((XtAlmostProc) _XtInherit), /* set_values_almost */
191 XawCommandGetValuesHook, /* get_values_hook */
192 NULL((void*)0), /* accept_focus */
193 XtVersion(11 * 1000 + 6), /* version */
194 NULL((void*)0), /* callback_private */
195 defaultTranslations, /* tm_table */
196 XtInheritQueryGeometry((XtGeometryHandler) _XtInherit), /* query_geometry */
197 XtInheritDisplayAccelerator((XtStringProc) _XtInherit), /* display_accelerator */
198 NULL((void*)0), /* extension */
199 },
200 /* simple */
201 {
202 ChangeSensitive, /* change_sensitive */
203 },
204 /* label */
205 {
206 NULL((void*)0), /* not used */
207 },
208 /* command */
209 {
210 NULL((void*)0), /* not used */
211 },
212};
213
214WidgetClass commandWidgetClass = (WidgetClass)&commandClassRec;
215
216/*
217 * Implementation
218 */
219static GC
220Get_GC(CommandWidget cbw, Pixel fg, Pixel bg)
221{
222 XGCValues values;
223
224 values.foreground = fg;
225 values.background = bg;
226 values.font = cbw->label.font->fid;
5
Access to field 'fid' results in a dereference of a null pointer (loaded from field 'font')
227 values.cap_style = CapProjecting3;
228
229 if (cbw->command.highlight_thickness > 1)
230 values.line_width = cbw->command.highlight_thickness;
231 else
232 values.line_width = 0;
233
234 if (cbw->simple.international == True1)
235 return (XtAllocateGC((Widget)cbw, 0,
236 GCForeground(1L<<2) | GCBackground(1L<<3) | GCLineWidth(1L<<4) |
237 GCCapStyle(1L<<6), &values, GCFont(1L<<14), 0));
238 else
239 return (XtGetGC((Widget)cbw,
240 GCForeground(1L<<2) | GCBackground(1L<<3) | GCFont(1L<<14) | GCLineWidth(1L<<4) |
241 GCCapStyle(1L<<6), &values));
242}
243
244/*ARGSUSED*/
245static void
246XawCommandInitialize(Widget request, Widget cnew,
247 ArgList args, Cardinal *num_args)
248{
249 CommandWidget cbw = (CommandWidget)cnew;
250 int shape_event_base, shape_error_base;
251
252 if (!cbw->label.font) XtError("Aborting: no font found\n");
1
Assuming pointer value is null
2
Taking true branch
253
254 if (cbw->command.shape_style != XawShapeRectangle1 &&
255 !XShapeQueryExtension(XtDisplay(cnew)(((cnew)->core.screen)->display), &shape_event_base,
256 &shape_error_base))
257 cbw->command.shape_style = XawShapeRectangle1;
258
259 if (cbw->command.highlight_thickness == DEFAULT_SHAPE_HIGHLIGHT32767) {
3
Taking false branch
260 if (cbw->command.shape_style != XawShapeRectangle1)
261 cbw->command.highlight_thickness = 0;
262 else
263 cbw->command.highlight_thickness = DEFAULT_HIGHLIGHT_THICKNESS2;
264 }
265
266 cbw->command.normal_GC = Get_GC(cbw, cbw->label.foreground,
4
Calling 'Get_GC'
267 cbw->core.background_pixel);
268 cbw->command.inverse_GC = Get_GC(cbw, cbw->core.background_pixel,
269 cbw->label.foreground);
270 XtReleaseGC(cnew, cbw->label.normal_GC);
271 cbw->label.normal_GC = cbw->command.normal_GC;
272
273 cbw->command.set = False0;
274 cbw->command.highlighted = HighlightNone;
275}
276
277static Region
278HighlightRegion(CommandWidget cbw)
279{
280 static Region outerRegion = NULL((void*)0), innerRegion, emptyRegion;
281 XRectangle rect;
282
283 if (cbw->command.highlight_thickness == 0 ||
284 cbw->command.highlight_thickness > Min(XtWidth(cbw), XtHeight(cbw))((((((RectObj)cbw)->rectangle.width)) < ((((RectObj)cbw
)->rectangle.height))) ? ((((RectObj)cbw)->rectangle.width
)) : ((((RectObj)cbw)->rectangle.height)))
/ 2)
285 return (NULL((void*)0));
286
287 if (outerRegion == NULL((void*)0)) {
288 /* save time by allocating scratch regions only once. */
289 outerRegion = XCreateRegion();
290 innerRegion = XCreateRegion();
291 emptyRegion = XCreateRegion();
292 }
293
294 rect.x = rect.y = 0;
295 rect.width = XtWidth(cbw)(((RectObj)cbw)->rectangle.width);
296 rect.height = XtHeight(cbw)(((RectObj)cbw)->rectangle.height);
297 XUnionRectWithRegion(&rect, emptyRegion, outerRegion);
298 rect.x = rect.y = cbw->command.highlight_thickness;
299 rect.width -= cbw->command.highlight_thickness * 2;
300 rect.height -= cbw->command.highlight_thickness * 2;
301 XUnionRectWithRegion(&rect, emptyRegion, innerRegion);
302 XSubtractRegion(outerRegion, innerRegion, outerRegion);
303
304 return (outerRegion);
305}
306
307/***************************
308* Action Procedures
309***************************/
310static void
311XawCommandToggle(Widget w)
312{
313 CommandWidget xaw = (CommandWidget)w;
314 Arg args[2];
315 Cardinal num_args;
316
317 num_args = 0;
318 XtSetArg(args[num_args], XtNbackground,((void)( (args[num_args]).name = (((char*)&XtStrings[52])
), (args[num_args]).value = (XtArgVal)(xaw->label.foreground
) ))
319 xaw->label.foreground)((void)( (args[num_args]).name = (((char*)&XtStrings[52])
), (args[num_args]).value = (XtArgVal)(xaw->label.foreground
) ))
; ++num_args;
320 XtSetArg(args[num_args], XtNforeground,((void)( (args[num_args]).name = (((char*)&XtStrings[214]
)), (args[num_args]).value = (XtArgVal)(xaw->core.background_pixel
) ))
321 xaw->core.background_pixel)((void)( (args[num_args]).name = (((char*)&XtStrings[214]
)), (args[num_args]).value = (XtArgVal)(xaw->core.background_pixel
) ))
; ++num_args;
322 XtSetValues(w, args, num_args);
323}
324
325/*ARGSUSED*/
326static void
327Set(Widget w, XEvent *event, String *params, Cardinal *num_params)
328{
329 CommandWidget cbw = (CommandWidget)w;
330
331 if (cbw->command.set)
332 return;
333
334 XawCommandToggle(w);
335 cbw->command.set= True1;
336}
337
338/*ARGSUSED*/
339static void
340Unset(Widget w, XEvent *event, String *params, Cardinal *num_params)
341{
342 CommandWidget cbw = (CommandWidget)w;
343
344 if (!cbw->command.set)
345 return;
346
347 cbw->command.set = False0;
348 XawCommandToggle(w);
349}
350
351/*ARGSUSED*/
352static void
353Reset(Widget w, XEvent *event, String *params, Cardinal *num_params)
354{
355 CommandWidget cbw = (CommandWidget)w;
356
357 if (cbw->command.set) {
358 cbw->command.highlighted = HighlightNone;
359 Unset(w, event, params, num_params);
360 }
361 else
362 Unhighlight(w, event, params, num_params);
363}
364
365/*ARGSUSED*/
366static void
367Highlight(Widget w, XEvent *event, String *params, Cardinal *num_params)
368{
369 CommandWidget cbw = (CommandWidget)w;
370
371 if (*num_params == (Cardinal)0)
372 cbw->command.highlighted = HighlightWhenUnset;
373 else {
374 if (*num_params != (Cardinal)1)
375 XtWarning("Too many parameters passed to highlight action table.");
376 switch (params[0][0]) {
377 case 'A':
378 case 'a':
379 cbw->command.highlighted = HighlightAlways;
380 break;
381 default:
382 cbw->command.highlighted = HighlightWhenUnset;
383 break;
384 }
385 }
386
387 if (XtIsRealized(w)(XtWindowOfObject(w) != 0L))
388 PaintCommandWidget(w, event, HighlightRegion(cbw), True1);
389}
390
391/*ARGSUSED*/
392static void
393Unhighlight(Widget w, XEvent *event, String *params, Cardinal *num_params)
394{
395 CommandWidget cbw = (CommandWidget)w;
396
397 cbw->command.highlighted = HighlightNone;
398 if (XtIsRealized(w)(XtWindowOfObject(w) != 0L))
399 PaintCommandWidget(w, event, HighlightRegion(cbw), True1);
400}
401
402/*ARGSUSED*/
403static void
404Notify(Widget w, XEvent *event, String *params, Cardinal *num_params)
405{
406 CommandWidget cbw = (CommandWidget)w;
407
408 /* check to be sure state is still Set so that user can cancel
409 the action (e.g. by moving outside the window, in the default
410 bindings.
411 */
412 if (cbw->command.set)
413 XtCallCallbackList(w, cbw->command.callbacks, (XtPointer) NULL((void*)0));
414}
415
416static void
417XawCommandRedisplay(Widget w, XEvent *event, Region region)
418{
419 PaintCommandWidget(w, event, region, False0);
420}
421
422/*
423 * Function:
424 * PaintCommandWidget
425 * Parameters:
426 * w - command widget
427 * region - region to paint (passed to the superclass)
428 * change - did it change either set or highlight state?
429 */
430static void
431PaintCommandWidget(Widget w, XEvent *event, Region region, Boolint change)
432{
433 CommandWidget cbw = (CommandWidget)w;
434 Boolint very_thick;
435 GC rev_gc;
436
437 very_thick = cbw->command.highlight_thickness
438 > Min(XtWidth(cbw), XtHeight(cbw))((((((RectObj)cbw)->rectangle.width)) < ((((RectObj)cbw
)->rectangle.height))) ? ((((RectObj)cbw)->rectangle.width
)) : ((((RectObj)cbw)->rectangle.height)))
/ 2;
439
440 if (cbw->command.highlight_thickness == 0) {
441 (*SuperClass((LabelWidgetClass)&labelClassRec)->core_class.expose) (w, event, region);
442 return;
443 }
444
445 /*
446 * If we are set then use the same colors as if we are not highlighted
447 */
448
449 if (cbw->command.highlighted != HighlightNone) {
450 rev_gc = cbw->command.normal_GC;
451 }
452 else {
453 rev_gc = cbw->command.inverse_GC;
454 }
455
456 if (!((!change && cbw->command.highlighted == HighlightNone)
457 || (cbw->command.highlighted == HighlightWhenUnset
458 && cbw->command.set))) {
459 if (very_thick)
460 XFillRectangle(XtDisplay(w)(((w)->core.screen)->display),XtWindow(w)((w)->core.window), rev_gc,
461 0, 0, XtWidth(cbw)(((RectObj)cbw)->rectangle.width), XtHeight(cbw)(((RectObj)cbw)->rectangle.height));
462 else {
463 /* wide lines are centered on the path, so indent it */
464 if (cbw->core.background_pixmap != XtUnspecifiedPixmap((Pixmap)2) &&
465 rev_gc == cbw->command.inverse_GC) {
466 XClearArea(XtDisplay(w)(((w)->core.screen)->display), XtWindow(w)((w)->core.window),
467 0, 0, XtWidth(cbw)(((RectObj)cbw)->rectangle.width), cbw->command.highlight_thickness,
468 False0);
469 XClearArea(XtDisplay(w)(((w)->core.screen)->display), XtWindow(w)((w)->core.window),
470 0, cbw->command.highlight_thickness,
471 cbw->command.highlight_thickness,
472 XtHeight(cbw)(((RectObj)cbw)->rectangle.height) - (cbw->command.highlight_thickness<<1),
473 False0);
474 XClearArea(XtDisplay(w)(((w)->core.screen)->display), XtWindow(w)((w)->core.window),
475 XtWidth(cbw)(((RectObj)cbw)->rectangle.width) - cbw->command.highlight_thickness,
476 cbw->command.highlight_thickness,
477 cbw->command.highlight_thickness,
478 XtHeight(cbw)(((RectObj)cbw)->rectangle.height) - (cbw->command.highlight_thickness<<1),
479 False0);
480 XClearArea(XtDisplay(w)(((w)->core.screen)->display), XtWindow(w)((w)->core.window),
481 0, XtHeight(cbw)(((RectObj)cbw)->rectangle.height) - cbw->command.highlight_thickness,
482 XtWidth(cbw)(((RectObj)cbw)->rectangle.width), cbw->command.highlight_thickness,
483 False0);
484 }
485 else {
486 int offset = cbw->command.highlight_thickness / 2;
487
488 XDrawRectangle(XtDisplay(w)(((w)->core.screen)->display),XtWindow(w)((w)->core.window), rev_gc, offset, offset,
489 XtWidth(cbw)(((RectObj)cbw)->rectangle.width) - cbw->command.highlight_thickness,
490 XtHeight(cbw)(((RectObj)cbw)->rectangle.height) - cbw->command.highlight_thickness);
491 }
492 }
493 }
494
495 (*SuperClass((LabelWidgetClass)&labelClassRec)->core_class.expose)(w, event, region);
496}
497
498static void
499XawCommandDestroy(Widget w)
500{
501 CommandWidget cbw = (CommandWidget)w;
502
503 /* Label will release cbw->command.normal_GC */
504 XtReleaseGC(w, cbw->command.inverse_GC);
505}
506
507/*ARGSUSED*/
508static Boolean
509XawCommandSetValues(Widget current, Widget request, Widget cnew,
510 ArgList args, Cardinal *num_args)
511{
512 CommandWidget oldcbw = (CommandWidget)current;
513 CommandWidget cbw = (CommandWidget)cnew;
514 Boolean redisplay = False0;
515
516 if (oldcbw->core.sensitive != cbw->core.sensitive && !cbw->core.sensitive) {
517 cbw->command.highlighted = HighlightNone;
518 redisplay = True1;
519 }
520
521 if (cbw->command.set) {
522 unsigned int i;
523 Pixel foreground, background;
524
525 foreground = oldcbw->label.foreground;
526 background = oldcbw->core.background_pixel;
527 for (i = 0; i < *num_args; i++) {
528 if (STR_EQUAL(args[i].name, XtNforeground)(args[i].name == ((char*)&XtStrings[214]) || strcmp(args[
i].name, ((char*)&XtStrings[214])) == 0)
)
529 background = cbw->label.foreground;
530 else if (STR_EQUAL(args[i].name, XtNbackground)(args[i].name == ((char*)&XtStrings[52]) || strcmp(args[i
].name, ((char*)&XtStrings[52])) == 0)
)
531 foreground = cbw->core.background_pixel;
532 }
533 cbw->label.foreground = foreground;
534 cbw->core.background_pixel = background;
535 }
536
537 if (oldcbw->label.foreground != cbw->label.foreground
538 || oldcbw->core.background_pixel != cbw->core.background_pixel
539 || oldcbw->command.highlight_thickness
540 != cbw->command.highlight_thickness
541 || oldcbw->label.font != cbw->label.font) {
542 XtReleaseGC(cnew, cbw->command.inverse_GC);
543
544 cbw->command.normal_GC = Get_GC(cbw, cbw->label.foreground,
545 cbw->core.background_pixel);
546 cbw->command.inverse_GC = Get_GC(cbw, cbw->core.background_pixel,
547 cbw->label.foreground);
548 XtReleaseGC(cnew, cbw->label.normal_GC);
549 cbw->label.normal_GC = cbw->command.normal_GC;
550
551 redisplay = True1;
552 }
553
554 if (XtIsRealized(cnew)(XtWindowOfObject(cnew) != 0L)
555 && oldcbw->command.shape_style != cbw->command.shape_style
556 && !ShapeButton(cbw, True1))
557 cbw->command.shape_style = oldcbw->command.shape_style;
558
559 return (redisplay);
560}
561
562static void
563XawCommandGetValuesHook(Widget w, ArgList args, Cardinal *num_args)
564{
565 CommandWidget cbw = (CommandWidget)w;
566 unsigned int i;
567
568 for (i = 0; i < *num_args; i++) {
569 if (STR_EQUAL(args[i].name, XtNforeground)(args[i].name == ((char*)&XtStrings[214]) || strcmp(args[
i].name, ((char*)&XtStrings[214])) == 0)
)
570 *((String*)args[i].value) = cbw->command.set ?
571 (String)cbw->core.background_pixel : (String)cbw->label.foreground;
572 else if (STR_EQUAL(args[i].name, XtNbackground)(args[i].name == ((char*)&XtStrings[52]) || strcmp(args[i
].name, ((char*)&XtStrings[52])) == 0)
)
573 *((String*)args[i].value) = cbw->command.set ?
574 (String)cbw->label.foreground : (String)cbw->core.background_pixel;
575 }
576}
577
578static void
579XawCommandClassInitialize(void)
580{
581 XawInitializeWidgetSet();
582 XtSetTypeConverter(XtRString((char*)&XtStrings[1797]), XtRShapeStyle"ShapeStyle", XmuCvtStringToShapeStyle,
583 NULL((void*)0), 0, XtCacheNone0x001, NULL((void*)0));
584 XtSetTypeConverter(XtRShapeStyle"ShapeStyle", XtRString((char*)&XtStrings[1797]), XmuCvtShapeStyleToString,
585 NULL((void*)0), 0, XtCacheNone0x001, NULL((void*)0));
586}
587
588static Boolint
589ShapeButton(CommandWidget cbw, Boolint checkRectangular)
590{
591 Dimension corner_size = 0;
592
593 if (cbw->command.shape_style == XawShapeRoundedRectangle4) {
594 corner_size = XtWidth(cbw)(((RectObj)cbw)->rectangle.width) < XtHeight(cbw)(((RectObj)cbw)->rectangle.height) ?
595 XtWidth(cbw)(((RectObj)cbw)->rectangle.width) : XtHeight(cbw)(((RectObj)cbw)->rectangle.height);
596 corner_size = (corner_size * cbw->command.corner_round) / 100;
597 }
598
599 if (checkRectangular || cbw->command.shape_style != XawShapeRectangle1) {
600 if (!XmuReshapeWidget((Widget)cbw, cbw->command.shape_style,
601 corner_size, corner_size)) {
602 cbw->command.shape_style = XawShapeRectangle1;
603 return (False0);
604 }
605 }
606
607 return (True1);
608}
609
610static void
611XawCommandRealize(Widget w, Mask *valueMask, XSetWindowAttributes *attributes)
612{
613 (*commandWidgetClass->core_class.superclass->core_class.realize)
614 (w, valueMask, attributes);
615
616 ShapeButton((CommandWidget)w, False0);
617}
618
619static void
620XawCommandResize(Widget w)
621{
622 if (XtIsRealized(w)(XtWindowOfObject(w) != 0L))
623 ShapeButton((CommandWidget)w, False0);
624
625 (*commandWidgetClass->core_class.superclass->core_class.resize)(w);
626}
627
628static Boolint
629ChangeSensitive(Widget w)
630{
631 CommandWidget cbw = (CommandWidget)w;
632
633 if (XtIsRealized(w)(XtWindowOfObject(w) != 0L)) {
634 if (XtIsSensitive(w)) {
635 if (w->core.border_pixmap != XtUnspecifiedPixmap((Pixmap)2))
636 XSetWindowBorderPixmap(XtDisplay(w)(((w)->core.screen)->display), XtWindow(w)((w)->core.window),
637 w->core.border_pixmap);
638 else
639 XSetWindowBorder(XtDisplay(w)(((w)->core.screen)->display), XtWindow(w)((w)->core.window),
640 w->core.border_pixel);
641 }
642 else {
643 if (cbw->simple.insensitive_border == None0L)
644 cbw->simple.insensitive_border =
645 XmuCreateStippledPixmap(XtScreen(w)((w)->core.screen),
646 w->core.border_pixel,
647 cbw->command.set ?
648 cbw->label.foreground :
649 w->core.background_pixel,
650 w->core.depth);
651 XSetWindowBorderPixmap(XtDisplay(w)(((w)->core.screen)->display), XtWindow(w)((w)->core.window),
652 cbw->simple.insensitive_border);
653 }
654 }
655
656 return (False0);
657}