home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / cmd / xfe / src / Button.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  17.0 KB  |  685 lines

  1. /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public License
  4.  * Version 1.0 (the "NPL"); you may not use this file except in
  5.  * compliance with the NPL.  You may obtain a copy of the NPL at
  6.  * http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the NPL is distributed on an "AS IS" basis,
  9.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
  10.  * for the specific language governing rights and limitations under the
  11.  * NPL.
  12.  *
  13.  * The Initial Developer of this code under the NPL is Netscape
  14.  * Communications Corporation.  Portions created by Netscape are
  15.  * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
  16.  * Reserved.
  17.  */
  18. /* 
  19.    Button.cpp -- implementation file for XFE_Button.
  20.    Created: Chris McAfee <mcafee@netscape.com>, Wed Nov  6 11:11:42 PST 1996
  21.  */
  22.  
  23.  
  24.  
  25. #include "Button.h"
  26. #include "Command.h"
  27. #include "mozilla.h"
  28. #include "icons.h"
  29. #include "prefapi.h"
  30.  
  31. #include <Xfe/Button.h>
  32. #include <Xfe/Cascade.h>
  33. #include <Xfe/BmCascade.h>
  34. #include <Xm/XmAll.h>
  35.  
  36. #include "xpgetstr.h"            // for XP_GetString()
  37. extern int XFE_UNTITLED;
  38.  
  39. const char *
  40. XFE_Button::doCommandCallback = "XFE_Button::doCommandCallback";
  41.  
  42. #if defined(DEBUG_tao_)
  43. #define XDBG(x) x
  44. #else
  45. #define XDBG(x) 
  46. #endif
  47.  
  48. void
  49. XFE_Button::tip_cb(Widget w, XtPointer clientData, XtPointer cb_data)
  50. {
  51.     XFE_Button *obj = (XFE_Button *) clientData;
  52.     obj->tipCB(w, cb_data);
  53. }
  54.  
  55. void
  56. XFE_Button::tipCB(Widget /* w */, XtPointer cb_data)
  57. {
  58.     XFE_TipStringCallbackStruct* cbs = (XFE_TipStringCallbackStruct*)cb_data;
  59.  
  60.     /* get frame first
  61.      */
  62.     XFE_Frame * frame = (XFE_Frame *) getToplevel();
  63.  
  64.     if (!frame) 
  65.     {
  66.         return;
  67.     }/* if */
  68.  
  69.     XDBG(printf("\n *** XFE_Button::tipCB: parent Frame found for %s! *** \n", 
  70.                 XtName(w)));
  71.  
  72.     char *rtn = 0;
  73.  
  74.     if (cbs->reason == XFE_DOCSTRING) 
  75.     {
  76.         rtn = frame->getDocString(m_cmd);
  77.     } 
  78.     else if (cbs->reason == XFE_TIPSTRING) 
  79.     {
  80.         rtn = frame->getTipString(m_cmd);
  81.     }
  82.     if (rtn)
  83.     {
  84.         *cbs->string = rtn;
  85.     }
  86. }
  87.  
  88. // Can't just pass in a XFE_Frame, we might be in a XFE_Dialog.
  89. // Cast to XFE_Component superclass.
  90. //////////////////////////////////////////////////////////////////////////
  91. XFE_Button::XFE_Button(XFE_Frame *        frame,
  92.                        Widget            parent,
  93.                        const char *        name,
  94.                        IconGroup *        iconGroup,
  95.                        IconGroup *        iconGroup2,
  96.                        IconGroup *        iconGroup3,
  97.                        IconGroup *        iconGroup4)
  98.     : XFE_Component(frame)
  99. {
  100.     XP_ASSERT(parent);
  101.     XP_ASSERT(frame);
  102.  
  103.     m_icons[0] = iconGroup;
  104.     m_icons[1] = iconGroup2;
  105.     m_icons[2] = iconGroup3;
  106.     m_icons[3] = iconGroup4;
  107.     m_currentIconGroup = 0;
  108.     
  109.     m_name = name ? name : XP_GetString(XFE_UNTITLED);
  110.     m_cmd = Command::intern((char *) m_name);
  111.     m_callData = NULL;
  112.  
  113.     m_widget = createButton(parent,xfeButtonWidgetClass);
  114.  
  115.     installDestroyHandler();
  116.  
  117.     // Set the new pixmap group if needed
  118.     if (m_icons[m_currentIconGroup])
  119.     {
  120.         setPixmap(m_icons[m_currentIconGroup]);
  121.     }
  122. }
  123. //////////////////////////////////////////////////////////////////////////
  124. XFE_Button::XFE_Button(XFE_Frame *        frame,
  125.                        Widget            parent,
  126.                        const char *        name,
  127.                        MenuSpec *        spec,
  128.                        IconGroup *        iconGroup,
  129.                        IconGroup *        iconGroup2,
  130.                        IconGroup *        iconGroup3,
  131.                        IconGroup *        iconGroup4)
  132.     : XFE_Component(frame)
  133. {
  134.     XP_ASSERT(parent);
  135.     XP_ASSERT(frame);
  136.  
  137.     m_icons[0] = iconGroup;
  138.     m_icons[1] = iconGroup2;
  139.     m_icons[2] = iconGroup3;
  140.     m_icons[3] = iconGroup4;
  141.     m_currentIconGroup = 0;
  142.  
  143.     m_name = name ? name : XP_GetString(XFE_UNTITLED);
  144.     m_cmd = Command::intern((char *) m_name);
  145.     m_callData = NULL;
  146.  
  147.     m_widget = createButton(parent,xfeCascadeWidgetClass);
  148.  
  149.     installDestroyHandler();
  150.     
  151.     // Set the new pixmap group if needed
  152.     if (m_icons[m_currentIconGroup])
  153.     {
  154.         setPixmap(m_icons[m_currentIconGroup]);
  155.     }
  156.  
  157.     setMenuSpec(spec);
  158.  
  159. }
  160. //////////////////////////////////////////////////////////////////////////
  161. XFE_Button::XFE_Button(XFE_Frame *            frame,
  162.                        Widget                parent,
  163.                        const char *            name,
  164.                        dynamenuCreateProc    generateProc,
  165.                        void *                generateArg,
  166.                        IconGroup *            iconGroup,
  167.                        IconGroup *            iconGroup2,
  168.                        IconGroup *            iconGroup3,
  169.                        IconGroup *            iconGroup4)
  170.     : XFE_Component(frame)
  171. {
  172.     XP_ASSERT(parent);
  173.     XP_ASSERT(frame);
  174.  
  175.     m_icons[0] = iconGroup;
  176.     m_icons[1] = iconGroup2;
  177.     m_icons[2] = iconGroup3;
  178.     m_icons[3] = iconGroup4;
  179.     m_currentIconGroup = 0;
  180.  
  181.     m_name = name ? name : XP_GetString(XFE_UNTITLED);
  182.     m_cmd = Command::intern((char *) m_name);
  183.     m_callData = NULL;
  184.  
  185.     m_widget = createButton(parent,xfeCascadeWidgetClass);
  186.  
  187.     installDestroyHandler();
  188.     
  189.     // Set the new pixmap group if needed
  190.     if (m_icons[m_currentIconGroup])
  191.     {
  192.         setPixmap(m_icons[m_currentIconGroup]);
  193.     }
  194.  
  195.     (*generateProc)(m_widget,generateArg,frame);
  196.  
  197. }
  198. //////////////////////////////////////////////////////////////////////////
  199. XFE_Button::~XFE_Button()
  200. {
  201. }
  202. //////////////////////////////////////////////////////////////////////////
  203. void
  204. XFE_Button::setPixmap(IconGroup * icons)
  205. {
  206.     fe_buttonSetPixmaps(m_widget,icons);
  207. }
  208. //////////////////////////////////////////////////////////////////////////
  209. void
  210. XFE_Button::setLabel(char *label)
  211. {
  212.   XfeSetXmStringPSZ(m_widget, XmNlabelString, XmFONTLIST_DEFAULT_TAG, label);
  213. }
  214. //////////////////////////////////////////////////////////////////////////
  215. Widget
  216. XFE_Button::createButton(Widget parent,WidgetClass wc)
  217. {
  218.     XP_ASSERT( XfeIsAlive(parent) );
  219.     XP_ASSERT( (wc == xfeButtonWidgetClass) || (wc == xfeCascadeWidgetClass) );
  220.  
  221.     Widget button;
  222.  
  223.     button = XtVaCreateWidget(m_name,wc,parent,
  224.                               XmNinstancePointer,    this,
  225.                               NULL);
  226.     
  227.     XtAddCallback(button,
  228.                   XmNactivateCallback,
  229.                   &XFE_Button::activate_cb,
  230.                   (XtPointer) this);
  231.  
  232.     /* Add tooltip to button */
  233. #if 1
  234.     fe_AddTipStringCallback(button, XFE_Button::tip_cb, this);
  235. #else
  236.     // Add tooltip to button
  237.     fe_WidgetAddToolTips(button);
  238. #endif
  239.     return button;
  240. }
  241. //////////////////////////////////////////////////////////////////////////
  242. void
  243. XFE_Button::activate_cb(Widget        w,
  244.                         XtPointer    clientData, 
  245.                         XtPointer    callData)
  246. {    
  247.     XFE_Button *                button = (XFE_Button*) clientData;
  248.     XfeButtonCallbackStruct *    cd = (XfeButtonCallbackStruct *) callData;
  249.     CommandType                    cmd = button->getCmd();
  250.     void *                        cmdCallData = button->getCallData();
  251.  
  252.  
  253.     // The command info - only widget and event available
  254.     XFE_CommandInfo                info(XFE_COMMAND_BUTTON_ACTIVATE,w,cd->event);
  255.  
  256.     // Command arguments
  257.     XFE_DoCommandArgs            cmdArgs(cmd,cmdCallData,&info);
  258.  
  259.     // Send a message that will perform an action.
  260.     button->notifyInterested(XFE_Button::doCommandCallback,(void *) &cmdArgs);
  261. }
  262. //////////////////////////////////////////////////////////////////////////
  263. void
  264. XFE_Button::sub_menu_cb(Widget        w,
  265.                         XtPointer    clientData, 
  266.                         XtPointer    callData)
  267. {    
  268.     XFE_Button *            obj = (XFE_Button*) clientData;
  269.     XmAnyCallbackStruct *    cbs = (XmAnyCallbackStruct *) callData;
  270.     CommandType                cmd = Command::intern(XtName(w));
  271.  
  272.     XP_ASSERT( obj != NULL );
  273.  
  274.     if (!obj)
  275.     {
  276.         return;
  277.     }
  278.  
  279.     XFE_Frame * frame = (XFE_Frame *) obj->getToplevel();
  280.  
  281.     XP_ASSERT( frame != NULL );
  282.  
  283.     if (!frame)
  284.     {
  285.         return;
  286.     }
  287.  
  288.     switch(cbs->reason)
  289.     {
  290.     case XmCR_ARM:
  291.  
  292.         frame->notifyInterested(Command::commandArmedCallback,(void*) cmd);
  293.  
  294.         break;
  295.  
  296.     case XmCR_DISARM:
  297.  
  298.         frame->notifyInterested(Command::commandDisarmedCallback,(void*)cmd);
  299.  
  300.         break;
  301.  
  302.     case XmCR_ACTIVATE:
  303.         {
  304.             XFE_CommandInfo e_info(XFE_COMMAND_BUTTON_ACTIVATE,
  305.                                    w,cbs->event,NULL,0);
  306.  
  307.             MenuSpec * spec = (MenuSpec *) XfeUserData(w);
  308.  
  309.             if ( spec && spec->tag == CUSTOMBUTTON ) {
  310.                 cmd = spec->getCmdName();
  311.                 if (frame->handlesCommand(cmd) && frame->isCommandEnabled(cmd))
  312.                 {
  313.                     xfe_ExecuteCommand(frame, cmd, spec->callData, &e_info);
  314.                 }
  315.             } else {
  316.                 if (frame->handlesCommand(cmd) && frame->isCommandEnabled(cmd))
  317.                 {
  318.                     xfe_ExecuteCommand(frame, cmd, NULL, &e_info);
  319.                 }
  320.             }
  321.         }
  322.         break;
  323.  
  324.  
  325.     case XmCR_VALUE_CHANGED:
  326.         {
  327.             XFE_CommandInfo e_info(XFE_COMMAND_BUTTON_ACTIVATE,
  328.                                    w,cbs->event,NULL,0);
  329.             
  330. //            if (frame->handlesCommand(cmd) && frame->isCommandSelected(cmd))
  331.             if (frame->handlesCommand(cmd))
  332.             {
  333.                 xfe_ExecuteCommand(frame, cmd, NULL, &e_info);
  334.             }
  335.         }
  336.         break;
  337.     }
  338. }
  339. //////////////////////////////////////////////////////////////////////////
  340. void
  341. XFE_Button::setMenuSpec(MenuSpec * spec)
  342. {
  343.     XP_ASSERT( XfeIsAlive(m_widget) );
  344.     XP_ASSERT( XfeIsCascade(m_widget) );
  345.  
  346.     Widget        sub_menu_id;
  347.     MenuSpec *    cur_spec;
  348.  
  349.     XtVaGetValues(m_widget,XmNsubMenuId,&sub_menu_id,NULL);
  350.  
  351.     XP_ASSERT( XfeIsAlive(sub_menu_id) );
  352.  
  353.     // Make sure a menu spec is given
  354.     if (!spec)
  355.     {
  356.         return;
  357.     }
  358.     
  359.     cur_spec = spec;
  360.  
  361.     // Create toolbar buttons
  362.     while (cur_spec->menuItemName)
  363.     {
  364.         switch(cur_spec->tag)
  365.         {
  366.         case PUSHBUTTON:
  367.         {
  368.             Widget pb=XtVaCreateManagedWidget(cur_spec->menuItemName,
  369.                                     xmPushButtonGadgetClass,
  370.                                     sub_menu_id,
  371.                                     XmNuserData, cur_spec,
  372.                                     NULL);
  373.             
  374.              XtAddCallback(pb,
  375.                           XmNactivateCallback,
  376.                            XFE_Button::sub_menu_cb,
  377.                            (XtPointer) this);
  378.  
  379.              XtAddCallback(pb,
  380.                           XmNarmCallback,
  381.                            XFE_Button::sub_menu_cb,
  382.                            (XtPointer) this);
  383.  
  384.              XtAddCallback(pb,
  385.                           XmNdisarmCallback,
  386.                            XFE_Button::sub_menu_cb,
  387.                            (XtPointer) this);
  388.         }
  389.         break;
  390.  
  391.         case CUSTOMBUTTON:
  392.         {
  393.             char* str;
  394.             XmString xm_str;
  395.             KeySym mnemonic;
  396.  
  397.             if ( !PREF_GetLabelAndMnemonic((char*) cur_spec->callData, &str, 
  398.                                     &xm_str, &mnemonic) ) break;
  399.  
  400.             if ( !strcmp(str, "-") ) {
  401.                 XtVaCreateManagedWidget(spec->menuItemName,
  402.                                         xmSeparatorGadgetClass,
  403.                                         sub_menu_id,
  404.                                         XmNshadowThickness, 2,
  405.                                         NULL);
  406.             } else {
  407.                 Widget pb=XtVaCreateManagedWidget(cur_spec->menuItemName,
  408.                                         xmPushButtonGadgetClass,
  409.                                         sub_menu_id,
  410.                                         XmNuserData, cur_spec,
  411.                                         XmNlabelString, xm_str,
  412.                                         mnemonic ? XmNmnemonic : NULL, mnemonic,
  413.                                         NULL);
  414.             
  415.                  XtAddCallback(pb,
  416.                               XmNactivateCallback,
  417.                                XFE_Button::sub_menu_cb,
  418.                                (XtPointer) this);
  419.  
  420.                  XtAddCallback(pb,
  421.                               XmNarmCallback,
  422.                                XFE_Button::sub_menu_cb,
  423.                                (XtPointer) this);
  424.  
  425.                  XtAddCallback(pb,
  426.                               XmNdisarmCallback,
  427.                                XFE_Button::sub_menu_cb,
  428.                                (XtPointer) this);
  429.             }
  430.  
  431.             XmStringFree(xm_str);
  432.         }
  433.         break;
  434.  
  435.         case TOGGLEBUTTON:
  436.         {
  437.             Widget tb=XtVaCreateManagedWidget(cur_spec->menuItemName,
  438.                                               xmToggleButtonGadgetClass,
  439.                                               sub_menu_id,
  440.                                               XmNuserData, cur_spec,
  441.                                               NULL);
  442.             
  443.              XtAddCallback(tb,
  444.                           XmNvalueChangedCallback,
  445.                            XFE_Button::sub_menu_cb,
  446.                            (XtPointer) this);
  447.  
  448.              XtAddCallback(tb,
  449.                           XmNarmCallback,
  450.                            XFE_Button::sub_menu_cb,
  451.                            (XtPointer) this);
  452.  
  453.              XtAddCallback(tb,
  454.                           XmNdisarmCallback,
  455.                            XFE_Button::sub_menu_cb,
  456.                            (XtPointer) this);
  457.         }
  458.         break;
  459.         
  460.         case SEPARATOR:
  461.  
  462.             XtVaCreateManagedWidget(spec->menuItemName,
  463.                                     xmSeparatorGadgetClass,
  464.                                     sub_menu_id,
  465.                                     XmNshadowThickness, 2,
  466.                                     NULL);
  467.  
  468.  
  469.             break;
  470.  
  471.         case DYNA_MENUITEMS:
  472.  
  473.             XP_ASSERT( cur_spec != NULL );
  474.             XP_ASSERT( cur_spec->generateProc != NULL );
  475.  
  476.             (*cur_spec->generateProc)(m_widget,
  477.                                       cur_spec->callData,
  478.                                       (XFE_Frame *) m_toplevel);
  479.  
  480.  
  481.             break;
  482.  
  483.         case DYNA_CASCADEBUTTON:
  484.         case DYNA_FANCY_CASCADEBUTTON:
  485.         {
  486.             XP_ASSERT( cur_spec != NULL );
  487.             XP_ASSERT( cur_spec->generateProc != NULL );
  488.  
  489.             Widget        top_level = m_toplevel->getBaseWidget();
  490.             Visual *    visual = XfeVisual(top_level);
  491.             Colormap    cmap = XfeColormap(top_level);
  492.             Cardinal    depth = XfeDepth(top_level);
  493.             Arg            av[10];
  494.             Cardinal    ac = 0;
  495.             Widget        pulldown;
  496.             Widget        cascade;
  497.             WidgetClass    wc = NULL;
  498.  
  499.             ac = 0;
  500.             XtSetArg(av[ac],XmNvisual,        visual);    ac++;
  501.             XtSetArg(av[ac],XmNcolormap,    cmap);        ac++;
  502.             XtSetArg(av[ac],XmNdepth,        depth);        ac++;
  503.             
  504.             pulldown = XmCreatePulldownMenu(sub_menu_id,"pulldown",av,ac);
  505.  
  506.             if (cur_spec->tag == DYNA_FANCY_CASCADEBUTTON)
  507.             {
  508.                 wc = xfeBmCascadeWidgetClass;
  509.             }
  510.             else
  511.             {
  512.                 wc = xmCascadeButtonWidgetClass;
  513.             }
  514.  
  515.             cascade = XtVaCreateManagedWidget(cur_spec->menuItemName,
  516.                                               wc,
  517.                                               sub_menu_id,
  518.                                               XmNsubMenuId, pulldown,
  519.                                               NULL);
  520.  
  521.             
  522.             (*cur_spec->generateProc)(cascade,
  523.                                       cur_spec->callData,
  524.                                       (XFE_Frame *) m_toplevel);
  525.         }
  526.         break;
  527.  
  528.         default:
  529.             
  530.             XP_ASSERT(0);
  531.             
  532.             break;
  533.         }
  534.         
  535.         cur_spec++;
  536.     }
  537. }
  538. //////////////////////////////////////////////////////////////////////////
  539. int
  540. XFE_Button::getIconGroupIndex()
  541. {
  542.   return m_currentIconGroup;
  543. }
  544. //////////////////////////////////////////////////////////////////////////
  545. void
  546. XFE_Button::setIconGroups (IconGroup *iconGroup,
  547.                            IconGroup *iconGroup2,
  548.                            IconGroup *iconGroup3,
  549.                            IconGroup *iconGroup4)
  550. {
  551.   m_icons[0] = iconGroup;
  552.   m_icons[1] = iconGroup2;
  553.   m_icons[2] = iconGroup3;
  554.   m_icons[3] = iconGroup4;
  555.   if (m_icons[m_currentIconGroup] == NULL) 
  556.     m_currentIconGroup = 0;
  557. }
  558. //////////////////////////////////////////////////////////////////////////
  559. void
  560. XFE_Button::useIconGroup (int iconGroupIndex)
  561. {
  562.   if (m_currentIconGroup != iconGroupIndex
  563.       && iconGroupIndex >= 0
  564.       && iconGroupIndex < MAX_ICON_GROUPS
  565.       && m_icons[iconGroupIndex] != NULL)
  566.     {
  567.       setPixmap(m_icons[iconGroupIndex]);
  568.       m_currentIconGroup = iconGroupIndex;
  569.     }
  570. }
  571. //////////////////////////////////////////////////////////////////////////
  572. void
  573. XFE_Button::setPretendSensitive(Boolean state)
  574. {
  575.     XP_ASSERT( XfeIsAlive(m_widget) );
  576.  
  577.     XfeSetPretendSensitive(m_widget,state);
  578. }
  579. //////////////////////////////////////////////////////////////////////////
  580. Boolean
  581. XFE_Button::isPretendSensitive()
  582. {
  583.     XP_ASSERT( XfeIsAlive(m_widget) );
  584.  
  585.     return XfeIsPretendSensitive(m_widget);
  586. }
  587. //////////////////////////////////////////////////////////////////////////
  588. void
  589. XFE_Button::setPopupDelay(int delay)
  590. {
  591.     XP_ASSERT( XfeIsAlive(m_widget) );
  592.     XP_ASSERT( XfeIsCascade(m_widget) );
  593.  
  594.     XtVaSetValues(m_widget,XmNmappingDelay,delay,NULL);
  595. }
  596. //////////////////////////////////////////////////////////////////////////
  597.  
  598. //////////////////////////////////////////////////////////////////////////
  599. //
  600. // fe_buttonSetPixmaps()
  601. //
  602. // This function should be used to configure the icons of any widget that
  603. // is a XfeButton (or subclass).
  604. //
  605. // Only the normal pixmap/mask (XmNpixmap,XmNpixmapMask) and the mouse
  606. // over pixmap/mask (XmNraisedPixmap/XmNraisedMask) are created and used.
  607. //
  608. // The XfeButton will render the insensitive effect for the pixmap 
  609. // automatically.  Also, the button will be filled on arm.  This provides
  610. // enough "mouse-down" feedback and thus reduces the XID resource 
  611. // consumption (pixmaps and pixels).
  612. //
  613. //////////////////////////////////////////////////////////////////////////
  614. /* extern */ void
  615. fe_buttonSetPixmaps(Widget button,IconGroup * ig)
  616. {
  617.     XP_ASSERT( ig != NULL );
  618.     XP_ASSERT( XfeIsAlive(button) );
  619.     XP_ASSERT( XfeIsButton(button) );
  620.  
  621.     if (!ig || !XfeIsAlive(button))
  622.     {
  623.         return;
  624.     }
  625.  
  626.     // Use the closest ancestor shell's colormap
  627.     Widget    shell_for_colormap = 
  628.         XfeAncestorFindByClass(button,shellWidgetClass,XfeFIND_ANY);
  629.  
  630.     XP_ASSERT( XfeIsAlive(shell_for_colormap) );
  631.  
  632.     // Normal pixmap
  633.     if (!XfePixmapGood(ig->pixmap_icon.pixmap))
  634.     {
  635.         IconGroup_createOneIcon(&ig->pixmap_icon,
  636.                                 ig->pixmap_data,
  637.                                 shell_for_colormap,
  638.                                 XfeForeground(button),
  639.                                 XfeBackground(button));
  640.     }
  641.  
  642.     // Mouse Over pixmap (raised)
  643.     if (!XfePixmapGood(ig->pixmap_mo_icon.pixmap))
  644.     {
  645.         IconGroup_createOneIcon(&ig->pixmap_mo_icon,
  646.                                 ig->pixmap_mo_data,
  647.                                 shell_for_colormap,
  648.                                 XfeForeground(button),
  649.                                 XfeBackground(button));
  650.     }
  651.  
  652.     Arg            av[4];
  653.     Cardinal    ac = 0;
  654.  
  655.     // XmNpixmap
  656.     if (XfePixmapGood(ig->pixmap_icon.pixmap))
  657.     {
  658.         XtSetArg(av[ac],XmNpixmap,ig->pixmap_icon.pixmap); ac++;
  659.     }
  660.  
  661.     // XmNpixmapMask
  662.     if (XfePixmapGood(ig->pixmap_icon.mask))
  663.     {
  664.         XtSetArg(av[ac],XmNpixmapMask,ig->pixmap_icon.mask); ac++;
  665.     }
  666.  
  667.     // XmNraisedPixmap
  668.     if (XfePixmapGood(ig->pixmap_mo_icon.pixmap))
  669.     {
  670.         XtSetArg(av[ac],XmNraisedPixmap,ig->pixmap_mo_icon.pixmap); ac++;
  671.     }
  672.  
  673.     // XmNraisedPixmapMask
  674.     if (XfePixmapGood(ig->pixmap_mo_icon.mask))
  675.     {
  676.         XtSetArg(av[ac],XmNraisedPixmapMask,ig->pixmap_mo_icon.mask); ac++;
  677.     }
  678.  
  679.     if (ac)
  680.     {
  681.         XtSetValues(button,av,ac);
  682.     }
  683. }
  684. //////////////////////////////////////////////////////////////////////////
  685.