#!/bin/sh
exec rep "$0" "$@"
!#

#| sawfish-client.jl -- window manager remote client

   $Id: sawfish-client.jl,v 1.4 2000/12/11 00:22:29 jsh Exp $

   Copyright (C) 2000 John Harper <john@dcs.warwick.ac.uk>

   This file is part of sawmill.

   sawmill 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 2, or (at your option)
   any later version.

   sawmill 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 sawmill; see the file COPYING.  If not, write to
   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|#

(require 'sawfish.client)

(define current-repl (make-fluid))

(define (usage)
  (write standard-output "\
usage: sawfish-client OPTIONS...

where OPTIONS are any of:

	--display X	Connect to the window manager on display X
	-q		Be quiet (perform commands asynchronously)
	-f FUNCTION	Call Lisp function FUNCTION on the server
	-c COMMAND	Call the interactive Lisp function COMMAND
	-r FEATURE	Require the module called FEATURE
	-e FORM		Evaluate Lisp form FORM on the server
	-		Read lines of input until EOF, evaluating each
			 one as it is read
	--		Read forms from standard input until EOF, evaluating
			 the whole lot in one go (inside a progn)\n"))

(define (exit n) (throw 'quit n))

(define (main)
  (let ((dpy (or (get-command-line-option "-display" t)
		 (get-command-line-option "--display" t))))
    (when dpy
      (sawfish-client-display dpy)))

  (when (get-command-line-option "--help")
    (usage)
    (exit 0))

  (let ((quiet nil))

    (define (do-eval form)
      (if quiet
	  (sawfish-client-eval-async form)
	(write standard-output (sawfish-client-eval form t))
	(write standard-output #\newline)))
	
    (let loop ((args (or command-line-args '("-"))))
      (cond ((null args))

	    ((string= (car args) "-q")
	     (setq quiet t)
	     (loop (cdr args)))

	    ((string= (car args) "-d") (loop (cdr args)))

	    ((and (string= (car args) "-f") (cdr args))
	     (do-eval `(,(read-from-string (cadr args))))
	     (loop (cddr args)))

	    ((and (string= (car args) "-c") (cdr args))
	     (do-eval `(call-command ',(read-from-string (cadr args))))
	     (loop (cddr args)))

	    ((and (string= (car args) "-r") (cdr args))
	     (do-eval `(require ',(read-from-string (cadr args))))
	     (loop (cddr args)))

	    ((and (string= (car args) "-e") (cdr args))
	     (do-eval (read-from-string (cadr args)))
	     (loop (cddr args)))

	    ((string= (car args) "-")
	     (require 'rep.io.readline)
	     (require 'rep.util.repl)
	     (format standard-output "\
sawfish %s, Copyright (C) 1999-2000 John Harper
sawfish comes with ABSOLUTELY NO WARRANTY; for details see the file COPYING\n"
		     (sawfish-client-eval 'sawfish-version))
	     (let ((r (sawfish-client-eval
		       `(progn
			  (require 'rep.util.repl)
			  (make-repl 'user)))))
	       (let-fluids ((current-repl r))
		 (write standard-output "\nEnter `,help' to list commands.\n")
		 (let loop ()
		   (let ((input (readline
				 (format nil (if (repl-pending r) "" "%s> ")
					 (repl-struct r)))))
		     (when input
		       (let ((out (sawfish-client-eval
				   `(progn
				      (require 'rep.util.repl)
				      (let* ((standard-output
					      (make-string-output-stream))
					     (standard-error standard-output)
					     (r ',r))
					(cons (and (repl-iterate r ',input) r)
					      (get-output-stream-string
					       standard-output)))))))
			 (setq r (car out))
			 (fluid-set current-repl r)
			 (write standard-output (cdr out))
			 (when r (loop))))))))
	     (loop (cdr args)))

	    ((string= (car args) "--")
	     (let ((text (make-string-output-stream)))
	       (copy-stream standard-input text)
	       (do-eval (read-from-string
			 (concat "\(progn"
				 (get-output-stream-string text)
				 "\)")))
	       (loop (cdr args))))

	    (t (format standard-error
		       "sawfish-client: unknown option `%s'\n" (car args))
	       (format standard-error
		       "Try `sawfish-client --help' for more information.\n")
	       (exit 1))))
    (exit 0)))
      
(define (rl-completion-generator w)
  (sawfish-client-eval
   `(repl-completions ',(fluid current-repl) ',w)))

(main)

;; Local variables:
;; major-mode: lisp-mode
;; End:


syntax highlighted by Code2HTML, v. 0.9.1