stumpwm-devel
[Top][All Lists]
Advanced

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

[STUMP] Real fullscreen and centering windows.


From: Philippe Brochard
Subject: [STUMP] Real fullscreen and centering windows.
Date: Mon, 13 Mar 2006 18:16:52 +0100
User-agent: Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux)

Hi everybody,

Here is a few patch to have windows that doesn't fill all the frame
automaticaly centered :

in core.lisp I have add this in maximize-window :

-- core.lisp ---------------------------------------------------------
(defun maximize-window (win)
  "Maximize the window."
  ...
      ;; readjust the window to center if it doesn't fill all the frame
      (setf (xlib:drawable-x win) (truncate (+ x (/ (- width 
(xlib:drawable-width win)) 2)))
            (xlib:drawable-y win) (truncate (+ y (/ (- height 
(xlib:drawable-height win)) 2))))
      (xlib:display-force-output *display*))))
----------------------------------------------------------------------

I have also improved the previous code to maximize a frame. Now the
background is filled to hide windows below the current window:

-- ~/.stumpwmrc ------------------------------------------------------
;;; Maximizing/minimizing current frame
;;;
;;; Add this in user.lisp: choose-frame-by-number, remove-split
;;;                        horiz-split-frame, vert-split-frame
;;;   (minimize-frame screen)

(defvar *maximized-frame-size* (make-frame :x 0 :y 0 :width 1024 :height 768))
;;; For a dual screen.
;;(defvar *maximized-frame-size* (make-frame :x 1024 :y 0 :width 1024 :height 
768))
(defvar *current-frame-size* (make-frame :x 0 :y 0 :width 0 :height 0))
(defvar *current-maximized-frame* nil)
(defvar *background-win* nil)
(defvar *background-win-color* nil)

(defun draw-background-win (screen)
  (delete-background-win)
  (let* ((focused-win (xlib:input-focus *display*))
         (win (xlib:create-window :parent (xlib:screen-root (screen-number 
screen))
                                  :x (frame-x *maximized-frame-size*)
                                  :y (frame-y *maximized-frame-size*)
                                  :width (frame-width *maximized-frame-size*)
                                  :height (frame-height *maximized-frame-size*)
                                  :background (or *background-win-color*
                                                  (xlib:screen-black-pixel 
(screen-number screen)))
                                  :border (or *background-win-color*
                                              (xlib:screen-black-pixel 
(screen-number screen)))
                                  :border-width 1
                                  :event-mask '())))
    (xlib:map-window win)
    (setf (xlib:window-priority win) :above)
    (setf (xlib:window-priority focused-win) :above)
    (setf *background-win* win)
    (xlib:display-force-output *display*)))

(defun delete-background-win ()
  (when *background-win*
    (xlib:destroy-window *background-win*)
    (setf *background-win* nil)))


(defun maximize-frame (screen frame)
  (when *current-maximized-frame*
    (minimize-frame screen))
  (setf (frame-x *current-frame-size*) (frame-x frame)
        (frame-y *current-frame-size*) (frame-y frame)
        (frame-width *current-frame-size*) (frame-width frame)
        (frame-height *current-frame-size*) (frame-height frame))
  (setf *current-maximized-frame* frame)
  (setf (frame-x frame) (frame-x *maximized-frame-size*)
        (frame-y frame) (frame-y *maximized-frame-size*)
        (frame-width frame) (frame-width *maximized-frame-size*)
        (frame-height frame) (frame-height *maximized-frame-size*))
  (sync-frame-windows screen frame)
  (focus-frame screen frame)
  (draw-background-win screen))

(defun minimize-frame (screen)
  (when *current-maximized-frame*
    (setf (frame-x *current-maximized-frame*) (frame-x *current-frame-size*)
          (frame-y *current-maximized-frame*) (frame-y *current-frame-size*)
          (frame-width *current-maximized-frame*) (frame-width 
*current-frame-size*)
          (frame-height *current-maximized-frame*) (frame-height 
*current-frame-size*))
    (sync-frame-windows screen *current-maximized-frame*)
    (setf *current-maximized-frame* nil)
    (delete-background-win)
    (focus-frame screen (screen-current-frame screen))))

(defun toggle-minmax-frame (screen frame)
  (if *current-maximized-frame*
      (minimize-frame screen)
      (maximize-frame screen frame)))


(define-stumpwm-command "max" (screen)
  (maximize-frame screen (screen-current-frame screen)))

(define-stumpwm-command "min" (screen)
  (minimize-frame screen))

(define-stumpwm-command "toggle" (screen)
  (toggle-minmax-frame screen (screen-current-frame screen)))

(define-stumpwm-command "bdb" (screen)
  (setf (xlib:window-border (xlib:input-focus *display*))
        (xlib:screen-black-pixel (screen-number screen))
        *background-win-color* (xlib:screen-black-pixel (screen-number 
screen))))

(define-stumpwm-command "bdw" (screen)
  (setf (xlib:window-border (xlib:input-focus *display*))
        (xlib:screen-white-pixel (screen-number screen))
        *background-win-color* (xlib:screen-white-pixel (screen-number 
screen))))

(add-hook *focus-window-hook*
          #'(lambda (win)
              (when *current-maximized-frame*
                (draw-background-win (window-screen win)))))
----------------------------------------------------------------------

I have also add two function to sets the border color
  bdb -> border black
  bdw -> border white


With all this code, all windows are centered in the frame event if
they doesn't fill it and you have a real fullscreen.

I hope that can be useful.

Regards,

Philippe

-- 
Philippe Brochard    <address@hidden>
                      http://hocwp.free.fr

-=-= http://www.gnu.org/home.fr.html =-=-




reply via email to

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