home *** CD-ROM | disk | FTP | other *** search
/ Tools / WinSN5.0Ver.iso / NETSCAP.50 / WIN1998.ZIP / ns / cmd / xfe / XfeWidgets / Xfe / FrameShell.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  21.7 KB  |  811 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/TempShell.c>                                        */
  21. /* Description:    XfeTempShell widget source.                                */
  22. /* Author:        Ramiro Estrugo <ramiro@netscape.com>                    */
  23. /*                                                                        */
  24. /*----------------------------------------------------------------------*/
  25.  
  26.  
  27. #include <stdio.h>
  28.  
  29. #include <Xfe/FrameShellP.h>
  30.  
  31. #include <Xm/AtomMgr.h>
  32. #include <Xm/Protocols.h>
  33.  
  34. #define BYPASS_SHELL_NAME "SharedBypassShell"
  35.  
  36. #define EDITRES 1
  37.  
  38. #ifdef EDITRES
  39. #include <X11/Xmu/Editres.h>
  40. #endif
  41.  
  42. #define MESSAGE1 "Widget is not an XfeFrameShell."
  43. #define MESSAGE2 "XmNhasBeenMapped is a read-only resource."
  44.  
  45. #define STRUCTURE_EVENTS    StructureNotifyMask
  46.  
  47. /*----------------------------------------------------------------------*/
  48. /*                                                                        */
  49. /* Core class methods                                                    */
  50. /*                                                                        */
  51. /*----------------------------------------------------------------------*/
  52. static void        ClassInitialize    ();
  53. static void     Initialize        (Widget,Widget,ArgList,Cardinal *);
  54. static void        Resize            (Widget);
  55. static void        Realize            (Widget,XtValueMask *,XSetWindowAttributes *);
  56. static void     Destroy            (Widget);
  57. static Boolean    SetValues        (Widget,Widget,Widget,ArgList,Cardinal *);
  58. static void        GetValuesHook    (Widget,ArgList,Cardinal *);
  59.  
  60. /*----------------------------------------------------------------------*/
  61. /*                                                                        */
  62. /* Tracking update functions                                            */
  63. /*                                                                        */
  64. /*----------------------------------------------------------------------*/
  65. static void        SetTrackEditres            (Widget,Boolean);
  66. static void        SetTrackMapping            (Widget,Boolean);
  67. static void        SetTrackSaveYourself    (Widget,Boolean);
  68. static void        SetTrackDeleteWindow    (Widget,Boolean);
  69.  
  70. /*----------------------------------------------------------------------*/
  71. /*                                                                        */
  72. /* Window manager protocol callbacks                                    */
  73. /*                                                                        */
  74. /*----------------------------------------------------------------------*/
  75. static void        DeleteWindowCB        (Widget,XtPointer,XtPointer);
  76. static void        SaveYourselfCB        (Widget,XtPointer,XtPointer);
  77.  
  78. /*----------------------------------------------------------------------*/
  79. /*                                                                        */
  80. /* Shell structure event handler                                        */
  81. /*                                                                        */
  82. /*----------------------------------------------------------------------*/
  83. static void        StructureEH            (Widget,XtPointer,XEvent *,Boolean *);
  84. static void        MappingEH            (Widget,XtPointer,XEvent *,Boolean *);
  85.  
  86. /*----------------------------------------------------------------------*/
  87. /*                                                                        */
  88. /* XfeFrameShell resources                                                */
  89. /*                                                                        */
  90. /*----------------------------------------------------------------------*/
  91. static XtResource resources[] =     
  92. {                    
  93.     /* Realization callback resources */
  94.     { 
  95.         XmNrealizeCallback,
  96.         XmCCallback,
  97.         XmRCallback,
  98.         sizeof(XtCallbackList),
  99.         XtOffsetOf(XfeFrameShellRec,xfe_frame_shell.realize_callback),
  100.         XmRImmediate, 
  101.         (XtPointer) NULL,
  102.     },
  103.     { 
  104.         XmNbeforeRealizeCallback,
  105.         XmCCallback,
  106.         XmRCallback,
  107.         sizeof(XtCallbackList),
  108.         XtOffsetOf(XfeFrameShellRec,xfe_frame_shell.before_realize_callback),
  109.         XmRImmediate, 
  110.         (XtPointer) NULL,
  111.     },
  112.  
  113.     /* Configure callback resources */
  114.     { 
  115.         XmNresizeCallback,
  116.         XmCCallback,
  117.         XmRCallback,
  118.         sizeof(XtCallbackList),
  119.         XtOffsetOf(XfeFrameShellRec,xfe_frame_shell.resize_callback),
  120.         XmRImmediate, 
  121.         (XtPointer) NULL,
  122.     },
  123.     { 
  124.         XmNbeforeResizeCallback,
  125.         XmCCallback,
  126.         XmRCallback,
  127.         sizeof(XtCallbackList),
  128.         XtOffsetOf(XfeFrameShellRec,xfe_frame_shell.before_resize_callback),
  129.         XmRImmediate, 
  130.         (XtPointer) NULL,
  131.     },
  132.     { 
  133.         XmNmoveCallback,
  134.         XmCCallback,
  135.         XmRCallback,
  136.         sizeof(XtCallbackList),
  137.         XtOffsetOf(XfeFrameShellRec,xfe_frame_shell.move_callback),
  138.         XmRImmediate, 
  139.         (XtPointer) NULL,
  140.     },
  141.  
  142.     /* WM Protocol callback resources */
  143.     { 
  144.         XmNdeleteWindowCallback,
  145.         XmCCallback,
  146.         XmRCallback,
  147.         sizeof(XtCallbackList),
  148.         XtOffsetOf(XfeFrameShellRec,xfe_frame_shell.delete_window_callback),
  149.         XmRImmediate, 
  150.         (XtPointer) NULL,
  151.     },
  152.     { 
  153.         XmNsaveYourselfCallback,
  154.         XmCCallback,
  155.         XmRCallback,
  156.         sizeof(XtCallbackList),
  157.         XtOffsetOf(XfeFrameShellRec,xfe_frame_shell.save_yourself_callback),
  158.         XmRImmediate, 
  159.         (XtPointer) NULL,
  160.     },
  161.  
  162.     /* Mapping callbacks */
  163.     { 
  164.         XmNfirstMapCallback,
  165.         XmCCallback,
  166.         XmRCallback,
  167.         sizeof(XtCallbackList),
  168.         XtOffsetOf(XfeFrameShellRec,xfe_frame_shell.first_map_callback),
  169.         XmRImmediate, 
  170.         (XtPointer) NULL,
  171.     },
  172.     { 
  173.         XmNmapCallback,
  174.         XmCCallback,
  175.         XmRCallback,
  176.         sizeof(XtCallbackList),
  177.         XtOffsetOf(XfeFrameShellRec,xfe_frame_shell.map_callback),
  178.         XmRImmediate, 
  179.         (XtPointer) NULL,
  180.     },
  181.     { 
  182.         XmNunmapCallback,
  183.         XmCCallback,
  184.         XmRCallback,
  185.         sizeof(XtCallbackList),
  186.         XtOffsetOf(XfeFrameShellRec,xfe_frame_shell.unmap_callback),
  187.         XmRImmediate, 
  188.         (XtPointer) NULL,
  189.     },
  190.  
  191.     /* Title changed callback */
  192.     { 
  193.         XmNtitleChangedCallback,
  194.         XmCCallback,
  195.         XmRCallback,
  196.         sizeof(XtCallbackList),
  197.         XtOffsetOf(XfeFrameShellRec,xfe_frame_shell.title_changed_callback),
  198.         XmRImmediate, 
  199.         (XtPointer) NULL,
  200.     },
  201.  
  202.     /* Tracking resources */
  203.     { 
  204.         XmNtrackEditres,
  205.         XmCTrackEditres,
  206.         XmRBoolean,
  207.         sizeof(Boolean),
  208.         XtOffsetOf(XfeFrameShellRec , xfe_frame_shell . track_editres),
  209.         XmRImmediate, 
  210.         (XtPointer) False
  211.     },
  212.     { 
  213.         XmNtrackMapping,
  214.         XmCTrackMapping,
  215.         XmRBoolean,
  216.         sizeof(Boolean),
  217.         XtOffsetOf(XfeFrameShellRec , xfe_frame_shell . track_mapping),
  218.         XmRImmediate, 
  219.         (XtPointer) True
  220.     },
  221.     { 
  222.         XmNtrackPosition,
  223.         XmCTrackPosition,
  224.         XmRBoolean,
  225.         sizeof(Boolean),
  226.         XtOffsetOf(XfeFrameShellRec , xfe_frame_shell . track_position),
  227.         XmRImmediate, 
  228.         (XtPointer) True
  229.     },
  230.     { 
  231.         XmNtrackSaveYourself,
  232.         XmCTrackSaveYourself,
  233.         XmRBoolean,
  234.         sizeof(Boolean),
  235.         XtOffsetOf(XfeFrameShellRec , xfe_frame_shell . track_save_yourself),
  236.         XmRImmediate, 
  237.         (XtPointer) True
  238.     },
  239.     { 
  240.         XmNtrackSize,
  241.         XmCTrackSize,
  242.         XmRBoolean,
  243.         sizeof(Boolean),
  244.         XtOffsetOf(XfeFrameShellRec , xfe_frame_shell . track_size),
  245.         XmRImmediate, 
  246.         (XtPointer) True
  247.     },
  248.  
  249.  
  250.     /* Other resources */
  251.     { 
  252.         XmNhasBeenMapped,
  253.         XmCReadOnly,
  254.         XmRBoolean,
  255.         sizeof(Boolean),
  256.         XtOffsetOf(XfeFrameShellRec , xfe_frame_shell . has_been_mapped),
  257.         XmRImmediate, 
  258.         (XtPointer) False
  259.     },
  260.     { 
  261.         XmNstartIconic,
  262.         XmCStartIconic,
  263.         XmRBoolean,
  264.         sizeof(Boolean),
  265.         XtOffsetOf(XfeFrameShellRec , xfe_frame_shell . start_iconic),
  266.         XmRImmediate, 
  267.         (XtPointer) True
  268.     },
  269.  
  270.     { 
  271.         XmNbypassShell,
  272.         XmCBypassShell,
  273.         XmRWidget,
  274.         sizeof(Widget),
  275.         XtOffsetOf(XfeFrameShellRec , xfe_frame_shell . bypass_shell),
  276.         XmRImmediate, 
  277.         (XtPointer) NULL
  278.     },
  279. };   
  280.  
  281. /*----------------------------------------------------------------------*/
  282. /*                                                                        */
  283. /* Widget Class Record Initialization                                   */
  284. /*                                                                        */
  285. /*----------------------------------------------------------------------*/
  286. _XFE_WIDGET_CLASS_RECORD(frameshell,FrameShell) =
  287. {
  288.     {
  289.         (WidgetClass) &topLevelShellClassRec,    /* superclass            */
  290.         "XfeFrameShell",                        /* class_name            */
  291.         sizeof(XfeFrameShellRec),                /* widget_size            */
  292.         ClassInitialize,                        /* class_initialize        */
  293.         NULL,                                    /* class_part_initialize*/
  294.         FALSE,                                    /* class_inited            */
  295.         Initialize,                                /* initialize            */
  296.         NULL,                                    /* initialize_hook        */
  297.         Realize,                                /* realize                */
  298.         NULL,                                    /* actions                */
  299.         0,                                        /* num_actions            */
  300.         resources,                              /* resources            */
  301.         XtNumber(resources),                    /* num_resources        */
  302.         NULLQUARK,                                /* xrm_class            */
  303.         FALSE,                                    /* compress_motion        */
  304.         TRUE,                                    /* compress_exposure    */
  305.         FALSE,                                    /* compress_enterleave    */
  306.         FALSE,                                    /* visible_interest        */
  307.         Destroy,                                /* destroy                */
  308.         Resize,                                    /* resize                */
  309.         XtInheritExpose,                        /* expose                */
  310.         SetValues,                              /* set_values            */
  311.         NULL,                                   /* set_values_hook        */
  312.         NULL,                                    /* set_values_almost    */
  313.         GetValuesHook,                            /* get_values_hook        */
  314.         NULL,                                   /* access_focus            */
  315.         XtVersion,                              /* version                */
  316.         NULL,                                   /* callback_private        */
  317.         XtInheritTranslations,                    /* tm_table                */
  318.         NULL,                                    /* query_geometry        */
  319.         NULL,                                    /* display accelerator    */
  320.         NULL,                                    /* extension            */
  321.     },
  322.     
  323.     /* Composite Part */
  324.     {
  325.         XtInheritGeometryManager,                /* geometry_manager        */
  326.         XtInheritChangeManaged,                    /* change_managed        */
  327.         XtInheritInsertChild,                    /* insert_child            */
  328.         XtInheritDeleteChild,                    /* delete_child            */
  329.         NULL                                    /* extension            */
  330.     },
  331.  
  332.     /* Shell */
  333.     {
  334.         NULL,                                    /* extension            */
  335.     },
  336.  
  337.     /* WMShell */
  338.     {
  339.         NULL,                                    /* extension            */
  340.     },
  341.  
  342.     /* VendorShell */
  343.     {
  344.         NULL,                                    /* extension            */
  345.     },
  346.  
  347.     /* TopShell */
  348.     {
  349.         NULL,                                    /* extension            */
  350.     },
  351.  
  352.     /* XfeFrameShell Part */
  353.     {
  354.         NULL,                                    /* extension            */
  355.     },
  356. };
  357.  
  358. /*----------------------------------------------------------------------*/
  359. /*                                                                        */
  360. /* xfeFrameShellWidgetClass declaration.                                */
  361. /*                                                                        */
  362. /*----------------------------------------------------------------------*/
  363. _XFE_WIDGET_CLASS(frameshell,FrameShell);
  364.  
  365. /*----------------------------------------------------------------------*/
  366. /*                                                                        */
  367. /* Core Class methods                                                    */
  368. /*                                                                        */
  369. /*----------------------------------------------------------------------*/
  370. static void
  371. ClassInitialize()
  372. {
  373.     /* Register Xfe Converters */
  374.     /*XfeRegisterConverters();*/
  375.  
  376.     /* Register Representation Types */
  377.     XfeRegisterRepresentationTypes();
  378. }
  379. /*----------------------------------------------------------------------*/
  380. static void
  381. Initialize(Widget rw,Widget nw,ArgList args,Cardinal *nargs)
  382. {
  383.     XfeFrameShellPart *        fp = _XfeFrameShellPart(nw);
  384.  
  385.     /* Check read only resources */
  386.     if (fp->has_been_mapped)
  387.     {
  388.         fp->has_been_mapped = False;
  389.  
  390.         _XfeWarning(nw,MESSAGE2);
  391.     }
  392.  
  393.     /* Initialize private members */
  394.  
  395.     /* Update tracking */
  396. /*     SetTrackEditres(nw,fp->track_editres); */
  397.     SetTrackMapping(nw,fp->track_mapping);
  398.     SetTrackSaveYourself(nw,fp->track_save_yourself);
  399.     SetTrackDeleteWindow(nw,fp->track_delete_window);
  400. }
  401. /*----------------------------------------------------------------------*/
  402. static void
  403. Destroy(Widget w)
  404. {
  405. /*     XfeFrameShellPart *        fp = _XfeFrameShellPart(w); */
  406.  
  407. #if 0
  408.     SetTrackEditres(w,False);
  409.     SetTrackMapping(w,False);
  410.     SetTrackSaveYourself(w,False);
  411.     SetTrackDeleteWindow(w,False);
  412. #endif
  413. }
  414. /*----------------------------------------------------------------------*/
  415. static void
  416. Realize(Widget w,XtValueMask * mask,XSetWindowAttributes * wa)
  417. {
  418.     XfeFrameShellPart *    fp = _XfeFrameShellPart(w);
  419.  
  420.     /* Invoke before realize Callbacks */
  421.     _XfeInvokeCallbacks(w,fp->before_realize_callback,
  422.                         XmCR_BEFORE_REALIZE,NULL,False);
  423.  
  424.     /* The actual realization is handled by the superclass */
  425.     (*topLevelShellWidgetClass->core_class.realize)(w,mask,wa);
  426.  
  427.     /* Invoke realize Callbacks */
  428.     _XfeInvokeCallbacks(w,fp->realize_callback,XmCR_REALIZE,NULL,False);
  429. }
  430. /*----------------------------------------------------------------------*/
  431. static void
  432. Resize(Widget w)
  433. {
  434.     XfeFrameShellPart *    fp = _XfeFrameShellPart(w);
  435.  
  436.     /* Invoke before resize Callbacks */
  437.     _XfeInvokeCallbacks(w,fp->before_resize_callback,
  438.                         XmCR_BEFORE_RESIZE,NULL,False);
  439.  
  440.     /* The actual realization is handled by the superclass */
  441.     (*topLevelShellWidgetClass->core_class.resize)(w);
  442.     
  443.     /* Invoke resize Callbacks */
  444.     _XfeInvokeCallbacks(w,fp->resize_callback,XmCR_RESIZE,NULL,False);
  445. }
  446. /*----------------------------------------------------------------------*/
  447. static Boolean
  448. SetValues(Widget ow,Widget rw,Widget nw,ArgList args,Cardinal *nargs)
  449. {
  450.     XfeFrameShellPart *        np = _XfeFrameShellPart(nw);
  451.     XfeFrameShellPart *        op = _XfeFrameShellPart(ow);
  452.  
  453.     WMShellPart *            wm_np = _WMShellPart(nw);
  454.     WMShellPart *            wm_op = _WMShellPart(ow);
  455.  
  456.     /* has_been_mapped */
  457.     if (np->has_been_mapped != op->has_been_mapped)
  458.     {
  459.         np->has_been_mapped = op->has_been_mapped;
  460.  
  461.         _XfeWarning(nw,MESSAGE2);
  462.     }
  463.  
  464.     /* track_editres */
  465.     if (np->track_editres != op->track_editres)
  466.     {
  467.         SetTrackEditres(nw,np->track_editres);
  468.     }
  469.  
  470.     /* track_mapping */
  471.     if (np->track_mapping != op->track_mapping)
  472.     {
  473.         SetTrackMapping(nw,np->track_mapping);
  474.     }
  475.  
  476.     /* track_save_yourself */
  477.     if (np->track_save_yourself != op->track_save_yourself)
  478.     {
  479.         SetTrackSaveYourself(nw,np->track_save_yourself);
  480.     }
  481.  
  482.     /* track_delete_window */
  483.     if (np->track_delete_window != op->track_delete_window)
  484.     {
  485.         SetTrackDeleteWindow(nw,np->track_delete_window);
  486.     }
  487.  
  488.     /* title */
  489.     if (wm_np->title != wm_op->title)
  490.     {
  491.         /* Invoke title changed Callbacks */
  492.         _XfeInvokeCallbacks(nw,np->title_changed_callback,
  493.                             XmCR_TITLE_CHANGED,NULL,False);
  494.     }
  495.  
  496.     return False;
  497. }
  498. /*----------------------------------------------------------------------*/
  499. static void
  500. GetValuesHook(Widget w,ArgList av,Cardinal * pac)
  501. {
  502.     XfeFrameShellPart *    fp = _XfeFrameShellPart(w);
  503.     Cardinal            i;
  504.     
  505.     for (i = 0; i < *pac; i++)
  506.     {
  507.         /* bypass_shell */
  508.         if (strcmp(av[i].name,XmNbypassShell) == 0)
  509.         {
  510.             *((XtArgVal *) av[i].value) = 
  511.                 (XtArgVal) XfeFrameShellGetBypassShell(w);
  512.         }
  513.     }
  514. }
  515. /*----------------------------------------------------------------------*/
  516.  
  517. /*----------------------------------------------------------------------*/
  518. /*                                                                        */
  519. /* Tracking update functions                                            */
  520. /*                                                                        */
  521. /*----------------------------------------------------------------------*/
  522. static void
  523. SetTrackEditres(Widget w,Boolean state)
  524. {
  525. #ifdef EDITRES
  526.     /* Remove any editres event handler that might have been added */
  527.      XtRemoveEventHandler(w,0,True,_XEditResCheckMessages,NULL);
  528.  
  529.     /* Add the editres event handler if needed */
  530.     if (state)
  531.     {
  532.          XtAddEventHandler(w,0,True,_XEditResCheckMessages,NULL);
  533.     }
  534. #endif
  535. }
  536. /*----------------------------------------------------------------------*/
  537. static void
  538. SetTrackMapping(Widget w,Boolean state)
  539. {
  540.     /* Remove any mapping event handler that might have been added */
  541.     XtRemoveEventHandler(w,StructureNotifyMask,True,MappingEH,w);
  542.  
  543.     /* Add the mapping event handler if needed */
  544.     if (state)
  545.     {
  546.         XtAddEventHandler(w,StructureNotifyMask,True,MappingEH,w);
  547.     }
  548. }
  549. /*----------------------------------------------------------------------*/
  550. static void
  551. SetTrackDeleteWindow(Widget w,Boolean state)
  552. {
  553.     static Atom WM_DELETE_WINDOW = None;
  554.  
  555.     /* Dont do nothing if the state is False and no Atom has been created */
  556.     if ((WM_DELETE_WINDOW == None) && !state)
  557.     {
  558.         return;
  559.     }
  560.  
  561.     /* Create the Atom for the first time */
  562.     if (WM_DELETE_WINDOW == None)
  563.     {
  564.         WM_DELETE_WINDOW = XmInternAtom(XtDisplay(w),"WM_DELETE_WINDOW",False);
  565.  
  566.         XmAddWMProtocols(w,&WM_DELETE_WINDOW,1);
  567.     }
  568.     
  569.     /* Remove any delete callback that might have been added */
  570.     XmRemoveWMProtocolCallback(w,WM_DELETE_WINDOW,DeleteWindowCB,w);
  571.  
  572.     /* Add the delete callback if needed */
  573.     if (state)
  574.     {
  575.         XmAddWMProtocolCallback(w,WM_DELETE_WINDOW,DeleteWindowCB,w);
  576.     }
  577. }
  578. /*----------------------------------------------------------------------*/
  579. static void
  580. SetTrackSaveYourself(Widget w,Boolean state)
  581. {
  582.     static Atom WM_SAVE_YOURSELF = None;
  583.  
  584.     /* Dont do nothing if the state is False and no Atom has been created */
  585.     if ((WM_SAVE_YOURSELF == None) && !state)
  586.     {
  587.         return;
  588.     }
  589.  
  590.     /* Create the Atom for the first time */
  591.     if (WM_SAVE_YOURSELF == None)
  592.     {
  593.         WM_SAVE_YOURSELF = XmInternAtom(XtDisplay(w),"WM_SAVE_YOURSELF",False);
  594.  
  595.         XmAddWMProtocols(w,&WM_SAVE_YOURSELF,1);
  596.     }
  597.     
  598.     /* Remove any save yourself callback that might have been added */
  599.     XmRemoveWMProtocolCallback(w,WM_SAVE_YOURSELF,SaveYourselfCB,w);
  600.  
  601.     /* Add the save yourself callback if needed */
  602.     if (state)
  603.     {
  604.         XmAddWMProtocolCallback(w,WM_SAVE_YOURSELF,SaveYourselfCB,w);
  605.     }
  606.  
  607. }
  608. /*----------------------------------------------------------------------*/
  609.  
  610.  
  611. /*----------------------------------------------------------------------*/
  612. /*                                                                        */
  613. /* Window manager protocol callbacks                                    */
  614. /*                                                                        */
  615. /*----------------------------------------------------------------------*/
  616. static void
  617. DeleteWindowCB(Widget shell,XtPointer client_data,XtPointer call_data)
  618. {
  619.     Widget                    w = (Widget) client_data;
  620.     XfeFrameShellPart *        fp = _XfeFrameShellPart(w);
  621. /*     XmVendorShellExtPart *    vp = _XfeVendorShellPart(w); */
  622.  
  623.     if (_XfeIsAlive(w) && fp->track_delete_window)
  624.     {
  625.         /* Invoke delete window callbacks */
  626.         _XfeInvokeCallbacks(w,fp->delete_window_callback,
  627.                             XmCR_DELETE_WINDOW,NULL,False);
  628.     }
  629. }
  630. /*----------------------------------------------------------------------*/
  631. static void
  632. SaveYourselfCB(Widget shell,XtPointer client_data,XtPointer call_data)
  633. {
  634.     Widget                w = (Widget) client_data;
  635.     XfeFrameShellPart *    fp = _XfeFrameShellPart(w);
  636.  
  637.     if (_XfeIsAlive(w) && fp->track_save_yourself)
  638.     {
  639.         /* Invoke save yourself callbacks */
  640.         _XfeInvokeCallbacks(w,fp->save_yourself_callback,
  641.                             XmCR_SAVE_YOURSELF,NULL,False);
  642.     }
  643. }
  644. /*----------------------------------------------------------------------*/
  645.  
  646. /*----------------------------------------------------------------------*/
  647. /*                                                                        */
  648. /* Shell structure event handler                                        */
  649. /*                                                                        */
  650. /*----------------------------------------------------------------------*/
  651. static void
  652. MappingEH(Widget        shell,
  653.           XtPointer        client_data,
  654.           XEvent *        event,
  655.           Boolean *        cont)
  656. {
  657.     Widget                w = (Widget) client_data;
  658.     XfeFrameShellPart *    fp = _XfeFrameShellPart(w);
  659.  
  660.     /* Make sure the shell is still alive */
  661.     if (_XfeIsAlive(w) && fp->track_mapping)
  662.     {
  663.         switch(event->type) 
  664.         {
  665.             /* Map */
  666.         case MapNotify:
  667.  
  668.             if (XfeIsViewable(shell))
  669.             {
  670.                 /* Invoke first map callbacks */
  671.                 if (!fp->has_been_mapped)
  672.                 {
  673.                     fp->has_been_mapped = True;
  674.                     
  675.                     _XfeInvokeCallbacks(w,fp->first_map_callback,
  676.                                         XmCR_FIRST_MAP,NULL,False);
  677.                 }
  678.                 /* Invoke map callbacks */
  679.                 else
  680.                 {
  681.                     _XfeInvokeCallbacks(w,fp->map_callback,
  682.                                         XmCR_MAP,NULL,False);
  683.                 }
  684.             }
  685.             
  686.             break;
  687.             
  688.             /* Unmap */
  689.         case UnmapNotify:
  690.             
  691.             /* Invoke unmap callbacks */
  692.             _XfeInvokeCallbacks(w,fp->unmap_callback,
  693.                             XmCR_UNMAP,NULL,False);
  694.  
  695.             break;
  696.         }
  697.     }
  698.  
  699.     *cont = True;
  700. }
  701. /*----------------------------------------------------------------------*/
  702. static void
  703. StructureEH(Widget            shell,
  704.             XtPointer        client_data,
  705.             XEvent *        event,
  706.             Boolean *        cont)
  707. {
  708.     Widget                w = (Widget) client_data;
  709.     XfeFrameShellPart *    fp = _XfeFrameShellPart(w);
  710.  
  711.     /* Make sure the shell is still alive */
  712.     if (!_XfeIsAlive(w))
  713.     {
  714.         return;
  715.     }
  716.  
  717.     switch(event->type) 
  718.     {
  719.     case MapNotify:
  720.  
  721.         /* Invoke first map callbacks */
  722.         if (!fp->has_been_mapped)
  723.         {
  724.             fp->has_been_mapped = True;
  725.  
  726.             _XfeInvokeCallbacks(w,fp->first_map_callback,
  727.                                 XmCR_FIRST_MAP,NULL,False);
  728.             
  729.         }
  730.         /* Invoke map callbacks */
  731.         else
  732.         {
  733.             _XfeInvokeCallbacks(w,fp->map_callback,
  734.                                 XmCR_MAP,NULL,False);
  735.         }
  736.  
  737.         break;
  738.  
  739.     case UnmapNotify:
  740.  
  741.         /* Invoke unmap callbacks */
  742.         _XfeInvokeCallbacks(w,fp->unmap_callback,
  743.                             XmCR_UNMAP,NULL,False);
  744.  
  745.         break;
  746.     }
  747.  
  748.     *cont = True;
  749. }
  750. /*----------------------------------------------------------------------*/
  751.  
  752.  
  753. /*----------------------------------------------------------------------*/
  754. /*                                                                        */
  755. /* XfeFrameShell Public Methods                                            */
  756. /*                                                                        */
  757. /*----------------------------------------------------------------------*/
  758. /* extern */ Widget
  759. XfeCreateFrameShell(Widget pw,char * name,ArgList av,Cardinal ac)
  760. {
  761.     return XtCreatePopupShell(name,xfeFrameShellWidgetClass,pw,av,ac);
  762. }
  763. /*----------------------------------------------------------------------*/
  764. /* extern */ Widget
  765. XfeFrameShellGetBypassShell(Widget w)
  766. {
  767.     XfeFrameShellPart *    fp = _XfeFrameShellPart(w);
  768.     Arg                    av[10];
  769.     Cardinal            ac = 0;
  770.  
  771.     assert( XfeIsFrameShell(w) );
  772.  
  773. #if 0
  774.     assert( _XfeIsRealized(w) );
  775.  
  776.     if (!_XfeIsRealized(w))
  777.     {
  778.         return False;
  779.     }
  780. #endif
  781.  
  782. #if 1
  783.     /*
  784.      * Make sure the frame shell is realized or else the colormap and visual
  785.      * stuff below will fail.
  786.      */
  787.     if (!_XfeIsRealized(w))
  788.     {
  789.         XtRealizeWidget(w);
  790.     }
  791. #endif
  792.  
  793.     /* Make sure a shared bypass shell does not already exist */
  794.     if (_XfeIsAlive(fp->bypass_shell))
  795.     {
  796.         return fp->bypass_shell;
  797.     }
  798.  
  799.     XtSetArg(av[ac],XmNcolormap,    XfeColormap(w));    ac++;
  800.     XtSetArg(av[ac],XmNvisual,        XfeVisual(w));        ac++;
  801.     XtSetArg(av[ac],XmNdepth,        XfeDepth(w));        ac++;
  802.  
  803.     fp->bypass_shell = XfeCreateBypassShell(w,BYPASS_SHELL_NAME,av,ac);
  804.  
  805.     /* Make sure its realized */
  806.      XtRealizeWidget(fp->bypass_shell);
  807.  
  808.     return fp->bypass_shell;
  809. }
  810. /*----------------------------------------------------------------------*/
  811.