the command-window now uses command-buffers based on input-fields instead of input-buffers
This commit is contained in:
		
							parent
							
								
									1ef838007d
								
							
						
					
					
						commit
						475177b891
					
				| 
						 | 
				
			
			@ -0,0 +1,404 @@
 | 
			
		|||
;; History
 | 
			
		||||
 | 
			
		||||
;(define command-history-pos 0)
 | 
			
		||||
(define the-command-history (make-empty-history))
 | 
			
		||||
 | 
			
		||||
(define (command-history) the-command-history)
 | 
			
		||||
 | 
			
		||||
(define *current-command-history-item* #f)
 | 
			
		||||
 | 
			
		||||
(define (current-command-history-item)
 | 
			
		||||
  *current-command-history-item*)
 | 
			
		||||
 | 
			
		||||
(define-record-type command-history-entry :command-history-entry
 | 
			
		||||
  (make-command-history-entry prompt window-lines)
 | 
			
		||||
  command-history-entry?
 | 
			
		||||
  (prompt        command-history-entry-prompt)
 | 
			
		||||
  (window-lines  command-history-entry-window-lines))
 | 
			
		||||
 | 
			
		||||
(define input-field->command-history-item
 | 
			
		||||
  (lambda (input-field)
 | 
			
		||||
    (let* ((prompt (input-field-prompt input-field))
 | 
			
		||||
	   (w-l (map list->string 
 | 
			
		||||
		     (input-field-window-lines input-field)))
 | 
			
		||||
	   (window-lines (cons (substring (car w-l)
 | 
			
		||||
					  (string-length prompt)
 | 
			
		||||
					  (string-length (car w-l)))
 | 
			
		||||
			       (cdr w-l))))
 | 
			
		||||
      (make-command-history-entry prompt window-lines))))
 | 
			
		||||
 | 
			
		||||
(define (append-to-command-history! history-entry)
 | 
			
		||||
  (append-history-item! the-command-history history-entry)
 | 
			
		||||
  (set! *current-command-history-item* 
 | 
			
		||||
	(history-last-entry the-command-history)))
 | 
			
		||||
 | 
			
		||||
;;  one step back in the history
 | 
			
		||||
(define (command-history-back!)
 | 
			
		||||
  (cond
 | 
			
		||||
   ((and (current-command-history-item)
 | 
			
		||||
	 (history-prev-entry (current-command-history-item)))
 | 
			
		||||
    => (lambda (prev)
 | 
			
		||||
	 (set! *current-command-history-item* prev)))
 | 
			
		||||
   (else (values))))
 | 
			
		||||
 | 
			
		||||
;; one step forward
 | 
			
		||||
(define (command-history-forward!)
 | 
			
		||||
  (cond
 | 
			
		||||
   ((and *current-command-history-item*
 | 
			
		||||
	 (history-next-entry *current-command-history-item*))
 | 
			
		||||
    => (lambda (next)
 | 
			
		||||
	 (set! *current-command-history-item* next)))
 | 
			
		||||
   (else (values))))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
(define *history-down?* #t)
 | 
			
		||||
					       
 | 
			
		||||
(define history-up
 | 
			
		||||
  (lambda (com-buf)
 | 
			
		||||
    (let ((last-entry (history-last-entry (command-history))))
 | 
			
		||||
      (if last-entry
 | 
			
		||||
	  (if *history-down?*
 | 
			
		||||
	      (begin
 | 
			
		||||
		(set! *history-down?* #f)
 | 
			
		||||
		(set-command-buffer-keep-in-mind! com-buf 
 | 
			
		||||
						  (input-field-text (command-buffer-input-field com-buf)))
 | 
			
		||||
		(set-command-buffer-text! com-buf 
 | 
			
		||||
					  (fold-right string-append
 | 
			
		||||
						      ""
 | 
			
		||||
						      (command-history-entry-window-lines 
 | 
			
		||||
						       (entry-data *current-command-history-item*)))))
 | 
			
		||||
	      (let ((current-window-lines (command-history-entry-window-lines 
 | 
			
		||||
					   (entry-data *current-command-history-item*))))
 | 
			
		||||
		(command-history-back!)
 | 
			
		||||
		(set-command-buffer-text! com-buf 
 | 
			
		||||
					  (fold-right string-append
 | 
			
		||||
						      ""
 | 
			
		||||
						      (command-history-entry-window-lines 
 | 
			
		||||
						       (entry-data *current-command-history-item*))))
 | 
			
		||||
		(if (and (not (eq? *current-command-history-item*
 | 
			
		||||
				   (history-first-entry (command-history))))
 | 
			
		||||
			 (equal? current-window-lines
 | 
			
		||||
				 (command-history-entry-window-lines 
 | 
			
		||||
				  (entry-data *current-command-history-item*))))
 | 
			
		||||
		    (history-up com-buf)
 | 
			
		||||
		    (values))))
 | 
			
		||||
	  (values)))))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
(define history-down
 | 
			
		||||
  (lambda (com-buf)
 | 
			
		||||
    (let ((last-entry (history-last-entry (command-history))))
 | 
			
		||||
      (if last-entry
 | 
			
		||||
	  (if (eq? *current-command-history-item*
 | 
			
		||||
		   (history-last-entry (command-history)))
 | 
			
		||||
	      (begin
 | 
			
		||||
		(if (command-buffer-keep-in-mind com-buf)
 | 
			
		||||
		    (set-command-buffer-text! com-buf (command-buffer-keep-in-mind com-buf)))
 | 
			
		||||
		(set! *history-down?* #t))
 | 
			
		||||
	      (let ((current-window-lines (command-history-entry-window-lines 
 | 
			
		||||
					   (entry-data *current-command-history-item*))))
 | 
			
		||||
		(command-history-forward!)
 | 
			
		||||
		(set-command-buffer-text! com-buf
 | 
			
		||||
					  (fold-right string-append
 | 
			
		||||
						      ""
 | 
			
		||||
						      (command-history-entry-window-lines 
 | 
			
		||||
						       (entry-data *current-command-history-item*))))
 | 
			
		||||
		(if (equal? current-window-lines
 | 
			
		||||
			   (command-history-entry-window-lines 
 | 
			
		||||
			    (entry-data *current-command-history-item*)))
 | 
			
		||||
		    (history-down com-buf)
 | 
			
		||||
		    (values))))
 | 
			
		||||
	  (values)))))
 | 
			
		||||
 | 
			
		||||
;; Buffer
 | 
			
		||||
 | 
			
		||||
(define-record-type command-buffer :command-buffer
 | 
			
		||||
  (really-make-command-buffer win
 | 
			
		||||
			      prompt
 | 
			
		||||
			      x-loc y-loc
 | 
			
		||||
			      x-dim y-dim
 | 
			
		||||
			      history-scroll
 | 
			
		||||
			      input-field 
 | 
			
		||||
			      keep-in-mind)
 | 
			
		||||
  command-buffer?
 | 
			
		||||
  (win            command-buffer-win            set-command-buffer-win!)
 | 
			
		||||
  (prompt         command-buffer-prompt         set-command-buffer-prompt!)
 | 
			
		||||
  (x-loc          command-buffer-x-loc          set-command-buffer-x-loc!)
 | 
			
		||||
  (y-loc          command-buffer-y-loc          set-command-buffer-y-loc!)
 | 
			
		||||
  (x-dim          command-buffer-x-dim          set-command-buffer-x-dim!)
 | 
			
		||||
  (y-dim          command-buffer-y-dim          set-command-buffer-y-dim!)
 | 
			
		||||
  (history-scroll command-buffer-history-scroll set-command-buffer-history-scroll!)
 | 
			
		||||
  (input-field    command-buffer-input-field    set-command-buffer-input-field!)
 | 
			
		||||
  (keep-in-mind   command-buffer-keep-in-mind   set-command-buffer-keep-in-mind!))
 | 
			
		||||
 | 
			
		||||
(define make-command-buffer
 | 
			
		||||
  (lambda (win prompt x-loc y-loc x-dim y-dim)
 | 
			
		||||
    (really-make-command-buffer win
 | 
			
		||||
				prompt
 | 
			
		||||
				x-loc y-loc
 | 
			
		||||
				x-dim y-dim
 | 
			
		||||
				0
 | 
			
		||||
				(make&install-input-field win
 | 
			
		||||
							  x-loc y-loc ;; later y-loc and y-dim will
 | 
			
		||||
							  x-dim y-dim ;; be dynamically calculated
 | 
			
		||||
							  (if (procedure? prompt)
 | 
			
		||||
							      (prompt)
 | 
			
		||||
							      prompt)
 | 
			
		||||
							  ""
 | 
			
		||||
							  standard-behavior-pro)
 | 
			
		||||
				#f)))
 | 
			
		||||
 | 
			
		||||
(define make-buffer make-command-buffer)
 | 
			
		||||
 | 
			
		||||
(define buffer-pos-col
 | 
			
		||||
  (lambda (com-buf)
 | 
			
		||||
    (let ((input-field (command-buffer-input-field com-buf)))
 | 
			
		||||
    (- (input-field-x-edit-pos input-field)
 | 
			
		||||
       (string-length (input-field-prompt input-field))))))
 | 
			
		||||
 | 
			
		||||
(define history-lines-from-history
 | 
			
		||||
  (lambda (n)
 | 
			
		||||
    (let loop ((current-entry (history-last-entry (command-history)))
 | 
			
		||||
	       (n n)
 | 
			
		||||
	       (history-lines '()))
 | 
			
		||||
      (if (or (< n 0)
 | 
			
		||||
	      (not current-entry))
 | 
			
		||||
	  history-lines
 | 
			
		||||
	  (let* ((current-item (entry-data current-entry))
 | 
			
		||||
		 (new-lines-wo-prompt (command-history-entry-window-lines current-item))
 | 
			
		||||
		 (new-lines (cons (string-append (command-history-entry-prompt current-item)
 | 
			
		||||
						 (car new-lines-wo-prompt))
 | 
			
		||||
				  (cdr new-lines-wo-prompt)))
 | 
			
		||||
		 (new-n (- n (length new-lines))))
 | 
			
		||||
	    (loop (history-prev-entry current-entry)
 | 
			
		||||
		  new-n
 | 
			
		||||
		  (append new-lines history-lines)))))))
 | 
			
		||||
 | 
			
		||||
(define print-command-buffer
 | 
			
		||||
  (lambda (com-buf)           
 | 
			
		||||
    (print-history-lines com-buf) 
 | 
			
		||||
    (print-input-field com-buf)))    
 | 
			
		||||
 | 
			
		||||
(define print-history-lines
 | 
			
		||||
  (lambda (com-buf)
 | 
			
		||||
    (let* ((win (command-buffer-win com-buf))
 | 
			
		||||
	   (x-loc (command-buffer-x-loc com-buf))
 | 
			
		||||
	   (y-loc (command-buffer-y-loc com-buf))
 | 
			
		||||
	   (x-dim (command-buffer-x-dim com-buf))
 | 
			
		||||
	   (history-lines (history-lines-from-history (+ (command-buffer-y-dim com-buf)
 | 
			
		||||
							 (command-buffer-history-scroll com-buf))))
 | 
			
		||||
	   (history-lines-to (take history-lines
 | 
			
		||||
				   (max (- (length history-lines)
 | 
			
		||||
					   (command-buffer-history-scroll com-buf))
 | 
			
		||||
					(- (command-buffer-y-dim com-buf)
 | 
			
		||||
					   (input-field-y-size 
 | 
			
		||||
					    (command-buffer-input-field com-buf))))))
 | 
			
		||||
	   (history-lines-to-print (drop history-lines-to
 | 
			
		||||
					 (max 0
 | 
			
		||||
					      (- (length history-lines-to)
 | 
			
		||||
						 (- (command-buffer-y-dim com-buf)
 | 
			
		||||
						    (input-field-y-size 
 | 
			
		||||
						     (command-buffer-input-field com-buf))))))))
 | 
			
		||||
      (let loop ((lines history-lines-to-print)
 | 
			
		||||
		 (y-ofst 0))
 | 
			
		||||
	(if (null? lines)
 | 
			
		||||
	    #t
 | 
			
		||||
	    (begin
 | 
			
		||||
	      (mvwaddstr win 
 | 
			
		||||
			   (+ y-loc y-ofst)
 | 
			
		||||
			   x-loc
 | 
			
		||||
			   (fill-string (car lines) #\space x-dim))
 | 
			
		||||
	      (loop (cdr lines)
 | 
			
		||||
		    (+ y-ofst 1))))))))
 | 
			
		||||
 | 
			
		||||
(define print-input-field 
 | 
			
		||||
  (lambda (com-buf)
 | 
			
		||||
    (input-field-refresh (command-buffer-input-field com-buf))))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
;; Input
 | 
			
		||||
 | 
			
		||||
(define input
 | 
			
		||||
  (lambda (com-buf asc)
 | 
			
		||||
    (cond ((or (= asc 13)
 | 
			
		||||
	       (= asc 10))
 | 
			
		||||
	   (return-pressed-action com-buf))
 | 
			
		||||
	  ((= asc key-up)
 | 
			
		||||
	   (history-up com-buf))
 | 
			
		||||
	  ((= asc key-down)
 | 
			
		||||
	   (history-down com-buf))
 | 
			
		||||
;	  ((= asc 23) ; C-w
 | 
			
		||||
;	   (scroll-up-history-window-lines com-buf))
 | 
			
		||||
;	  ((= asc 5) ; C-e
 | 
			
		||||
;	   (scroll-down-history-window-lines com-buf))
 | 
			
		||||
	  (else 
 | 
			
		||||
	   (call-with-values
 | 
			
		||||
	       (lambda ()
 | 
			
		||||
		 (send-input-field (command-buffer-input-field com-buf)
 | 
			
		||||
				   asc))
 | 
			
		||||
	     (lambda (was-known has-changed)
 | 
			
		||||
	       (if (eq? was-known 'buffer-full)
 | 
			
		||||
		   (enlarge-input-field com-buf asc)
 | 
			
		||||
		   #t)))))))
 | 
			
		||||
 | 
			
		||||
(define return-pressed-action
 | 
			
		||||
  (lambda (com-buf) 
 | 
			
		||||
    (append-to-command-history! (input-field->command-history-item 
 | 
			
		||||
				 (command-buffer-input-field com-buf)))
 | 
			
		||||
    (set-command-buffer-keep-in-mind! com-buf #f)
 | 
			
		||||
    (set-command-buffer-history-scroll! com-buf 0)
 | 
			
		||||
    (set! *current-command-history-item* (history-last-entry (command-history)))
 | 
			
		||||
    (set! *history-down?* #t)
 | 
			
		||||
    (let ((new-input-field-y-dim (max 1 
 | 
			
		||||
				      (- (command-buffer-y-dim com-buf)
 | 
			
		||||
					 (length (history-lines-from-history 
 | 
			
		||||
						  (command-buffer-y-dim com-buf))))))
 | 
			
		||||
	  (old-input-field (command-buffer-input-field com-buf)))
 | 
			
		||||
      (set-command-buffer-input-field! com-buf
 | 
			
		||||
				       (make&install-input-field 
 | 
			
		||||
					(command-buffer-win com-buf)
 | 
			
		||||
					(command-buffer-x-loc com-buf)
 | 
			
		||||
					(+ (command-buffer-y-loc com-buf)
 | 
			
		||||
					   (- (command-buffer-y-dim com-buf)
 | 
			
		||||
					      new-input-field-y-dim))
 | 
			
		||||
					(command-buffer-x-dim com-buf)
 | 
			
		||||
					new-input-field-y-dim
 | 
			
		||||
					(let ((prompt (command-buffer-prompt com-buf)))
 | 
			
		||||
					  (if (procedure? prompt)
 | 
			
		||||
					      (prompt)
 | 
			
		||||
					      prompt))
 | 
			
		||||
					""
 | 
			
		||||
					standard-behavior-pro))
 | 
			
		||||
      (remove-input-field old-input-field))
 | 
			
		||||
    (print-command-buffer com-buf)))
 | 
			
		||||
		
 | 
			
		||||
(define scroll-up-history-window-lines
 | 
			
		||||
  (lambda (com-buf)
 | 
			
		||||
    (let ((scroll (command-buffer-history-scroll com-buf)))
 | 
			
		||||
      (if (< scroll (- (length (history-lines-from-history (+ scroll
 | 
			
		||||
							      (command-buffer-y-dim com-buf))))
 | 
			
		||||
		       (- (command-buffer-y-dim com-buf)
 | 
			
		||||
			  (input-field-y-size (command-buffer-input-field com-buf)))))
 | 
			
		||||
	  (begin
 | 
			
		||||
	    (set-command-buffer-history-scroll! com-buf (+ scroll 1))
 | 
			
		||||
	    (print-command-buffer com-buf))))))
 | 
			
		||||
 | 
			
		||||
(define scroll-down-history-window-lines
 | 
			
		||||
  (lambda (com-buf)
 | 
			
		||||
    (let ((scroll (command-buffer-history-scroll com-buf)))
 | 
			
		||||
      (if (> scroll 0)
 | 
			
		||||
	  (begin
 | 
			
		||||
	    (set-command-buffer-history-scroll! com-buf (- scroll 1))
 | 
			
		||||
	    (print-command-buffer com-buf))))))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
(define command-buffer-text
 | 
			
		||||
  (lambda (com-buf)
 | 
			
		||||
    (input-field-text (command-buffer-input-field com-buf))))
 | 
			
		||||
 | 
			
		||||
(define buffer-text command-buffer-text)
 | 
			
		||||
 | 
			
		||||
(define set-command-buffer-text!
 | 
			
		||||
  (lambda (com-buf text)
 | 
			
		||||
    (let* ((buffer-y-dim (command-buffer-y-dim com-buf))
 | 
			
		||||
	   (buffer-x-dim (command-buffer-x-dim com-buf))
 | 
			
		||||
	   (input-field (command-buffer-input-field com-buf))
 | 
			
		||||
	   (prompt (input-field-prompt input-field))
 | 
			
		||||
	   (needed-y-dim (max 1
 | 
			
		||||
			      (+ (quotient (+ (string-length prompt)
 | 
			
		||||
					      (string-length text))
 | 
			
		||||
					   buffer-x-dim)
 | 
			
		||||
				 1))))
 | 
			
		||||
      (set-input-field-text! input-field "")
 | 
			
		||||
      (if (> needed-y-dim buffer-y-dim)
 | 
			
		||||
	  (begin 
 | 
			
		||||
	    (input-field-move input-field 
 | 
			
		||||
			      (command-buffer-x-loc com-buf)
 | 
			
		||||
			      (command-buffer-y-loc com-buf))
 | 
			
		||||
	    (input-field-resize input-field
 | 
			
		||||
				buffer-x-dim
 | 
			
		||||
				buffer-y-dim)
 | 
			
		||||
	    (if (not (input-field-y-scroll input-field))
 | 
			
		||||
		(input-field-toggle-y-scroll input-field)))
 | 
			
		||||
	  (let* ((new-input-field-y-dim (max needed-y-dim
 | 
			
		||||
				      (- (command-buffer-y-dim com-buf)
 | 
			
		||||
					 (length (history-lines-from-history 
 | 
			
		||||
						  (command-buffer-y-dim com-buf))))))
 | 
			
		||||
		 (move-input-field (lambda ()
 | 
			
		||||
			      (input-field-move input-field
 | 
			
		||||
						(input-field-x-location input-field)
 | 
			
		||||
						(+ (command-buffer-y-loc com-buf)
 | 
			
		||||
						   (- (command-buffer-y-dim com-buf)
 | 
			
		||||
						      new-input-field-y-dim)))))
 | 
			
		||||
		 (resize-input-field (lambda ()
 | 
			
		||||
				(input-field-resize input-field
 | 
			
		||||
						    buffer-x-dim
 | 
			
		||||
						    new-input-field-y-dim))))
 | 
			
		||||
	    (if (> new-input-field-y-dim (input-field-y-size input-field))
 | 
			
		||||
		(begin (move-input-field) (resize-input-field))
 | 
			
		||||
		(begin (resize-input-field) (move-input-field)))
 | 
			
		||||
	    (if (input-field-y-scroll input-field)
 | 
			
		||||
		(input-field-toggle-y-scroll input-field))))
 | 
			
		||||
      (set-input-field-text! input-field text))))
 | 
			
		||||
 | 
			
		||||
(define set-buffer-text! set-command-buffer-text!)
 | 
			
		||||
 | 
			
		||||
(define change-command-buffer-prompt!
 | 
			
		||||
  (lambda (com-buf prompt)
 | 
			
		||||
    (let* ((new-input-field-y-dim (max 1 
 | 
			
		||||
				       (- (command-buffer-y-dim com-buf)
 | 
			
		||||
					  (length (history-lines-from-history 
 | 
			
		||||
						   (command-buffer-y-dim com-buf))))))
 | 
			
		||||
	   (old-input-field (command-buffer-input-field com-buf))
 | 
			
		||||
	   (text (input-field-text old-input-field)))
 | 
			
		||||
      (set-command-buffer-prompt! com-buf prompt)
 | 
			
		||||
      (set-command-buffer-input-field! com-buf
 | 
			
		||||
				       (make&install-input-field 
 | 
			
		||||
					(command-buffer-win com-buf)
 | 
			
		||||
					(command-buffer-x-loc com-buf)
 | 
			
		||||
					(+ (command-buffer-y-loc com-buf)
 | 
			
		||||
					   (- (command-buffer-y-dim com-buf)
 | 
			
		||||
					      new-input-field-y-dim))
 | 
			
		||||
					(command-buffer-x-dim com-buf)
 | 
			
		||||
					new-input-field-y-dim
 | 
			
		||||
					(let ((prompt (command-buffer-prompt com-buf)))
 | 
			
		||||
					  (if (procedure? prompt)
 | 
			
		||||
					      (prompt)
 | 
			
		||||
					      prompt))
 | 
			
		||||
					""
 | 
			
		||||
					standard-behavior-pro))
 | 
			
		||||
      (set-command-buffer-text! com-buf text)
 | 
			
		||||
      (remove-input-field old-input-field))
 | 
			
		||||
    (print-command-buffer com-buf)))
 | 
			
		||||
 | 
			
		||||
(define enlarge-input-field
 | 
			
		||||
  (lambda (com-buf asc)
 | 
			
		||||
    (let ((input-field (command-buffer-input-field com-buf)))
 | 
			
		||||
      (if (= (command-buffer-y-dim com-buf)
 | 
			
		||||
	     (input-field-y-size input-field))
 | 
			
		||||
	(begin
 | 
			
		||||
	  (input-field-toggle-y-scroll input-field)
 | 
			
		||||
	  (send-input-field input-field key-right))
 | 
			
		||||
	(begin 
 | 
			
		||||
	  (input-field-move input-field
 | 
			
		||||
			    (input-field-x-location input-field)
 | 
			
		||||
			    (- (input-field-y-location input-field)
 | 
			
		||||
			       1))
 | 
			
		||||
	  (input-field-resize input-field 
 | 
			
		||||
			      (input-field-x-size input-field)
 | 
			
		||||
			      (+ (input-field-y-size input-field)
 | 
			
		||||
				 1))
 | 
			
		||||
	  (send-input-field input-field asc)
 | 
			
		||||
	  (send-input-field input-field key-right)))
 | 
			
		||||
      (print-command-buffer com-buf))))
 | 
			
		||||
 | 
			
		||||
(define fill-string
 | 
			
		||||
  (lambda (str ch len)
 | 
			
		||||
    (let loop ((len (- len (string-length str)))
 | 
			
		||||
	       (missing '()))
 | 
			
		||||
      (if (zero? len)
 | 
			
		||||
	  (string-append str
 | 
			
		||||
			 (list->string missing))
 | 
			
		||||
	  (loop (- len 1)
 | 
			
		||||
		(cons ch missing))))))
 | 
			
		||||
| 
						 | 
				
			
			@ -158,31 +158,29 @@
 | 
			
		|||
    (refresh-result-window))
 | 
			
		||||
   (else
 | 
			
		||||
    (focus-command-buffer!)
 | 
			
		||||
    (move-cursor (command-buffer) (result-buffer))
 | 
			
		||||
    (refresh-command-window))))
 | 
			
		||||
 | 
			
		||||
(define (current-command-line)
 | 
			
		||||
  (let ((entered (last (buffer-text (command-buffer)))))
 | 
			
		||||
  (let ((entered (buffer-text (command-buffer))))
 | 
			
		||||
    (if (string=? entered "")
 | 
			
		||||
	#f
 | 
			
		||||
	entered)))
 | 
			
		||||
 | 
			
		||||
(define (replace-current-command-line! text)
 | 
			
		||||
  (set-buffer-text! 
 | 
			
		||||
   (command-buffer)
 | 
			
		||||
   (reverse
 | 
			
		||||
    (cons text
 | 
			
		||||
	  (cdr (reverse (buffer-text (command-buffer))))))))
 | 
			
		||||
  (set-buffer-text! (command-buffer) text))
 | 
			
		||||
 | 
			
		||||
(define (toggle-command/scheme-mode)
 | 
			
		||||
  (cond 
 | 
			
		||||
   ((command-buffer-in-command-mode?)
 | 
			
		||||
    (enter-scheme-mode!))
 | 
			
		||||
    (enter-scheme-mode!)
 | 
			
		||||
    (change-command-buffer-prompt! (command-buffer) "> "))
 | 
			
		||||
   ((command-buffer-in-scheme-mode?)
 | 
			
		||||
    (enter-command-mode!)))
 | 
			
		||||
    (enter-command-mode!)
 | 
			
		||||
    (change-command-buffer-prompt! (command-buffer) (lambda ()
 | 
			
		||||
						      (string-append (cwd)
 | 
			
		||||
								     "> ")))))
 | 
			
		||||
  (paint-command-frame-window)
 | 
			
		||||
  (paint-command-window-contents)
 | 
			
		||||
  (move-cursor (command-buffer) (result-buffer))
 | 
			
		||||
  (refresh-command-window))
 | 
			
		||||
 | 
			
		||||
;; assumes we are in command mode
 | 
			
		||||
| 
						 | 
				
			
			@ -198,17 +196,14 @@
 | 
			
		|||
		       (compile-command-line parsed))))
 | 
			
		||||
		  (replace-current-command-line! scheme-str)
 | 
			
		||||
		  (enter-scheme-mode!)
 | 
			
		||||
		  (set-buffer-pos-col! (command-buffer) 
 | 
			
		||||
				       (+ 2 (string-length scheme-str)))
 | 
			
		||||
		  (paint-command-frame-window)
 | 
			
		||||
		  (paint-command-window-contents)
 | 
			
		||||
		  (move-cursor (command-buffer) (result-buffer))
 | 
			
		||||
		  (refresh-command-window))))
 | 
			
		||||
	  (else (values)))))
 | 
			
		||||
   (else (values))))
 | 
			
		||||
 | 
			
		||||
(define (handle-return-key)
 | 
			
		||||
  (let ((command-line (cadr (reverse (buffer-text (command-buffer))))))
 | 
			
		||||
  (let ((command-line (buffer-text (command-buffer))))
 | 
			
		||||
    (debug-message "command-line " command-line)
 | 
			
		||||
    (cond
 | 
			
		||||
     ((string=? command-line "")
 | 
			
		||||
| 
						 | 
				
			
			@ -282,7 +277,6 @@
 | 
			
		|||
      (paint-active-command-window)
 | 
			
		||||
      (paint-result-window new-entry)
 | 
			
		||||
      (refresh-result-window)
 | 
			
		||||
      (move-cursor (command-buffer) (result-buffer))
 | 
			
		||||
      (refresh-command-window)
 | 
			
		||||
      (release-lock paint-lock))))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -303,7 +297,6 @@
 | 
			
		|||
        (paint-active-command-window)
 | 
			
		||||
        (paint-result-window new-entry)
 | 
			
		||||
        (refresh-result-window)
 | 
			
		||||
        (move-cursor (command-buffer) (result-buffer))
 | 
			
		||||
        (refresh-command-window)
 | 
			
		||||
        (release-lock paint-lock))))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -315,9 +308,7 @@
 | 
			
		|||
   (send (current-viewer) 
 | 
			
		||||
	 'get-selection-as-text
 | 
			
		||||
	 (command-buffer-in-scheme-mode?) (focus-table)))
 | 
			
		||||
  (print-command-buffer (app-window-curses-win (command-window))
 | 
			
		||||
			(command-buffer))
 | 
			
		||||
  (move-cursor (command-buffer) (result-buffer))
 | 
			
		||||
  (print-command-buffer (command-buffer))
 | 
			
		||||
  (refresh-command-window)
 | 
			
		||||
  (refresh-result-window))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -329,9 +320,7 @@
 | 
			
		|||
	     (command-buffer-in-scheme-mode?)
 | 
			
		||||
	     (focus-table))
 | 
			
		||||
       (send (current-viewer) 'get-selection-as-ref (focus-table))))
 | 
			
		||||
  (print-command-buffer (app-window-curses-win (command-window))
 | 
			
		||||
			(command-buffer))
 | 
			
		||||
  (move-cursor (command-buffer) (result-buffer))
 | 
			
		||||
  (print-command-buffer (command-buffer))
 | 
			
		||||
  (refresh-command-window)
 | 
			
		||||
  (refresh-result-window))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -375,11 +364,10 @@
 | 
			
		|||
  (init-windows!)
 | 
			
		||||
  (read-config-file!)
 | 
			
		||||
  (set! *command-buffer-mode* (config 'main 'initial-command-mode))
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  (set-evaluation-package! 'nuit-eval)
 | 
			
		||||
 | 
			
		||||
  (clear)
 | 
			
		||||
 | 
			
		||||
  (if (not (process-group-leader?))
 | 
			
		||||
      (become-session-leader))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -399,11 +387,9 @@
 | 
			
		|||
	 (paint-job-status-list stats)
 | 
			
		||||
	 (paint-command-window-contents)
 | 
			
		||||
	 (wrefresh (app-window-curses-win (command-frame-window)))
 | 
			
		||||
	 (move-cursor (command-buffer) (result-buffer))
 | 
			
		||||
	 (refresh-command-window)
 | 
			
		||||
	 (release-lock paint-lock)
 | 
			
		||||
	 (lp (cml-receive statistics-channel))))))
 | 
			
		||||
 | 
			
		||||
  (paint)
 | 
			
		||||
  (let loop ((ch (wait-for-input)) 
 | 
			
		||||
             (c-x-pressed? #f))
 | 
			
		||||
| 
						 | 
				
			
			@ -417,7 +403,9 @@
 | 
			
		|||
            (when (current-history-item)
 | 
			
		||||
              (paint-result-window 
 | 
			
		||||
               (entry-data (current-history-item)))
 | 
			
		||||
              (refresh-result-window))))
 | 
			
		||||
              (refresh-result-window)
 | 
			
		||||
	      (if (focus-on-command-buffer?)
 | 
			
		||||
		  (refresh-command-window)))))
 | 
			
		||||
      (loop (wait-for-input) c-x-pressed?))
 | 
			
		||||
     ;; Ctrl-x -> wait for next input
 | 
			
		||||
     ((= ch key-control-x)
 | 
			
		||||
| 
						 | 
				
			
			@ -427,7 +415,7 @@
 | 
			
		|||
     ((and (focus-on-command-buffer?)
 | 
			
		||||
	   (command-buffer-in-command-mode?)
 | 
			
		||||
	   (= ch key-tab))
 | 
			
		||||
      (offer-completions (last (buffer-text (command-buffer))))
 | 
			
		||||
      (offer-completions (buffer-text (command-buffer)))
 | 
			
		||||
      (loop (wait-for-input) #f))
 | 
			
		||||
 | 
			
		||||
     ((and (focus-on-command-buffer?)
 | 
			
		||||
| 
						 | 
				
			
			@ -507,15 +495,13 @@
 | 
			
		|||
      (loop (wait-for-input) c-x-pressed?))
 | 
			
		||||
 | 
			
		||||
     ((and (focus-on-command-buffer?) (= ch 10))
 | 
			
		||||
      (handle-return-key)
 | 
			
		||||
      (input (command-buffer) ch)
 | 
			
		||||
      (obtain-lock paint-lock)
 | 
			
		||||
      (werase (app-window-curses-win (command-window)))
 | 
			
		||||
      (print-command-buffer (app-window-curses-win (command-window))
 | 
			
		||||
			    (command-buffer))
 | 
			
		||||
      (move-cursor (command-buffer) (result-buffer))
 | 
			
		||||
      (print-command-buffer (command-buffer))
 | 
			
		||||
      (refresh-command-window)
 | 
			
		||||
      (release-lock paint-lock)
 | 
			
		||||
      (handle-return-key)
 | 
			
		||||
      (loop (wait-for-input) c-x-pressed?))
 | 
			
		||||
 | 
			
		||||
     (else 
 | 
			
		||||
| 
						 | 
				
			
			@ -535,7 +521,6 @@
 | 
			
		|||
		(unset-redisplay-everything)))
 | 
			
		||||
 | 
			
		||||
	  (paint-result-window (entry-data (current-history-item)))
 | 
			
		||||
	  (move-cursor (command-buffer) (result-buffer))
 | 
			
		||||
	  (refresh-result-window)
 | 
			
		||||
	  (release-lock paint-lock))
 | 
			
		||||
	(loop (wait-for-input) #f))
 | 
			
		||||
| 
						 | 
				
			
			@ -543,9 +528,7 @@
 | 
			
		|||
	(input (command-buffer) ch)
 | 
			
		||||
	(obtain-lock paint-lock)
 | 
			
		||||
	(werase (app-window-curses-win (command-window)))
 | 
			
		||||
	(print-command-buffer (app-window-curses-win (command-window))
 | 
			
		||||
			      (command-buffer))
 | 
			
		||||
	(move-cursor (command-buffer) (result-buffer))
 | 
			
		||||
	(print-command-buffer (command-buffer))
 | 
			
		||||
	(refresh-command-window)
 | 
			
		||||
	(release-lock paint-lock)
 | 
			
		||||
	(loop (wait-for-input) c-x-pressed?)))))))
 | 
			
		||||
