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
next prev 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.