
subwindow had its text modified since the last update, this would give the package an oppor-
tunity to prompt the user for an update. Or you might install a routine that interposes any
request for destruction on a particular object (such as a frame).*
The quit() routine looks like this:
void
quit()
{
if (xv_destroy_safe(frame) == XV_OK)
exit(0);
}
Rather than calling xv_destroy_safe() on all objects, it is only called for the base
frame. Because the base frame is the owner of all the other objects, xv_destroy() and
xv_destroy_safe() descend into the objects’ children and destroys all of them with the
same call.
Use the function xv_destroy_safe() to destroy objects from within the object’s call-
back procedures. xv_destroy_safe() will delay destroying the object until it is safe to
do so (that is, not while in the object’s callback). For example, when a frame is destroyed
from within the frame’s FRAME_DONE_PROC, you need to use xv_destroy_safe() to
ensure that the frame object is removed. (See FRAME_DONE_PROC in the next chapter for a
description of a frame’s “done” callback.)
xv_destroy() may be called at any time without notice. It may result from actions the
user takes with the window manager, from a separate process or from events sent by other
applications.
3.3.4 Using xv_set( ) and xv_get( )
As discussed in the previous chapter, attributes about objects can be set, reset and retrieved
using the calls ...