[122840] branches/gsoc14-interactive/base/src/port/port.tcl

shasha at macports.org shasha at macports.org
Thu Jul 31 10:04:52 PDT 2014


Revision: 122840
          https://trac.macports.org/changeset/122840
Author:   shasha at macports.org
Date:     2014-07-31 10:04:52 -0700 (Thu, 31 Jul 2014)
Log Message:
-----------
fixed Ctrl-C issues

Modified Paths:
--------------
    branches/gsoc14-interactive/base/src/port/port.tcl

Modified: branches/gsoc14-interactive/base/src/port/port.tcl
===================================================================
--- branches/gsoc14-interactive/base/src/port/port.tcl	2014-07-31 16:41:42 UTC (rev 122839)
+++ branches/gsoc14-interactive/base/src/port/port.tcl	2014-07-31 17:04:52 UTC (rev 122840)
@@ -5236,6 +5236,7 @@
 # Create namespace for questions
 namespace eval portclient::questions {
 	
+	package require Tclx
 	##
 	# Function that handles printing of a timeout.
 	#
@@ -5244,23 +5245,25 @@
 	# @param def
 	#        The default action to be taken in the occurence of a timeout.
 	proc ui_timeout {def timeout} {
-		# Gap between printing of each dot
-		set sec 0
-		
-		# Prints time like 5...4...3...2...1...0
-		while {$timeout >= 0} { 
-			after $sec {puts -nonewline "\r"}
-			after $sec {puts -nonewline "Continuing in "}
-			incr sec 1000
-			after $sec puts -nonewline [format "%02d" $timeout]
-			after $sec flush stdout
-			after $sec {puts -nonewline ". Press Ctrl-C to exit: "}
-			after $sec flush stdout
+		fconfigure stdin -blocking 0
+
+		signal error {TERM INT}
+		while {$timeout >= 0} {
+			if {[catch {set inp [read stdin]} err]} {
+				return -code error "Ctrl-C"
+			}
+			if {$inp eq "\n"} {
+				return $def
+			}
+			puts -nonewline "\r"
+			puts -nonewline [format "Continuing in %02d s. Press Ctrl-C to exit: " $timeout]
+			flush stdout
+			after 1000
 			incr timeout -1
 		}
-		after $sec set result def
-		vwait result
 		puts ""
+		fconfigure stdin -blocking 1
+		signal -restart error {TERM INT}
 		return $def
 	}
 	
@@ -5339,7 +5342,11 @@
 		
 		# User input (probably requires some input error checking code) 
 		while 1 {
-			set input [gets stdin]
+			signal error {TERM INT}
+			if {[catch {set input [gets stdin]} err]} {
+				return -code error "Ctrl-C"
+			}
+			signal -restart error {TERM INT}
 			if {$input in {y Y}} {
 				return 0
 			} elseif {$input in {n N}} {
@@ -5362,14 +5369,18 @@
 	# @param ports
 	#        The port/list of ports for which the question is being asked.
 	proc ui_ask_singlechoice {msg name ports} {
-		
+		package require Tclx
 		ui_choice $msg $name $ports
 				
 		# User Input (single input restriction)
 		while 1 {
 			puts -nonewline "Enter a number to select an option: "
 			flush stdout
-			set input [gets stdin]
+			signal error {TERM INT}
+			if {[catch {set input [gets stdin]} err]} {
+				return -code error "Ctrl-C"
+			}
+			signal -restart error {TERM INT}
 			if {($input <= [llength $ports] && [string is integer -strict $input])} {
 				return $input
 			} else {
@@ -5395,7 +5406,11 @@
 		while 1 {
 			puts -nonewline "Enter the numbers to select the options: "
 			flush stdout
-			set input [gets stdin]
+			signal error {TERM INT}
+			if {[catch {set input [gets stdin]} err]} {
+				return -code error "Ctrl-C"
+			}
+			signal -restart error {TERM INT}
 			set count 0
 			# check if input is non-empty and otherwise fine
 			if {$input == ""} {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/macports-changes/attachments/20140731/3d17bd55/attachment.html>


More information about the macports-changes mailing list