3 ;;; CLFSWM configuration file example
5 ;;; Send me your configuration file at pbrochard _at_ common-lisp -dot- net
6 ;;; if you want to share it with others.
12 ;;;; Uncomment the line above if you need default modifiers (or not)
18 ;;;; Uncomment the line above if you want to enable the notify event compression.
19 ;;;; This variable may be useful to speed up some slow version of CLX
20 ;;;; It is particulary useful with CLISP/MIT-CLX.
21 ;; (setf *have-to-compress-notify* t)
25 ;;; -- Azerty configuration --
27 ;;(defun my-binding ()
28 ;; (define-main-key ("twosuperior") 'banish-pointer)
29 ;; (undefine-main-multi-keys (#\t :mod-1) (#\b :mod-1) (#\b :mod-1 :control))
30 ;; (undefine-main-multi-keys ("1" :mod-1) ("2" :mod-1) ("3" :mod-1)
31 ;; ("4" :mod-1) ("5" :mod-1) ("6" :mod-1)
32 ;; ("7" :mod-1) ("8" :mod-1) ("9" :mod-1) ("0" :mod-1))
33 ;; (define-main-key ("ampersand" :mod-1) 'bind-or-jump 1)
34 ;; (define-main-key ("eacute" :mod-1) 'bind-or-jump 2)
35 ;; (define-main-key ("quotedbl" :mod-1) 'bind-or-jump 3)
36 ;; (define-main-key ("quoteright" :mod-1) 'bind-or-jump 4)
37 ;; (define-main-key ("parenleft" :mod-1) 'bind-or-jump 5)
38 ;; (define-main-key ("minus" :mod-1) 'bind-or-jump 6)
39 ;; (define-main-key ("egrave" :mod-1) 'bind-or-jump 7)
40 ;; (define-main-key ("underscore" :mod-1) 'bind-or-jump 8)
41 ;; (define-main-key ("ccedilla" :mod-1) 'bind-or-jump 9)
42 ;; (define-main-key ("agrave" :mod-1) 'bind-or-jump 10)
43 ;; ;; For the second mode
44 ;; (undefine-second-multi-keys ("1" :mod-1) ("2" :mod-1) ("3" :mod-1)
45 ;; ("4" :mod-1) ("5" :mod-1) ("6" :mod-1)
46 ;; ("7" :mod-1) ("8" :mod-1) ("9" :mod-1) ("0" :mod-1))
47 ;; (define-second-key ("ampersand" :mod-1) 'bind-or-jump 1)
48 ;; (define-second-key ("eacute" :mod-1) 'bind-or-jump 2)
49 ;; (define-second-key ("quotedbl" :mod-1) 'bind-or-jump 3)
50 ;; (define-second-key ("quoteright" :mod-1) 'bind-or-jump 4)
51 ;; (define-second-key ("parenleft" :mod-1) 'bind-or-jump 5)
52 ;; (define-second-key ("minus" :mod-1) 'bind-or-jump 6)
53 ;; (define-second-key ("egrave" :mod-1) 'bind-or-jump 7)
54 ;; (define-second-key ("underscore" :mod-1) 'bind-or-jump 8)
55 ;; (define-second-key ("ccedilla" :mod-1) 'bind-or-jump 9)
56 ;; (define-second-key ("agrave" :mod-1) 'bind-or-jump 10))
58 ;;(add-hook *binding-hook* 'my-binding)
60 ;;(dbg *binding-hook*)
61 ;;;;; -- Azerty configuration end --
65 ;;; Color configuration example
67 ;;; See in package.lisp for all variables
68 ;;(setf *color-unselected* "Blue")
71 ;;; How to change the default fullscreen size
72 ;;(defun get-fullscreen-size ()
73 ;; "Return the size of root child (values rx ry rw rh)
74 ;;You can tweak this to what you want"
75 ;; (values -2 -2 (+ (xlib:screen-width *screen*) 2) (- (xlib:screen-height *screen*) 20)))
78 ;;; Contributed code example
79 ;;; See in the clfswm/contrib directory to find some contributed code
80 ;;; and se load-contrib to load them. For example:
81 ;;(load-contrib "contrib-example.lisp")
85 ;;; Binding example: Undefine Control-F1 and define Control-F5 as a
86 ;;; new binding in main mode
88 ;;; See bindings.lisp, bindings-second-mode.lisp and bindings-pager.lisp
89 ;;; for all default bindings definitions.
90 ;;(defun binding-example ()
91 ;; (undefine-main-key ("F1" :mod-1))
92 ;; (define-main-key ("F5" :mod-1) 'help-on-clfswm)
93 ;; ;; Binding example for apwal
94 ;; (define-second-key (#\Space)
95 ;; (defun tpm-apwal ()
97 ;; (do-shell "exec apwal")
98 ;; (show-all-windows-in-workspace (current-workspace))
99 ;; (throw 'exit-second-loop nil))))
101 ;;(add-hook *binding-hook* 'binding-example)
107 ;;; See in package.lisp and clfswm.lisp, clfswm-second-mode.lisp
108 ;;; for hook examples
109 ;;(setf *key-press-hook* (list (lambda (&rest args) ; function 1
110 ;; (format t "Keyp press (before): ~A~%" args)
112 ;; #'handle-key-press ; function 2 (default)
113 ;; (lambda (&rest args) ; function 3
114 ;; (declare (ignore args))
115 ;; (format t "Keyp press (after)~%")
121 ;;; A more complex example I use to record my desktop and show
122 ;;; documentation associated to each key press.
123 ;;(defun display-osd (formatter &rest args)
124 ;; (do-shell "pkill osd_cat")
125 ;; (do-shell (format nil "echo ~A | osd_cat -d 3 -p bottom -o -60 -f -*-fixed-*-*-*-*-16-*-*-*-*-*-*-1"
126 ;; (apply #'format nil formatter args)))
129 ;;(defun documentation-key-from-code (hash-key code state)
130 ;; (documentation (first (find-key-from-code hash-key code state)) 'function))
133 ;;(defun key-string (hash-key code state)
134 ;; (let* ((modifiers (xlib:make-state-keys state))
135 ;; (keysym (keysym->keysym-name (xlib:keycode->keysym *display* code 0)))
136 ;; (doc (documentation-key-from-code hash-key code state)))
137 ;; (values (format nil "~:(~{~A+~}~A~) : ~S" modifiers keysym doc)
140 ;;(defun display-doc (hash-key code state)
141 ;; (multiple-value-bind (str doc)
142 ;; (key-string hash-key code state)
144 ;; (display-osd "~A" str))))
146 ;;(defun display-key-osd-main (&rest event-slots &key code state &allow-other-keys)
147 ;; (declare (ignore event-slots))
148 ;; (display-doc *main-keys* code state))
150 ;;(defun display-key-osd-second (&rest event-slots &key code state &allow-other-keys)
151 ;; (declare (ignore event-slots))
152 ;; (display-doc *second-keys* code state))
154 ;;;; Define new hook or add to precedent one
155 ;;(if (consp *key-press-hook*)
156 ;; (push #'display-key-osd-main *key-press-hook*)
157 ;; (setf *key-press-hook* (list #'display-key-osd-main #'handle-key-press)))
158 ;;(setf *sm-key-press-hook* (list #'display-key-osd-second #'sm-handle-key-press))
161 ;;;;; Display menu functions
162 ;;(defun open-menu (&optional (menu *menu*))
163 ;; "Open the main menu"
164 ;; (let ((info-list nil)
166 ;; (dolist (item (menu-item menu))
167 ;; (let ((value (menu-item-value item)))
168 ;; (push (typecase value
169 ;; (menu (list (list (format nil "~A" (menu-item-key item)) *menu-color-menu-key*)
170 ;; (list (format nil ": < ~A >" (menu-doc value)) *menu-color-submenu*)))
171 ;; (string (list (list (format nil "~A" (menu-item-value item)) *menu-color-comment*)))
172 ;; (t (list (list (format nil "~A" (menu-item-key item)) *menu-color-key*)
173 ;; (format nil ": ~A" (documentation value 'function)))))
175 ;; (when (menu-item-key item)
176 ;; (define-info-key-fun (list (menu-item-key item) 0)
177 ;; (lambda (&optional args)
178 ;; (declare (ignore args))
179 ;; (setf action value)
180 ;; (throw 'exit-info-loop nil))))))
181 ;; (info-mode (nreverse info-list))
182 ;; (dolist (item (menu-item menu))
183 ;; (undefine-info-key-fun (list (menu-item-key item) 0)))
186 ;; (display-osd "Open Menu: ~A" (menu-doc action)) ;; <- Display here
187 ;; (open-menu action))
188 ;; (t (when (fboundp action)
189 ;; (display-osd "~A" (documentation action 'function)) ;; <- Display here
190 ;; (funcall action))))))
194 ;;(defun get-fullscreen-size ()
195 ;; "Return the size of root child (values rx ry rw rh)
196 ;;You can tweak this to what you want"
197 ;; (values -2 -2 (+ (xlib:screen-width *screen*) 2) (- (xlib:screen-height *screen*) 20)))
199 ;;;;; -- Doc example end --
202 ;;;;; Init hook examples:
203 ;;(defun my-init-hook-1 ()
204 ;; (dbg 'my-init-hook)
205 ;; ;;(add-frame (create-frame :name "Default" :layout #'tile-left-layout :data (list '(:tile-size 0.6))) *root-frame*)
206 ;; (add-frame (create-frame :name "The Gimp" :x 0.6 :y 0 :w 0.3 :h 0.2) *root-frame*)
207 ;; (add-frame (create-frame :name "Net" :x 0.52 :y 0.3 :w 0.4 :h 0.3) *root-frame*)
208 ;; (add-frame (create-frame :x 0.4 :y 0 :w 0.2 :h 0.3) (first (frame-child *root-frame*)))
209 ;; (add-frame (create-frame :x 0.6 :y 0.4 :w 0.4 :h 0.2) (first (frame-child *root-frame*)))
210 ;; (add-frame (create-frame :x 0.4 :y 0.7 :w 0.2 :h 0.3) (first (frame-child *root-frame*)))
211 ;; (let ((frame (create-frame :name "The Qiv" :x 0 :y 0.4 :w 0.4 :h 0.2)))
212 ;; (add-frame frame (first (frame-child *root-frame*)))
213 ;; (add-frame (create-frame) frame))
214 ;; (add-frame (create-frame :x 0.1 :y 0.55 :w 0.8 :h 0.43) *root-frame*)
215 ;; (add-frame (create-frame :x 0.2 :y 0.1 :w 0.6 :h 0.4) (first (frame-child *root-frame*)))
216 ;; (add-frame (create-frame :x 0.3 :y 0.55 :w 0.4 :h 0.3) (first (frame-child *root-frame*)))
217 ;; (add-frame (create-frame :x 0.1 :y 0.1 :w 0.3 :h 0.6) (first (frame-child (first (frame-child *root-frame*)))))
218 ;; (setf *current-child* (first (frame-child *current-root*)))
219 ;; (setf (frame-layout *current-child*) #'tile-layout))
221 ;;(defun my-init-hook-2 ()
222 ;; (dbg 'my-init-hook)
223 ;; (add-frame (create-frame :name "Default" :layout #'tile-left-layout :data (list '(:tile-size 0.6))) *root-frame*)
224 ;; (setf *current-child* (first (frame-child *current-root*)))
225 ;; (setf (frame-layout *current-child*) #'tile-layout))
228 ;;(defun my-init-hook-3 ()
229 ;; (dbg 'my-init-hook)
230 ;; (add-frame (create-frame :name "plop" :x 0.1 :y 0.4 :w 0.7 :h 0.3) *root-frame*)
231 ;; (add-frame (create-frame :name "Default" :layout nil :x 0.1 :y 0.5 :w 0.8 :h 0.5)
233 ;; (setf *current-child* (first (frame-child *current-root*)))
234 ;; (setf (frame-layout *root-frame*) nil))
238 ;;(defun my-init-hook-4 ()
239 ;; (let ((frame (add-frame (create-frame :name "Default"
240 ;; :layout #'tile-left-layout
241 ;; :x 0.05 :y 0.05 :w 0.9 :h 0.9)
243 ;; (setf *current-child* frame)))
246 ;;;;; Use this hook and prevent yourself to create a new frame to emulate
247 ;;;;; the MS Windows desktop style :)
248 ;;(defun my-init-hook-ms-windows-style ()
249 ;; (setf (frame-managed-type *root-frame*) nil))
252 ;;;;; Here is another example useful with the ROX filer: Only the
253 ;;;;; root frame fullscreen with some space on the left for icons.
254 ;;(defun my-init-hook-rox-filer ()
255 ;; (setf (frame-layout *root-frame*) #'tile-left-space-layout
256 ;; (frame-data-slot *root-frame* :tile-size) 0.9))
261 ;;(setf *init-hook* #'my-init-hook-4) ;; <- choose one in 1 to 4
262 ;;;;(setf *init-hook* nil)