Update of /project/beirc/cvsroot/beirc
In directory common-lisp.net:/tmp/cvs-serv32347
Modified Files:
beirc.lisp message-display.lisp
Log Message:
add a customizable variable for timestamp orientation, and fix
redisplay on focus/ignore/etc. command
* new variable *timestamp-column-orientation* (this is for you, mgr)
* new command /Switch Timestamp Orientation
* /S-T-O, /{,un}ignore, /{,un}focus now redraw the panes they affect.
* comment out the nickname to hostmask ptype translator. for some
reason it was always activated.
Date: Sun Sep 25 00:30:25 2005
Author: afuchs
Index: beirc/beirc.lisp
diff -u beirc/beirc.lisp:1.28 beirc/beirc.lisp:1.29
--- beirc/beirc.lisp:1.28 Sat Sep 24 21:13:54 2005
+++ beirc/beirc.lisp Sun Sep 25 00:30:23 2005
@@ -389,6 +389,17 @@
(scroll-extent pane 0 (max 0 (- (bounding-rectangle-height pane)
(bounding-rectangle-height (sheet-parent pane))))))
+(defun redraw-receiver (receiver)
+ (let ((pane (actual-application-pane (pane receiver))))
+ (setf (pane-needs-redisplay pane) t)
+ (redisplay-frame-pane *application-frame* pane)))
+
+(defun redraw-all-receivers ()
+ (maphash (lambda (name receiver)
+ (declare (ignore name))
+ (redraw-receiver receiver))
+ (receivers *application-frame*)))
+
(defmethod handle-event ((frame beirc) (event foo-event))
;; Hack:
;; Figure out if we are scrolled to the bottom.
@@ -478,6 +489,8 @@
(receiver-from-tab-pane
(find-in-tab-panes-list object 'tab-layout-pane)))
+;;; XXX: for some reason, this translator is activated when accepting NICKNAME.
+#+(or)
(define-presentation-translator nickname-to-hostmask-translator
(nickname hostmask beirc)
(object)
@@ -533,18 +546,22 @@
(title (current-receiver *application-frame*))))
(define-beirc-command (com-focus :name t) ((who 'nickname :prompt "who"))
- (pushnew who (current-focused-nicks) :test #'string=))
+ (pushnew who (current-focused-nicks) :test #'string=)
+ (redraw-receiver (current-receiver *application-frame*)))
(define-beirc-command (com-ignore :name t) ((who 'nickname :prompt "who"))
- (pushnew who (slot-value *application-frame* 'ignored-nicks) :test #'string=))
+ (pushnew who (slot-value *application-frame* 'ignored-nicks) :test #'string=)
+ (redraw-all-receivers))
(define-beirc-command (com-unignore :name t) ((who 'ignored-nickname :prompt "who"))
(setf (slot-value *application-frame* 'ignored-nicks)
- (remove who (slot-value *application-frame* 'ignored-nicks) :test #'string=)))
+ (remove who (slot-value *application-frame* 'ignored-nicks) :test #'string=))
+ (redraw-all-receivers))
(define-beirc-command (com-unfocus :name t) ((who 'nickname :prompt "who"))
(setf (current-focused-nicks)
- (remove who (current-focused-nicks) :test #'string=)))
+ (remove who (current-focused-nicks) :test #'string=))
+ (redraw-receiver (current-receiver *application-frame*)))
(define-beirc-command (com-eval :name t) ((command 'string :prompt "command")
(args '(sequence string) :prompt "arguments"))
@@ -604,6 +621,12 @@
(when (current-connection *application-frame*)
(quit *application-frame* reason)))
+(define-beirc-command (com-switch-timestamp-orientation :name t) ()
+ (setf *timestamp-column-orientation* (if (eql *timestamp-column-orientation* :left)
+ :right
+ :left))
+ (redraw-all-receivers))
+
(defun target (&optional (*application-frame* *application-frame*))
(or (current-query)
(current-channel)))
@@ -714,7 +737,7 @@
(clim-sys:make-process #'(lambda ()
(unwind-protect
(irc-event-loop frame connection)
- (quit frame "IRC event loop terminated.")))
+ (disconnect frame)))
:name "IRC Message Muffling Loop")))))))
(defun disconnect (frame)
Index: beirc/message-display.lisp
diff -u beirc/message-display.lisp:1.12 beirc/message-display.lisp:1.13
--- beirc/message-display.lisp:1.12 Sat Sep 24 21:03:15 2005
+++ beirc/message-display.lisp Sun Sep 25 00:30:24 2005
@@ -2,6 +2,7 @@
(defparameter *hyperspec-base-url* "file://localhost/Users/dmurray/lisp/HyperSpec/")
(defparameter *default-fill-column* 80)
+(defparameter *timestamp-column-orientation* :right)
(defvar *max-preamble-length* 0)
@@ -34,39 +35,47 @@
(member (irc:source message) (slot-value *application-frame* 'ignored-nicks)
:test #'string=))
+(defun invoke-formatting-message (stream message receiver preamble-writer message-body-writer)
+ (let* ((stream* (if (eql stream t) *standard-output* stream))
+ (width (- (floor (bounding-rectangle-width (sheet-parent stream*))
+ (clim:stream-string-width stream* "X"))
+ 2)))
+ (labels ((output-timestamp-column (position)
+ (when (eql position *timestamp-column-orientation*)
+ (formatting-cell (stream* :align-x :left)
+ (with-drawing-options (stream* :ink +gray+)
+ (format stream* "[~2,'0D:~2,'0D]"
+ (nth-value 2 (decode-universal-time (irc:received-time message)))
+ (nth-value 1 (decode-universal-time (irc:received-time message)))))))))
+ (updating-output (stream*
+ :cache-value
+ (list message
+ (focused-nicks receiver)
+ (slot-value *application-frame* 'ignored-nicks)
+ width
+ *max-preamble-length*
+ *timestamp-column-orientation*)
+ :cache-test #'equal)
+ (formatting-row (stream*)
+ (output-timestamp-column :left)
+ (formatting-cell (stream* :align-x :right :min-width '(16 :character))
+ (with-drawing-options (stream* :ink +dark-red+)
+ (funcall preamble-writer)))
+ (formatting-cell (stream* :align-x :left
+ :min-width '(80 :character))
+ (funcall message-body-writer))
+ (output-timestamp-column :right))))))
+
(defmacro formatting-message ((stream message receiver)
(&body preamble-column-body)
(&body message-body-column-body))
;; Fix me: This usage of UPDATING-OUTPUT is sub-optimal and ugly!
;; (asf 2005-09-17: is it still?)
- (let ((width (gensym))
- (%stream% (gensym))
- (stream* (gensym)))
- `(let* ((,%stream% ,stream)
- (,stream* (if (eql ,%stream% t) *standard-output* ,%stream%))
- (,width (- (floor (bounding-rectangle-width (sheet-parent ,stream*))
- (clim:stream-string-width ,stream* "X"))
- 2)))
- (updating-output (,stream*
- :cache-value
- (list ,message
- (focused-nicks ,receiver)
- (slot-value *application-frame* 'ignored-nicks)
- ,width
- *max-preamble-length*)
- :cache-test #'equal)
- (formatting-row (,stream*)
- (formatting-cell (,stream* :align-x :right :min-width '(16 :character))
- (with-drawing-options (,stream* :ink +dark-red+)
- ,@preamble-column-body))
- (formatting-cell (,stream* :align-x :left
- :min-width '(80 :character))
- ,@message-body-column-body)
- (formatting-cell (,stream* :align-x :left)
- (with-drawing-options (,stream* :ink +gray+)
- (format ,stream* "[~2,'0D:~2,'0D]"
- (nth-value 2 (decode-universal-time (irc:received-time message)))
- (nth-value 1 (decode-universal-time (irc:received-time message)))))))))))
+ `(invoke-formatting-message ,stream ,message ,receiver
+ (lambda ()
+ ,@preamble-column-body)
+ (lambda ()
+ ,@message-body-column-body)))
(defun strip-punctuation (word)
(if (= (length word) 0)