home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / cmd / xfe / XfeWidgets / Xfe / BypassShell.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  19.9 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. /*                                                                        */
  20. /* Name:        <Xfe/BypassShell.c>                                        */
  21. /* Description:    XfeBypassShell widget source.                            */
  22. /* Author:        Ramiro Estrugo <ramiro@netscape.com>                    */
  23. /*                                                                        */
  24. /*----------------------------------------------------------------------*/
  25.  
  26.  
  27. #include <stdio.h>
  28.  
  29. #include <Xfe/BypassShellP.h>
  30.  
  31. #include <Xm/AtomMgr.h>
  32. #include <Xm/Protocols.h>
  33.  
  34. #ifdef EDITRES
  35. #include <X11/Xmu/Editres.h>
  36. #endif
  37.  
  38. #define MESSAGE1 "Widget is not an XfeBypassShell."
  39. #define MESSAGE2 "XfeBypassShell can only have one managed child."
  40.  
  41. #define STRUCTURE_EVENTS    StructureNotifyMask
  42.  
  43. /*----------------------------------------------------------------------*/
  44. /*                                                                        */
  45. /* Core class methods                                                    */
  46. /*                                                                        */
  47. /*----------------------------------------------------------------------*/
  48. static void        ClassInitialize    ();
  49. static void     Initialize        (Widget,Widget,ArgList,Cardinal *);
  50. static void        Resize            (Widget);
  51. static void        Redisplay        (Widget,XEvent *,Region);
  52. static void        Realize            (Widget,XtValueMask *,XSetWindowAttributes *);
  53. static void     Destroy            (Widget);
  54. static Boolean    SetValues        (Widget,Widget,Widget,ArgList,Cardinal *);
  55.  
  56. /*----------------------------------------------------------------------*/
  57. /*                                                                        */
  58. /* Composite Class Methods                                                */
  59. /*                                                                        */
  60. /*----------------------------------------------------------------------*/
  61. static void                InsertChild        (Widget);
  62. static void                DeleteChild        (Widget);
  63. static void                ChangeManaged    (Widget);
  64. static XtGeometryResult GeometryManager    (Widget,XtWidgetGeometry *,
  65.                                          XtWidgetGeometry *);
  66.  
  67. /*----------------------------------------------------------------------*/
  68. /*                                                                        */
  69. /* XfeBypassShell action procedures                                        */
  70. /*                                                                        */
  71. /*----------------------------------------------------------------------*/
  72. static void     BtnUp                (Widget,XEvent *,char **,Cardinal *);
  73. static void     BtnDown                (Widget,XEvent *,char **,Cardinal *);
  74.  
  75. /*----------------------------------------------------------------------*/
  76. /*                                                                        */
  77. /* Misc XfeBypassShell functions                                        */
  78. /*                                                                        */
  79. /*----------------------------------------------------------------------*/
  80. static void        DrawShadow            (Widget,XEvent *,Region,XRectangle *);
  81.  
  82. /*----------------------------------------------------------------------*/
  83. /*                                                                        */
  84. /* Shell structure event handler                                        */
  85. /*                                                                        */
  86. /*----------------------------------------------------------------------*/
  87. static void        MappingEH            (Widget,XtPointer,XEvent *,Boolean *);
  88.  
  89. /*----------------------------------------------------------------------*/
  90. /*                                                                        */
  91. /* XfeBypassShell resources                                                */
  92. /*                                                                        */
  93. /*----------------------------------------------------------------------*/
  94. static XtResource resources[] =     
  95. {                    
  96.     /* Realization callback resources */
  97.     { 
  98.         XmNrealizeCallback,
  99.         XmCCallback,
  100.         XmRCallback,
  101.         sizeof(XtCallbackList),
  102.         XtOffsetOf(XfeBypassShellRec , xfe_bypass_shell . realize_callback),
  103.         XmRImmediate, 
  104.         (XtPointer) NULL,
  105.     },
  106.     { 
  107.         XmNbeforeRealizeCallback,
  108.         XmCCallback,
  109.         XmRCallback,
  110.         sizeof(XtCallbackList),
  111.         XtOffsetOf(XfeBypassShellRec , xfe_bypass_shell . before_realize_callback),
  112.         XmRImmediate, 
  113.         (XtPointer) NULL,
  114.     },
  115.  
  116.     /* Mapping callback resources */
  117.     { 
  118.         XmNmapCallback,
  119.         XmCCallback,
  120.         XmRCallback,
  121.         sizeof(XtCallbackList),
  122.         XtOffsetOf(XfeBypassShellRec , xfe_bypass_shell . map_callback),
  123.         XmRImmediate, 
  124.         (XtPointer) NULL,
  125.     },
  126.     { 
  127.         XmNunmapCallback,
  128.         XmCCallback,
  129.         XmRCallback,
  130.         sizeof(XtCallbackList),
  131.         XtOffsetOf(XfeBypassShellRec , xfe_bypass_shell . unmap_callback),
  132.         XmRImmediate, 
  133.         (XtPointer) NULL,
  134.     },
  135.  
  136.     { 
  137.         XmNchangeManagedCallback,
  138.         XmCCallback,
  139.         XmRCallback,
  140.         sizeof(XtCallbackList),
  141.         XtOffsetOf(XfeBypassShellRec , xfe_bypass_shell . change_managed_callback),
  142.         XmRImmediate, 
  143.         (XtPointer) NULL,
  144.     },
  145.  
  146.     /* Shadow resources */
  147.     { 
  148.         XmNbottomShadowColor,
  149.         XmCBottomShadowColor,
  150.         XmRPixel,
  151.         sizeof(Pixel),
  152.         XtOffsetOf(XfeBypassShellRec , xfe_bypass_shell . bottom_shadow_color),
  153.         XmRCallProc, 
  154.         (XtPointer) _XmBottomShadowColorDefault,
  155.     },
  156.     { 
  157.         XmNtopShadowColor,
  158.         XmCTopShadowColor,
  159.         XmRPixel,
  160.         sizeof(Pixel),
  161.         XtOffsetOf(XfeBypassShellRec , xfe_bypass_shell . top_shadow_color),
  162.         XmRCallProc, 
  163.         (XtPointer) _XmTopShadowColorDefault,
  164.     },
  165.  
  166.     { 
  167.         XmNshadowThickness,
  168.         XmCShadowThickness,
  169.         XmRDimension,
  170.         sizeof(Dimension),
  171.         XtOffsetOf(XfeBypassShellRec , xfe_bypass_shell . shadow_thickness),
  172.         XmRImmediate, 
  173.         (XtPointer) XfeDEFAULT_SHADOW_THICKNESS 
  174.     },
  175.     { 
  176.         XmNshadowType,
  177.         XmCShadowType,
  178.         XmRShadowType,
  179.         sizeof(unsigned char),
  180.         XtOffsetOf(XfeBypassShellRec , xfe_bypass_shell . shadow_type),
  181.         XmRImmediate, 
  182.         (XtPointer) XfeDEFAULT_SHADOW_TYPE
  183.     },
  184.  
  185.     /* Cursor resources */
  186.     { 
  187.         XmNcursor,
  188.         XmCCursor,
  189.         XmRCursor,
  190.         sizeof(Cursor),
  191.         XtOffsetOf(XfeBypassShellRec , xfe_bypass_shell . cursor),
  192.         XmRString, 
  193.         "arrow"
  194.     },
  195.  
  196.     /* Other resources */
  197.     { 
  198.         XmNignoreExposures,
  199.         XmCIgnoreExposures,
  200.         XmRBoolean,
  201.         sizeof(Boolean),
  202.         XtOffsetOf(XfeBypassShellRec , xfe_bypass_shell . ignore_exposures),
  203.         XmRImmediate, 
  204.         (XtPointer) True
  205.     },
  206.  
  207.     /* Override Shell resources */
  208.     { 
  209.         XmNallowShellResize,
  210.         XmCAllowShellResize,
  211.         XmRBoolean,
  212.         sizeof(Boolean),
  213.         XtOffsetOf(XfeBypassShellRec , shell . allow_shell_resize),
  214.         XmRImmediate, 
  215.         (XtPointer) True
  216.     },
  217.     { 
  218.         XmNoverrideRedirect,
  219.         XmCOverrideRedirect,
  220.         XmRBoolean,
  221.         sizeof(Boolean),
  222.         XtOffsetOf(XfeBypassShellRec , shell . override_redirect),
  223.         XmRImmediate, 
  224.         (XtPointer) True
  225.     },
  226.     { 
  227.         XmNsaveUnder,
  228.         XmCSaveUnder,
  229.         XmRBoolean,
  230.         sizeof(Boolean),
  231.         XtOffsetOf(XfeBypassShellRec , shell . save_under),
  232.         XmRImmediate, 
  233.         (XtPointer) False
  234.     },
  235.  
  236.     /* Override WmShell resources */
  237.     { 
  238.         XmNtransient,
  239.         XmCTransient,
  240.         XmRBoolean,
  241.         sizeof(Boolean),
  242.         XtOffsetOf(XfeBypassShellRec , wm . transient),
  243.         XmRImmediate, 
  244.         (XtPointer) True
  245.     },
  246.     { 
  247.         XmNwaitForWm,
  248.         XmCWaitForWm,
  249.         XmRBoolean,
  250.         sizeof(Boolean),
  251.         XtOffsetOf(XfeBypassShellRec , wm . wait_for_wm),
  252.         XmRImmediate, 
  253.         (XtPointer) False
  254.     },
  255. };   
  256.  
  257. /*----------------------------------------------------------------------*/
  258. /*                                                                        */
  259. /* XfeBypassShell actions                                                */
  260. /*                                                                        */
  261. /*----------------------------------------------------------------------*/
  262. static XtActionsRec actions[] = 
  263. {
  264.     { "BtnDown",            BtnDown                },
  265.     { "BtnUp",                BtnUp                },
  266. };
  267.  
  268. /*----------------------------------------------------------------------*/
  269. /*                                                                        */
  270. /* Widget Class Record Initialization                                   */
  271. /*                                                                        */
  272. /*----------------------------------------------------------------------*/
  273. _XFE_WIDGET_CLASS_RECORD(bypassshell,BypassShell) =
  274. {
  275.     {
  276.         (WidgetClass) &vendorShellClassRec,        /* superclass            */
  277.         "XfeBypassShell",                        /* class_name            */
  278.         sizeof(XfeBypassShellRec),                /* widget_size            */
  279.         ClassInitialize,                        /* class_initialize        */
  280.         NULL,                                    /* class_part_initialize*/
  281.         False,                                    /* class_inited            */
  282.         Initialize,                                /* initialize            */
  283.         NULL,                                    /* initialize_hook        */
  284.         Realize,                                /* realize                */
  285. #if 0
  286.         actions,                                /* actions                */
  287.         XtNumber(actions),                        /* num_actions            */
  288. #else
  289.         NULL,                                    /* actions                */
  290.         0,                                        /* num_actions            */
  291. #endif
  292.         resources,                              /* resources            */
  293.         XtNumber(resources),                    /* num_resources        */
  294.         NULLQUARK,                                /* xrm_class            */
  295.         True,                                    /* compress_motion        */
  296.         XtExposeCompressMaximal,                /* compress_exposure    */
  297.         True,                                    /* compress_enterleave    */
  298.         False,                                    /* visible_interest        */
  299.         Destroy,                                /* destroy                */
  300.         Resize,                                    /* resize                */
  301.         Redisplay,                                /* expose                */
  302.         SetValues,                              /* set_values            */
  303.         NULL,                                   /* set_values_hook        */
  304.         NULL,                                    /* set_values_almost    */
  305.         NULL,                                    /* get_values_hook        */
  306.         NULL,                                   /* access_focus            */
  307.         XtVersion,                              /* version                */
  308.         NULL,                                   /* callback_private        */
  309.         _XfeBypassShellDefaultTranslations,        /* tm_table                */
  310.         NULL,                                    /* query_geometry        */
  311.         NULL,                                    /* display accelerator    */
  312.         NULL,                                    /* extension            */
  313.     },
  314.     
  315.     /* Composite Part */
  316.     {
  317.         XtInheritGeometryManager,                /* geometry_manager        */
  318.         ChangeManaged,                            /* change_managed        */
  319.         XtInheritInsertChild,                    /* insert_child            */
  320.         XtInheritDeleteChild,                    /* delete_child            */
  321.         NULL                                    /* extension            */
  322.     },
  323.  
  324.     /* Shell */
  325.     {
  326.         NULL,                                    /* extension            */
  327.     },
  328.  
  329.     /* WMShell */
  330.     {
  331.         NULL,                                    /* extension            */
  332.     },
  333.  
  334.     /* VendorShell */
  335.     {
  336.         NULL,                                    /* extension            */
  337.     },
  338.  
  339.     /* XfeBypassShell Part */
  340.     {
  341.         NULL,                                    /* extension            */
  342.     },
  343. };
  344.  
  345. /*----------------------------------------------------------------------*/
  346. /*                                                                        */
  347. /* xfeBypassShellWidgetClass declaration.                                */
  348. /*                                                                        */
  349. /*----------------------------------------------------------------------*/
  350. _XFE_WIDGET_CLASS(bypassshell,BypassShell);
  351.  
  352. /*----------------------------------------------------------------------*/
  353. /*                                                                        */
  354. /* Core Class methods                                                    */
  355. /*                                                                        */
  356. /*----------------------------------------------------------------------*/
  357. static void
  358. ClassInitialize()
  359. {
  360.     /* Register Xfe Converters */
  361.     /*XfeRegisterConverters();*/
  362.  
  363.     /* Register Representation Types */
  364.     XfeRegisterRepresentationTypes();
  365. }
  366. /*----------------------------------------------------------------------*/
  367. static void
  368. Initialize(Widget rw,Widget nw,ArgList args,Cardinal *nargs)
  369. {
  370.     XfeBypassShellPart *        bp = _XfeBypassShellPart(nw);
  371.  
  372.     /* Make sure the shadow type is ok */
  373.     XfeRepTypeCheck(nw,XmRShadowType,&bp->shadow_type,XfeDEFAULT_SHADOW_TYPE);
  374.  
  375.     /* Add mapping event handler */
  376.     XtAddEventHandler(nw,StructureNotifyMask,True,MappingEH,nw);
  377.  
  378.     /* Allocate the shadow GCs */
  379.     bp->top_shadow_GC = 
  380.         XfeAllocateColorGc(nw,bp->top_shadow_color,None,True);
  381.  
  382.     bp->bottom_shadow_GC = 
  383.         XfeAllocateColorGc(nw,bp->bottom_shadow_color,None,True);
  384.  
  385.     /* Initialize private members */
  386.     bp->managed_child = False;
  387. }
  388. /*----------------------------------------------------------------------*/
  389. static void
  390. Destroy(Widget w)
  391. {
  392.     XfeBypassShellPart *        bp = _XfeBypassShellPart(w);
  393.  
  394.     XtReleaseGC(w,bp->top_shadow_GC);
  395.     XtReleaseGC(w,bp->bottom_shadow_GC);
  396. }
  397. /*----------------------------------------------------------------------*/
  398. static void
  399. Realize(Widget w,XtValueMask * mask,XSetWindowAttributes * wa)
  400. {
  401.     XfeBypassShellPart *    bp = _XfeBypassShellPart(w);
  402.  
  403.     /* Invoke before realize Callbacks */
  404.     _XfeInvokeCallbacks(w,bp->before_realize_callback,
  405.                         XmCR_BEFORE_REALIZE,NULL,False);
  406.  
  407.     /* The actual realization is handled by the superclass */
  408.     (*vendorShellWidgetClass->core_class.realize)(w,mask,wa);
  409.  
  410.     /* Invoke realize Callbacks */
  411.     _XfeInvokeCallbacks(w,bp->realize_callback,XmCR_REALIZE,NULL,False);
  412. }
  413. /*----------------------------------------------------------------------*/
  414. static void
  415. Resize(Widget w)
  416. {
  417.     XfeBypassShellPart *    bp = _XfeBypassShellPart(w);
  418.  
  419.     /* The actual realization is handled by the superclass */
  420.     (*vendorShellWidgetClass->core_class.resize)(w);
  421. }
  422. /*----------------------------------------------------------------------*/
  423. static void
  424. Redisplay(Widget w,XEvent *event,Region region)
  425. {
  426.     XfeBypassShellPart *    bp = _XfeBypassShellPart(w);
  427.  
  428.     if (!bp->ignore_exposures)
  429.     {
  430.         DrawShadow(w,event,region,NULL);
  431.     }
  432. }
  433. /*----------------------------------------------------------------------*/
  434. static Boolean
  435. SetValues(Widget ow,Widget rw,Widget nw,ArgList args,Cardinal *nargs)
  436. {
  437.     XfeBypassShellPart *        np = _XfeBypassShellPart(nw);
  438.     XfeBypassShellPart *        op = _XfeBypassShellPart(ow);
  439.     Boolean                    redisplay = False;
  440.  
  441.     /* shadow_thickness */
  442.     if (np->shadow_thickness != op->shadow_thickness)
  443.     {
  444.         redisplay = True;
  445.     }
  446.  
  447.     /* shadow_type */
  448.     if (np->shadow_type != op->shadow_type)
  449.     {
  450.         /* Make sure the new shadow type is ok */
  451.         XfeRepTypeCheck(nw,XmRShadowType,&np->shadow_type,
  452.                         XfeDEFAULT_SHADOW_TYPE);
  453.  
  454.         redisplay = True;
  455.     }
  456.  
  457.     /* bottom_shadow_color */
  458.     if (np->bottom_shadow_color != op->bottom_shadow_color)
  459.     {
  460.         XtReleaseGC(nw,np->bottom_shadow_GC);
  461.  
  462.         np->bottom_shadow_GC = 
  463.             XfeAllocateColorGc(nw,np->bottom_shadow_color,None,True);
  464.  
  465.         redisplay = True;
  466.     }
  467.  
  468.     /* top_shadow_color */
  469.     if (np->top_shadow_color != op->top_shadow_color)
  470.     {
  471.         XtReleaseGC(nw,np->top_shadow_GC);
  472.  
  473.         np->top_shadow_GC = 
  474.             XfeAllocateColorGc(nw,np->top_shadow_color,None,True);
  475.  
  476.         redisplay = True;
  477.     }
  478.     
  479.     return redisplay;
  480. }
  481. /*----------------------------------------------------------------------*/
  482.  
  483. /*----------------------------------------------------------------------*/
  484. /*                                                                        */
  485. /* Composite Class Methods                                                */
  486. /*                                                                        */
  487. /*----------------------------------------------------------------------*/
  488. static void
  489. InsertChild(Widget child)
  490. {
  491. }
  492. /*----------------------------------------------------------------------*/
  493. static void
  494. DeleteChild(Widget child)
  495. {
  496. }
  497. /*----------------------------------------------------------------------*/
  498. static void
  499. ChangeManaged(Widget w)
  500. {
  501.     XfeBypassShellPart *    bp = _XfeBypassShellPart(w);
  502.     Cardinal                i;
  503.     Widget                    new_managed_child = NULL;
  504.     Widget                    old_managed_child = bp->managed_child;
  505.  
  506.     for(i = 0; i < _XfemNumChildren(w); i++)
  507.     {
  508.         Widget child = _XfeChildrenIndex(w,i);
  509.  
  510.         /* Look for the first child that is managed */
  511.         if ((child != old_managed_child) && _XfeChildIsShown(child))
  512.         {
  513.             new_managed_child = child;
  514.         }
  515.     }
  516.  
  517.     printf("ChangeManaged(%s,last = %s, new = %s)\n",
  518.            XtName(w),
  519.            old_managed_child ? XtName(old_managed_child) : "NULL",
  520.            new_managed_child ? XtName(new_managed_child) : "NULL");
  521.  
  522.     if (new_managed_child)
  523.     {
  524.         /* Assign the new managed child */
  525.         bp->managed_child = new_managed_child;
  526.         
  527.         /* Invoke before change managed Callbacks */
  528.         _XfeInvokeCallbacks(w,bp->change_managed_callback,
  529.                             XmCR_CHANGE_MANAGED,NULL,False);
  530.         
  531.         _XfeConfigureWidget(bp->managed_child,
  532.                             bp->shadow_thickness,
  533.                             bp->shadow_thickness,
  534.                             _XfeWidth(w) - 2 * bp->shadow_thickness,
  535.                             _XfeHeight(w) - 2 * bp->shadow_thickness);
  536.  
  537.         if (_XfeIsRealized(bp->managed_child))
  538.         {
  539.             XRaiseWindow(XtDisplay(w),_XfeWindow(bp->managed_child));
  540.         }
  541.     }
  542. }
  543. /*----------------------------------------------------------------------*/
  544. static XtGeometryResult
  545. GeometryManager(Widget child,XtWidgetGeometry *request,XtWidgetGeometry *reply)
  546. {
  547.     XtGeometryResult    result;
  548.  
  549.     return result;
  550. }
  551. /*----------------------------------------------------------------------*/
  552.  
  553. /*----------------------------------------------------------------------*/
  554. /*                                                                        */
  555. /* XfeBypassShell action procedures                                        */
  556. /*                                                                        */
  557. /*----------------------------------------------------------------------*/
  558. static void
  559. BtnDown(Widget w,XEvent * event,char ** params,Cardinal * nparams)
  560. {
  561.     XfeBypassShellPart *    bp = _XfeBypassShellPart(w);
  562.  
  563.     printf("BtnDown(%s)\n",XtName(w));
  564. }
  565. /*----------------------------------------------------------------------*/
  566. static void
  567. BtnUp(Widget w,XEvent * event,char ** params,Cardinal * nparams)
  568. {
  569.     XfeBypassShellPart *    bp = _XfeBypassShellPart(w);
  570.  
  571.     printf("BtnUp(%s)\n",XtName(w));
  572. }
  573. /*----------------------------------------------------------------------*/
  574.  
  575. /*----------------------------------------------------------------------*/
  576. /*                                                                        */
  577. /* Shell structure event handler                                        */
  578. /*                                                                        */
  579. /*----------------------------------------------------------------------*/
  580. static void
  581. MappingEH(Widget        shell,
  582.           XtPointer        client_data,
  583.           XEvent *        event,
  584.           Boolean *        cont)
  585. {
  586.     Widget                w = (Widget) client_data;
  587.     XfeBypassShellPart *    bp = _XfeBypassShellPart(w);
  588.  
  589.     /* Make sure the shell is still alive */
  590.     if (_XfeIsAlive(w))
  591.     {
  592.         switch(event->type) 
  593.         {
  594.             /* Map */
  595.         case MapNotify:
  596.  
  597.             DrawShadow(w,NULL,NULL,NULL);
  598.             
  599.             /* Invoke map callbacks */
  600.             _XfeInvokeCallbacks(w,bp->map_callback,XmCR_MAP,NULL,False);
  601.  
  602.             break;
  603.             
  604.             /* Unmap */
  605.         case UnmapNotify:
  606.             
  607.             /* Invoke unmap callbacks */
  608.             _XfeInvokeCallbacks(w,bp->unmap_callback,XmCR_UNMAP,NULL,False);
  609.  
  610.             break;
  611.         }
  612.     }
  613.  
  614.     *cont = True;
  615. }
  616. /*----------------------------------------------------------------------*/
  617.  
  618. /*----------------------------------------------------------------------*/
  619. /*                                                                        */
  620. /* Misc XfeBypassShell functions                                        */
  621. /*                                                                        */
  622. /*----------------------------------------------------------------------*/
  623. static void
  624. DrawShadow(Widget w,XEvent * event,Region region,XRectangle * clip_rect)
  625. {
  626.     XfeBypassShellPart *    bp = _XfeBypassShellPart(w);
  627.  
  628.     if (!bp->shadow_thickness)
  629.     {
  630.         return;
  631.  
  632.     }
  633.  
  634.     _XmDrawShadows(XtDisplay(w),_XfeWindow(w),
  635.                    bp->top_shadow_GC,bp->bottom_shadow_GC,
  636.                    0,0,_XfeWidth(w),_XfeHeight(w),
  637.                    bp->shadow_thickness,bp->shadow_type);
  638. }
  639. /*----------------------------------------------------------------------*/
  640.  
  641. /*----------------------------------------------------------------------*/
  642. /*                                                                        */
  643. /* XfeBypassShell private methods                                        */
  644. /*                                                                        */
  645. /*----------------------------------------------------------------------*/
  646. static Widget _bypass_shell_global = NULL;
  647.  
  648. /*----------------------------------------------------------------------*/
  649. /* extern */ Boolean
  650. _XfeBypassShellGlobalIsAlive(void)
  651. {
  652.     return _XfeIsAlive(_bypass_shell_global);
  653. }
  654. /*----------------------------------------------------------------------*/
  655. /* extern */ Widget
  656. _XfeBypassShellGlobalAccess(void)
  657. {
  658.     assert( _XfeIsAlive(_bypass_shell_global) );
  659.  
  660.     return _bypass_shell_global;
  661. }
  662. /*----------------------------------------------------------------------*/
  663. /* extern */ Widget
  664. _XfeBypassShellGlobalInitialize(Widget pw,char * name,Arg * av,Cardinal ac)
  665. {
  666.     assert( ! _XfeIsAlive(_bypass_shell_global) );
  667.  
  668.     _bypass_shell_global = XfeCreateBypassShell(pw,name,av,ac);
  669.  
  670.     return _bypass_shell_global;
  671. }
  672. /*----------------------------------------------------------------------*/
  673.  
  674. /*----------------------------------------------------------------------*/
  675. /*                                                                        */
  676. /* XfeBypassShell public methods                                        */
  677. /*                                                                        */
  678. /*----------------------------------------------------------------------*/
  679. /* extern */ Widget
  680. XfeCreateBypassShell(Widget pw,char * name,Arg * av,Cardinal ac)
  681. {
  682.     return XtCreatePopupShell(name,xfeBypassShellWidgetClass,pw,av,ac);
  683. }
  684. /*----------------------------------------------------------------------*/
  685.