unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* desktop height?
@ 2003-01-28  6:47 Bruce Ingalls
  2003-01-28 14:27 ` Phillip Lord
  2003-01-30 14:40 ` Chris McMahan
  0 siblings, 2 replies; 9+ messages in thread
From: Bruce Ingalls @ 2003-01-28  6:47 UTC (permalink / raw)


Does anyone know a way to calculate the height of the desktop in elisp?

I'd like Emacs to start up with maximum height.
For that matter, I'd like XEmacs, and various OSes to work.

In Linux X Window, the following works reasonably well:

(/ (- (x-display-pixel-height) 50) (frame-char-height)))

I can get reasonably close with

(/ (x-display-pixel-height)
  (* (/ (font-default-size-for-device) 2) 3))

which works in w32 XEmacs as

(/ (x-display-pixel-height)
  (* (/ (string-to-number (font-default-size-for-device)) 2) 3))

or w32 Emacs as

(/ (x-display-pixel-height) 18)

I'd also like to hear of testing on other OSes.
If someone has a better solution, please send it!
Thanks ahead.

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

* Re: desktop height?
  2003-01-28  6:47 desktop height? Bruce Ingalls
@ 2003-01-28 14:27 ` Phillip Lord
  2003-01-28 18:32   ` Bruce Ingalls
  2003-01-30 14:40 ` Chris McMahan
  1 sibling, 1 reply; 9+ messages in thread
From: Phillip Lord @ 2003-01-28 14:27 UTC (permalink / raw)


>>>>> "Bruce" == Bruce Ingalls <bingalls.NO_SPAM@fit-zones.com> writes:

  Bruce> Does anyone know a way to calculate the height of the desktop
  Bruce> in elisp?

  Bruce> I'd like Emacs to start up with maximum height.  For that
  Bruce> matter, I'd like XEmacs, and various OSes to work.

  Bruce> In Linux X Window, the following works reasonably well:

  Bruce> (/ (- (x-display-pixel-height) 50) (frame-char-height)))

  Bruce> I can get reasonably close with

  Bruce> (/ (x-display-pixel-height)
  Bruce>   (* (/ (font-default-size-for-device) 2) 3))

  Bruce> which works in w32 XEmacs as

  Bruce> (/ (x-display-pixel-height)
  Bruce>   (* (/ (string-to-number (font-default-size-for-device)) 2)
  Bruce>   3))

  Bruce> or w32 Emacs as

  Bruce> (/ (x-display-pixel-height) 18)

  Bruce> I'd also like to hear of testing on other OSes.  If someone
  Bruce> has a better solution, please send it!  Thanks ahead.


I used to probe the display to get what is effectively a maximised
emacs, on start up. I stopped doing this because probing in this way
misses things like the Gnome toolbar (which I still want to be
visible). 

In recent years I've just gone onto setting it by hand. 

Cheers

Phil

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

* Re: desktop height?
  2003-01-28 14:27 ` Phillip Lord
@ 2003-01-28 18:32   ` Bruce Ingalls
  2003-01-28 18:48     ` Phillip Lord
  2003-01-31  8:07     ` Lee Sau Dan
  0 siblings, 2 replies; 9+ messages in thread
From: Bruce Ingalls @ 2003-01-28 18:32 UTC (permalink / raw)


Phillip Lord wrote:
> "Bruce" == Bruce Ingalls <bingalls.NO_SPAM@fit-zones.com> writes:
> 
> 
>   Bruce> Does anyone know a way to calculate the height of the desktop
>   Bruce> in elisp?
...
> I used to probe the display to get what is effectively a maximised
> emacs, on start up. I stopped doing this because probing in this way
> misses things like the Gnome toolbar (which I still want to be
> visible). 
> 
> In recent years I've just gone onto setting it by hand. 

Send me your code!
I already use `ps` to check for gnome-panel, kicker, and others.
I'm not sure how to detect a menu at the top of Sawfish, but this has a
manual override.

I'm using this for the EMacro project, where the point of its ease of 
use, is to
make the computer do the work, instead of you.

The Unux philosophy is that you have to spend hours customzing, which makes
bosses nervous, because you've started the project, and they don't see 
you getting
any work done yet.

Another philosophy sets you up, and gets you going. Just don't change 
the settings
from the way they do business in Redmond.

The EMacro philosophy is to use those smart, easy wizards to set you up, 
then gets
out of the way, to tweak like a Unix hack, should that be necessary.

Hey 5.0 * 10^0 EMacro fans must be onto something!

Here's some X Window code, which works well, but doesn't help Mac nor w32:

(/ (- (x-display-pixel-height) 50) (frame-char-height))

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

* Re: desktop height?
  2003-01-28 18:32   ` Bruce Ingalls
