Key bindings for fg, bg, and stop job
Ignore SIGTTOU within Commander S and reset to default handler before exec
This commit is contained in:
		
							parent
							
								
									0f45f80db0
								
							
						
					
					
						commit
						60d1130cf4
					
				| 
						 | 
				
			
			@ -1,3 +1,13 @@
 | 
			
		|||
(define key-f (char->ascii #\f))
 | 
			
		||||
(define key-s (char->ascii #\s))
 | 
			
		||||
(define key-g (char->ascii #\g))
 | 
			
		||||
(define key-b (char->ascii #\b))
 | 
			
		||||
 | 
			
		||||
(define fg-key key-f)
 | 
			
		||||
(define bg-key key-b)
 | 
			
		||||
(define stop-job-key key-s)
 | 
			
		||||
(define refresh-key key-g)
 | 
			
		||||
 | 
			
		||||
(define (job-name->string name)
 | 
			
		||||
  (let ((port (open-output-string)))
 | 
			
		||||
    (display name port)
 | 
			
		||||
| 
						 | 
				
			
			@ -89,8 +99,18 @@
 | 
			
		|||
 | 
			
		||||
	((key-press)
 | 
			
		||||
	 (lambda (self key control-x-pressed?)
 | 
			
		||||
	   (set! select-list
 | 
			
		||||
		 (select-list-handle-key-press select-list key))
 | 
			
		||||
           (cond 
 | 
			
		||||
            ((= key fg-key)
 | 
			
		||||
             (continue-job-in-foreground (select-list-selected-entry select-list)))
 | 
			
		||||
            ((= key bg-key)
 | 
			
		||||
             (continue-job-in-background (select-list-selected-entry select-list)))
 | 
			
		||||
            ((= key stop-job-key)
 | 
			
		||||
             (stop-job (select-list-selected-entry select-list)))
 | 
			
		||||
            ((= key refresh-key)
 | 
			
		||||
             #f) ;; TODO
 | 
			
		||||
            (else
 | 
			
		||||
             (set! select-list
 | 
			
		||||
                   (select-list-handle-key-press select-list key))))
 | 
			
		||||
	   self))
 | 
			
		||||
 | 
			
		||||
	((get-selection-as-text) get-selection-as-text)	
 | 
			
		||||
| 
						 | 
				
			
			@ -200,16 +220,18 @@
 | 
			
		|||
 | 
			
		||||
    (define (handle-key-press self key control-x-pressed?)
 | 
			
		||||
      (cond
 | 
			
		||||
       ((= key (char->ascii #\f))
 | 
			
		||||
	(continue-job-in-foreground job)
 | 
			
		||||
	self)
 | 
			
		||||
       ((= key (char->ascii #\g))
 | 
			
		||||
	(set! select-list (make-job-select-list job))
 | 
			
		||||
	self)
 | 
			
		||||
       ((= key fg-key)
 | 
			
		||||
	(continue-job-in-foreground job))
 | 
			
		||||
       ((= key bg-key)
 | 
			
		||||
        (continue-job-in-background job))
 | 
			
		||||
       ((= key refresh-key)
 | 
			
		||||
	(set! select-list (make-job-select-list job)))
 | 
			
		||||
       ((= key stop-job-key)
 | 
			
		||||
        (stop-job job))
 | 
			
		||||
       (else
 | 
			
		||||
	(set! select-list
 | 
			
		||||
	      (select-list-handle-key-press select-list key))
 | 
			
		||||
	self)))
 | 
			
		||||
	      (select-list-handle-key-press select-list key))))
 | 
			
		||||
      self)
 | 
			
		||||
 | 
			
		||||
    (set! select-list (make-job-select-list job))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -90,11 +90,10 @@
 | 
			
		|||
  (eq? (job-run-status job) 'stopped))
 | 
			
		||||
 | 
			
		||||
(define (signal-job signal job)
 | 
			
		||||
  (signal-process-group signal (job-proc job)))
 | 
			
		||||
  (signal-process-group (job-proc job) signal))
 | 
			
		||||
  
 | 
			
		||||
(define (stop-job job)
 | 
			
		||||
  (signal-process-group 
 | 
			
		||||
   (proc:pid (job-proc job)) signal/stop))
 | 
			
		||||
  (signal-job signal/stop job))
 | 
			
		||||
 | 
			
		||||
(define (continue-job job)
 | 
			
		||||
  (set-job-status! job (make-placeholder))
 | 
			
		||||
| 
						 | 
				
			
			@ -102,7 +101,7 @@
 | 
			
		|||
  (signal-process-group 
 | 
			
		||||
   (proc:pid (job-proc job)) signal/cont)
 | 
			
		||||
  (spawn-job-status-surveillant job)
 | 
			
		||||
  (send notify-continue/foreground-channel job))
 | 
			
		||||
  (send notify-continue-channel job))
 | 
			
		||||
 | 
			
		||||
(define (pause-job-output job)
 | 
			
		||||
  (pause-console-output (job-console job)))
 | 
			
		||||
| 
						 | 
				
			
			@ -128,6 +127,9 @@
 | 
			
		|||
	(wait-for-key)
 | 
			
		||||
	(release-lock paint-lock))))
 | 
			
		||||
 | 
			
		||||
(define (continue-job-in-background job)
 | 
			
		||||
  (continue-job job))
 | 
			
		||||
 | 
			
		||||
;; channels for communicating with the joblist surveillant
 | 
			
		||||
 | 
			
		||||
(define add-job-channel
 | 
			
		||||
| 
						 | 
				
			
			@ -139,7 +141,7 @@
 | 
			
		|||
(define clear-ready-jobs-channel
 | 
			
		||||
  (make-channel))
 | 
			
		||||
 | 
			
		||||
(define notify-continue/foreground-channel
 | 
			
		||||
(define notify-continue-channel
 | 
			
		||||
  (make-channel))
 | 
			
		||||
 | 
			
		||||
(define (add-job! job)
 | 
			
		||||
| 
						 | 
				
			
			@ -205,7 +207,7 @@
 | 
			
		|||
		      (lp (cons new-job running)
 | 
			
		||||
			  ready stopped new-output waiting-for-input #t)))
 | 
			
		||||
 | 
			
		||||
	      (wrap (receive-rv notify-continue/foreground-channel)
 | 
			
		||||
	      (wrap (receive-rv notify-continue-channel)
 | 
			
		||||
		    (lambda (job)
 | 
			
		||||
		      (lp (cons job running)
 | 
			
		||||
			  ready 
 | 
			
		||||
| 
						 | 
				
			
			@ -251,7 +253,9 @@
 | 
			
		|||
					  ready stopped
 | 
			
		||||
					  (cons job new-output)
 | 
			
		||||
					  waiting-for-input #t))
 | 
			
		||||
				     ((= signal signal/tstp)
 | 
			
		||||
				     ((or (= signal signal/tstp)
 | 
			
		||||
                                          (= signal signal/stop))
 | 
			
		||||
                                      ;; TODO catch any other signal here
 | 
			
		||||
				      (stop-job job)
 | 
			
		||||
				      (lp (delete job running)
 | 
			
		||||
					  ready (cons job stopped)
 | 
			
		||||
| 
						 | 
				
			
			@ -294,6 +298,7 @@
 | 
			
		|||
      (lambda ()
 | 
			
		||||
	(fork-pty-session
 | 
			
		||||
	 (lambda () 
 | 
			
		||||
           (handle-signal-default signal/ttou)
 | 
			
		||||
	   (eval-s-expr s-expr))))
 | 
			
		||||
    (lambda (proc pty-in pty-out tty-name)
 | 
			
		||||
      (make-job-with-console
 | 
			
		||||
| 
						 | 
				
			
			@ -324,9 +329,12 @@
 | 
			
		|||
	   (proc
 | 
			
		||||
	    (fork
 | 
			
		||||
	     (lambda ()
 | 
			
		||||
	       (set-process-group (pid) (pid))
 | 
			
		||||
	       (set-tty-process-group (current-output-port) (pid))
 | 
			
		||||
	       (eval-s-expr s-expr)))))
 | 
			
		||||
               (let ((child-pid (pid)))
 | 
			
		||||
                 (set-process-group child-pid)
 | 
			
		||||
                 (set-tty-process-group (current-output-port) child-pid)
 | 
			
		||||
                 (handle-signal-default signal/ttou)
 | 
			
		||||
                 (eval-s-expr s-expr))))))
 | 
			
		||||
       (sleep 1000)
 | 
			
		||||
       (let* ((job (make-job-sans-console s-expr proc))
 | 
			
		||||
	      (status (job-status job)))
 | 
			
		||||
	 (set-tty-process-group (current-output-port) foreground-pgrp)
 | 
			
		||||
| 
						 | 
				
			
			@ -350,6 +358,7 @@
 | 
			
		|||
	 (fork
 | 
			
		||||
	  (lambda ()
 | 
			
		||||
	    (set-process-group (pid) (pid))
 | 
			
		||||
            (handle-signal-default signal/ttou)
 | 
			
		||||
	    (eval-s-expr s-expr)))))
 | 
			
		||||
    (let ((job (make-job-sans-console s-expr proc)))
 | 
			
		||||
      (release-lock paint-lock)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -299,6 +299,7 @@
 | 
			
		|||
 | 
			
		||||
;; handle input
 | 
			
		||||
(define (run)
 | 
			
		||||
  (ignore-signal signal/ttou)
 | 
			
		||||
  (save-initial-tty-info! (current-input-port))
 | 
			
		||||
 | 
			
		||||
  (autoreap-policy #f)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -591,6 +591,7 @@
 | 
			
		|||
	  jobs-waiting-for-input
 | 
			
		||||
 | 
			
		||||
	  continue-job-in-foreground
 | 
			
		||||
          continue-job-in-background
 | 
			
		||||
 | 
			
		||||
	  signal-job
 | 
			
		||||
	  stop-job
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue