windows: force codepage to 65001 to show superscript characters
[scilab.git] / scilab / modules / windows_tools / src / c / scilab_windows / console.c
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) INRIA - Allan CORNET
4 *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13 *
14 */
15
16 /*--------------------------------------------------------------------------*/
17
18 #define  _WIN32_WINNT 0x0500 // GetConsoleWindow
19 #include <Windows.h>
20 #include <shlwapi.h>
21 #include <stdio.h>
22 #pragma comment(lib, "shlwapi.lib")
23
24 #include "WinConsole.h"
25 #include "WndThread.h"
26 #include "console.h"
27 #include "version.h"
28 #include "os_string.h"
29 /*--------------------------------------------------------------------------*/
30 #define NameConsole "Console"
31 /*--------------------------------------------------------------------------*/
32 static CONSOLE_SCREEN_BUFFER_INFO csbiInfoSave;
33 static UINT savedCodePage;
34 static char ScilexConsoleName[MAX_PATH];
35 /*--------------------------------------------------------------------------*/
36 void UpdateConsoleColors(void)
37 {
38     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
39     COORD Coord;
40     DWORD cWritten;
41
42     Coord.X = 0;
43     Coord.Y = 0;
44
45     FillConsoleOutputAttribute(hConsole,
46         BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY,
47         csbiInfoSave.dwSize.X * csbiInfoSave.dwSize.Y,
48         Coord,
49         &cWritten);
50
51     SetConsoleTextAttribute(hConsole, BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY);
52
53 }
54 /*--------------------------------------------------------------------------*/
55 void SaveConsoleColors(void)
56 {
57     GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbiInfoSave);
58 }
59 /*--------------------------------------------------------------------------*/
60 void RestoreConsoleColors(void)
61 {
62     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
63     COORD Coord;
64     DWORD cWritten;
65
66     Coord.X = 0;
67     Coord.Y = 0;
68
69     FillConsoleOutputAttribute(hConsole,
70         csbiInfoSave.wAttributes,
71         csbiInfoSave.dwSize.X * csbiInfoSave.dwSize.Y,
72         Coord,
73         &cWritten);
74     SetConsoleTextAttribute(hConsole, csbiInfoSave.wAttributes);
75 }
76 /*--------------------------------------------------------------------------*/
77 void UpdateConsoleFont(void)
78 {
79     //change codepage to cp65001
80     SetConsoleOutputCP(65001);
81 }
82 /*--------------------------------------------------------------------------*/
83 void SaveConsoleFont(void)
84 {
85     savedCodePage = GetConsoleCP();
86 }
87 /*--------------------------------------------------------------------------*/
88 void RestoreConsoleFont(void)
89 {
90     SetConsoleCP(savedCodePage);
91 }
92 /*--------------------------------------------------------------------------*/
93 void RenameConsole(void)
94 {
95     HWND hScilex = NULL;
96     char CurrentConsoleName[MAX_PATH];
97     char CurrentConsoleNameTmp[MAX_PATH];
98
99     GetConsoleTitle(CurrentConsoleName, MAX_PATH);
100     strncpy(CurrentConsoleNameTmp, CurrentConsoleName, strlen(NameConsole));
101     CurrentConsoleNameTmp[strlen(NameConsole)] = '\0';
102
103     if ( strcmp(CurrentConsoleNameTmp, NameConsole) != 0)
104     {
105         wsprintf(ScilexConsoleName, "%s %s", NameConsole, SCI_VERSION_STRING);
106         SetConsoleTitle(ScilexConsoleName);
107     }
108
109     hScilex = GetConsoleWindow();
110     if (hScilex)
111     {
112         HMENU hmenuConsole = NULL;
113         // Desactive croix dans la console
114         hmenuConsole = GetSystemMenu(hScilex, FALSE);
115         DeleteMenu(hmenuConsole, SC_CLOSE, MF_BYCOMMAND);
116     }
117 }
118 /*--------------------------------------------------------------------------*/
119 void RestoreExitButton(void)
120 {
121     HWND hScilex = NULL;
122     hScilex = GetConsoleWindow();
123     if (hScilex)
124     {
125         HMENU hmenuConsole = NULL;
126         // Active croix dans la console
127         hmenuConsole = GetSystemMenu(hScilex, FALSE);
128         AppendMenu( hmenuConsole, MF_BYCOMMAND, SC_CLOSE, "&Close Alt+F4" );
129     }
130 }
131 /*--------------------------------------------------------------------------*/
132 void CreateScilabConsole(int ShowBanner)
133 {
134     HWND hScilex = NULL;
135
136     SetConsoleState(0);  /* Console DOS Cachée par défaut */
137     AllocConsole();
138
139     wsprintf(ScilexConsoleName, "%s %s (%d)", NameConsole, SCI_VERSION_STRING, getCurrentScilabId());
140     SetConsoleTitle(ScilexConsoleName);
141
142     CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
143     freopen("CONOUT$", "wb", stdout); /* redirect stdout --> CONOUT$*/
144     freopen("CONOUT$", "wb", stderr); /* redirect stderr --> CONOUT$*/
145
146     if (ShowBanner)
147     {
148         char line[80];
149
150         strcpy(line, "        ___________________________________________\n");
151         printf(line);
152         wsprintf(line, "                         %s\n\n", SCI_VERSION_STRING);
153         printf(line);
154         strcpy(line, "                     ESI Group\n");
155         printf(line);
156         strcpy(line, "         Copyright (c) 2017-2020 (ESI Group)\n");
157         printf(line);
158         strcpy(line, "         Copyright (c) 2011-2017 (Scilab Enterprises)\n");
159         printf(line);
160         strcpy(line, "               Copyright (c) 1989-2012 (INRIA)\n");
161         printf(line);
162         strcpy(line, "               Copyright (c) 1989-2007 (ENPC)\n");
163         printf(line);
164         strcpy(line, "        ___________________________________________\n\n");
165         printf(line);
166     }
167
168     hScilex = GetConsoleWindow();
169     if (hScilex)
170     {
171         HMENU hmenuConsole = NULL;
172         // Desactive croix dans la console
173         hmenuConsole = GetSystemMenu(hScilex, FALSE);
174         DeleteMenu(hmenuConsole, SC_CLOSE, MF_BYCOMMAND);
175
176         /* Cache la fenetre Console */
177         ShowWindow(hScilex, SW_HIDE);
178     }
179 }
180 /*--------------------------------------------------------------------------*/
181 void CloseScilabConsole(void)
182 {
183     fclose(stdout);
184     fclose(stderr);
185     FreeConsole();
186 }
187 /*--------------------------------------------------------------------------*/
188 char *getScilexConsoleName(void)
189 {
190     char *retName = NULL;
191
192     if (strlen(ScilexConsoleName) > 0)
193     {
194         retName = os_strdup(ScilexConsoleName);
195     }
196     return retName;
197 }
198 /*--------------------------------------------------------------------------*/
199 int getXConsoleScreenSize(void)
200 {
201     return (csbiInfoSave.srWindow.Right - csbiInfoSave.srWindow.Left);
202 }
203 /*--------------------------------------------------------------------------*/
204 int getYConsoleScreenSize(void)
205 {
206     return (csbiInfoSave.srWindow.Bottom - csbiInfoSave.srWindow.Top);
207 }
208 /*--------------------------------------------------------------------------*/