The objects of the XmVendorShellExtObject class serve for two purposes. First, they provide storage for resources that are new with M*TIF's particular VendorShell. Second, they form a tree (or hierarchy) which shadows the instance hierarchy of all the shell widgets an application has. From now on I'll refer to this hierarchy as the ``shadow shell tree''. But first some more information about the rather less-spotted vendor shell extension objects.
By definition a VendorShell is a subclass of a WMShell and allows
software vendors to provide new resources, class methods, etc. to
support their custom window managers. So much for theory. In practice
the spirit (idea) was willing but the flesh (the implementation)
is still weak. If you would have to write your own VendorShell
widget class that has additional instance variables (``resources'')
you would be in trouble - or rather those programmers writing their X
applications using your new VendorShell. As several widget classes
are derived from the VendorShell class (for example the
TransientShell, the TopLevelShell and the ApplicationShell, see figure
on page
) these classes then
would have to be recompiled. Otherwise the VendorShell part of an
already compiled and older ApplicationShell would differ from that
part of a new VendorShell. At this point the object-orientated
approach simply can't handle the case where you need to replace a
class within the class tree.
Historically, the CSF needed to add new resources to the VendorShell to support resolution independance, specific MWM functions and other ``features''. But extending the existing VendorShell was not desirable at all, as mentioned above, so the programmers at the CSF took another approach.
With M*TIF, every VendorShell widget (as well as every widget
created from a subclass of VendorShell) is accompanied by a so-called
VendorShell extension object. This VendorShell extension object (or
``VSE object'' for short) is a descendant of XmDesktopObject,
XmExtObject, and thus finally of the Intrinsics' Object class (see
figure ).
The Object class was made public in X11R4 to enable programmers to use the Intrinsics' classing and resource handling mechanisms for things besides widgets. Within M*TIF, the VSE objects serve to hold all the instance variables (resources) that had to be added to the VendorShell class after the Xt Intrinsics had already been written down.
XmExtObjectXmNlogicalParentThe starting point for all kind of extension object classes within LESSTIF is the XmExtObject class. This class provides for synthetic resources as well as external resources. In addition, every instance of a XmExtObject contains a pointer to its ``logical parent'' (resource XmNlogicalParent) that is the widget that owns the extension object (or that the extension object extends). You'll never find a XmExtObject in its logical parent's child list. One reason is that M*TIF seems to use some kind of self-crafted XtCreateWidget() when creating extension objects. A second reason is that LESSTIF currently uses a call to XtCreateWidget() when creating VSE objects. To cite Mitch, the affected logical parents keep ``those pesky [extension] objects'' out of the child list using special insert_child() and delete_child() methods.