@ 2003-01-28 18:48     ` Phillip Lord
  2003-01-28 21:09       ` Bruce Ingalls
  2003-01-31  8:07     ` Lee Sau Dan
  1 sibling, 1 reply; 9+ messages in thread
From: Phillip Lord @ 2003-01-28 18:48 UTC (permalink / raw)


>>>>> "Bruce" == Bruce Ingalls <bingalls@CUT-this-SPAM-BLOCK.fit-zones.com> writes:

  Bruce> Phillip Lord wrote:
  >> "Bruce" == Bruce Ingalls <bingalls.NO_SPAM@fit-zones.com> writes:
  Bruce> Does anyone know a way to calculate the height of the Bruce>
  >> desktop

  Bruce> in elisp?  ...  I used to probe the display to get what is
  Bruce> effectively a
  >> maximised emacs, on start up. I stopped doing this because
  >> probing in this way misses things like the Gnome toolbar (which I
  >> still want to be visible). In recent years I've just gone onto
  >> setting it by hand.


  Bruce> Send me your code! 

Well as I say, I set things up "by hand" now, so its not much use for
you. 

As I generally use only a few machines, I do this....


(add-to-list 'load-path "~/emacs/machine-config")
;;this is the config file loading function
(defun phil-load-config-for-machine(&optional suffix)
  "This function attempts to load machine specific configuration information. This
information should be placed in a lisp file called NAME-suffix.el
where NAME is the machine name, either fully qualified with the domain
name, or not. If `suffix' is not given it defaults to -config. The
variable `phil-display-is-local' will be set to true if the initial
frame is opening on a local machine"
  (interactive)
  (let* ((suf (if suffix
                  suffix
                "-config"))
         (machine-config-file-long
          (concat (system-name) suf))
         (machine-config-file-short
          (concat 
           (substring machine-config-file-long 0
                      (string-match "[.]" machine-config-file-long))
           suf)))
    ;; this part of the function is essentially a total guess. I hope
    ;; it will work but I shall have to play with it a little if it doesnt
    (setq phil-display-is-x (boundp 'x-display-name))
    (if phil-display-is-x
        (setq phil-display-is-local-x (equal x-display-name ":0"))
      (setq phil-display-is-local-x nil))
    ;; load a file named after this machine, using the fully qualified name in preference first. 
    (if (or (load machine-config-file-long 't)
            (load machine-config-file-short 't))
        ;;try the default config therefore
        (load "default-machine-config" 't))))


which loads a file based on the machine name, which just then sets the
size up by hand. It's less than perfect. In particular resizing the
main emacs frame, causes it to pop up on which ever viewport is
currently visible, so I normally have to move my emacs around to the
correct viewport after it's started. Fortunately as I use sawfish, I
can do this with a few key presses.


  Bruce> I already use `ps` to check for gnome-panel, kicker, and
  Bruce> others.  I'm not sure how to detect a menu at the top of
  Bruce> Sawfish, but this has a manual override.

Now this is a good idea. I shall have to have a look at your code. It
would probably have been too much effort to do for myself. 

I have briefly toyed with the idea of interacting with sawfish, from
within emacs, which might allow me to probe for the panel, and solve
the viewport issue. But this is probably more effort than its worth,
as getting values by hand when I use a new machine works well most of
the time. 

  Bruce> I'm using this for the EMacro project, where the point of its
  Bruce> ease of use, is to

I guessed as much!


  Bruce> The EMacro philosophy is to use those smart, easy wizards to
  Bruce> set you up, then gets

  Bruce> out of the way, to tweak like a Unix hack, should that be
  Bruce> necessary.

A good philosophy, I think.

 
Cheers

Phil

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

* Re: desktop height?
  2003-01-28 18:48     ` Phillip Lord
@ 2003-01-28 21:09       ` Bruce Ingalls
  0 siblings, 0 replies; 9+ messages in thread
From: Bruce Ingalls @ 2003-01-28 21:09 UTC (permalink / raw)


Phillip Lord wrote:
>   Bruce> Send me your code! 
> Well as I say, I set things up "by hand" now, so its not much use for
> you. 

OK. I sent you my new code, via gnu.emacs.sources, called
desktop-height-approx() or deskheight.el

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

* Re: desktop height?
  2003-01-28  6:47 desktop height? Bruce Ingalls
  2003-01-28 14:27 ` Phillip Lord
@ 2003-01-30 14:40 ` Chris McMahan
  2003-01-31  0:11   ` Bruce Ingalls
  1 sibling, 1 reply; 9+ messages in thread
