help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Toggle fullscreen with one key


From: Pascal Bourguignon
Subject: Re: Toggle fullscreen with one key
Date: 18 Mar 2005 02:08:02 +0100
User-agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3

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


reply via email to

[Prev in Thread] Current Thread [Next in Thread]