The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
;; Copyright 2008, 2009 Kevin Ryde

;; This file is part of Chart.
;;
;; Chart 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, or (at your option) any later version.
;;
;; Chart 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 Chart.  If not, see <http://www.gnu.org/licenses/>.

(defvar ticker-mode-map
  (let ((m (make-sparse-keymap)))
    (define-key m "q"         'ticker-quit)
    m)
  "Keymap for `ticker-mode' display buffer.")

(defun ticker-quit ()
  (interactive)
  (delete-window))

(defun ticker-timer-scroll (buffer)
  (dolist (window (get-buffer-window-list buffer))
    (with-selected-window window
      (let ((offset (- (point) (window-hscroll)))
            (new-hscroll (if (> (+ (window-hscroll) (window-width)) (point-max))
                             (point-min)
                           (1+ (window-hscroll)))))
        (goto-char (+ new-hscroll offset))
        (set-window-hscroll window new-hscroll)))))

(defvar ticker-timer nil)
(make-local-variable 'ticker-timer)

(defun ticker-stop-timer ()
  (when ticker-timer
    (cancel-timer ticker-timer)
    (setq ticker-timer nil)))

(defun ticker-mode ()
  "Show a scrolling ticker.
"
  (kill-all-local-variables)
  (setq major-mode        'ticker-mode
        mode-name         "Ticker"
        truncate-lines    t)
  (use-local-map ticker-mode-map)
  (setq buffer-read-only t)

  (setq ticker-timer (run-at-time 0 1 'ticker-timer-scroll (current-buffer)))
  (add-hook 'kill-buffer-hook 'ticker-stop-timer t t)

  (run-hooks 'ticker-mode-hook))

(progn
  (if (get-buffer "x")
      (kill-buffer "x"))
  (let ((window-min-height 1))
    (split-window nil 2))
  (switch-to-buffer "x")
  (insert "fjksdj fksd jfksd fksd jfksd jfk sjdfk jsdkf sjdkf jsdkf jsdk fjsdk fjksd fjksd fjksd fjksd fjk sdjfksd fjkj kj kj k jk jk jk k ")
  (ticker-mode))

;; (cancel-timer (car timer-list))