Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: "Pierre Muller" <pierre.muller@ics-cnrs.unistra.fr>
To: <gdb-patches@sourceware.org>
Subject: RE: [RFA] windows-nat.c: Copy console information for new console
Date: Thu, 27 May 2010 07:14:00 -0000	[thread overview]
Message-ID: <001801cafd69$018b9a00$04a2ce00$@muller@ics-cnrs.unistra.fr> (raw)
In-Reply-To: <20100526170712.GA32594@ednor.casa.cgf.cx>



> -----Message d'origine-----
> De : gdb-patches-owner@sourceware.org [mailto:gdb-patches-
> owner@sourceware.org] De la part de Christopher Faylor
> Envoyé : Wednesday, May 26, 2010 7:07 PM
> À : gdb-patches@sourceware.org; Pierre Muller
> Objet : Re: [RFA] windows-nat.c: Copy console information for new
> console
> 
> 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,
> 
> 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  <muller@ics.u-strasbg.fr>

	* 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 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
 
 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. */


  reply	other threads:[~2010-05-27  6:51 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-21 22:37 Pierre Muller
2010-05-25 21:01 ` Christopher Faylor
2010-05-26  8:07   ` Pierre Muller
2010-05-26 17:20     ` Christopher Faylor
2010-05-27  7:14       ` Pierre Muller [this message]
2010-05-27 12:59         ` Pierre Muller
2010-05-27 15:43           ` Christopher Faylor
2010-05-28 15:28             ` Pierre Muller
2010-05-30 18:00               ` Christopher Faylor
2010-06-01  6:57                 ` [RFC] windows-nat.c: New oddity after copy console information for new console patch Pierre Muller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='001801cafd69$018b9a00$04a2ce00$@muller@ics-cnrs.unistra.fr' \
    --to=pierre.muller@ics-cnrs.unistra.fr \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox