* liece-minibuf.el: Autoload `completing-read-multiple'; declare
[elisp/liece.git] / lisp / liece-emacs.el
index 7104bcc..8f7761c 100644 (file)
   (autoload 'bitmap-stipple-xbm-file-to-stipple "bitmap-stipple")
   (autoload 'bitmap-stipple-insert-pixmap "bitmap-stipple"))
 
+(defcustom liece-emacs-unread-character "!"
+  "Unread character."
+  :type 'character
+  :group 'liece-look)
+
 ;;; @ widget emulation
 ;;; 
 (defvar liece-widget-keymap nil)
@@ -51,8 +56,7 @@
   (substitute-key-definition
    'widget-button-click 'liece-widget-button-click
    liece-widget-keymap)
-  (define-key liece-widget-keymap (if (featurep 'xemacs) 'button3
-                                   [mouse-3])
+  (define-key liece-widget-keymap [mouse-3]
     'liece-widget-button-click))
 
 (defun liece-emacs-widget-convert-button (type from to &rest args)
 
 (defun liece-emacs-widget-button-click (event)
   (interactive "e")
-  (with-current-buffer
-      (let ((window (posn-window (event-start event))))
-       (and (windowp window) (window-buffer window)))
-    (goto-char (widget-event-point event))
-    (cond
-     ((widget-at (point)))
-     ((> (point) (save-excursion
-                  (widget-forward 0)
-                  (point)))
-      (widget-backward 0))
-     ((< (point) (save-excursion
-                  (widget-backward 0)
-                  (point)))
-      (widget-forward 0)))
-    (widget-button-click event)))
+  (let* ((window (posn-window (event-start event)))
+        (point (window-point window))
+        (buffer (window-buffer window)))
+    (with-current-buffer buffer
+      (unwind-protect
+         (progn
+           (goto-char (widget-event-point event))
+           (cond
+            ((widget-at (point)))
+            ((> (point) (save-excursion
+                          (widget-forward 0)
+                          (point)))
+             (widget-backward 0))
+            ((< (point) (save-excursion
+                          (widget-backward 0)
+                          (point)))
+             (widget-forward 0)))
+           (call-interactively (function widget-button-click)))
+       (if (windowp (setq window (get-buffer-window buffer)))
+           (set-window-point window point))))))
 
 (fset 'liece-widget-convert-button
       'liece-emacs-widget-convert-button)
        (progn
          (setq config (current-window-configuration))
          (save-excursion
-           (switch-to-buffer (setq buffer (liece-get-buffer-create
-                                           (concat (if arg "*" " *")
-                                                   (liece-version) "*"))))
+           (setq buffer (generate-new-buffer
+                         (concat (if arg "*" " *")
+                                 (liece-version) "*")))
+           (switch-to-buffer buffer)
            (erase-buffer)
            (static-cond
             ((and (fboundp 'image-type-available-p)
 ;;; 
 (defconst liece-mode-line-image nil)
 
-(static-unless (or (not (fboundp 'create-image))
-                  (memq 'data-p (aref (symbol-function 'create-image) 0)))
-  (defadvice create-image
-    (before data-p (file-or-data &optional type data-p &rest props) activate)
-    (ad-set-args 0 (list (ad-get-arg 0) (ad-get-arg 1) (ad-get-arg 3)))))
-
 (defun liece-emacs-create-mode-line-image ()
   (static-when (fboundp 'image-type-available-p)
     (let ((file (liece-locate-icon-file
                                         'rear-nonsticky (list 'display))))
            (beginning-of-line 2)))))))
 
+;;; @ unread mark
+;;; 
+(defun liece-emacs-unread-mark (chnl)
+  (if liece-display-unread-mark
+    (with-current-buffer liece-channel-list-buffer
+      (let ((buffer-read-only nil))
+       (goto-char (point-min))
+       (when (re-search-forward (concat "^ ?[0-9]+: " chnl "$") nil t)
+          (goto-char (match-end 0))
+         (insert (concat " " liece-emacs-unread-character)))))))
+
+(defun liece-emacs-read-mark (chnl)
+  (if liece-display-unread-mark
+    (with-current-buffer liece-channel-list-buffer
+      (let ((buffer-read-only nil))
+        (goto-char (point-min))
+        (when (re-search-forward
+              (concat "^ ?[0-9]+: " chnl " "
+                      liece-emacs-unread-character "$") nil t)
+         (goto-char (- (match-end 0) 2))
+        (delete-char 2))))))
+
+(defun liece-emacs-redisplay-unread-mark ()
+  (if liece-display-unread-mark
+    (let ((chnl))
+      (dolist (chnl liece-channel-unread-list)
+        (liece-emacs-unread-mark chnl)))))
+
 (add-hook 'liece-nick-insert-hook 'liece-emacs-nick-image-region)
 (add-hook 'liece-nick-replace-hook 'liece-emacs-nick-image-region)
        
 (and liece-splash-image window-system
      (liece-emacs-splash))
 
+(fset 'liece-redisplay-unread-mark 'liece-emacs-redisplay-unread-mark)
+(add-hook 'liece-channel-unread-hook 'liece-emacs-unread-mark)
+(add-hook 'liece-channel-read-hook 'liece-emacs-read-mark)
+
 (provide 'liece-emacs)
 
 ;;; liece-emacs.el ends here