Index: lang/elisp/twittering-mode/trunk/twittering-mode.el
===================================================================
--- lang/elisp/twittering-mode/trunk/twittering-mode.el (revision 134)
+++ lang/elisp/twittering-mode/trunk/twittering-mode.el (revision 135)
@@ -15,5 +15,7 @@
 ;; twittering-public-timeline
 ;; twittering-user-timeline
-;; twittering-current-timeline
+;; twittering-current-timeline(-(non)interractive)
+;; twittering-other-user-timeline
+;; twittering-other-user-timeline-interactive
 
 ;; This file is free software; you can redistribute it and/or modify
@@ -52,5 +54,5 @@
 (require 'parse-time)
 
-(defconst twittering-mode-version "0.6")
+(defconst twittering-mode-version "0.7")
 
 (defun twittering-mode-version ()
@@ -77,4 +79,15 @@
 
 (defvar twittering-last-timeline-retrieved nil)
+
+(defvar twittering-last-timeline-interactive nil)
+
+(defvar twittering-new-tweets-count 0
+  "Number of new tweets when `twittering-new-tweets-hook' is run")
+
+(defvar twittering-new-tweets-hook nil
+  "Hook run when new twits are received.
+
+You can read `twittering-new-tweets-count' to get the number of new
+tweets received when this hook is run.")
 
 (defvar twittering-scroll-mode nil)
@@ -257,5 +270,7 @@
       (define-key km [mouse-1] 'twittering-click)
       (define-key km "\C-c\C-v" 'twittering-view-user-page)
-      (define-key km "g" 'twittering-current-timeline)
+      (define-key km "g" 'twittering-current-timeline-interactive)
+      (define-key km "v" 'twittering-other-user-timeline)
+      (define-key km "V" 'twittering-other-user-timeline-interactive)
       ;; (define-key km "j" 'next-line)
       ;; (define-key km "k" 'previous-line)
@@ -431,8 +446,13 @@
 	   status
 	   (("200 OK")
-	    (mapcar
-	     #'twittering-cache-status-datum
-	     (reverse (twittering-xmltree-to-status
-		       body)))
+	    (setq twittering-new-tweets-count
+		  (count t (mapcar
+			    #'twittering-cache-status-datum
+			    (reverse (twittering-xmltree-to-status
+				      body)))))
+	    (if (and (> twittering-new-tweets-count 0)
+		     (not twittering-last-timeline-interactive))
+		(run-hooks 'twittering-new-tweets-hook))
+	    (setq twittering-last-timeline-interactive t)
 	    (twittering-render-timeline)
 	    (message (if suc-msg suc-msg "Success: Get.")))
@@ -454,5 +474,5 @@
 	      (insert "\n"))
 	    twittering-timeline-data)
-      (if twittering-image-stack
+      (if (and twittering-image-stack window-system)
 	  (clear-image-cache))
       (setq buffer-read-only t)
@@ -527,5 +547,5 @@
 	   (list-push (attr 'created-at) result))
 	  ((?C) ; %C{time-format-str} - created_at (formatted with
-		; time-format-str)
+	   ; time-format-str)
 	   (list-push (twittering-local-strftime
 		       (or (match-string-no-properties 2 format-str) "%H:%M:%S")
@@ -759,4 +779,5 @@
        `(mouse-face highlight
 		    uri ,(concat "http://twitter.com/" user-screen-name)
+		    status-id ,id
 		    face twittering-username-face)
        user-name)
@@ -766,6 +787,6 @@
        0 (length user-screen-name)
        `(mouse-face highlight
-		    face twittering-username-face
 		    uri ,(concat "http://twitter.com/" user-screen-name)
+		    status-id ,id
 		    face twittering-username-face)
        user-screen-name)
@@ -893,13 +914,18 @@
       )))
 
-(defun twittering-update-status-if-not-blank (status)
+(defun twittering-update-status-if-not-blank (status &optional reply-to-id)
   (if (string-match "^\\s-*\\(?:@[-_a-z0-9]+\\)?\\s-*$" status)
       nil
-    (twittering-http-post "statuses" "update"
-			  `(("status" . ,status)
-			    ("source" . "twmode")))
+    (let ((parameters `(("status" . ,status)
+			("source" . "twmode"))))
+      (twittering-http-post "statuses" "update"
+			    (if reply-to-id
+				(cons `("in_reply_to_status_id" . ,(format "%s" reply-to-id))
+				      parameters)
+			      parameters)))
     t))
 