| 
						 | 
				
			
			@ -606,13 +589,7 @@
 | 
			
		|||
	   line))))))
 | 
			
		||||
 | 
			
		||||
(define (paint-command-window-contents)
 | 
			
		||||
  (set-buffer-num-lines! (command-buffer)
 | 
			
		||||
 			 (- (app-window-height (command-window)) 2))
 | 
			
		||||
  (set-buffer-num-cols! (command-buffer)
 | 
			
		||||
 			(- (app-window-width (command-window)) 3))
 | 
			
		||||
  (werase (app-window-curses-win (command-window)))
 | 
			
		||||
  (print-command-buffer (app-window-curses-win (command-window))
 | 
			
		||||
			(command-buffer)))
 | 
			
		||||
  (print-command-buffer (command-buffer)))
 | 
			
		||||
 | 
			
		||||
(define (refresh-command-window)
 | 
			
		||||
  (wrefresh (app-window-curses-win (command-window))))
 | 
			
		||||
| 
						 | 
				
			
			@ -635,9 +612,7 @@
 | 
			
		|||
(define (paint-result/command-buffer history-entry)
 | 
			
		||||
  (paint-result-window history-entry)
 | 
			
		||||
  (paint-active-command-window)
 | 
			
		||||
  (scroll-command-buffer)
 | 
			
		||||
  (paint-command-window-contents)
 | 
			
		||||
  (move-cursor (command-buffer) (result-buffer))
 | 
			
		||||
  (refresh-result-window)
 | 
			
		||||
  (refresh-command-window))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -648,9 +623,11 @@
 | 
			
		|||
  (paint-active-command-window)
 | 
			
		||||
  (paint-result-frame-window)
 | 
			
		||||
  ;(paint-result-window)
 | 
			
		||||
  (move-cursor (command-buffer) (result-buffer))
 | 
			
		||||
  (refresh-command-window)
 | 
			
		||||
  (refresh-result-window))
 | 
			
		||||
  (if (focus-on-command-buffer?)
 | 
			
		||||
      (begin (refresh-result-window)
 | 
			
		||||
	     (refresh-command-window))
 | 
			
		||||
      (begin (refresh-command-window)
 | 
			
		||||
	     (refresh-result-window))))
 | 
			
		||||
 | 
			
		||||
