stumpwm-devel
[Top][All Lists]
Advanced

[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))

reply via email to

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