summaryrefslogtreecommitdiffstats
path: root/emacs.d/lisp/rudel/rudel-hooks.el
diff options
context:
space:
mode:
Diffstat (limited to 'emacs.d/lisp/rudel/rudel-hooks.el')
-rw-r--r--emacs.d/lisp/rudel/rudel-hooks.el252
1 files changed, 252 insertions, 0 deletions
diff --git a/emacs.d/lisp/rudel/rudel-hooks.el b/emacs.d/lisp/rudel/rudel-hooks.el
new file mode 100644
index 0000000..0cc9a3e
--- /dev/null
+++ b/emacs.d/lisp/rudel/rudel-hooks.el
@@ -0,0 +1,252 @@
+;;; rudel-hooks.el --- Hooks for Rudel events
+;;
+;; Copyright (C) 2009 Jan Moringen
+;;
+;; Author: Jan Moringen <scymtym@users.sourceforge.net>
+;; Keywords: Rudel, hook
+;; X-RCS: $Id:$
+;;
+;; This file is part of Rudel.
+;;
+;; Rudel is free software: you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+;;
+;; Rudel is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with Rudel. If not, see <http://www.gnu.org/licenses>.
+
+
+;;; Commentary:
+;;
+;; This file contains all global hooks (as opposed to hooks provided
+;; by individual objects) provided by Rudel.
+
+
+;;; History:
+;;
+;; 0.1 - Initial revision.
+
+
+;;; Code:
+;;
+
+(require 'eieio)
+
+
+;;; Hook variables
+;;
+
+(defvar rudel-session-start-hook nil
+ "This hook is run when a new session is started.
+The only argument is the session object.")
+
+(defvar rudel-session-end-hook nil
+ "This hook is run when a session ends.
+The only argument is the session object.")
+
+(defvar rudel-session-add-user-hook nil
+ "This hook is run when a user is added to a session.
+The arguments are the session and the user.")
+
+(defvar rudel-session-remove-user-hook nil
+ "This hook is run when a user is removed from a session.
+The arguments are the session and the user.")
+
+(defvar rudel-session-add-document-hook nil
+ "This hook is run when a document is added to a session.
+The arguments are the session and the document.")
+
+(defvar rudel-session-remove-document-hook nil
+ "This hook is run when a document is removed from a session.
+The arguments are the session and the document.")
+
+
+(defvar rudel-user-change-hook nil
+ "This hooks is run when a user object changes.
+The only argument is the user object.")
+
+
+(defvar rudel-document-attach-hook nil
+ "This hook is run when a document is attached to a buffer.
+The arguments are the document and the buffer.")
+
+(defvar rudel-document-detach-hook nil
+ "This hook is run when document is detached from its buffer.
+The arguments are the document and the buffer.")
+
+
+;;; Handlers
+;;
+
+(defun rudel-hooks--session-start (session)
+ "Watch SESSION for added/removed users and documents."
+ ;; Install handlers for the hooks of the session.
+ (with-slots (users documents) session
+
+ ;; Watch for session end.
+ (object-add-hook session 'end-hook
+ #'rudel-hooks--session-end)
+
+ ;; Watch all users in the session.
+ (dolist (user users)
+ (rudel-hooks--session-add-user session user))
+
+ ;; Watch session for added/removed users.
+ (object-add-hook
+ session 'add-user-hook
+ #'rudel-hooks--session-add-user)
+ (object-add-hook
+ session 'remove-user-hook
+ #'rudel-hooks--session-remove-user)
+
+ ;; Watch all documents in the session.
+ (dolist (document documents)
+ (rudel-hooks--session-add-document session document))
+
+ ;; Watch session for added/removed documents.
+ (object-add-hook
+ session 'add-document-hook
+ #'rudel-hooks--session-add-document)
+ (object-add-hook
+ session 'remove-document-hook
+ #'rudel-hooks--session-remove-document))
+ )
+
+(defun rudel-hooks--session-end (session)
+ "Stop watching SESSION for added/removed users and documents."
+ ;; Remove handlers from the session.
+ (with-slots (users documents) session
+
+ ;; Stop watching for session end.
+ (object-remove-hook session 'end-hook
+ #'rudel-hooks--session-end)
+
+ ;; Stop watching all users in the session.
+ (dolist (user users)
+ (rudel-hooks--session-remove-user session user))
+
+ ;; Stop watching session for added/removed users.
+ (object-remove-hook
+ session 'add-user-hook
+ #'rudel-hooks--session-add-user)
+ (object-remove-hook
+ session 'remove-user-hook
+ #'rudel-hooks--session-remove-user)
+
+ ;; Stop watching all documents in the session.
+ (dolist (document documents)
+ (rudel-hooks--session-remove-document session document))
+
+ ;; Stop watching session for added/removed documents.
+ (object-remove-hook
+ session 'add-document-hook
+ #'rudel-hooks--session-add-document)
+ (object-remove-hook
+ session 'remove-document-hook
+ #'rudel-hooks--session-remove-document))
+
+ ;; Run the hook.
+ (run-hook-with-args 'rudel-session-end-hook session)
+ )
+
+(defun rudel-hooks--session-add-user (session user)
+ "Watch USER for changes and run `rudel-session-add-user-hook'."
+ ;; Watch USER.
+ (object-add-hook user 'change-hook #'rudel-hooks--user-change)
+
+ ;; Run the hook.
+ (run-hook-with-args 'rudel-session-add-user-hook session user))
+
+(defun rudel-hooks--session-remove-user (session user)
+ "Stop watching USER and run `rudel-session-remove-user-hook'"
+ ;; Stop watching USER.
+ (object-remove-hook user 'change-hook #'rudel-hooks--user-change)
+
+ ;; Run the hook.
+ (run-hook-with-args 'rudel-session-remove-user-hook
+ session user))
+
+(defun rudel-hooks--session-add-document (session document)
+ "Watch DOCUMENT and run `rudel-session-add-document-hook'."
+ ;; Watch document for attach/detach.
+ (object-add-hook document 'attach-hook
+ #'rudel-hooks--document-attach)
+ (object-add-hook document 'detach-hook
+ #'rudel-hooks--document-detach)
+
+ ;; Run the hook.
+ (run-hook-with-args 'rudel-session-add-document-hook
+ session document)
+ )
+
+(defun rudel-hooks--session-remove-document (session document)
+ "Stop watching DOCUMENT and run `rudel-session-remove-document-hook'."
+ ;; Stop watching DOCUMENT for attach/detach.
+ (object-remove-hook
+ document 'attach-hook #'rudel-hooks--document-attach)
+ (object-remove-hook
+ document 'detach-hook #'rudel-hooks--document-detach)
+
+ ;; Run the hook.
+ (run-hook-with-args 'rudel-session-remove-document-hook
+ session document)
+ )
+
+
+(defun rudel-hooks--user-change (user)
+ "Run `rudel-user-change-hook' with argument USER."
+ (run-hook-with-args 'rudel-user-change-hook user))
+
+
+(defun rudel-hooks--document-attach (document buffer)
+ "Run `rudel-document-attach-hook' with arguments DOCUMENT and BUFFER."
+ (run-hook-with-args 'rudel-document-attach-hook
+ document buffer))
+
+(defun rudel-hooks--document-detach (document buffer)
+ "Run `rudel-document-detach-hook' with arguments DOCUMENT and BUFFER."
+ (run-hook-with-args 'rudel-document-detach-hook
+ document buffer))
+
+
+;;; Initialization
+;;
+
+(defun rudel-hooks--install-handlers ()
+ "Install handlers for session start/end."
+ ;; Install handlers for already started sessions.
+ (when (boundp 'rudel-current-session)
+ (mapc
+ #'rudel-hooks--session-start
+ (when rudel-current-session
+ (list rudel-current-session))))
+
+ ;; Watch for session start/end.
+ (add-hook 'rudel-session-start-hook
+ #'rudel-hooks--session-start)
+ )
+
+(defun rudel-hooks--uninstall-handlers ()
+ "Uninstall handlers for session start/end."
+ ;; Stop watching session start/end.
+ (remove-hook 'rudel-session-start-hook
+ #'rudel-hooks--session-start)
+
+ ;; Uninstall handlers for already started sessions.
+ (when (boundp 'rudel-current-session)
+ (mapc
+ #'rudel-hooks--session-end
+ (when rudel-current-session
+ (list rudel-current-session))))
+ )
+
+(rudel-hooks--install-handlers)
+
+(provide 'rudel-hooks)
+;;; rudel-hooks.el ends here