(define (wait-for-input)
 | 
			
		||||
  (noecho)
 | 
			
		||||
| 
						 | 
				
			
			@ -672,12 +649,6 @@
 | 
			
		|||
   (else 
 | 
			
		||||
    (make-standard-viewer result (result-buffer)))))
 | 
			
		||||
 | 
			
		||||
;;scroll buffer after one command was entered
 | 
			
		||||
(define (scroll-command-buffer)
 | 
			
		||||
  (set-buffer-pos-line! (command-buffer) 
 | 
			
		||||
			(+ (buffer-pos-line (command-buffer)) 1))
 | 
			
		||||
  (set-buffer-pos-col! (command-buffer) 2))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
(define (determine-plugin-by-type result)
 | 
			
		||||
  (find (lambda (r)
 | 
			
		||||
| 
						 | 
				
			
			@ -687,22 +658,7 @@
 | 
			
		|||
;;Management of the upper buffer
 | 
			
		||||
;;add a char to the buffer
 | 
			
		||||
(define (add-to-command-buffer ch)
 | 
			
		||||
  (let* ((text (buffer-text (command-buffer)))
 | 
			
		||||
	 (last-pos (- (length text) 1))
 | 
			
		||||
	 (old-last-el (list-ref text last-pos))
 | 
			
		||||
	 (old-rest (sublist text 0 last-pos))
 | 
			
		||||
	 (before-ch (substring old-last-el 0 
 | 
			
		||||
			       (max 0 (- (buffer-pos-col (command-buffer)) 2))))
 | 
			
		||||
	 (after-ch (substring old-last-el 
 | 
			
		||||
			      (max 0 (- (buffer-pos-col (command-buffer)) 2))
 | 
			
		||||
			      (string-length old-last-el)))
 | 
			
		||||
	 (new-last-el (string-append  before-ch
 | 
			
		||||
				      (string (ascii->char ch))
 | 
			
		||||
				      after-ch)))
 | 
			
		||||
    (set-buffer-text! (command-buffer)
 | 
			
		||||
		     (append old-rest (list new-last-el)))
 | 
			
		||||
    (set-buffer-pos-col! (command-buffer)
 | 
			
		||||
			 (+ (buffer-pos-col (command-buffer)) 1))))
 | 
			
		||||
  (input (command-buffer) ch))
 | 
			
		||||
 | 
			
		||||
;;add a string to the buffer
 | 
			
		||||
(define (add-string-to-command-buffer string)
 | 
			
		||||
| 
						 | 
				
			
			@ -736,21 +692,6 @@
 | 
			
		|||
		       width)))))
 | 
			
		||||
     (wrefresh win)))
 | 
			
		||||
 | 
			
		||||