-(defun twittering-update-status-from-minibuffer (&optional init-str)
+(defun twittering-update-status-from-minibuffer (&optional init-str
+							   reply-to-id)
   (if (null init-str) (setq init-str ""))
   (let ((status init-str) (not-posted-p t))
@@ -907,5 +933,6 @@
       (setq status (read-from-minibuffer "status: " status nil nil nil nil t))
       (setq not-posted-p
-	    (not (twittering-update-status-if-not-blank status))))))
+	    (not (twittering-update-status-if-not-blank status reply-to-id))))
+    ))
 
 (defun twittering-update-lambda ()
@@ -934,5 +961,5 @@
   (interactive)
   (if (null action)
-      (setq action #'twittering-current-timeline))
+      (setq action #'twittering-current-timeline-noninteractive))
   (if twittering-timer
       nil
@@ -965,5 +992,5 @@
 			       `(("since" . ,since)))))))
 
-  (if twittering-icon-mode
+  (if (and twittering-icon-mode window-system)
       (if twittering-image-stack
 	  (let ((proc
@@ -1001,6 +1028,14 @@
   (twittering-get-timeline "user_timeline"))
 
+(defun twittering-current-timeline-interactive ()
+  (interactive)
+  (setq twittering-last-timeline-interactive t)
+  (twittering-current-timeline))
+
+(defun twittering-current-timeline-noninteractive ()
+  (setq twittering-last-timeline-interactive nil)
+  (twittering-current-timeline))
+
 (defun twittering-current-timeline ()
-  (interactive)
   (if (not twittering-last-timeline-retrieved)
       (setq twittering-last-timeline-retrieved "friends_timeline"))
@@ -1035,7 +1070,9 @@
   (interactive)
   (let ((username (get-text-property (point) 'username))
+	(status-id (get-text-property (point) 'status-id))
 	(uri (get-text-property (point) 'uri)))
     (if username
-	(twittering-update-status-from-minibuffer (concat "@" username " "))
+	(twittering-update-status-from-minibuffer (concat "@" username " ")
+						  status-id)
       (if uri
 	  (browse-url uri)))))
@@ -1046,4 +1083,18 @@
     (if uri
 	(browse-url uri))))
+
+(defun twittering-other-user-timeline ()
+  (interactive)
+  (let ((username (get-text-property (point) 'username)))
+    (if (> (length username) 0)
+	(twittering-get-timeline (concat "user_timeline/" username))
+      (message "No user selected"))))
+
+(defun twittering-other-user-timeline-interactive ()
+  (interactive)
+  (let ((username (read-from-minibuffer "user: " (get-text-property (point) 'username))))
+    (if (> (length username) 0)
+	(twittering-get-timeline (concat "user_timeline/" username))
+      (message "No user selected"))))
 
 (defun twittering-reply-to-user ()
Index: lang/elisp/twittering-mode/trunk/ChangeLog
===================================================================
--- lang/elisp/twittering-mode/trunk/ChangeLog (revision 81)
+++ lang/elisp/twittering-mode/trunk/ChangeLog (revision 135)
@@ -1,2 +1,21 @@
+2009-06-17  Tsuyoshi CHO  <Tsuyoshi.CHO+develop@Gmail.com>
+
+	* twittering-mode.el (twittering-last-timeline-interactive): New add variable.
+	(twittering-new-tweets-count): Ditto.
+	(twittering-new-tweets-hook): Ditto.
+	(twittering-mode-map): Add new binding v/V
+	(twittering-http-get-default-sentinel): Add new hook support
+	`twittering-new-tweets-hook'.
+	(twittering-render-timeline, twittering-get-timeline): Support
+	console emacs.
+	(twittering-current-timeline-interactive): Add new function.
+	(twittering-current-timeline-noninteractive): Ditto.
+	(twittering-other-user-timeline): Ditto.
+	(twittering-other-user-timeline-interactive): Ditto.
+	(twittering-status-to-status-datum): Add support status id and
+	reply to id.
+	(twittering-update-status-if-not-blank): Ditto.
+	(twittering-update-status-from-minibuffer): Ditto.
+
 2009-03-12  Tsuyoshi CHO  <Tsuyoshi.CHO+develop@Gmail.com>
 
