AppPlusShell Widget ----------
------------------------------------------------------------
From the Xt FAQ:
---------------------------------------------------------------------- 4.
How do I use a different visual than the default? ---------
-------------------------------------------------------------
This requires a more complicated answer than it should. A window has three
things that are visual specific -- the visual, colormap and border pixmap.
All widgets have their own Colormap and BorderPixmap resource; only shell
widgets have Visual resources (another questions deals with why shells have
a Visual). The default value of these resources is CopyFromParent which
does exactly what it says. In the shell widget CopyFromParent gets
evalulated as DefaultVisualOfScreen and DefaultColormapOfScreen. When any
one of the three resources is not properly set, a BadMatch error occurs
when the window is created. They are not properly set because each of the
values depends on the visual being used.
How to get this to work? There are two parts to the answer. The first is
if you want an application to start with a particular visual and the second
is if you want a particular shell within an application to start with a
different visual. The second is actually easier because the basic
information you need is available. The first is a little harder because
you'll need to initialize much of the toolkit yourself in order to
determine the needed information.
----------------------------------------------------------------------
This doesn't seem like the correct solution to me. First, its not
reusable, and second it's not user configurable thru resources. This was
the inspiration behind the AppPlusShell widget.
The AppPlusShell adds the following to the application shell:
1) Visual/Colormap control thru resources 2) EditRes built in (can be
turned on/off) 3) Catches the WM_DELETE_WINDOW
It does this thru the following added resources:
For 1: XtNvisualClass XtNusePrivateColormap XtNvisualID XtNapplicationDepth
For 2: XtNallowEditRes
For 3: XtNsaveYourselfCallback
The algorithm is as follows, in this order:
1) if XtNvisualID is set try to use the visual with this id, if it exists.
2) if XtNapplicationDepth is set try to find a visual with that depth,
otherwise set it to DefaultDepth(). This allows users to have:
*applicationDepth: 24
which will be used if it exists. XtNapplicationDepth is needed instead of
XtNdepth, since, IMO, most users will want to do
*depth: 24
which would screw up for any subwidgets if there were no visual with a
depth of 24. Note that the depth gets correctly set in the initialize too.
3) if XtNvisualClass is set then find the visual with the that class and
the greatest depth.
4) if all else fails use the default visual/default depth.
5a) if he visualID == default visual id, and XtNusePrivateColormap is
FALSE, then use the default colormap, otherwise, create an appropriate one.
5b) If the XCC library is in use, it would call the XCC lib at this point
instead.
Plus, there is now a file called SubPlusS.c that containts
functions for creating popup/menu shells with the correct
visuals/colormaps/depths.
The only other thing of interest is if you define MOTIF the code
uses some Motif functions instead of their X/Xt equivalents, but otherwise
should work with pretty much any Xt widget set.
I use a version of this code in our product, and so it has been
used on just about every major U*x platform with success.
Let me know what you think...(Otherwise I'll stop writing this
stuff...Well, after I finish this next one, then that's it..., Yeah, that's
it...)
John L. Cwikla cwikla@wri.com