;;Cursor
 | 
			
		||||
;;move cursor to the corrct position
 | 
			
		||||
(define (move-cursor command-buffer result-buffer)
 | 
			
		||||
  (cond
 | 
			
		||||
   ((focus-on-command-buffer?)
 | 
			
		||||
    (cursor-right-pos 
 | 
			
		||||
     (app-window-curses-win (command-window))
 | 
			
		||||
     command-buffer))
 | 
			
		||||
   (else
 | 
			
		||||
    (compute-y-x result-buffer)
 | 
			
		||||
    (wmove (app-window-curses-win (result-window)) 
 | 
			
		||||
	   (result-buffer-y result-buffer)
 | 
			
		||||
	   (result-buffer-x result-buffer))
 | 
			
		||||
    (wrefresh (app-window-curses-win (result-window))))))
 | 
			
		||||
 | 
			
		||||
;;compue pos-x and pos-y
 | 
			
		||||
(define (compute-y-x result-buffer)
 | 
			
		||||
  (let ((pos-result (result-buffer-line result-buffer))
 | 
			
		||||
| 
						 | 
				
			
			@ -790,20 +731,14 @@
 | 
			
		|||
 | 
			
		||||
(define (display-completed-line line cursor-pos)
 | 
			
		||||
  (debug-message "display-completed-line " line "," cursor-pos)
 | 
			
		||||
  (set-buffer-pos-col! (command-buffer) cursor-pos)
 | 
			
		||||
  (set-buffer-text! (command-buffer)
 | 
			
		||||
		    (append
 | 
			
		||||
		     (drop-right (buffer-text (command-buffer)) 1)
 | 
			
		||||
		     (list line)))
 | 
			
		||||
  (set-buffer-text! (command-buffer) line)
 | 
			
		||||
  (wclrtoeol (app-window-curses-win (command-window)))
 | 
			
		||||
  (print-command-buffer (app-window-curses-win (command-window))
 | 
			
		||||
			(command-buffer))
 | 
			
		||||
  (move-cursor (command-buffer) (result-buffer))
 | 
			
		||||
  (print-command-buffer (command-buffer))
 | 
			
		||||
  (refresh-command-window))
 | 
			
		||||
 | 
			
		||||
(define (current-cursor-index)
 | 
			
		||||
  ;; #### No, I will not comment on this.
 | 
			
		||||
  (- (buffer-pos-col (command-buffer)) 2))
 | 
			
		||||
  (buffer-pos-col (command-buffer))) ;; - 2
 | 
			
		||||
 | 
			
		||||
(define (offer-completions command)
 | 
			
		||||
  (debug-message "offer-completions '" command "' " (current-cursor-index))
 | 
			
		||||
| 
						 | 
				
			
			@ -891,4 +826,3 @@
 | 
			
		|||
          #f)
 | 
			
		||||
         (else
 | 
			
		||||
          #f))))))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -144,10 +144,28 @@
 | 
			
		|||
	rendezvous-channels
 | 
			
		||||
 | 
			
		||||
	ncurses
 | 
			
		||||
	command-buffer
 | 
			
		||||
	tty-debug
 | 
			
		||||
	layout)
 | 
			
		||||
  (files win))
 | 
			
		||||
 | 
			
		||||
(define-interface command-buffer-interface
 | 
			
		||||
  (export make-buffer
 | 
			
		||||
	  buffer-text
 | 
			
		||||
	  set-buffer-text!
 | 
			
		||||
	  change-command-buffer-prompt!
 | 
			
		||||
	  buffer-pos-col
 | 
			
		||||
	  input
 | 
			
		||||
	  print-command-buffer))
 | 
			
		||||
 | 
			
		||||
(define-structure command-buffer command-buffer-interface
 | 
			
		||||
  (open scheme-with-scsh
 | 
			
		||||
	srfi-1
 | 
			
		||||
	define-record-types
 | 
			
		||||
	ncurses
 | 
			
		||||
	history)
 | 
			
		||||
  (files command-buffer))
 | 
			
		||||
 | 
			
		||||
;;; process viewer plugin
 | 
			
		||||
 | 
			
		||||
(define-structure process-viewer
 | 
			
		||||
| 
						 | 
				
			
			@ -959,6 +977,7 @@
 | 
			
		|||
	destructuring
 | 
			
		||||
 | 
			
		||||
	(modify ncurses (hide filter))
 | 
			
		||||
	command-buffer
 | 
			
		||||
	app-windows
 | 
			
		||||
	initial-tty
 | 
			
		||||
	nuit-windows 
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,13 +34,23 @@
 | 
			
		|||
(define *result-frame-window* #f)
 | 
			
		||||
(define (result-frame-window) *result-frame-window*)
 | 
			
		||||
 | 
			
		||||
(define *command-buffer*
 | 
			
		||||
  (make-buffer '("pwd" "")
 | 
			
		||||
	       2 2 2 1 1
 | 
			
		||||
	       0 0
 | 
			
		||||
	       #t 1))
 | 
			
		||||
(define *command-buffer* #f)
 | 
			
		||||
;  (make-buffer '("pwd" "")
 | 
			
		||||
;	       2 2 2 1 1
 | 
			
		||||
;	       0 0
 | 
			
		||||
;	       #t 1))
 | 
			
		||||
 | 
			
		||||
(define (command-buffer) *command-buffer*)
 | 
			
		||||
(define (command-buffer) 
 | 
			
		||||
  (if *command-buffer*
 | 
			
		||||
      *command-buffer*
 | 
			
		||||
      (let ((buf (make-buffer (app-window-curses-win (command-window))
 | 
			
		||||
			     (lambda () 
 | 
			
		||||
			       (string-append (cwd) "> "))
 | 
			
		||||
			     0 0
 | 
			
		||||
			     (- (app-window-width (command-window)) 0)
 | 
			
		||||
			     (- (app-window-height (command-window)) 1))))
 | 
			
		||||
	(set! *command-buffer* buf)
 | 
			
		||||
	buf)))			     
 | 
			
		||||
 | 
			
		||||
(define *result-buffer*
 | 
			
		||||
  (make-result-buffer 0 0 0 0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue