unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* HowTo: Detect when a frame's size changes
@ 2017-04-05  3:03 raman
  2017-04-05  6:58 ` martin rudalics
  0 siblings, 1 reply; 9+ messages in thread
From: raman @ 2017-04-05  3:03 UTC (permalink / raw)
  To: emacs-devel

Is there a way to tell from elisp if the size of a frame changes? I went
looking for some type of frame-resize-hook but didn't find any ---
-- 



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

* Re: HowTo: Detect when a frame's size changes
  2017-04-05  3:03 HowTo: Detect when a frame's size changes raman
@ 2017-04-05  6:58 ` martin rudalics
  2017-04-05  7:54   ` martin rudalics
  0 siblings, 1 reply; 9+ messages in thread
From: martin rudalics @ 2017-04-05  6:58 UTC (permalink / raw)
  To: raman, emacs-devel

 > Is there a way to tell from elisp if the size of a frame changes? I went
 > looking for some type of frame-resize-hook but didn't find any ---

If and when the change of the frame size is propagated to the frame's
windows, then with Emacs 26 `window-size-change-functions' should catch
them all.  With earlier Emacsen you might have to consult
`window-configuration-change-hook' as well.  And maybe some size changes
will not even be noticed.

Note that `window-size-change-functions' is also called when the
relative sizes of windows change.  So you have to store the previous
frame size and compare it with the current one to find out whether the
frame really changed size or only some of its windows.

Also note that size changes that do not affect the inner frame (like
adding or removing the menu or tool bar or a border) might not be
tracked at all.

In any case I'll have to add an appropriate link to the Elisp manual.

martin



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

* Re: HowTo: Detect when a frame's size changes
  2017-04-05  6:58 ` martin rudalics
@ 2017-04-05  7:54   ` martin rudalics
       [not found]     ` <p91a87uhon5.fsf@raman-glaptop2>
  0 siblings, 1 reply; 9+ messages in thread
From: martin rudalics @ 2017-04-05  7:54 UTC (permalink / raw)
  To: raman, emacs-devel

 > Note that `window-size-change-functions' is also called when the
 > relative sizes of windows change.  So you have to store the previous
 > frame size and compare it with the current one to find out whether the
 > frame really changed size or only some of its windows.

Actually that shouldn't be necessary.  Try with

(defun beep-when-frame-size-changed (frame)
   (when (or (/= (window-pixel-width-before-size-change (frame-root-window frame))
		(window-pixel-width (frame-root-window frame)))
	    (/= (window-pixel-height-before-size-change (frame-root-window frame))
		(window-pixel-height (frame-root-window frame))))
     (ding)))

(add-hook 'window-size-change-functions 'beep-when-frame-size-changed)

martin



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

* Re: HowTo: Detect when a frame's size changes
       [not found]     ` <p91a87uhon5.fsf@raman-glaptop2>
@ 2017-04-05 17:26       ` martin rudalics
  2017-04-05 17:32         ` T.V Raman
  0 siblings, 1 reply; 9+ messages in thread
From: martin rudalics @ 2017-04-05 17:26 UTC (permalink / raw)
  To: raman, emacs-devel

 > Thanks! will try that

Hmmm... rather not.  You will still get false positives when the
minibuffer window is resized.  For the moment stick to my earlier
proposal: When you run your ‘window-size-change-functions’ function
remember the old values of ‘frame-pixel-width’ and ‘frame-pixel-height’
(maybe in a frame parameter) and the next time you run it compare them
with the current values.

I will fix that soon probably by providing a ‘frame-size-changed-p’
function that you can use during ‘window-size-change-functions’.
Providing a separate ‘frame-size-change-functions’ hook would be also
possible but the interaction of these could be tricky.

martin




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

* Re: HowTo: Detect when a frame's size changes
  2017-04-05 17:26       ` martin rudalics
@ 2017-04-05 17:32         ` T.V Raman
  2017-04-05 18:05           ` martin rudalics
  2017-04-11 10:55           ` martin rudalics
  0 siblings, 2 replies; 9+ messages in thread
From: T.V Raman @ 2017-04-05 17:32 UTC (permalink / raw)
  To: rudalics; +Cc: emacs-devel, raman

Thanks Martin!

frame-size-changed-p would be nice --- Basically I was writing myself
some code in Emacspeak so it would cue me via sounds to the position
of the current window relative to the overall layout.

I wrote myself this function: -- and was looking to see if I could
avoid some of the computes by cacheing values --- though for now it
doesn't look like the code I have is sufficiently inefficient to
deserve cacheing.

(sox-multiwindow ...) used below uses SoX to produce a short tone, and
the tone's pitch and left/right pan get paramaeterized  appropriately 

(defun emacspeak--sox-multiwindow (corners)
  "Takes `window-edges' and plays a sound cue based on position of current window with respect to
