Web lists-archives.com

Re: Cygwin fails to utilize Unicode replacement character




Am 03.09.2018 um 22:27 schrieb Corinna Vinschen:
On Sep  3 21:14, Corinna Vinschen wrote:
On Sep  3 20:20, Thomas Wolff wrote:
Am 03.09.2018 um 19:56 schrieb Thomas Wolff:
Am 03.09.2018 um 19:16 schrieb Corinna Vinschen:
On Sep  3 18:34, Thomas Wolff wrote:
Am 03.09.2018 um 16:59 schrieb Corinna Vinschen:
Does anybody have an idea what I'm doing wrong?
This works in mintty, just uploaded a patch. Maybe somehow the
GetConsole
"dc" does not support this usage?
¯\_(ツ)_/¯
Dito; hold on, sorry, your code does *not* work inside mintty.
Mine looks a bit different and I thought to have manually verified it's
functionally equivalent, but indeed there must be something fishy...
You still need to
   SelectObject(cdc, f);
where f is the HFONT of the font you want to check.
To compare, you may check out function win_check_glyphs in file wintext.c in
mintty.
Thanks but I don't know how to get a HFONT for the current console font.

In the meantime I figured out why my GetCurrentConsoleFontEx call
failed with error 87:

When looking again I realized there's a member called cbSize.  The MSDN
docs neglect to tell that the cbSize member has to be primed with
sizeof(CONSOLE_FONT_INFOEX).  As soon as I tried that, the function
succeeded.

Well, it's a start.  I now have the actual font name.  No idea how to
get a HFONT from there, though.  From what I can tell ATM, I'd have to
call CreateFont to get a new HFONT and then destroy it again after
usage.  This looks pretty wasteful.
Well, it still doesn't work for me.  I now have the following code:

===================== SNIP ======================
#include <windows.h>
#include <stdio.h>
#include <wchar.h>

int
main ()
{
   static const wchar_t replacement_char[2] =
     {
       0xfffd, /* REPLACEMENT CHARACTER */
       0x2592  /* MEDIUM SHADE */
     };

   CONSOLE_FONT_INFOEX cfi;
   HWND cwnd = GetConsoleWindow ();
   HDC cdc = GetDC (cwnd);
   int rp_idx = 1;
   WORD gi[2] = { 0, 0 };

   memset (&cfi, 0, sizeof cfi);
   cfi.cbSize = sizeof cfi;
   if (GetCurrentConsoleFontEx (GetStdHandle (STD_OUTPUT_HANDLE), FALSE, &cfi))
     {
       printf ("font %ls\n", cfi.FaceName);
       HFONT hf = CreateFontW (cfi.dwFontSize.Y, cfi.dwFontSize.X,
			      0, 0, cfi.FontWeight, FALSE, FALSE, FALSE,
			      DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
			      CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
			      FIXED_PITCH | FF_DONTCARE, cfi.FaceName);
       if (hf)
       	{
	  HFONT old_f = SelectObject(cdc, hf);
	  if (GetGlyphIndicesW (cdc, replacement_char, 2, gi,
				GGI_MARK_NONEXISTING_GLYPHS) != GDI_ERROR)
	    {
	      printf ("gi = %d %d\n", gi[0], gi[1]);
	      if (gi[0] != 0xffff)
		rp_idx = 0;
	    }
	  if (old_f)
	    old_f = SelectObject (cdc, old_f);
	  DeleteObject (hf);
	}
     }

   printf ("rp_idx = %d\n", rp_idx);
   return 0;
}
===================== SNAP ======================

Supposedly none of the fonts support 0xfffd:

   $ gcc -g -o cons cons.c -lgdi32
   $ ./cons
   font Consolas
   gi = 65535 879
   rp_idx = 1
   $ ./cons
   font Lucida Console
   gi = 65535 620
   rp_idx = 1
   $ ./cons
   font Courier New
   gi = 65535 372
   rp_idx = 1

So I'm still doing something wrong, apparently.  Any hint?
Test with a font that has the glyph; those 3 don't. Try DejaVu.

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple