(3)

NAME
XfwfIcon

DESCRIPTION
The XfwfIcon widget displays an image. The preferred width and height of the widget will be set to the width and height of the loaded image, plus space for the frame. The widget has a callback activateCallback, that is by default bound to a click of the left mouse button. The image is a Pixmap, optionally accompanied by a mask, to make parts of the image transparent. When the image has a mask, the frame around the widget will not be shown.

  Public variables
XfwfIcon
Name | Class | Type | Default
XtNimage | XtCImage | Icon * | NULL
XtNactivate | XtCActivate | Callback | NULL

XtNimage
    The image must be in Pixmap format. The width and height of the image will be used to set the width and height of the widget. There is a converter for strings (defined in the Common widget), which will try to interpret a string as a file name and load the file. The file must be in XPM format. The converter also knows about some built-in images, called "FATAL", "ERROR", "WARNING", "QUESTION", "INFO" and "NONE".

    Icon * image = NULL

XtNactivate
    The callback is called by the activate action, which is by default bound to a click of mouse button 1.

    <Callback> XtCallbackList  activate = NULL

XtNframeWidth
    By default, icons do not have a frame.

     frameWidth = 0
    XfwfBoard
    Name | Class | Type | Default
    XtNabs_x | XtCAbs_x | Position | 0
    XtNrel_x | XtCRel_x | Float | "0.0"
    XtNabs_y | XtCAbs_y | Position | 0
    XtNrel_y | XtCRel_y | Float | "0.0"
    XtNabs_width | XtCAbs_width | Position | 0
    XtNrel_width | XtCRel_width | Float | "1.0"
    XtNabs_height | XtCAbs_height | Position | 0
    XtNrel_height | XtCRel_height | Float | "1.0"
    XtNhunit | XtCHunit | Float | "1.0"
    XtNvunit | XtCVunit | Float | "1.0"
    XtNlocation | XtCLocation | String | NULL
    XfwfFrame
    Name | Class | Type | Default
    XtNcursor | XtCCursor | Cursor | None
    XtNframeType | XtCFrameType | FrameType | XfwfRaised
    XtNframeWidth | XtCFrameWidth | Dimension | 0
    XtNouterOffset | XtCOuterOffset | Dimension | 0
    XtNinnerOffset | XtCInnerOffset | Dimension | 0
    XtNshadowScheme | XtCShadowScheme | ShadowScheme | XfwfAuto
    XtNtopShadowColor | XtCTopShadowColor | Pixel | compute_topcolor
    XtNbottomShadowColor | XtCBottomShadowColor | Pixel | compute_bottomcolor
    XtNtopShadowStipple | XtCTopShadowStipple | Bitmap | NULL
    XtNbottomShadowStipple | XtCBottomShadowStipple | Bitmap | NULL
    XfwfCommon
    Name | Class | Type | Default
    XtNtraversalOn | XtCTraversalOn | Boolean | True
    XtNhighlightThickness | XtCHighlightThickness | Dimension | 2
    XtNhighlightColor | XtCHighlightColor | Pixel | XtDefaultForeground
    XtNhighlightPixmap | XtCHighlightPixmap | Pixmap | None
    XtNnextTop | XtCNextTop | Callback | NULL
    XtNuserData | XtCUserData | Pointer | NULL
    Composite
    Name | Class | Type | Default
    XtNchildren | XtCChildren | WidgetList | NULL
    insertPosition | XtCInsertPosition | XTOrderProc | NULL
    numChildren | XtCNumChildren | Cardinal | 0
    Core
    Name | Class | Type | Default
    XtNx | XtCX | Position | 0
    XtNy | XtCY | Position | 0
    XtNwidth | XtCWidth | Dimension | 0
    XtNheight | XtCHeight | Dimension | 0
    borderWidth | XtCBorderWidth | Dimension | 0
    XtNcolormap | XtCColormap | Colormap | NULL
    XtNdepth | XtCDepth | Int | 0
    destroyCallback | XtCDestroyCallback | XTCallbackList | NULL
    XtNsensitive | XtCSensitive | Boolean | True
    XtNtm | XtCTm | XTTMRec | NULL
    ancestorSensitive | XtCAncestorSensitive | Boolean | False
    accelerators | XtCAccelerators | XTTranslations | NULL
    borderColor | XtCBorderColor | Pixel | 0
    borderPixmap | XtCBorderPixmap | Pixmap | NULL
    background | XtCBackground | Pixel | 0
    backgroundPixmap | XtCBackgroundPixmap | Pixmap | NULL
    mappedWhenManaged | XtCMappedWhenManaged | Boolean | True
    XtNscreen | XtCScreen | Screen * | NULL

  Exports
