[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How about introducing a new frame parameter: topmost

From: brianjiang
Subject: Re: How about introducing a new frame parameter: topmost
Date: Wed, 4 Jun 2008 13:06:29 +0800

> 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
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 :-(


reply via email to

[Prev in Thread] Current Thread [Next in Thread]