Rename *root-size-change* hook to *root-size-change-hook*
[clfswm.git] / src / clfswm-generic-mode.lisp
blobbc3d58628ced5c9e3632462c167d367c5a5d94ef
1 ;;; --------------------------------------------------------------------------
2 ;;; CLFSWM - FullScreen Window Manager
3 ;;;
4 ;;; --------------------------------------------------------------------------
5 ;;; Documentation: Main functions
6 ;;; --------------------------------------------------------------------------
7 ;;;
8 ;;; (C) 2012 Philippe Brochard <pbrochard@common-lisp.net>
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)
28 (defun generic-mode (mode exit-tag &key enter-function loop-function leave-function
29 (loop-hook *loop-hook*) original-mode)
30 "Enter in a generic mode"
31 (let ((last-mode *current-event-mode*))
32 (unwind-protect
33 (progn
34 (unassoc-keyword-handle-event)
35 (when original-mode
36 (dolist (add-mode (ensure-list original-mode))
37 (assoc-keyword-handle-event add-mode)))
38 (assoc-keyword-handle-event mode)
39 (with-xlib-protect ()
40 (nfuncall enter-function)
41 (catch exit-tag
42 (loop
43 (with-xlib-protect (:generic-mode exit-tag)
44 (call-hook loop-hook)
45 (process-timers)
46 (nfuncall loop-function)
47 (when (xlib:event-listen *display* *loop-timeout*)
48 (xlib:process-event *display* :handler #'handle-event))
49 (xlib:display-finish-output *display*))))))
50 (with-xlib-protect ()
51 (nfuncall leave-function))
52 (unassoc-keyword-handle-event)
53 (assoc-keyword-handle-event last-mode))))