all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* Re: How about introducing a new frame parameter: topmost
@ 2008-06-04  2:59 brianjiang
  2008-06-04  3:55 ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: brianjiang @ 2008-06-04  2:59 UTC (permalink / raw)
  To: monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1045 bytes --]

> > If this parameter is true, the frame is shown as a TOPMOST window.
>               
> The tricky part is to coerce the window manager into agreeing
> with Emacs.   
>               
>               
>         Stefan

It is quit easy to implement it in Windows, simply calling WIN API
SetWindowPos.
Currently, I actually implement it by defining a DEFUN
w32-set-frame-topmost as follows. 
But I don't know whether we can implement the same thing in X-window
system and MAC 
system.
 
 
DEFUN("w32-set-frame-topmost", Fw32_set_frame_topmost, 
      Sw32_set_frame_topmost, 0, 2, 0,
      doc: /* update later */)
     (frame, notopmost)
     Lisp_Object frame, notopmost;
{
  FRAME_PTR f = check_x_frame (frame);
 
  HWND hWndInsertAfter;
 
  if (NILP(notopmost))
    {
      hWndInsertAfter = HWND_TOPMOST;
    }
  else
    {
      hWndInsertAfter = HWND_NOTOPMOST;
    }
  
  SetWindowPos(FRAME_W32_WINDOW(f), hWndInsertAfter, 0, 0, 0, 0,
               SWP_NOMOVE|SWP_NOSIZE);
  
  return Qnil;
}


[-- Attachment #2: Type: text/html, Size: 2757 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread
* Re: How about introducing a new frame parameter: topmost
@ 2008-06-04  5:06 brianjiang
  0 siblings, 0 replies; 6+ messages in thread
From: brianjiang @ 2008-06-04  5:06 UTC (permalink / raw)
  To: monnier, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 2235 bytes --]

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

 

[-- Attachment #2: Type: text/html, Size: 4255 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread
* How about introducing a new frame parameter: topmost
@ 2008-06-03 16:39 brianjiang
  2008-06-03 19:28 ` Stefan Monnier
  0 siblings, 1 reply; 6+ messages in thread
From: brianjiang @ 2008-06-03 16:39 UTC (permalink / raw)
  To: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 735 bytes --]

How about introducing a new frame parameter: topmost . 
If this parameter is true, the frame is shown as a TOPMOST window.
 
It will be quite useful. e.g.,
 
1. During ediff, the small ediff frame can be set as TOPMOST frame. So
it will not be hiden when we need to edit the comparing file
termporarily.
 
2. Sometimes we may like to pop up a small information frame (e.g.,
*help*, sometimes we may prefer to pop up a new frame instead of
spltting the current frame/window), and at the same time, we can edit
file in another frame. The information frame is set as TOPMOST, so it
will not be coverred by the edit frame. And so we can easily refer to
the information when we are editing our file. It will be very nice.
 

[-- Attachment #2: Type: text/html, Size: 2398 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2008-06-04 16:59 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-06-04  2:59 How about introducing a new frame parameter: topmost brianjiang
2008-06-04  3:55 ` Stefan Monnier
  -- strict thread matches above, loose matches on Subject: below --
2008-06-04  5:06 brianjiang
2008-06-03 16:39 brianjiang
2008-06-03 19:28 ` Stefan Monnier
2008-06-04 16:59   ` James Cloos

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.