X-Spam-Check-By: sourceware.org Message-ID: <44695649.9080001@cwilson.fastmail.fm> Date: Tue, 16 May 2006 00:34:17 -0400 From: Charles Wilson User-Agent: Thunderbird 1.5.0.2 (Windows/20060308) MIME-Version: 1.0 To: cygwin AT cygwin DOT com Subject: Re: rvxt-20050409-1 console problem [SUMMARY] References: In-Reply-To: Content-Type: multipart/mixed; boundary="------------030401050204060101040600" Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com --------------030401050204060101040600 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Igor Peshansky wrote: > After installing rxvt-20050409-1, starting rxvt from a console bash hides > that console. To reproduce: start a console bash, type "rxvt" or "rxvt &" > (either way), observe that the bash window goes away (the process is still > running, though). I don't think the cygcheck output is relevant, since > this looks like an rxvt problem (caused by the new code to hide the > console). Chuck, if you can't reproduce this, please let me know and I'll > provide more details. Nope, don't need to reproduce it -- it's an obvious (now!) effect of the code. I've got an idea for a solution to this problem I've created, but first I want to address some misconceptions downthread. ====== (1) Brian Dessent was 99.9% right in this message (http://cygwin.com/ml/cygwin/2006-05/msg00376.html). 100% if you take the correction in his immediate followup. If CYGWIN contains tty (set BEFORE the bash shell is started; e.g. via the Windows Environment), then you're using ptys. -mwindows apps (like javaw) can communicate with the console, but only if they like ptys. Not all of them do (C:\Windows\system32\ftp.exe does not, for example). If you're using rxvt or ssh, then you're using ptys. However, if you're using PLAIN OLD CMD.EXE *and* CYGWIN does not contain tty, THEN, and ONLY then, are you actually using direct console I/O. In this scenario, -mwindows do not HAVE console I/O, so they cannot communicate with the spawning console. (unless they use the XP API to reconnect, as Brian mentioned). Since neither of those two options are acceptable, -mwindows is not allowed. ====== (2) So, we've had rxvt for years, and run.exe for years, and this combo has worked just fine. rxvt is a -mconsole app, it can talk to the spawning console (rxvt --help works) regardless of cmd.exe/CYGWIN=tty/rxvt/whathaveyou). However, if launched via a shortcut from the Windows Environment (Start Menu, Desktop, Explorer, etc), it will create a dummy cmd.exe window -- because it is an -mconsole app, and that's what they do. [* errm, not really. See ==1== below] Well, as one poster suggested, you could create the console window with !SW_VISIBLE. The problem with that idea, is that by the time you've got control the console has already been created! So, what you do, is OPTIONALLY -- e.g. when you don't care about interaction with the spawning console, like if you're double-clicking a windows shortcut -- use a helper application that is compiled -mwindows. It can then create a hidden (!SW_VISIBLE) console, and pass that console to the client application by launching the client directly using the WindowsAPI CreateProcess, instead of cygwin's spawn/exec/family. Well, that's exactly what run.exe does. Another alterative is for rxvt to hide the console after it is launched (but this leads to a briefly flashing cmd.exe window). [*] ==1== ===== So, until now, if you're (manually) launching rxvt from a console -- whether an rxvt/xterm one, a cmd.exe+CYGWIN=tty one, or a cmd.exe+CYGWIN=notty one -- then you simply call rxvt.exe directly. It just works. And your console -- even if it was a cmd+CYGWIN=notty one -- did not disappear on you. I broke this when cmd+CYGWIN=notty. Oops. If you wanted to launch rxvt from the "Windows Environment", you used run.exe to launch the rxvt indirectly. That just works. (There is no cmd.exe window, not even a briefly flashing one). [*] The following was news to me, but I've verified it and dug into the code to figure out why. Mark Harig was correct here: http://cygwin.com/ml/cygwin/2006-05/msg00386.html It turns out that if you launch rxvt directly from the windows environment, it -- even before I messed with it -- will follow the procedure above at ==1==. It turns out that the libW11 wrapper code in rxvt-2.7.10-6 already has a variant of the hide_console code. It differs from the new code I added in that it has some kind of test to see if its associated console was spawned in response to its own launch, or if it pre-existed. In the former case (e.g. you double clicked a shortcut and Windows launched the process with an associated console) it would hide the console -- after the obligatory brief flash. In the latter case -- the console was already there, and you manually typed 'rxvt' or whatever -- then it would NOT hide the console. Pretty slick: hConsole = CreateFile( "CONOUT$", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, OPEN_EXISTING, 0, 0 ); if (GetConsoleScreenBufferInfo(hConsole,&buffInfo) && buffInfo.dwCursorPosition.X==0 && buffInfo.dwCursorPosition.Y==0) { ... only then, do we hide the console ... } ===== So why did I bother? Well, 'cause (a) I didn't know about the above; I always got cmd.exe boxes because I always launched rxvt via a script, not directly, and (b) I *wanted* to be able to launch rxvt via windows shortcut to a script and STILL be able to hide the console. Why not just revert to the old behavior? Well, maybe we will, but... ...the answer is here: http://cygwin.com/ml/cygwin-apps/2006-03/msg00119.html http://cygwin.com/ml/cygwin-apps/2006-03/msg00122.html and http://cygwin.com/ml/cygwin-apps/2006-03/msg00133.html Ultimately, I want a script (.bat or .sh) that can mimic what the current split-personality rxvt does: when DISPLAY is set to a usable Xserver, run **some rxvt binary** which is an Xclient. Otherwise, run **some other rxvt binary** which is a pure native windows app. e.g. I want users to "pretend" they still have a split personality rxvt, but actually provide the capability via two separate applications. I'd prefer to use a script to call two clients, so that users could customize it: "I want plain old rxvt for native windows, and urxvtc for X" "I want rxvt-unicode-W for native windows, and urxvt for X" "I'm old school, I want plain old rxvt for both native and X" etc. But here's the problem: if you have a script (like, say, the one attached and uuencoded to protect against overzealous anti-v filters) and you launch that script via a shortcut -- then you're stuck with the console window that the script ran in! This is true even with the pre-existing hideConsole code in old-rxvt. (Basically, the "pretty slick" code in old-rxvt can't distinguish between "this console was just created in order for the batch script that launched me" and "this console belongs to an interactive bash/cmd window". But that's hindsight; I didn't even realize the old-rxvt had any hide-console code at all.) So, in my ignorance, I added hide-the-console code to both rxvt-unicode-X and to the new version of rxvt. And it worked great! The (fairly complicated) batch file below does just like I wanted -- on NT/2K/XP. (Okay, I get *two* briefly flashing windows, but that's just because I can't guarantee that the user has set HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions true, so I relaunch cmd.exe with the /v switch. I've got a bash version of the same script that only flashes *one* window). ====== I never thought of users like Igor. The current situation is clearly untenable. ====== So, here's a possible solution: (1) revert rxvt back to old behavior with "smart" hide console code (but which won't be able to hide the console if launched via a script, like the one below). (2) add the "smart" hide console code to rxvt-unicode-X and remove the brute-force hide console code. Otherwise, the Igors of the world will have the same "where'd my console go" problem with rxvt-unicode-X. (3) (a) add a command line option to say "force hide console" and use that from scripts (3) (b) forget about scripts. Use a special version of "run" specifically for the purpose of switching between rxvt versions. For user customizability, maybe it could read configuration info --- nativeGUI: /usr/bin/rxvt.exe X11: /usr/bin/urxvtc.exe ## use these to override ~/.Xdefaults ## try not to conflict with ACTUAL cmdline args given to rxvt-launcher ## because it's indeterminate which one of a conflicting set will ## actually have effect. nativeGUI-options: -fn "Lucida ConsoleP-16" -tn rxvt-native-cygwin X11-options: -fn "--some-X11-XLFN" -tn rxvt-unicode --- from a file in /etc. This rxvt-launcher would be a -mwindows app, just like run. It would use the checkX program (or borrow the code; sigh. Time for a library?) to determine Xness, and launch the apropriate client using !SW_VISIBLE, just like run. But it wouldn't have any of run's introspection code ("what was my own argv[0]? Did it match 'run?????.exe' where ????? non-empty? Search PATH for ?????.) nor would it need to have any PATH walking code at all -- require that configuration info contain full PATH. (It would need to resolve symlinks, tho). ===== Okay, I think I've covered all the bases in this thread, explained the history of this change, and laid out a proposed solution going forward. Comments? Suggestions between 3(a) and 3(b)? -- Chuck --------------030401050204060101040600 Content-Type: text/plain; name="start-rxvt.bat.uue" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="start-rxvt.bat.uue" begin 751 start-rxvt.bat M0&5C:&\@;V9F"E)%30I214T AT 5V%R;FEN9RX@(%1H:7,@8F%T8V@@9FEL92!O M;FQY('=O2!S;&]W;'D@*"=3;&5E<"@T,"DG"E)%32!S96-O;F1S M*2X AT 66]U&4@6]U2X@($]R('5P9W)A9&4@>6]U6-L92!T:')U(&%R9W,@;&]O:VEN9R!F;W(@)RUD('1G="<@ M;W(@+61I'9T(&ET M&4@)4%21TQ)4U0E"@I214T AT 8VQI96YT+W-E2!C;VYF=7-E