From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17009 invoked by alias); 27 May 2010 06:51:20 -0000 Received: (qmail 16980 invoked by uid 22791); 27 May 2010 06:51:16 -0000 X-SWARE-Spam-Status: No, hits=-1.4 required=5.0 tests=AWL,BAYES_00,MSGID_MULTIPLE_AT,TW_CG X-Spam-Check-By: sourceware.org Received: from mailhost.u-strasbg.fr (HELO mailhost.u-strasbg.fr) (130.79.200.155) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 27 May 2010 06:51:05 +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 o4R6p13W012690 for ; Thu, 27 May 2010 08:51:02 +0200 (CEST) (envelope-from pierre.muller@ics-cnrs.unistra.fr) Received: from mailserver.u-strasbg.fr (ms3.u-strasbg.fr [IPv6:2001:660:2402:d::12]) by baal.u-strasbg.fr (8.14.0/jtpda-5.5pre1) with ESMTP id o4R6p1rN048285 for ; Thu, 27 May 2010 08:51:01 +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 o4R6p0J5053861 (version=TLSv1/SSLv3 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 27 May 2010 08:51:01 +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> In-Reply-To: <20100526170712.GA32594@ednor.casa.cgf.cx> Subject: RE: [RFA] windows-nat.c: Copy console information for new console Date: Thu, 27 May 2010 07:14:00 -0000 Message-ID: <001801cafd69$018b9a00$04a2ce00$@muller@ics-cnrs.unistra.fr> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable 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/msg00630.txt.bz2 > -----Message d'origine----- > De=A0: gdb-patches-owner@sourceware.org [mailto:gdb-patches- > owner@sourceware.org] De la part de Christopher Faylor > Envoy=E9=A0: Wednesday, May 26, 2010 7:07 PM > =C0=A0: gdb-patches@sourceware.org; Pierre Muller > Objet=A0: Re: [RFA] windows-nat.c: Copy console information for new > console >=20 > On Wed, May 26, 2010 at 09:49:05AM +0200, Pierre Muller wrote: > >> -----Message d'origine----- > > De?: gdb-patches-owner@sourceware.org [mailto:gdb-patches- > >> owner@sourceware.org] De la part de Christopher Faylor > >> I don't mind the concept but this function is becoming pretty big so > I > >> would appreciate it if you would move all of the logic into a > function. > >> Maybe call it "set_console_info()" and pass it &flags, &si. > >> > >> cgf > > > > > > You are right, this is cleaner, nevertheless flags isn't > >used much, >=20 > 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 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D 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 06:43:19 -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 =20 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); =20 static struct target_ops windows_ops; =20 @@ -1895,6 +1899,51 @@ windows_open (char *arg, int from_tty) error (_("Use the \"run\" command to start a Unix child process.")); } =20 +/* 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 =3D CreateFile ("CONOUT$", GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); + + if (hconsole !=3D INVALID_HANDLE_VALUE) + { + CONSOLE_SCREEN_BUFFER_INFO sbinfo; + COORD font_size; + CONSOLE_FONT_INFO cfi; + + GetCurrentConsoleFont (hconsole, FALSE, &cfi); + font_size =3D GetConsoleFontSize (hconsole, cfi.nFont); + GetConsoleScreenBufferInfo(hconsole, &sbinfo); + si->dwXSize =3D sbinfo.srWindow.Right - sbinfo.srWindow.Left + 1; + si->dwYSize =3D sbinfo.srWindow.Bottom - sbinfo.srWindow.Top + 1; + if (font_size.X) + si->dwXSize *=3D font_size.X; + else + si->dwXSize *=3D 8; + if (font_size.Y) + si->dwYSize *=3D font_size.Y; + else + si->dwYSize *=3D 12; + si->dwXCountChars =3D sbinfo.dwSize.X; + si->dwYCountChars =3D sbinfo.dwSize.Y; + si->dwFlags |=3D STARTF_USESIZE | STARTF_USECOUNTCHARS; + } + flags |=3D 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 |=3D CREATE_NEW_PROCESS_GROUP; =20 if (new_console) - flags |=3D CREATE_NEW_CONSOLE; + windows_set_console_info (&si, &flags); =20 #ifdef __CYGWIN__ if (!useshell) @@ -2574,6 +2623,21 @@ bad_OpenProcessToken (HANDLE w, DWORD x, return FALSE; } =20 +static BOOL WINAPI +bad_GetCurrentConsoleFont (HANDLE w, BOOL bMaxWindow, CONSOLE_FONT_INFO *f) +{ + f->nFont =3D 0; + return 1; +} +static COORD WINAPI +bad_GetConsoleFontSize (HANDLE w, DWORD nFont) +{ + COORD size; + size.X =3D 8; + size.Y =3D 12; + return size; +} +=20 /* 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 =3D (void *) GetProcAddress (hm, "DebugSetProcessKillOnExit"); + GetConsoleFontSize =3D (void *)=20 + GetProcAddress (hm, "GetConsoleFontSize"); + GetCurrentConsoleFont =3D (void *)=20 + GetProcAddress (hm, "GetCurrentConsoleFont"); } =20 /* Set variables to dummy versions of these processes if the function @@ -2601,6 +2669,10 @@ _initialize_loadable (void) DebugActiveProcessStop =3D bad_DebugActiveProcessStop; DebugSetProcessKillOnExit =3D bad_DebugSetProcessKillOnExit; } + if (!GetConsoleFontSize) + GetConsoleFontSize =3D bad_GetConsoleFontSize; + if (!GetCurrentConsoleFont) + GetCurrentConsoleFont =3D bad_GetCurrentConsoleFont; =20 /* Load optional functions used for retrieving filename information associated with the currently debugged process or its dlls. */