This is the mail archive of the
cygwin-patches@cygwin.com
mailing list for the Cygwin project.
Re: [Patch]: Ncurses frame drawing
- From: Micha Nelissen <M dot Nelissen at student dot tue dot nl>
- To: Corinna Vinschen <cygwin-patches at cygwin dot com>
- Date: Tue, 14 Oct 2003 22:26:27 +0200
- Subject: Re: [Patch]: Ncurses frame drawing
- References: <20031014145507.GC14344@cygbert.vinschen.de>
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.