src/clfswm-util.lisp (copy-focus-window, cut-focus-window): New functions and ask...
[clfswm.git] / src / clfswm-corner.lisp
blob9ec9ca15668d313a5090acfc65b31ae5fb87525f
1 ;;; --------------------------------------------------------------------------
2 ;;; CLFSWM - FullScreen Window Manager
3 ;;;
4 ;;; --------------------------------------------------------------------------
5 ;;; Documentation: Corner functions
6 ;;; --------------------------------------------------------------------------
7 ;;;
8 ;;; (C) 2011 Philippe Brochard <hocwp@free.fr>
9 ;;;
10 ;;; This program is free software; you can redistribute it and/or modify
11 ;;; it under the terms of the GNU General Public License as published by
12 ;;; the Free Software Foundation; either version 3 of the License, or
13 ;;; (at your option) any later version.
14 ;;;
15 ;;; This program is distributed in the hope that it will be useful,
16 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;;; GNU General Public License for more details.
19 ;;;
20 ;;; You should have received a copy of the GNU General Public License
21 ;;; along with this program; if not, write to the Free Software
22 ;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 ;;;
24 ;;; --------------------------------------------------------------------------
26 (in-package :clfswm)
30 (symbol-macrolet ((sw (xlib:screen-width *screen*))
31 (sh (xlib:screen-height *screen*))
32 (cs *corner-size*))
33 (defun in-corner (corner x y)
34 "Return t if (x, y) is in corner.
35 Corner is one of :bottom-right :bottom-left :top-right :top-left"
36 (multiple-value-bind (xmin ymin xmax ymax)
37 (case corner
38 (:bottom-right (values (- sw cs) (- sh cs) sw sh))
39 (:bottom-left (values 0 (- sh cs) cs sh))
40 (:top-left (values 0 0 cs cs))
41 (:top-right (values (- sw cs) 0 sw cs))
42 (t (values 10 10 0 0)))
43 (and (<= xmin x xmax)
44 (<= ymin y ymax)))))
47 (symbol-macrolet ((sw (xlib:screen-width *screen*))
48 (sh (xlib:screen-height *screen*))
49 (cs *corner-size*))
50 (defun find-corner (x y)
51 (cond ((and (< cs x (- sw cs)) (< cs y (- sh cs))) nil)
52 ((and (<= 0 x cs) (<= 0 y cs)) :top-left)
53 ((and (<= (- sw cs) x sw) (<= 0 y cs)) :top-right)
54 ((and (<= 0 x cs) (<= (- sh cs) y sh)) :bottom-left)
55 ((and (<= (- sw cs) x sw) (<= (- sh cs) y sh)) :bottom-right)
56 (t nil))))
61 (defun do-corner-action (x y corner-list)
62 "Do the action associated with corner. The corner function must return T to
63 stop the button event"
64 (when (frame-p *current-root*)
65 (let ((corner (find-corner x y)))
66 (when corner
67 (let ((fun (second (assoc corner corner-list))))
68 (when fun
69 (funcall fun)))))))
75 ;;;***************************************;;;
76 ;;; CONFIG - Corner actions definitions: ;;;
77 ;;;***************************************;;;
78 (defun find-window-in-query-tree (target-win)
79 (dolist (win (xlib:query-tree *root*))
80 (when (child-equal-p win target-win)
81 (return t))))
83 (defun wait-window-in-query-tree (wait-test)
84 (loop
85 (dolist (win (xlib:query-tree *root*))
86 (when (funcall wait-test win)
87 (return-from wait-window-in-query-tree win)))))
90 (defun generic-present-body (cmd wait-test win &optional focus-p)
91 (stop-button-event)
92 (unless (find-window-in-query-tree win)
93 (do-shell cmd)
94 (setf win (wait-window-in-query-tree wait-test))
95 (grab-all-buttons win)
96 (hide-window win))
97 (cond ((window-hidden-p win)
98 (unhide-window win)
99 (when focus-p
100 (focus-window win))
101 (raise-window win))
102 (t (hide-window win)
103 (show-all-children)))
104 win)
108 (let (win)
109 (defun close-virtual-keyboard ()
110 (when win
111 (xlib:destroy-window win)
112 (xlib:display-finish-output *display*)
113 (setf win nil)))
114 (defun present-virtual-keyboard ()
115 "Present a virtual keyboard"
116 (setf win (generic-present-body *virtual-keyboard-cmd*
117 (lambda (win)
118 (string-equal (xlib:get-wm-class win) "xvkbd"))
119 win))
123 (let (win)
124 (defun equal-clfswm-terminal (window)
125 (when win
126 (xlib:window-equal window win)))
127 (defun close-clfswm-terminal ()
128 (when win
129 (xlib:destroy-window win)
130 (xlib:display-finish-output *display*)
131 (setf win nil)))
132 (defun present-clfswm-terminal ()
133 "Hide/Unhide a terminal"
134 (setf win (generic-present-body *clfswm-terminal-cmd*
135 (lambda (win)
136 (string-equal (xlib:wm-name win) *clfswm-terminal-name*))