the overall window layout."
  (let
      ((tr 0)
       (mr (/ (frame-height) 2))
       (br (1- (frame-height)))
       (lc 0)
       (mc (/ (frame-width) 2))
       (rc (frame-width)))
    (cond
     ((equal corners `(,lc ,tr ,mc ,br))
      (sox-multiwindow)
      'left-half)
     ((equal corners `(,mc ,tr ,rc, br))
      (sox-multiwindow 'swap)
      'right-half)
     ((equal corners `(,lc ,tr ,rc ,mr))
      (sox-multiwindow  nil 2)
      'top-half)
     ((equal corners `(,lc ,mr ,rc ,br))
      (sox-multiwindow nil 1.3)
      'bottom-half)
     ((equal corners `(,lc ,tr ,mc ,mr)) 
      (sox-multiwindow nil 2.5)
      'top-left)
     ((equal corners `(,mc ,tr ,rc ,mr))
      (sox-multiwindow t 2.5)
      'top-right)
     ((equal corners `(,lc ,mr ,mc ,br))
      (sox-multiwindow nil 0.9)
      'bottom-left)
     ((equal corners `(,mc ,mr ,rc ,br))
      (sox-multiwindow 'swap 0.9)
      'bottom-right)
     (t ""))))

martin rudalics writes:
 >  > Thanks! will try that
 > 
 > Hmmm... rather not.  You will still get false positives when the
 > minibuffer window is resized.  For the moment stick to my earlier
 > proposal: When you run your ‘window-size-change-functions’ function
 > remember the old values of ‘frame-pixel-width’ and ‘frame-pixel-height’
 > (maybe in a frame parameter) and the next time you run it compare them
 > with the current values.
 > 
 > I will fix that soon probably by providing a ‘frame-size-changed-p’
 > function that you can use during ‘window-size-change-functions’.
 > Providing a separate ‘frame-size-change-functions’ hook would be also
 > possible but the interaction of these could be tricky.
 > 
 > martin

-- 

--



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

* Re: HowTo: Detect when a frame's size changes
  2017-04-05 17:32         ` T.V Raman
@ 2017-04-05 18:05           ` martin rudalics
  2017-04-05 18:12             ` T.V Raman
  2017-04-11 10:55           ` martin rudalics
  1 sibling, 1 reply; 9+ messages in thread
From: martin rudalics @ 2017-04-05 18:05 UTC (permalink / raw)
  To: T.V Raman; +Cc: emacs-devel

 > frame-size-changed-p would be nice --- Basically I was writing myself
 > some code in Emacspeak so it would cue me via sounds to the position
 > of the current window relative to the overall layout.

With "current window" do you mean the "selected window" or the "selected
frame" in Emacs parlance?  Note that Emacs currently does not tell you
when the position of a frame changes.  For Emacs 26 I plan to add a hook
‘move-frame-functions’ that will be called on that occasion.

martin




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

* Re: HowTo: Detect when a frame's size changes
  2017-04-05 18:05           ` martin rudalics
@ 2017-04-05 18:12             ` T.V Raman
  0 siblings, 0 replies; 9+ messages in thread
From: T.V Raman @ 2017-04-05 18:12 UTC (permalink / raw)
  To: rudalics; +Cc: emacs-devel, raman

I meant window in terms of Emacs. I use stumpwm as my window manager
and the only things I run are Emacs (with emacspeak  talking) and
Chrome with ChromeVox making Chrome talk. For the most part, I work
with Stumpwm just showing the Emacs window --  --  and the emacs Frame
showing either one or two emacs windows. 

martin rudalics writes:
 >  > frame-size-changed-p would be nice --- Basically I was writing myself
 >  > some code in Emacspeak so it would cue me via sounds to the position
 >  > of the current window relative to the overall layout.
 > 
 > With "current window" do you mean the "selected window" or the "selected
 > frame" in Emacs parlance?  Note that Emacs currently does not tell you
 > when the position of a frame changes.  For Emacs 26 I plan to add a hook
 > ‘move-frame-functions’ that will be called on that occasion.
 > 
 > martin

-- 

--



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

* Re: HowTo: Detect when a frame's size changes
  2017-04-05 17:32         ` T.V Raman
  2017-04-05 18:05           ` martin rudalics
@ 2017-04-11 10:55           ` martin rudalics
  2017-04-12 15:22             ` raman
  1 sibling, 1 reply; 9+ messages in thread
From: martin rudalics @ 2017-04-11 10:55 UTC (permalink / raw)
  To: T.V Raman; +Cc: emacs-devel

 > frame-size-changed-p would be nice

This function exists now on master.  Run ‘window-size-change-functions’
and within the function you've put there ‘frame-size-changed-p’ will
tell you whether the frame size really changed or there was a false
positive.

martin




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

* Re: HowTo: Detect when a frame's size changes
  2017-04-11 10:55           ` martin rudalics
@ 2017-04-12 15:22             ` raman
  0 siblings, 0 replies; 9+ messages in thread
From: raman @ 2017-04-12 15:22 UTC (permalink / raw)
  To: martin rudalics; +Cc: emacs-devel

Awesome!
-- 



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

end of thread, other threads:[~2017-04-12 15:22 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-05  3:03 HowTo: Detect when a frame's size changes raman
2017-04-05  6:58 ` martin rudalics
2017-04-05  7:54   ` martin rudalics
     [not found]     ` <p91a87uhon5.fsf@raman-glaptop2>
2017-04-05 17:26       ` martin rudalics
2017-04-05 17:32         ` T.V Raman
2017-04-05 18:05           ` martin rudalics
2017-04-05 18:12             ` T.V Raman
2017-04-11 10:55           ` martin rudalics
2017-04-12 15:22             ` raman

Code repositories for project(s) associated with this public inbox

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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).