This is the mail archive of the cygwin-patches@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch]: Ncurses frame drawing


Corinna Vinschen wrote:

Erm... I was still mulling over this code since I thought there's
something wrong.  It took some time until it occured to me that this
implementation overrides the original value of current_codepage, if
the application accidentally happens to send \E[11m twice.  That
shouldn't be possible.

I'd prefer if the value of original_codepage is set to the same value
as current_codepage in environ.cc (codepage_init).  It should not
be manipulated in fhandler_console.cc (char_command).

While thinking about the problem to solve, I now took a slightly different approach. See, those ncurses actually need to 'disable' translation from ansi to oem because that screws up the frame characters. So instead of original_codepage variable, I introduced a bool alternate_charset_active that states if an alternate charset is active. If so, it disables translation. Works perfectly for me and I think is a cleaner approach. No messing with remembering / initializing / faking codepages.


Regards,

Micha.

Index: dcrt0.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/dcrt0.cc,v
retrieving revision 1.187
diff -u -w -r1.187 dcrt0.cc
--- dcrt0.cc	8 Oct 2003 21:40:33 -0000	1.187
+++ dcrt0.cc	14 Oct 2003 20:20:51 -0000
@@ -57,6 +57,7 @@
 bool strip_title_path;
 bool allow_glob = TRUE;
 codepage_type current_codepage = ansi_cp;
+bool alternate_charset_active;
 
 int cygwin_finished_initializing;
 
Index: fhandler_console.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/fhandler_console.cc,v
retrieving revision 1.115
diff -u -w -r1.115 fhandler_console.cc
--- fhandler_console.cc	27 Sep 2003 02:36:50 -0000	1.115
+++ fhandler_console.cc	14 Oct 2003 20:20:51 -0000
@@ -66,6 +66,13 @@
 inline BOOL
 str_to_con (char *d, const char *s, DWORD sz)
 {
+  if (alternate_charset_active)
+    {
+      /* no translation when alternate charset is active */
+      memcpy(d, s, sz);
+      return TRUE;
+    }
+  else
   return cp_convert (GetConsoleOutputCP (), d, get_cp (), s, sz);
 }
 
@@ -1110,6 +1117,12 @@
 	       break;
 	     case 9:    /* dim */
 	       dev_state->intensity = INTENSITY_DIM;
+	       break;
+             case 10:   /* end alternate charset */
+               alternate_charset_active = FALSE;
+	       break;
+             case 11:   /* start alternate charset */
+               alternate_charset_active = TRUE;
 	       break;
 	     case 24:
 	       dev_state->underline = FALSE;
Index: winsup.h
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/winsup.h,v
retrieving revision 1.119
diff -u -w -r1.119 winsup.h
--- winsup.h	25 Sep 2003 00:37:17 -0000	1.119
+++ winsup.h	14 Oct 2003 20:20:51 -0000
@@ -90,6 +90,7 @@
 
 enum codepage_type {ansi_cp, oem_cp};
 extern codepage_type current_codepage;
+extern bool alternate_charset_active;
 
 UINT get_cp ();
 
2003-10-13  Micha Nelissen  <M.Nelissen@student.tue.nl>

        * fhandler_console.cc (char_command): Add escape sequence for codepage
        ansi <-> oem switching for ncurses frame drawing capabilities.

        * dcrt0.cc: Add local variable alternate_charset_active.

        * winsup.h: Add global external variable alternate_charset_active.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]