@@ -216,21 +216,21 @@ INIT {
216216 # I<conctl.cpp>
217217 {
218218 my $console ;
219- my $have_console = 0 ;
219+ my $have_console = false ;
220220
221221 $console = Win32::Console-> new( STD_INPUT_HANDLE );
222222 if ( $console && $console -> $isValid () ) {
223- $have_console = 1 ;
223+ $have_console = true ;
224224 $consoleHandle [cnInput] = $console ;
225225 }
226226 $console = Win32::Console-> new( STD_OUTPUT_HANDLE );
227227 if ( $console && $console -> $isValid () ) {
228- $have_console = 1 ;
228+ $have_console = true ;
229229 $consoleHandle [cnStartup] = $console ;
230230 }
231231 $console = Win32::Console-> new( STD_ERROR_HANDLE );
232232 if ( $console && $console -> $isValid () ) {
233- $have_console = 1 ;
233+ $have_console = true ;
234234 $consoleHandle [cnStartup] = $console ;
235235 }
236236
@@ -244,8 +244,6 @@ INIT {
244244 # Create a new generic object
245245 $console = Win32::Console-> new();
246246 if ( $console && $console -> $isValid () ) {
247- # If object is a valid console, close the old handle
248- $console -> Close();
249247 # Assign a handle created by CreateFile() to the object
250248 $console -> {handle } = Win32API::File::createFile(
251249 ' CONIN$' ,
@@ -261,7 +259,6 @@ INIT {
261259 unless ( $consoleHandle [cnStartup] ) {
262260 $console = Win32::Console-> new();
263261 if ( $console && $console -> $isValid () ) {
264- $console -> Close();
265262 $console -> {handle } = Win32API::File::createFile(
266263 ' CONOUT$' ,
267264 {
@@ -276,7 +273,8 @@ INIT {
276273 $console = Win32::Console-> new( GENERIC_READ | GENERIC_WRITE, 0 );
277274 if ( $console && $console -> $isValid () ) {
278275 $consoleHandle [cnOutput] = $console ;
279- if ( @sbInfo = $consoleHandle [cnStartup]-> Info() ) {
276+ if ( ref $consoleHandle [cnStartup] ) {
277+ @sbInfo = $consoleHandle [cnStartup]-> Info();
280278 # Force the screen buffer size to match the window size.
281279 # The Console API guarantees this, but some implementations
282280 # are not compliant (e.g. Wine).
@@ -298,7 +296,7 @@ INIT {
298296
299297END {
300298 $consoleHandle [cnStartup]-> Display()
301- if $consoleHandle [cnStartup];
299+ if ref $consoleHandle [cnStartup];
302300 Win32::Console::Free()
303301 if $ownsConsole ;
304302}
@@ -321,6 +319,7 @@ sub setCaretSize { # void ($class, $size)
321319 my ( $class , $size ) = @_ ;
322320 assert ( $class and !ref $class );
323321 assert ( looks_like_number $size );
322+ return unless ref $consoleHandle [cnOutput];
324323 @crInfo = $consoleHandle [cnOutput]-> Cursor();
325324 if ( $size == 0 ) {
326325 $crInfo [bVisible] = 0;
@@ -344,6 +343,7 @@ sub setCaretPosition { # void ($class, $x, $y)
344343 assert ( $class and !ref $class );
345344 assert ( looks_like_number $x );
346345 assert ( looks_like_number $y );
346+ return unless ref $consoleHandle [cnOutput];
347347 $consoleHandle [cnOutput]-> Cursor($x , $y );
348348 return ;
349349}
@@ -382,6 +382,7 @@ sub setScreenMode { # void ($class, $mode)
382382 my ( $class , $mode ) = @_ ;
383383 assert ( $class and !ref $class );
384384 assert ( looks_like_number $mode );
385+ return unless ref $consoleHandle [cnOutput];
385386 my %newSize = ( X => 80, Y => 25 );
386387 my %rect = ( Left => 0, Top => 0, Right => 79, Bottom => 24 );
387388
@@ -416,6 +417,7 @@ sub clearScreen { # void ($class, $w, $h);
416417 assert ( $class and !ref $class );
417418 assert ( looks_like_number $w );
418419 assert ( looks_like_number $h );
420+ return unless ref $consoleHandle [cnOutput];
419421 $consoleHandle [cnOutput]-> FillAttr( 0x07, $w * $h , 0, 0 );
420422 $consoleHandle [cnOutput]-> FillChar( ' ' , $w * $h , 0, 0 );
421423 return ;
@@ -428,6 +430,7 @@ sub screenWrite { # void ($class, $x, $y, $buf, $len)
428430 assert ( looks_like_number $y );
429431 assert ( ref $buf );
430432 assert ( looks_like_number $len );
433+ return unless ref $consoleHandle [cnOutput];
431434 my %to = ( Left => $x , Top => $y , Right => $x + $len - 1, Bottom => $y );
432435
433436 $consoleHandle [cnOutput]-> WriteRect(
@@ -466,6 +469,7 @@ sub getButtonCount { # $num ($class)
466469
467470sub cursorOn { # void ($class)
468471 assert ( $_ [0] and !ref $_ [0] );
472+ return unless ref $consoleHandle [cnInput];
469473 # Disable the Quick Edit mode, which inhibits the mouse.
470474 local $consoleMode = $consoleMode ;
471475 $consoleMode |= ENABLE_EXTENDED_FLAGS;
@@ -476,6 +480,7 @@ sub cursorOn { # void ($class)
476480
477481sub cursorOff { # void ($class)
478482 assert ( $_ [0] and !ref $_ [0] );
483+ return unless ref $consoleHandle [cnInput];
479484 $consoleHandle [cnInput]-> Mode( $consoleMode & ~ENABLE_MOUSE_INPUT );
480485 return ;
481486}
@@ -492,6 +497,7 @@ sub getMouseEvent { # $bool ($class, $event)
492497 my ( $class , $event ) = @_ ;
493498 assert ( $class and !ref $class );
494499 assert ( blessed $event );
500+ return unless ref $consoleHandle [cnInput];
495501 if ( !$pendingEvent ) {
496502 $pendingEvent = $consoleHandle [cnInput]-> GetEvents();
497503 if ( $pendingEvent ) {
@@ -517,6 +523,7 @@ sub getKeyEvent { # $bool ($class, $event)
517523 my ( $class , $event ) = @_ ;
518524 assert ( $class and !ref $class );
519525 assert ( blessed $event );
526+ return unless ref $consoleHandle [cnInput];
520527 if ( !$pendingEvent ) {
521528 $pendingEvent = $consoleHandle [cnInput]-> GetEvents();
522529 if ( $pendingEvent ) {
@@ -588,6 +595,7 @@ sub setCtrlBrkHandler { # $success ($class, $install)
588595 assert ( @_ == 2 );
589596 assert ( $class and !ref $class );
590597 assert ( !defined $install or !ref $install );
598+ return unless ref $consoleHandle [cnInput];
591599 my $consoleMode = $consoleHandle [cnInput]-> Mode() || return ;
592600 return $consoleHandle [cnInput]-> Mode(
593601 $install
0 commit comments