> It needs to work under X11 as well before I'd
consider integrating the
> feature. BTW, another detail is: does
this property mean "stay above
> every other GUI window", or "stay above
the current Emacs frame", or
> "stay above all other frames owned by this
Emacs process"?
>
> The latter seems more useful. The
former is probably what your
> code does. In X11, there's a feature
which could do something like
> the 2nd option, which is to mark a frame
as being "transient", in which
> case most window managers will try to
keep it "above its parent window",
> at least if that transient window is
sufficiently small.
>
>
> Stefan
Yes, my code does the one "stay above every other GUI
window". That is
the easiest way.
I did try to implement the 2nd option ("stay above the
current Emacs
frame") too by using the existing frame parameter "parent-id".
Something like:
In proc
w32_createwindow:
if
(f->output_data.w32->parent_desc != FRAME_X_DISPLAY_INFO
(f)->root_window)
{
long
style;
SetWindowLong (hwnd,
GWL_HWNDPARENT,
(long)f->output_data.w32->parent_desc);
style = GetWindowLong (hwnd,
GWL_STYLE);
style
&=
~(WS_MINIMIZEBOX);
SetWindowLong (hwnd, GWL_STYLE,
style);
}
Comment out
the following line in x-create-frame:
/*
f->output_data.w32->parent_desc = FRAME_W32_DISPLAY_INFO
(f)->root_window;*/
And also something need to be taken
care in Fdelete_frame.
It works. But sometimes it has problem in
redisplaying the parent window
(parent
window is not painted sometimes). And the child frame (window)
doesn't have
icon/button in the windows taskbar
too.
In GTK+, there is a API to do the 2nd
option:
gtk_window_set_transient_for. In Windows, this API actually
is
implemented by calling SetWindowLong with GWL_HWNDPARENT too.
But the MSDN says:
You must not call
SetWindowLong with the GWL_HWNDPARENT index to
change the parent
of a child window. Instead, use the SetParent
function.
But
SetParent is not what we need.
Don't know a way to do the 3rd option ("stay above
all other frames
owned by this Emacs process") yet :-(