From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11897 invoked by alias); 27 May 2010 07:14:07 -0000 Received: (qmail 11874 invoked by uid 22791); 27 May 2010 07:14:05 -0000 X-SWARE-Spam-Status: No, hits=-1.4 required=5.0 tests=AWL,BAYES_00,MSGID_MULTIPLE_AT X-Spam-Check-By: sourceware.org Received: from mailhost.u-strasbg.fr (HELO mailhost.u-strasbg.fr) (130.79.200.153) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 27 May 2010 07:13:57 +0000 Received: from baal.u-strasbg.fr (baal.u-strasbg.fr [IPv6:2001:660:2402::41]) by mailhost.u-strasbg.fr (8.14.3/jtpda-5.5pre1) with ESMTP id o4R7DsT1006310 for ; Thu, 27 May 2010 09:13:54 +0200 (CEST) (envelope-from pierre.muller@ics-cnrs.unistra.fr) Received: from mailserver.u-strasbg.fr (ms2.u-strasbg.fr [IPv6:2001:660:2402:d::11]) by baal.u-strasbg.fr (8.14.0/jtpda-5.5pre1) with ESMTP id o4R7DrWI071712 for ; Thu, 27 May 2010 09:13:53 +0200 (CEST) (envelope-from pierre.muller@ics-cnrs.unistra.fr) Received: from d620muller (lec67-4-82-230-53-140.fbx.proxad.net [82.230.53.140]) (user=mullerp mech=LOGIN) by mailserver.u-strasbg.fr (8.14.3/jtpda-5.5pre1) with ESMTP id o4R7Drc8075095 (version=TLSv1/SSLv3 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 27 May 2010 09:13:53 +0200 (CEST) (envelope-from pierre.muller@ics-cnrs.unistra.fr) From: "Pierre Muller" To: References: <001901caf934$fd580460$f8080d20$@muller@ics-cnrs.unistra.fr> <20100525205241.GA5298@ednor.casa.cgf.cx> <000601cafca7$ead3af80$c07b0e80$@muller@ics-cnrs.unistra.fr> <20100526170712.GA32594@ednor.casa.cgf.cx> <001801cafd69$018b9a00$04a2ce00$@muller@ics-cnrs.unistra.fr> In-Reply-To: <001801cafd69$018b9a00$04a2ce00$@muller@ics-cnrs.unistra.fr> Subject: RE: [RFA] windows-nat.c: Copy console information for new console Date: Thu, 27 May 2010 12:59:00 -0000 Message-ID: <001e01cafd6c$2a0c87c0$7e259740$@muller@ics-cnrs.unistra.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-05/txt/msg00631.txt.bz2 Please disregard the patch in the previous email, it contains an error that generates a compilation failure, sorry about this. > From Christopher Faylor > I actually thought fairly carefully about flags. If you have a > function > which controls console info, then the function should set the flags > appropriately to deal with the console info. As you prefer, here is a new version that also takes DWORD *flags as parameter. I also tried to explain a little bit better what the function tries to do. Pierre Muller 2010-05-26 Pierre Muller * windows-nat.c (GetConsoleFontSize, GetCurrentConsoleFont): New macros. (windows_set_console_info): New function. (windows_create_inferior): Call windows_set_console_info if NEW_CONSOLE is true. (bad_GetCurrentConsoleFont, bad_GetConsoleFontSize): New functions. (_initialize_loadable): Initialize GetConsoleFontSize and GetCurrentConsoleFont. Index: windows-nat.c =================================================================== RCS file: /cvs/src/src/gdb/windows-nat.c,v retrieving revision 1.209 diff -u -p -r1.209 windows-nat.c --- windows-nat.c 25 May 2010 07:38:18 -0000 1.209 +++ windows-nat.c 27 May 2010 07:11:40 -0000 @@ -75,6 +75,8 @@ #define GetModuleInformation dyn_GetModuleInformation #define LookupPrivilegeValueA dyn_LookupPrivilegeValueA #define OpenProcessToken dyn_OpenProcessToken +#define GetConsoleFontSize dyn_GetConsoleFontSize +#define GetCurrentConsoleFont dyn_GetCurrentConsoleFont static BOOL WINAPI (*AdjustTokenPrivileges)(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD); @@ -87,6 +89,8 @@ static BOOL WINAPI (*GetModuleInformatio DWORD); static BOOL WINAPI (*LookupPrivilegeValueA)(LPCSTR, LPCSTR, PLUID); static BOOL WINAPI (*OpenProcessToken)(HANDLE, DWORD, PHANDLE); +static BOOL WINAPI (*GetCurrentConsoleFont) (HANDLE, BOOL, CONSOLE_FONT_INFO *); +static COORD WINAPI (*GetConsoleFontSize) (HANDLE, DWORD); static struct target_ops windows_ops; @@ -1895,6 +1899,51 @@ windows_open (char *arg, int from_tty) error (_("Use the \"run\" command to start a Unix child process.")); } +/* Modify CreateProcess parameters for use of a new separate console. + Parameters are: + *FLAGS: DWORD parameter for general process creation flags. + *SI: STARTUPINFO structure, for which the console window size and + console buffer size is filled in if GDB is running in a console. + to create the new console. + The size of the used font is not available on all versions of + Windows OS. Furthermore, the current font might not be the default + font, but this is still better than before. + If the windows and buffer sizes are computed, + SI->DWFLAGS is changed so that this information is used + by CreateProcess function. */ + +static void +windows_set_console_info (STARTUPINFO *si, DWORD *flags) +{ + HANDLE hconsole = CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); + + if (hconsole != INVALID_HANDLE_VALUE) + { + CONSOLE_SCREEN_BUFFER_INFO sbinfo; + COORD font_size; + CONSOLE_FONT_INFO cfi; + + GetCurrentConsoleFont (hconsole, FALSE, &cfi); + font_size = GetConsoleFontSize (hconsole, cfi.nFont); + GetConsoleScreenBufferInfo(hconsole, &sbinfo); + si->dwXSize = sbinfo.srWindow.Right - sbinfo.srWindow.Left + 1; + si->dwYSize = sbinfo.srWindow.Bottom - sbinfo.srWindow.Top + 1; + if (font_size.X) + si->dwXSize *= font_size.X; + else + si->dwXSize *= 8; + if (font_size.Y) + si->dwYSize *= font_size.Y; + else + si->dwYSize *= 12; + si->dwXCountChars = sbinfo.dwSize.X; + si->dwYCountChars = sbinfo.dwSize.Y; + si->dwFlags |= STARTF_USESIZE | STARTF_USECOUNTCHARS; + } + *flags |= CREATE_NEW_CONSOLE; +} + /* Start an inferior windows child process and sets inferior_ptid to its pid. EXEC_FILE is the file to run. ALLARGS is a string containing the arguments to the program. @@ -1937,7 +1986,7 @@ windows_create_inferior (struct target_o flags |= CREATE_NEW_PROCESS_GROUP; if (new_console) - flags |= CREATE_NEW_CONSOLE; + windows_set_console_info (&si, &flags); #ifdef __CYGWIN__ if (!useshell) @@ -2574,6 +2623,21 @@ bad_OpenProcessToken (HANDLE w, DWORD x, return FALSE; } +static BOOL WINAPI +bad_GetCurrentConsoleFont (HANDLE w, BOOL bMaxWindow, CONSOLE_FONT_INFO *f) +{ + f->nFont = 0; + return 1; +} +static COORD WINAPI +bad_GetConsoleFontSize (HANDLE w, DWORD nFont) +{ + COORD size; + size.X = 8; + size.Y = 12; + return size; +} + /* Load any functions which may not be available in ancient versions of Windows. */ void @@ -2590,6 +2654,10 @@ _initialize_loadable (void) GetProcAddress (hm, "DebugBreakProcess"); DebugSetProcessKillOnExit = (void *) GetProcAddress (hm, "DebugSetProcessKillOnExit"); + GetConsoleFontSize = (void *) + GetProcAddress (hm, "GetConsoleFontSize"); + GetCurrentConsoleFont = (void *) + GetProcAddress (hm, "GetCurrentConsoleFont"); } /* Set variables to dummy versions of these processes if the function @@ -2601,6 +2669,10 @@ _initialize_loadable (void) DebugActiveProcessStop = bad_DebugActiveProcessStop; DebugSetProcessKillOnExit = bad_DebugSetProcessKillOnExit; } + if (!GetConsoleFontSize) + GetConsoleFontSize = bad_GetConsoleFontSize; + if (!GetCurrentConsoleFont) + GetCurrentConsoleFont = bad_GetCurrentConsoleFont; /* Load optional functions used for retrieving filename information associated with the currently debugged process or its dlls. */