From: Chris McMahan @ 2003-01-30 14:40 UTC (permalink / raw)


Bruce Ingalls <bingalls.NO_SPAM@fit-zones.com> writes:

> Does anyone know a way to calculate the height of the desktop in elisp?
> 
> I'd like Emacs to start up with maximum height.
> For that matter, I'd like XEmacs, and various OSes to work.
> 
> In Linux X Window, the following works reasonably well:
> 
> (/ (- (x-display-pixel-height) 50) (frame-char-height)))
> 
> I can get reasonably close with
> 
> (/ (x-display-pixel-height)
>   (* (/ (font-default-size-for-device) 2) 3))
> 
> which works in w32 XEmacs as
> 
> (/ (x-display-pixel-height)
>   (* (/ (string-to-number (font-default-size-for-device)) 2) 3))
> 
> or w32 Emacs as
> 
> (/ (x-display-pixel-height) 18)
> 
> I'd also like to hear of testing on other OSes.
> If someone has a better solution, please send it!
> Thanks ahead.
> 

Sorry about the length of this post. I recently rewrote these
functions, and thought I would share them within the context of this
thread :)

I've got the following code with sets the initial height based on the
current screen's resolution (working under WindowsXP with Emacs 21.2).
This assumes the font (defined in my .emacs as MY_FONT) is already
set. This is necessary to correctly return the frame-char-height.

  ;;;------------------------------------------------------------
  ;;; initial window position settings, height and vertical position is
  ;;; automatically calculated from within the .emacs-config file 
  ;;; The top left corner is 0 0, the bottom right is -1 -1
  (defconst MY_INITIAL_WIDTH   120)
  (defconst MY_INITIAL_LEFT   -15)
  
  ;; set an adjustment to account for window manager frames and title
  ;; bar when calculating the window height. This accounts for the
  ;; menubar as well
  (defconst MY_HEIGHT_ADJUST
    (if (not menu-bar-mode)
    	(setq MY_HEIGHT_ADJUST 30)
      (setq MY_HEIGHT_ADJUST 50))
    "Arbitrary adjustment factor to account for window managers and
    menubar")
  
  ;; use the screen resolution, font height, and whether or not
  ;; there's a menubar to calculate the height and center the frame
  (defconst MY_INITIAL_HEIGHT
    (/ (- (x-display-pixel-height) MY_HEIGHT_ADJUST)
       (frame-char-height))
    "Calculate the initial height of the frame based on the screen
    resolution and character height")
  
  ;;; set the height of the frame so the top can then be calculated to
  ;;; center it
  (set-frame-height (selected-frame) MY_INITIAL_HEIGHT)
  
  ;;; calculate the top to center the frame
  (defconst MY_INITIAL_TOP
    (/ (- (x-display-pixel-height)
    	  (+ (frame-pixel-height) MY_HEIGHT_ADJUST)) 2)
    "Calculate the initial top of the frame based on the screen
    resolution and character height")
  
  ;;; now that the initial frame info is known, set the size and
  ;;; position for subsequent windows
  (defconst MY_DEFAULT_HEIGHT (- MY_INITIAL_HEIGHT 15))
  (defconst MY_DEFAULT_TOP    (+ MY_INITIAL_TOP 45))
  (defconst MY_DEFAULT_LEFT   (- MY_INITIAL_LEFT 150))
  (defconst MY_DEFAULT_WIDTH   MY_INITIAL_WIDTH)
  
    ;;; Set the font and frame size for the initial frame.
    (progn
      (setq initial-frame-alist
            `(
              (top . ,MY_INITIAL_TOP)
              (left . ,MY_INITIAL_LEFT)
              (width . ,MY_INITIAL_WIDTH)
              (height . ,MY_INITIAL_HEIGHT)
              (internal-border-width . 1)
              (cursor-type . t)
              (font . ,MY_FONT)
              )
            )
  
    ;;; Set the default font and frame size
      (setq default-frame-alist
            `(
              (top . ,MY_DEFAULT_TOP)
              (left . ,MY_DEFAULT_LEFT)
              (width . ,MY_DEFAULT_WIDTH)
              (height . ,MY_DEFAULT_HEIGHT)
              (internal-border-width . 1)
              (cursor-type . t)
              (font . ,MY_FONT)
              )
            )
      ))

  ;;;------------------------------------------------------------


Here's some macros I also have to adjust the frame when a new font is
selected, to enlarge the frame to fill most of the current screen, and
to return the frame back to its initial settings:


;;;======================================================================
;;; frame sizing functions
;;;======================================================================

;;;==============================
(defun enlarge-frame ()
  "Enlarge the selected frame to fill a sizeable portion of the screen,
based on the current screen resolution"
  (interactive)

  ;; Set the frame size
  ;; set the new width, with a little space on the sides
  (setq lframe-width
		(- (/ (x-display-pixel-width) (frame-char-width)) 10))
  
  ;; set the new height, allowing for title bars (8)
  (setq lframe-height
		(/ (- (x-display-pixel-height) MY_HEIGHT_ADJUST)
		   (frame-char-height)))

  ;; apply to the selected frame
  (set-frame-size (selected-frame)
				  lframe-width
				  lframe-height)

  ;; center the new frame horizontally and vertically
  ;; set the left position, centering the frame and allowing for frame edges (10)
  (setq lframe-left
		(/ (- (x-display-pixel-width)
			  (+ (frame-pixel-width) 10)) 2))

  ;; set the top position, centering the frame and allowing for title bars (50)
  (setq lframe-top 
	(/ (- (x-display-pixel-height)
		  (+ (frame-pixel-height) MY_HEIGHT_ADJUST)) 2))

  ;; now apply the changes
  (set-frame-position (selected-frame)
					  lframe-left
					  lframe-top)
  )

;;;==============================
(defun adjust-frame ()
  "Adjust the selected frame based to the user's initial width, but
adjust the height based on the current screen resolution"

  (interactive)
  ;; set the width and height
  (set-frame-size
    (selected-frame)
	MY_INITIAL_WIDTH
	(/ (- (x-display-pixel-height) MY_HEIGHT_ADJUST)
	   (frame-char-height)))

  ;; set the frame position
  (set-frame-position
    (selected-frame)
    MY_INITIAL_LEFT
	;; need to account for the title bar and menu when centering
	;; vertically
	(/ (- (x-display-pixel-height)
		  (+ (frame-pixel-height) MY_HEIGHT_ADJUST)) 2))
  )

;;;==============================
(defun fix-frame ()
  "Restore the frame back to the initial height, width and position as
set up in the .emacs

uses the global variables:
   MY_INITIAL_WIDTH
   MY_INITIAL_HEIGHT
   MY_INITIAL_LEFT
   MY_INITIAL_RIGHT

defined in the .emacs file"
  (interactive)
  (set-frame-size (selected-frame) MY_INITIAL_WIDTH MY_INITIAL_HEIGHT)
  (set-frame-position (selected-frame) MY_INITIAL_LEFT MY_INITIAL_TOP)
  )





-- 
     (.   .)
  =ooO=(_)=Ooo========================
  Chris McMahan | cmcmahan-AT-one.net
  ====================================

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

* Re: desktop height?
  2003-01-30 14:40 ` Chris McMahan
@ 2003-01-31  0:11   ` Bruce Ingalls
  2003-01-31 13:48     ` Chris McMahan
  0 siblings, 1 reply; 9+ messages in thread
From: Bruce Ingalls @ 2003-01-31  0:11 UTC (permalink / raw)


Chris McMahan wrote:
> Bruce Ingalls <bingalls.NO_SPAM@fit-zones.com> writes:
>>Does anyone know a way to calculate the height of the desktop in elisp?
...
> I've got the following code with sets the initial height based on the
> current screen's resolution (working under WindowsXP with Emacs 21.2).
> This assumes the font (defined in my .emacs as MY_FONT) is already
> set. This is necessary to correctly return the frame-char-height.
Would be nice to see the syntax to set MY_FONT

...> ;;; frame sizing functions
...> (defun fix-frame ()
...
Very nice. Worked on my Linux box, which makes me believe that your code is
more portable. I did need to adjust it for the 
tray/panel/taskbar/statusbar, as
you indicated.

Consider renaming your functions, so that you can more easily remember them
with sentence completion, and so that they better fit a name space.
Instead of fix-frame, etc. try:
frame-adjust
frame-fix
frame-enlarge

While your code worked perfectly for Emacs, I had to adjust XEmacs. I 
also do this
(already) in desktop-height-approx().

I'd like to hear from the community, as to which code works better for them.
I remind users to adjust for their XEmacs & taskbars, when using your 
code, before
making judgement.

One last tradeoff with your code: the use of set-frame-height() is nice, 
in that it
can change an already running Emacs, but, as opposed to 
frame-initial-frame-plist()
or  setq default-frame-plist(), it appears to be capable to screw up an 
emacs -nw
and perhaps other console modes of Emacs/XEmacs.

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

* Re: desktop height?
  2003-01-28 18:32   ` Bruce Ingalls
  2003-01-28 18:48     ` Phillip Lord
@ 2003-01-31  8:07     ` Lee Sau Dan
  1 sibling, 0 replies; 9+ messages in thread
From: Lee Sau Dan @ 2003-01-31  8:07 UTC (permalink / raw)


>>>>> "Bruce" == Bruce Ingalls <bingalls@CUT-this-SPAM-BLOCK.fit-zones.com> writes:

    Bruce> The Unux philosophy is that you have to spend hours
    Bruce> customzing, which makes bosses nervous, because you've
    Bruce> started the project, and they don't see you getting any
    Bruce> work done yet.

You should teach such bosses a Chinese proverb:

        To do  job(s) well, polish the  tool(s) first.

(I put  (s) here because Chinese doesn't  distinguish between singular
and plural.)



-- 
Lee Sau Dan                     李守敦(Big5)                    ~{@nJX6X~}(HZ) 

E-mail: danlee@informatik.uni-freiburg.de
Home page: http://www.informatik.uni-freiburg.de/~danlee

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

* Re: desktop height?
  2003-01-31  0:11   ` Bruce Ingalls
@ 2003-01-31 13:48     ` Chris McMahan
  0 siblings, 0 replies; 9+ messages in thread
From: Chris McMahan @ 2003-01-31 13:48 UTC (permalink / raw)


Thanks! Your suggestion on the name changes is excellent. I'll make
that change here as well.

As for setting MY_FONT, here's the code (with some more context around it):
;;;===================================================
;;; Set the default font and frame size for all frames
;;;===================================================
(defconst MY_FONT "-*-Lucida Console-normal-r-*-*-11-*-*-*-c-*-iso8859-15")

;;; Set the default font to return the appropriate character height
;;; for the initial height calculation
(set-frame-font MY_FONT)

;;; initial window position settings, height and vertical position is
;;; automatically calculated from within the .emacs-config file 
;;; The top left corner is 0 0, the bottom right is -1 -1
(defconst MY_INITIAL_WIDTH   120)
(defconst MY_INITIAL_LEFT   -15)


The reason I do it with the consts is that I place all of the settings
(email, proxy, directory locations and such) within my .emacs file,
then call a .emacs-config file from there to do the actual
configurations based on the settings.

 - Chris

Bruce Ingalls <bingalls@CUT-this-SPAM-BLOCK.fit-zones.com> writes:

> Chris McMahan wrote:
> > Bruce Ingalls <bingalls.NO_SPAM@fit-zones.com> writes:
> >>Does anyone know a way to calculate the height of the desktop in elisp?
> ...
> > I've got the following code with sets the initial height based on the
> > current screen's resolution (working under WindowsXP with Emacs 21.2).
> > This assumes the font (defined in my .emacs as MY_FONT) is already
> > set. This is necessary to correctly return the frame-char-height.
> Would be nice to see the syntax to set MY_FONT
> 
> ...> ;;; frame sizing functions
> ...> (defun fix-frame ()
> ...
> Very nice. Worked on my Linux box, which makes me believe that your code is
> more portable. I did need to adjust it for the
> tray/panel/taskbar/statusbar, as
> 
> you indicated.
> 
> Consider renaming your functions, so that you can more easily remember them
> with sentence completion, and so that they better fit a name space.
> Instead of fix-frame, etc. try:
> frame-adjust
> frame-fix
> frame-enlarge
> 
> While your code worked perfectly for Emacs, I had to adjust XEmacs. I
> also do this
> 
> (already) in desktop-height-approx().
> 
> I'd like to hear from the community, as to which code works better for them.
> I remind users to adjust for their XEmacs & taskbars, when using your
> code, before
> 
> making judgement.
> 
> One last tradeoff with your code: the use of set-frame-height() is
> nice, in that it
> 
> can change an already running Emacs, but, as opposed to
> frame-initial-frame-plist()
> 
> or setq default-frame-plist(), it appears to be capable to screw up an
> emacs -nw
> 
> and perhaps other console modes of Emacs/XEmacs.
> 

-- 
     (.   .)
  =ooO=(_)=Ooo========================
  Chris McMahan | cmcmahan-AT-one.net
  ====================================

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

end of thread, other threads:[~2003-01-31 13:48 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-01-28  6:47 desktop height? Bruce Ingalls
2003-01-28 14:27 ` Phillip Lord
2003-01-28 18:32   ` Bruce Ingalls
2003-01-28 18:48     ` Phillip Lord
2003-01-28 21:09       ` Bruce Ingalls
2003-01-31  8:07     ` Lee Sau Dan
2003-01-30 14:40 ` Chris McMahan
2003-01-31  0:11   ` Bruce Ingalls
2003-01-31 13:48     ` Chris McMahan

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).