[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [STUMP] Mouse mode first shoot
From: |
Philippe Brochard |
Subject: |
Re: [STUMP] Mouse mode first shoot |
Date: |
Mon, 20 Mar 2006 23:09:05 +0100 |
User-agent: |
Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux) |
Philippe Brochard a écrit :
> Hi everyboy,
>
> Here is a first shoot for the mouse mode :)
>
[...]
> I haven't try this a lot, so maybe I'll rebind the default binding.
>
After some use, I've changed a little the default binding:
button 1: leave mouse mode
button 2: leave mouse mode and maximize
button 3: select or move window
button 4: wheel prev window
button 5: wheel next window
button S-3: mouse h split
button A-3: mouse v split
button C-3: mouse remove split
button C-S-3: mouse h split width
button C-A-3: mouse v split height
I have add two functions: mouse-h-split-width and mouse-v-split-height
to cut a frame according to the cursor location.
(this is a mouse equivalent to horiz/vert-split-prop-frame)
And I have add an outline function for frames. A screenshot is here:
http://hocwp.free.fr/stumpwm/stumpwm.png
[...]
The diff is attached with this mail and mouse.lisp can be found here
http://hocwp.free.fr/stumpwm/mouse.lisp
I plan to make a stumpwm page on my web site so my stumpwmrc can be
found in the same directory.
Regards,
Philippe
--
Philippe Brochard <address@hidden>
http://hocwp.free.fr
-=-= http://www.gnu.org/home.fr.html =-=-
--- mouse-old.lisp 2006-03-20 22:31:09.000000000 +0100
+++ local/stumpwm/mouse.lisp 2006-03-20 22:36:43.000000000 +0100
@@ -6,9 +6,10 @@
;;; interactive-command way.
(defvar *current-mouse-event* nil)
-(defvar *ignore-next-mouse-event* nil)
+;;; Set to t to ignore double mouse wheel events
+(defvar *ignore-next-mouse-event* t)
-(defvar *frame-number-wins* nil)
+(defvar *current-selected-window* nil)
;;; Little helpers
(defun define-mouse (map button command)
@@ -22,13 +23,15 @@
(defparameter *mouse-map*
(let ((m (make-sparse-keymap)))
(define-mouse m (button "1") "leave-mouse-mode")
- (define-mouse m (button "3") "leave-mouse-mode-and-maximize")
- (define-mouse m (button "C-1") "select-or-move-window")
+ (define-mouse m (button "2") "leave-mouse-mode-and-maximize")
+ (define-mouse m (button "3") "select-or-move-window")
(define-mouse m (button "4") "wheel-prev-window")
(define-mouse m (button "5") "wheel-next-window")
- (define-mouse m (button "S-2") "mouse-h-split")
- (define-mouse m (button "A-2") "mouse-v-split")
- (define-mouse m (button "C-2") "mouse-remove-split")
+ (define-mouse m (button "S-3") "mouse-h-split")
+ (define-mouse m (button "A-3") "mouse-v-split")
+ (define-mouse m (button "C-3") "mouse-remove-split")
+ (define-mouse m (button "C-S-3") "mouse-h-split-width")
+ (define-mouse m (button "C-A-3") "mouse-v-split-height")
m))
(define-key *root-map* (kbd "x") "mouse-mode")
@@ -38,14 +41,17 @@
(mouse-mode screen))
-;;; If command return t we leave mouse-mode, else we stay in it
+;;; If command return nil we stay in mouse-mode, else we leave it
(define-stumpwm-command "leave-mouse-mode" (screen)
- (focus-frame screen (find-frame-under-cursor screen *current-mouse-event*))
+ (let ((frame (find-frame-under-cursor screen *current-mouse-event*)))
+ (focus-frame screen frame)
+ (frame-raise-window screen frame (first (frame-windows screen frame))))
t)
(define-stumpwm-command "leave-mouse-mode-and-maximize" (screen)
(let ((frame (find-frame-under-cursor screen *current-mouse-event*)))
(focus-frame screen frame)
+ (frame-raise-window screen frame (first (frame-windows screen frame)))
(maximize-frame screen frame))
t)
@@ -70,18 +76,18 @@
;; First clic: select the window under the pointer
;; Second clic: move the selected window in frame under the pointer
-(let ((current-window nil))
- (define-stumpwm-command "select-or-move-window" (screen)
- (let ((frame (find-frame-under-cursor screen *current-mouse-event*)))
- (if current-window
- (progn
- (setf (window-frame screen current-window) frame)
- (sync-frame-windows screen frame)
- (frame-raise-window screen frame current-window)
- (setf current-window nil))
- (setf current-window (first (frame-windows screen frame)))))
- (display-frame-numbers screen)
- nil))
+(define-stumpwm-command "select-or-move-window" (screen)
+ (let ((frame (find-frame-under-cursor screen *current-mouse-event*)))
+ (if *current-selected-window*
+ (progn
+ (setf (window-frame screen *current-selected-window*) frame)
+ (sync-frame-windows screen frame)
+ (frame-raise-window screen frame *current-selected-window*)
+ (focus-window *current-selected-window*)
+ (setf *current-selected-window* nil)
+ (display-frame-numbers screen))
+ (setf *current-selected-window* (first (frame-windows screen frame)))))
+ nil)
@@ -106,6 +112,74 @@
+
+
+
+
+(defun split-frame-h-width (screen p width-1)
+ "Return 2 new frames. The first one stealing P's number and window"
+ (let* ((w1 width-1)
+ (w2 (- (frame-width p) width-1))
+ (h (frame-height p))
+ (f1 (make-frame :number (frame-number p)
+ :x (frame-x p)
+ :y (frame-y p)
+ :width w1
+ :height h
+ :window (frame-window p)))
+ (f2 (make-frame :number (find-free-frame-number screen)
+ :x (+ (frame-x p) w1)
+ :y (frame-y p)
+ :width w2
+ :height h
+ :window nil)))
+ (values f1 f2)))
+
+(define-stumpwm-command "mouse-h-split-width" (screen)
+ (let ((frame (find-frame-under-cursor screen *current-mouse-event*)))
+ (focus-frame screen frame)
+ (split-frame screen (lambda (f)
+ (split-frame-h-width screen f
+ (- (mouse-event-root-x
*current-mouse-event*)
+ (frame-x frame))))))
+ (display-frame-numbers screen)
+ nil)
+
+
+
+(defun split-frame-v-height (screen p height-1)
+ "Return 2 new frames. The first one stealing P's number and window"
+ (let* ((h1 height-1)
+ (h2 (- (frame-height p) height-1))
+ (w (frame-width p))
+ (f1 (make-frame :number (frame-number p)
+ :x (frame-x p)
+ :y (frame-y p)
+ :width w
+ :height h1
+ :window (frame-window p)))
+ (f2 (make-frame :number (find-free-frame-number screen)
+ :x (frame-x p)
+ :y (+ (frame-y p) h1)
+ :width w
+ :height h2
+ :window nil)))
+ (values f1 f2)))
+
+
+(define-stumpwm-command "mouse-v-split-height" (screen)
+ (let ((frame (find-frame-under-cursor screen *current-mouse-event*)))
+ (focus-frame screen frame)
+ (split-frame screen (lambda (f)
+ (split-frame-v-height screen f
+ (- (mouse-event-root-y
*current-mouse-event*)
+ (frame-y frame))))))
+ (display-frame-numbers screen)
+ nil)
+
+
+
+
;;; Main code begin here
@@ -186,19 +260,36 @@
(setf *current-mouse-event* nil)))))
-(defun display-frame-numbers (screen)
- (hide-frame-numbers)
- (setf *frame-number-wins* (draw-frame-numbers screen)))
-
-(defun hide-frame-numbers ()
- (mapc #'xlib:destroy-window *frame-number-wins*)
- (setf *frame-number-wins* nil))
+
+(let ((frame-number-wins nil))
+ (defun display-frame-numbers (screen)
+ (hide-frame-numbers screen)
+ (setf frame-number-wins (draw-frame-numbers screen))
+ (let ((gc (xlib:create-gcontext :drawable (xlib:screen-root (screen-number
screen))
+ :font (screen-font screen)
+ :foreground
+ (xlib:screen-white-pixel (screen-number
screen))
+ :background
+ (xlib:screen-black-pixel (screen-number
screen))
+ :line-style :dash)))
+ (mapc (lambda (f)
+ (xlib:draw-line (xlib:screen-root (screen-number screen)) gc
+ (frame-x f) (frame-y f) (frame-width f) 0 t)
+ (xlib:draw-line (xlib:screen-root (screen-number screen)) gc
+ (frame-x f) (frame-y f) 0 (frame-height f) t))
+ (screen-frames screen))))
+
+ (defun hide-frame-numbers (screen)
+ (mapc #'xlib:destroy-window frame-number-wins)
+ (xlib:clear-area (xlib:screen-root (screen-number screen)))
+ (setf frame-number-wins nil)))
(defun mouse-mode (screen)
+ (setf *current-selected-window* nil)
(minimize-frame screen)
(mouse-grab-pointer screen)
(display-frame-numbers screen)
(do ((ret (read-mouse) (read-mouse)))
((analyse-mouse-event screen ret)))
- (hide-frame-numbers)
+ (hide-frame-numbers screen)
(ungrab-pointer))