From mboxrd@z Thu Jan 1 00:00:00 1970 Path: eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Keith Thompson Newsgroups: comp.lang.ada Subject: Re: get_immediate echoe character--compiled error? Date: Wed, 04 Oct 2023 12:39:27 -0700 Organization: None to speak of Message-ID: <87v8bm41ow.fsf@nosuchdomain.example.com> References: <87fs2tr2vf.fsf@nosuchdomain.example.com> <87lecku0bu.fsf@nosuchdomain.example.com> <874jj75joi.fsf@nosuchdomain.example.com> MIME-Version: 1.0 Content-Type: text/plain Injection-Info: dont-email.me; posting-host="9da464444b2257c989bb4d90b174d1f1"; logging-data="506786"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19TtbNS9Ry/hL/nqABUVwRO" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) Cancel-Lock: sha1:CZoAI6bp/a3f2PdyJuTc6PVU7K0= sha1:q1gF+D0iDO7rS5KBqrutm+418so= Xref: news.eternal-september.org comp.lang.ada:65783 List-Id: Niklas Holsti writes: > On 2023-10-04 11:22, Simon Wright wrote: >> Keith Thompson writes: >>> Simon Wright writes: >>>> The low-level Get_Immediate implementation is in sysdep.c (probably >>>> not in the adainclude/ directory in an installed compiler), in >>>> getc_immediate() and getc_immediate_nowait(), both of which call >>>> getc_immediate_common(), and I can't see any difference! ECHO gets >>>> turned off in getc_immediate_common(), regardless of caller - see >>>> link. >>>> >>>> https://github.com/gcc-mirror/gcc/blob/3ca09d684e496240a87c0327687e2898060c2363/gcc/ada/sysdep.c#L387 >>> >>> I haven't really looked into this, but I *think* what's happening is >>> that for the versions with the Available parameter, ECHO hasn't yet been >>> turned off when the user types the character. If you type 'x', it >>> echoes immediately, because the program has no way of knowing that the >>> character will later be consumed by a call to Get_Immediate. Presumably >>> if the user hasn't typed anything, causing Available to be set to false, >>> Get_Immediate will turn echoing off and back on again very quickly. >>> Echoing is disabled only for small fraction of a second it takes for >>> Get_Immediate to be executed. >>> >>> The Get_Immediate functions without the Available parameter block >>> until a character is entered. They can disable echoing before the >>> character is entered. Echoing will typically be disabled for minutes >>> or seconds, from the time Get_Immediate is called and the time the >>> user types something. >>> >>> The only solution I can think of would be to disable echoing (in some >>> non-portable manner; I don't think the standard library provides this) >>> before the user starts typing. (Perhaps you want to run the >>> Get_Immediate without the Available parameter in a separate task?) >> Great analysis! > > > Yes indeed. > > A possible solution in Text_IO would be for Get_Immediate with > Available not to enable echo when it exits. Get_Immediate with > Available is typically called repeatedly, with no other input from the > terminal in between these calls, so it should be ok to keep echo > disabled from one such call to another. Any non-immediate input > operation on the terminal (that is, on this Text_IO file) should start > by re-enabling echo if it was disabled. Possibly the same should apply > also to Get_Immediate without Available, that is, it should leave echo > disabled, until some non-immediate input operation re-enables echo. The *first* character typed would still echo. I suggest that what's needed is a way to turn echoing on and off. Meanwhile, would calling Get_Immediate *without* the Available parameter (which blocks and turns echoing off until after a character is typed) in a separate task work? I haven't tried it. Of course you'd need to be careful not to have I/O calls from separate tasks interfere with each other. -- Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com Will write code for food. void Void(void) { Void(); } /* The recursive call of the void */