|  | @@ -1,16 +1,77 @@
 | 
	
		
			
				|  |  | -package door
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import (
 | 
	
		
			
				|  |  | -	"syscall"
 | 
	
		
			
				|  |  | -)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func Writer(handle int, writerChannel *chan string) {
 | 
	
		
			
				|  |  | -	for output := range *writerChannel {
 | 
	
		
			
				|  |  | -		buffer := []byte(output)
 | 
	
		
			
				|  |  | -		n, err := syscall.Write(handle, buffer)
 | 
	
		
			
				|  |  | -		if (err != nil) || (n != len(buffer)) {
 | 
	
		
			
				|  |  | -			close(*writerChannel)
 | 
	
		
			
				|  |  | -			break
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +package door
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import (
 | 
	
		
			
				|  |  | +	"log"
 | 
	
		
			
				|  |  | +	"strings"
 | 
	
		
			
				|  |  | +	"syscall"
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// https://go101.org/article/channel-closing.html
 | 
	
		
			
				|  |  | +func Writer2(handle int, d *Door) {
 | 
	
		
			
				|  |  | +	log.Println("Writer2")
 | 
	
		
			
				|  |  | +	defer d.wg.Done()
 | 
	
		
			
				|  |  | +	for {
 | 
	
		
			
				|  |  | +		select {
 | 
	
		
			
				|  |  | +		case <-d.closeChannel:
 | 
	
		
			
				|  |  | +			// close((*d).writerChannel)
 | 
	
		
			
				|  |  | +			log.Println("~Writer2")
 | 
	
		
			
				|  |  | +			return
 | 
	
		
			
				|  |  | +		default:
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		select {
 | 
	
		
			
				|  |  | +		case <-d.closeChannel:
 | 
	
		
			
				|  |  | +			// close((*d).writerChannel)
 | 
	
		
			
				|  |  | +			log.Println("~Writer2")
 | 
	
		
			
				|  |  | +			return
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		case output, ok := <-d.writerChannel:
 | 
	
		
			
				|  |  | +			if !ok {
 | 
	
		
			
				|  |  | +				// (*d).writerChannel = nil
 | 
	
		
			
				|  |  | +				log.Println("closeChannel")
 | 
	
		
			
				|  |  | +				// close(d.closeChannel)
 | 
	
		
			
				|  |  | +				d.Disconnected = true
 | 
	
		
			
				|  |  | +				close(d.writerChannel)
 | 
	
		
			
				|  |  | +				log.Println("~Writer2")
 | 
	
		
			
				|  |  | +				return
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +//				d.closeChannel <- true
 | 
	
		
			
				|  |  | +//				continue
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				// log.Println("output")
 | 
	
		
			
				|  |  | +				if strings.HasSuffix(output, RestorePos) {
 | 
	
		
			
				|  |  | +					output += Color(d.LastColor...)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				} else {
 | 
	
		
			
				|  |  | +					d.UpdateLastColor(output, &d.LastColor)
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				// log.Println("write output")
 | 
	
		
			
				|  |  | +				buffer := []byte(output)
 | 
	
		
			
				|  |  | +				n, err := syscall.Write(handle, buffer)
 | 
	
		
			
				|  |  | +				if (err != nil) || (n != len(buffer)) {
 | 
	
		
			
				|  |  | +					// close((*d).writerChannel)
 | 
	
		
			
				|  |  | +					// (*d).writerChannel = nil
 | 
	
		
			
				|  |  | +					log.Println("closeChannel")
 | 
	
		
			
				|  |  | +					// close(d.closeChannel)
 | 
	
		
			
				|  |  | +					d.Disconnected = true
 | 
	
		
			
				|  |  | +					close(d.writerChannel)
 | 
	
		
			
				|  |  | +					log.Println("~Writer2")
 | 
	
		
			
				|  |  | +					return
 | 
	
		
			
				|  |  | +//					d.closeChannel <- true
 | 
	
		
			
				|  |  | +//					continue
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func Writer(handle int, writerChannel *chan string) {
 | 
	
		
			
				|  |  | +	for output := range *writerChannel {
 | 
	
		
			
				|  |  | +		buffer := []byte(output)
 | 
	
		
			
				|  |  | +		n, err := syscall.Write(handle, buffer)
 | 
	
		
			
				|  |  | +		if (err != nil) || (n != len(buffer)) {
 | 
	
		
			
				|  |  | +			close(*writerChannel)
 | 
	
		
			
				|  |  | +			break
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 |