Here's a proposal for a tiny protocol extension (one request other than
QueryVersion) that would help a lot in making inter-client embedding
robust.
I'm willing to do the work in implementing this for XFree86, though
I might need help in checking the protocol for sanity and figuring
out how to implement it. (A separate library for one request seems
like overkill, but I'm not sure that adding it to XLib would be
legitimate.)
Does this proposal make sense?
Thanks,
Owen
ChangeSaveSetValues
window: WINDOW
value-mask: BITMASK
value-list: LISTofVALUE
Errors: Window, Match
Sets the save-set values for WINDOW. window must be in the client's
save-set or Match error occurs.
The value-mask and value-list contain the attributes to change. The
possible values are:
target: WINDOW or None
map-action: { Nothing, Map, Unmap }
x-offset: INT16
y-offset: INT16
When the client's resources are destroyed, if window is an inferior of a
window
created by the client,window is:
Reparented to the target value window, or if None, to the closest
ancestor such that window is not an inferior of a window created
by the client.
Mapped if map-action is Map, unmapped if map-action is Unmap.
Moved such that if the original root-window location of the client's
upper left corner is x,y then the new location is x + x-offset,
y + y-offset.
The default component values when a window is added to the client's save-set
correspond to the core protocol behavior and are:
Component Default
-----------------------
target None
map-action Map
x-offset 0
y-offset 0
Rationale:
Being able to set the target is important when doing-interclient
embedding as in the XEmbed protocol.
(http://www.freedesktop.org/standards/xembed.html.) If the
embedder is unexpectedly killed, the behavior of the core protocol is to
reparent the client to the window manager's frame and map it. Since the
window manager then destroys its frame, the client window is not saved,
and the client application will likely crash. The client application may
have a separate toplevel (e.g. an application with a status docklet in
the desktop's panel) or windows embedded elsewhere, so this is highly
undesirable.
Setting the map-action so that the window is unnmapped rather than
mapped is desirable to keep the window from temporarily being visible as
a child of the root window. (Note that unmapping and reparented back to
the root window not result in a "lost" window, since this is the normal
termination of the XEmbed protocol and clients are required to watch for
it.)
x-offset and y-offset can be used by a reparenting window manager so
that if it is killed unexpectedly then when a new window manager is
started, windows appear in their original location, rather than offset
by the frame thickness.
Possible Issues:
Allowing the target to be a WINDOW may complicate implementation to
handle the case where the target is destroyed between the
ChangeSaveSaveSetValues call and the client being destroyed. An
alternative which handles the use case is to make it an enumeration with
the possible values { NearestParent, Root }.
The save-set values are per-client, per-window rather than per-window.
I think being per-client is more logical and probably easier to
implement since the save-set itself is per-client.
_______________________________________________
Xpert mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/xpert