Windows/cygwin: no more GetConsoleTitleW errors on XP
This commit is contained in:
parent
82905fa3aa
commit
7a6a77e07c
@ -64,15 +64,21 @@ char** Platform::SetupArgs(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Max title length; the only thing MSDN tells us about the maximum length
|
||||||
|
// of the console title is that it is smaller than 64K. However in practice
|
||||||
|
// it is much smaller, and there is no way to figure out what the exact length
|
||||||
|
// of the title is or can be, at least not on XP. To make it even more
|
||||||
|
// annoying, GetConsoleTitle failes when the buffer to be read into is bigger
|
||||||
|
// than the actual maximum length. So we make a conservative guess here;
|
||||||
|
// just don't put the novel you're writing in the title, unless the plot
|
||||||
|
// survives truncation.
|
||||||
|
#define MAX_TITLE_LENGTH 8192
|
||||||
|
|
||||||
void Platform::SetProcessTitle(char *title) {
|
void Platform::SetProcessTitle(char *title) {
|
||||||
// We need to convert _title_ to UTF-16 first, because that's what windows uses internally.
|
// We need to convert _title_ to UTF-16 first, because that's what windows uses internally.
|
||||||
// It would be more efficient to use the UTF-16 value that we can obtain from v8,
|
// It would be more efficient to use the UTF-16 value that we can obtain from v8,
|
||||||
// but it's not accessible from here.
|
// but it's not accessible from here.
|
||||||
|
|
||||||
// Max title length; according to the specs it should be 64K but in practice it's a little over 30000,
|
|
||||||
// but who needs titles that long anyway?
|
|
||||||
const int MAX_TITLE_LENGTH = 30001;
|
|
||||||
|
|
||||||
int length;
|
int length;
|
||||||
WCHAR *title_w;
|
WCHAR *title_w;
|
||||||
|
|
||||||
@ -109,60 +115,37 @@ void Platform::SetProcessTitle(char *title) {
|
|||||||
|
|
||||||
|
|
||||||
static inline char* _getProcessTitle() {
|
static inline char* _getProcessTitle() {
|
||||||
WCHAR *title_w;
|
WCHAR title_w[MAX_TITLE_LENGTH];
|
||||||
char *title;
|
char *title;
|
||||||
int length, length_w;
|
int result, length;
|
||||||
|
|
||||||
length_w = GetConsoleTitleW((WCHAR*)L"\0", sizeof(WCHAR));
|
result = GetConsoleTitleW(title_w, sizeof(title_w) / sizeof(WCHAR));
|
||||||
|
|
||||||
// If length is zero, there may be an error or the title may be empty
|
if (result == 0) {
|
||||||
if (!length_w) {
|
|
||||||
if (GetLastError()) {
|
|
||||||
_winapi_perror("GetConsoleTitleW");
|
|
||||||
return NULL;
|
|
||||||
} else {
|
|
||||||
// The title is empty, so return empty string
|
|
||||||
process_title = strdup("\0");
|
|
||||||
return process_title;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Room for \0 terminator
|
|
||||||
length_w++;
|
|
||||||
|
|
||||||
title_w = new WCHAR[length_w];
|
|
||||||
|
|
||||||
if (!GetConsoleTitleW(title_w, length_w * sizeof(WCHAR))) {
|
|
||||||
_winapi_perror("GetConsoleTitleW");
|
_winapi_perror("GetConsoleTitleW");
|
||||||
delete title_w;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find out what the size of the buffer is that we need
|
// Find out what the size of the buffer is that we need
|
||||||
length = WideCharToMultiByte(CP_UTF8, 0, title_w, length_w, NULL, 0, NULL, NULL);
|
length = WideCharToMultiByte(CP_UTF8, 0, title_w, -1, NULL, 0, NULL, NULL);
|
||||||
if (!length) {
|
if (!length) {
|
||||||
_winapi_perror("WideCharToMultiByte");
|
_winapi_perror("WideCharToMultiByte");
|
||||||
delete title_w;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
title = (char *) malloc(length);
|
title = (char *) malloc(length);
|
||||||
if (!title) {
|
if (!title) {
|
||||||
perror("malloc");
|
perror("malloc");
|
||||||
delete title_w;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do utf16 -> utf8 conversion here
|
// Do utf16 -> utf8 conversion here
|
||||||
if (!WideCharToMultiByte(CP_UTF8, 0, title_w, -1, title, length, NULL, NULL)) {
|
if (!WideCharToMultiByte(CP_UTF8, 0, title_w, -1, title, length, NULL, NULL)) {
|
||||||
_winapi_perror("WideCharToMultiByte");
|
_winapi_perror("WideCharToMultiByte");
|
||||||
delete title_w;
|
|
||||||
free(title);
|
free(title);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete title_w;
|
|
||||||
|
|
||||||
return title;
|
return title;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,15 +94,21 @@ char** Platform::SetupArgs(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Max title length; the only thing MSDN tells us about the maximum length
|
||||||
|
// of the console title is that it is smaller than 64K. However in practice
|
||||||
|
// it is much smaller, and there is no way to figure out what the exact length
|
||||||
|
// of the title is or can be, at least not on XP. To make it even more
|
||||||
|
// annoying, GetConsoleTitle failes when the buffer to be read into is bigger
|
||||||
|
// than the actual maximum length. So we make a conservative guess here;
|
||||||
|
// just don't put the novel you're writing in the title, unless the plot
|
||||||
|
// survives truncation.
|
||||||
|
#define MAX_TITLE_LENGTH 8192
|
||||||
|
|
||||||
void Platform::SetProcessTitle(char *title) {
|
void Platform::SetProcessTitle(char *title) {
|
||||||
// We need to convert _title_ to UTF-16 first, because that's what windows uses internally.
|
// We need to convert _title_ to UTF-16 first, because that's what windows uses internally.
|
||||||
// It would be more efficient to use the UTF-16 value that we can obtain from v8,
|
// It would be more efficient to use the UTF-16 value that we can obtain from v8,
|
||||||
// but it's not accessible from here.
|
// but it's not accessible from here.
|
||||||
|
|
||||||
// Max title length; according to the specs it should be 64K but in practice it's a little over 30000,
|
|
||||||
// but who needs titles that long anyway?
|
|
||||||
const int MAX_TITLE_LENGTH = 30001;
|
|
||||||
|
|
||||||
int length;
|
int length;
|
||||||
WCHAR *title_w;
|
WCHAR *title_w;
|
||||||
|
|
||||||
@ -139,61 +145,37 @@ void Platform::SetProcessTitle(char *title) {
|
|||||||
|
|
||||||
|
|
||||||
static inline char* _getProcessTitle() {
|
static inline char* _getProcessTitle() {
|
||||||
WCHAR *title_w;
|
WCHAR title_w[MAX_TITLE_LENGTH];
|
||||||
char *title;
|
char *title;
|
||||||
int length, length_w;
|
int result, length;
|
||||||
|
|
||||||
length_w = GetConsoleTitleW((WCHAR*)L"\0", sizeof(WCHAR));
|
result = GetConsoleTitleW(title_w, sizeof(title_w) / sizeof(WCHAR));
|
||||||
|
|
||||||
// If length is zero, there may be an error or the title may be empty
|
if (result == 0) {
|
||||||
if (!length_w) {
|
|
||||||
if (GetLastError()) {
|
|
||||||
winapi_perror("GetConsoleTitleW");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// The title is empty, so return empty string
|
|
||||||
process_title = strdup("\0");
|
|
||||||
return process_title;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Room for \0 terminator
|
|
||||||
length_w++;
|
|
||||||
|
|
||||||
title_w = new WCHAR[length_w];
|
|
||||||
|
|
||||||
if (!GetConsoleTitleW(title_w, length_w * sizeof(WCHAR))) {
|
|
||||||
winapi_perror("GetConsoleTitleW");
|
winapi_perror("GetConsoleTitleW");
|
||||||
delete title_w;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find out what the size of the buffer is that we need
|
// Find out what the size of the buffer is that we need
|
||||||
length = WideCharToMultiByte(CP_UTF8, 0, title_w, length_w, NULL, 0, NULL, NULL);
|
length = WideCharToMultiByte(CP_UTF8, 0, title_w, -1, NULL, 0, NULL, NULL);
|
||||||
if (!length) {
|
if (!length) {
|
||||||
winapi_perror("WideCharToMultiByte");
|
winapi_perror("WideCharToMultiByte");
|
||||||
delete title_w;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
title = (char *) malloc(length);
|
title = (char *) malloc(length);
|
||||||
if (!title) {
|
if (!title) {
|
||||||
perror("malloc");
|
perror("malloc");
|
||||||
delete title_w;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do utf16 -> utf8 conversion here
|
// Do utf16 -> utf8 conversion here
|
||||||
if (!WideCharToMultiByte(CP_UTF8, 0, title_w, -1, title, length, NULL, NULL)) {
|
if (!WideCharToMultiByte(CP_UTF8, 0, title_w, -1, title, length, NULL, NULL)) {
|
||||||
winapi_perror("WideCharToMultiByte");
|
winapi_perror("WideCharToMultiByte");
|
||||||
delete title_w;
|
|
||||||
free(title);
|
free(title);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete title_w;
|
|
||||||
|
|
||||||
return title;
|
return title;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user