all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Pascal Bourguignon <spam@mouse-potato.com>
Subject: Re: Toggle fullscreen with one key
Date: 18 Mar 2005 02:08:02 +0100	[thread overview]
Message-ID: <874qf9g3rh.fsf@thalassa.informatimago.com> (raw)
In-Reply-To: MPG.1ca43861f435e0c5989681@news1.comhem.se

Johan Josefsson <johan.mailinglists@gmail.com> writes:

> I am currently using two keys (f2 and C-f2) and two functions for 
> maximizing and restoring the frame in win32:
> 
> --- functions
> 
> (defun my-frame-maximize () "Maximize Emacs window in win32" 
> (interactive) 
> (w32-send-sys-command ?\xf030))
> 
> (defun my-frame-restore () "Restore Emacs window in win32" 
> (interactive) 
> (w32-send-sys-command ?\xF120))
> 
> --- keys
> 
> (global-set-key [f2] 'my-frame-maximize) ; Maximize Emacs window
> (global-set-key [C-f2] 'my-frame-restore) ; Restore Emacs window
> 
> ---
> 
> It works as intended, but I wonder, is there any simple way to replace 
> these two keys with a function that use only one key (f2) to toggle 
> between these two states?

;; Of course. 

(global-set-key [f2] (function toggle-maximize-frame))


;;  You speak about state, so:

(defvar *frame-maximized-states* (make-hash-table)
  "Maps frames to their maximized state: When not maximized = nil; 
                                         when maximized = ((x y) w h)")

;; assuming each frame has its own state.
;; The following is to clean up the entry in the hash table when the 
;; frame is deleted:

(add-hook 'delete-frame-hook
          (lambda (frame) (setf (gethash frame *frame-maximized-states*) nil)))

;; Now let's toggle:

(defun toggle-maximize-frame ()
  (interactive)
  (let* ((frame (selected-frame))
         (state (gethash frame *frame-maximized-states*)))
    (if state
      (progn
        (apply (function set-frame-position) frame (first state))
        (set-frame-width  frame (second state))
        (set-frame-height frame (third state))
        (setf state nil))
      (let ((fp (frame-parameters nil)))
        (setf state (list (list (cdr (assoc 'left fp))
                                (cdr (assoc 'top fp)))
                          (cdr (assoc 'width fp))
                          (cdr (assoc 'height fp))))
        (set-frame-width  frame (max-frame-column-number frame 34))
        ;; I don't know where these 34 go?
        (set-frame-height frame (max-frame-line-number   frame))
        (set-frame-position frame 0 0)))
    (setf (gethash frame *frame-maximized-states*) state)))



;; Using the following auxiliary functions.  I have them for X, you'll
;; have to adapt them for Microsoft Windows, or edit toggle-maximize-frame
;; to use your Microsoft Windows specific functions.


(defvar *window-manager-y-offset* (+ 20 11)
  "The number of vertical pixels eaten by the window manager
   (window title, grow bar).")

(defvar *window-manager-x-offset* 2
  "The number of vertical pixels eaten by the window manager.")


(defun font-canonical-to-pixel (canon &optional device)
  (let ((pix-width (float (or (device-pixel-width device) 1024)))
        (mm-width (float (or (device-mm-width device) 293))))
    (/ canon (/ pix-width mm-width) (/ 25.4 72.0))))


(defun get-font-size-in-pixel (font &optional device)
  "
RETURN: The font height in pixel.
"
  (let ((fs (font-size (font-create-object font))))
    (if (numberp fs) 
      fs
      (font-canonical-to-pixel
       (font-spatial-to-canonical fs device) device))));;get-font-size-in-pixel


(defun max-frame-line-number (&optional frame)
  "
RETURN: The maximum number of line that can be displayed on this frame
        inside this screen.
"
  (truncate
   (/ (- (x-display-pixel-height frame) *window-manager-y-offset*)
      (frame-char-height frame))))


(defun max-frame-column-number (&optional frame margin)
  "
MARGIN: Number of pixel to substract from the display width.
RETURN: The maximum number of columns that can be displayed on this frame
        inside this screen.
"
  (setf margin (or margin 0))
  (truncate
   (/ (- (x-display-pixel-width frame) margin *window-manager-x-offset*)
      (frame-char-width frame))))


-- 
__Pascal Bourguignon__                     http://www.informatimago.com/
Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we. -- Georges W. Bush

  parent reply	other threads:[~2005-03-18  1:08 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-03-17 23:56 Toggle fullscreen with one key Johan Josefsson
2005-03-18  0:57 ` Drew Adams
2005-03-18  1:08 ` Pascal Bourguignon [this message]
2005-03-18 12:11 ` Mathias Dahl
2005-03-19  0:30 ` rgb

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=874qf9g3rh.fsf@thalassa.informatimago.com \
    --to=spam@mouse-potato.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.