summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2009-07-03 10:50:51 +0000
committerCorinna Vinschen <corinna@vinschen.de>2009-07-03 10:50:51 +0000
commita4175657bfb652ab816a54a219acf926a2f5762b (patch)
treefb24a62407edcf7f1d98329ed928c4c119830341
parente490a1f83c1fe635ebb2e47cb4a55f5ef7ca063e (diff)
downloadcygnal-a4175657bfb652ab816a54a219acf926a2f5762b.tar.gz
cygnal-a4175657bfb652ab816a54a219acf926a2f5762b.tar.bz2
cygnal-a4175657bfb652ab816a54a219acf926a2f5762b.zip
* autoload.cc: Fix typo in comment.
(ShowWindowAsync): Define. (AttachConsole): Define. * fhandler_console.cc (fhandler_console::need_invisible): Add band-aid for Windows 7 AllocConsole bug.
-rw-r--r--winsup/cygwin/autoload.cc4
-rw-r--r--winsup/cygwin/fhandler_console.cc17
2 files changed, 18 insertions, 3 deletions
diff --git a/winsup/cygwin/autoload.cc b/winsup/cygwin/autoload.cc
index f01419221..4a64e105a 100644
--- a/winsup/cygwin/autoload.cc
+++ b/winsup/cygwin/autoload.cc
@@ -364,6 +364,7 @@ LoadDLLfunc (SendMessageA, 16, user32)
LoadDLLfunc (SetClipboardData, 8, user32)
LoadDLLfunc (SetThreadDesktop, 4, user32)
LoadDLLfunc (SetProcessWindowStation, 4, user32)
+LoadDLLfuncEx (ShowWindowAsync, 8, user32, 1)
LoadDLLfunc (accept, 12, ws2_32)
LoadDLLfunc (bind, 12, ws2_32)
@@ -396,7 +397,7 @@ LoadDLLfunc (WSASetLastError, 4, ws2_32)
// LoadDLLfunc (WSAStartup, 8, ws2_32)
LoadDLLfunc (WSAWaitForMultipleEvents, 20, ws2_32)
-// 50 = ERROR_NOT_SUPPORTED. Returned if OS doesn't supprot iphlpapi funcs
+// 50 = ERROR_NOT_SUPPORTED. Returned if OS doesn't support iphlpapi funcs
LoadDLLfuncEx2 (GetAdaptersAddresses, 20, iphlpapi, 1, 50)
LoadDLLfuncEx2 (GetExtendedTcpTable, 24, iphlpapi, 1, 50)
LoadDLLfuncEx2 (GetIfEntry, 4, iphlpapi, 1, 50)
@@ -408,6 +409,7 @@ LoadDLLfuncEx2 (SendARP, 16, iphlpapi, 1, 50)
LoadDLLfunc (CoTaskMemFree, 4, ole32)
+LoadDLLfuncEx (AttachConsole, 0, kernel32, 1)
LoadDLLfuncEx (FindFirstVolumeA, 8, kernel32, 1)
LoadDLLfuncEx (FindNextVolumeA, 12, kernel32, 1)
LoadDLLfuncEx (FindVolumeClose, 4, kernel32, 1)
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
index 43f73597c..6ec1e29da 100644
--- a/winsup/cygwin/fhandler_console.cc
+++ b/winsup/cygwin/fhandler_console.cc
@@ -1977,9 +1977,20 @@ fhandler_console::need_invisible ()
debug_printf ("window station is not visible");
invisible_console = true;
}
- else
+ /* Band-aid for Windows 7. AllocConsole is broken on W7 in that it
+ doesn't allocate the console in the hidden, active WindowStation,
+ but instead on the WindowStation on which the application has
+ originally been started on. This effectively disallows to create
+ a hidden console.
+ So what we do now is this. First we try to attach to an existing
+ console window of the parent process. If that doesn't work, we
+ skip generating a hidden WindowStation entirely. After creating
+ the new console, we hide it. Unfortunately it's still visible in
+ the taskbar. Hopefully this will be fixed in SP1... */
+ else if (!wincap.has_broken_alloc_console () || !AttachConsole (-1))
{
- if (myself->ctty != TTY_CONSOLE)
+ if (myself->ctty != TTY_CONSOLE
+ && !wincap.has_broken_alloc_console ())
{
h = CreateWindowStationW (NULL, 0, WINSTA_ACCESS, NULL);
termios_printf ("%p = CreateWindowStation(NULL), %E", h);
@@ -1991,6 +2002,8 @@ fhandler_console::need_invisible ()
}
b = AllocConsole (); /* will cause flashing if CreateWindowStation
failed */
+ if (b && wincap.has_broken_alloc_console ())
+ ShowWindowAsync (GetConsoleWindow (), SW_HIDE);
debug_printf ("h %p, horig %p, flags %p", h, horig, oi.dwFlags);
if (horig && h && h != horig && SetProcessWindowStation (horig))
CloseWindowStation (h);