mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-09-17 11:35:08 -04:00
Fix ? when unsupported chars from pasting clipboard on linux
This commit is contained in:
parent
2edbc6ea1f
commit
0d7ae92c7c
45
src/Window.c
45
src/Window.c
@ -8,6 +8,35 @@
|
|||||||
static bool win_cursorVisible = true;
|
static bool win_cursorVisible = true;
|
||||||
bool Window_GetCursorVisible(void) { return win_cursorVisible; }
|
bool Window_GetCursorVisible(void) { return win_cursorVisible; }
|
||||||
|
|
||||||
|
static void Window_DecodeUtf16(String* value, Codepoint* chars, int numBytes) {
|
||||||
|
int i; char c;
|
||||||
|
|
||||||
|
for (i = 0; i < (numBytes >> 1); i++) {
|
||||||
|
if (Convert_TryUnicodeToCP437(chars[i], &c)) String_Append(value, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Window_DecodeUtf8(String* value, uint8_t* chars, int numBytes) {
|
||||||
|
int len; Codepoint cp; char c;
|
||||||
|
|
||||||
|
for (; numBytes > 0; numBytes -= len) {
|
||||||
|
len = Convert_Utf8ToUnicode(&cp, chars, numBytes);
|
||||||
|
if (!len) return;
|
||||||
|
|
||||||
|
if (Convert_TryUnicodeToCP437(cp, &c)) String_Append(value, c);
|
||||||
|
chars += len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Window_DecodeAscii(String* value, uint8_t* chars, int numBytes) {
|
||||||
|
int i; char c;
|
||||||
|
|
||||||
|
for (i = 0; i < numBytes; i++) {
|
||||||
|
if (Convert_TryUnicodeToCP437(chars[i], &c)) String_Append(value, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*########################################################################################################################*
|
/*########################################################################################################################*
|
||||||
*------------------------------------------------------Win32 window-------------------------------------------------------*
|
*------------------------------------------------------Win32 window-------------------------------------------------------*
|
||||||
*#########################################################################################################################*/
|
*#########################################################################################################################*/
|
||||||
@ -383,18 +412,14 @@ void Window_GetClipboardText(String* value) {
|
|||||||
}
|
}
|
||||||
if (!hGlobal) { CloseClipboard(); return; }
|
if (!hGlobal) { CloseClipboard(); return; }
|
||||||
LPVOID src = GlobalLock(hGlobal);
|
LPVOID src = GlobalLock(hGlobal);
|
||||||
|
DWORD size = GlobalSize(hGlobal);
|
||||||
|
|
||||||
char c;
|
/* ignore trailing NULL at end */
|
||||||
|
/* TODO: Verify it's always there */
|
||||||
if (isUnicode) {
|
if (isUnicode) {
|
||||||
Codepoint* text = (Codepoint*)src;
|
Window_DecodeUtf16(value, (Codepoint*)src, size - 2);
|
||||||
for (; *text; text++) {
|
|
||||||
if (Convert_TryUnicodeToCP437(*text, &c)) String_Append(value, c);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
char* text = (char*)src;
|
Window_DecodeAscii(value, (uint8_t*)src, size - 1);
|
||||||
for (; *text; text++) {
|
|
||||||
if (Convert_TryUnicodeToCP437(*text, &c)) String_Append(value, c);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GlobalUnlock(hGlobal);
|
GlobalUnlock(hGlobal);
|
||||||
@ -1240,7 +1265,7 @@ void Window_ProcessEvents(void) {
|
|||||||
|
|
||||||
if (data && items && prop_type == xa_utf8_string) {
|
if (data && items && prop_type == xa_utf8_string) {
|
||||||
clipboard_paste_text.length = 0;
|
clipboard_paste_text.length = 0;
|
||||||
String_DecodeUtf8(&clipboard_paste_text, data, items);
|
Window_DecodeUtf8(&clipboard_paste_text, data, items);
|
||||||
}
|
}
|
||||||
if (data) XFree(data);
|
if (data) XFree(data);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user