The type Icon is defined in Converters.h
incl
 <Xfwf/Converters.h>

  Translations
By default, the activate action is bound to a mouse click and to the Return key.

<Btn1Down>,<Btn1Up>: activate()
<Key>Return: activate()

  Actions

activate
    The activate action just calls the activate callback functions, passing the XEvent pointer in the call_data argument.
    void activate($, XEvent* event, String* params, Cardinal* num_params)
    {
        XtCallCallbackList($, $activate, event);
    }

Importss
incl
 <X11/extensions/shape.h>
incl
 <stdio.h>

  Private variables
The GC for drawing the image.

GC  image_gc

  Methods
The initialize sets the (desired and actual) size of the widget to the size of the image. The GC is initialized.
initialize(Widget  request, $, ArgList  args, Cardinal * num_args)
{
    Dimension dummy1, dummy2;
    Position x, y;
    $image_gc = NULL;
    create_image_gc($);
    if ($image  ($image->attributes.valuemask  XpmSize) != 0) {
	$compute_inside($, x, y, dummy1, dummy2);
	XtVaSetValues($, XtNwidth, $image->attributes.width + 2*x,
		      XtNheight, $image->attributes.height + 2*y, NULL);
    }
}
The expose method simply draws the image (if any) against the top left corner of the widget. The window is first masked with the image's mask. After that the images is drawn with a call to XFillRectangle. The GC is queried first, to see if the origin needs changing. Unfortunately, this involves a round trip to the server. Finally, expose calls the superclass's expose method to draw the frame.
expose($, XEvent * event, Region  region)
{
    Dimension wd, ht;
    Position x, y;
    if (! XtIsRealized($)) return;
    if ($image  $image->pixmap != None) {
	$compute_inside($, x, y, wd, ht);
	XFillRectangle(XtDisplay($), XtWindow($), $image_gc, x, y, wd, ht);
    }
    #expose($, event, region);
}
A change of image also causes a change in size.
Boolean  set_values(Widget  old, Widget  request, $, ArgList  args, Cardinal * num_args)
{
    Dimension dummy1, dummy2;
    Position x, y;
    Boolean need_redraw = False;
    if ($old$frameWidth != $frameWidth
	|| $old$outerOffset != $outerOffset
	|| $old$image != $image) {
	create_image_gc($);
	need_redraw = True;
    }
    if ($old$image != $image  $image) {
	$compute_inside($, x, y, dummy1, dummy2);
	if (($image->attributes.valuemask  XpmSize) != 0)
	    $set_abs_location($, CWWidth | CWHeight, 0, 0,
			      $image->attributes.width + 2*x,
			      $image->attributes.height + 2*y);
	if ($image->mask != None  XtIsRealized($))
	    XShapeCombineMask(XtDisplay($), XtWindow($), ShapeBounding,
			      x, y, $image->mask, ShapeSet);
	need_redraw = True;
    }
    return need_redraw;
}
When the Widget is realized, the window is immediately combined with the icon's mask.
realize($, XtValueMask * mask, XSetWindowAttributes * attributes)
{
    Dimension wd, ht;
    Position x, y;
    #realize($, mask, attributes);
    $compute_inside($, x, y, wd, ht);
    if ($image  $image->mask != None)
	XShapeCombineMask(XtDisplay($), XtWindow($), ShapeBounding,
			  x, y, $image->mask, ShapeSet);
}

Utilities
The GC is created by a utility function. It sets the fill style to FillTiled and the origin to the coordinates just inside the widget's frame
create_image_gc($)
{
    Dimension wd, ht;
    Position x, y;
    XtGCMask mask = GCFillStyle | GCTileStipXOrigin | GCTileStipYOrigin;
    XGCValues values;
    if ($image_gc != NULL) XtReleaseGC($, $image_gc);
    $compute_inside($, x, y, wd, ht);
    if ($image  $image->pixmap != None) {
	values.tile = $image->pixmap;
	mask |= GCTile;
    }
    values.fill_style = FillTiled;
    values.ts_x_origin = x;
    values.ts_y_origin = y;
    $image_gc = XtGetGC($, mask, values);
}