Fix Copy/Paste/Select All for Text Input

This commit is contained in:
nyaruku 2023-09-08 16:29:21 +03:00 committed by GitHub
parent 1aae7b555a
commit 0435477a91
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -761,7 +761,7 @@ nk_gdipfont_get_text_width(nk_handle handle, float height, const char *text, int
(void)height; (void)height;
wsize = MultiByteToWideChar(CP_UTF8, 0, text, len, NULL, 0); wsize = MultiByteToWideChar(CP_UTF8, 0, text, len, NULL, 0);
wstr = (WCHAR*)_alloca(wsize * sizeof(wchar_t)); wstr = (WCHAR*)_malloca(wsize * sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8, 0, text, len, wstr, wsize); MultiByteToWideChar(CP_UTF8, 0, text, len, wstr, wsize);
GdipMeasureString(gdip.memory, wstr, wsize, font->handle, &layout, gdip.format, &bbox, NULL, NULL); GdipMeasureString(gdip.memory, wstr, wsize, font->handle, &layout, gdip.format, &bbox, NULL, NULL);
@ -777,93 +777,63 @@ nk_gdipfont_del(GdipFont *font)
} }
static void static void
nk_gdip_clipboard_paste(nk_handle usr, struct nk_text_edit *edit) nk_gdip_clipboard_paste(nk_handle usr, struct nk_text_edit* edit)
{ {
HGLOBAL mem;
SIZE_T size;
LPCWSTR wstr;
int utf8size;
char* utf8;
(void)usr; (void)usr;
if (IsClipboardFormatAvailable(CF_UNICODETEXT) && OpenClipboard(NULL))
if (!IsClipboardFormatAvailable(CF_UNICODETEXT) && OpenClipboard(NULL)) {
return; HGLOBAL mem = GetClipboardData(CF_UNICODETEXT);
if (mem)
mem = (HGLOBAL)GetClipboardData(CF_UNICODETEXT); {
if (!mem) { SIZE_T size = GlobalSize(mem) - 1;
if (size)
{
LPCWSTR wstr = (LPCWSTR)GlobalLock(mem);
if (wstr)
{
int utf8size = WideCharToMultiByte(CP_UTF8, 0, wstr, (int)(size / sizeof(wchar_t)), NULL, 0, NULL, NULL);
if (utf8size)
{
char* utf8 = (char*)malloc(utf8size);
if (utf8)
{
WideCharToMultiByte(CP_UTF8, 0, wstr, (int)(size / sizeof(wchar_t)), utf8, utf8size, NULL, NULL);
nk_textedit_paste(edit, utf8, utf8size);
free(utf8);
}
}
GlobalUnlock(mem);
}
}
}
CloseClipboard(); CloseClipboard();
return;
} }
size = GlobalSize(mem) - 1;
if (!size) {
CloseClipboard();
return;
}
wstr = (LPCWSTR)GlobalLock(mem);
if (!wstr) {
CloseClipboard();
return;
}
utf8size = WideCharToMultiByte(CP_UTF8, 0, wstr, (int)(size / sizeof(wchar_t)), NULL, 0, NULL, NULL);
if (!utf8size) {
GlobalUnlock(mem);
CloseClipboard();
return;
}
utf8 = (char*)malloc(utf8size);
if (!utf8) {
GlobalUnlock(mem);
CloseClipboard();
return;
}
WideCharToMultiByte(CP_UTF8, 0, wstr, (int)(size / sizeof(wchar_t)), utf8, utf8size, NULL, NULL);
nk_textedit_paste(edit, utf8, utf8size);
free(utf8);
GlobalUnlock(mem);
CloseClipboard();
} }
static void static void
nk_gdip_clipboard_copy(nk_handle usr, const char *text, int len) nk_gdip_clipboard_copy(nk_handle usr, const char* text, int len)
{ {
HGLOBAL mem; if (OpenClipboard(NULL))
wchar_t* wstr; {
int wsize; int wsize = MultiByteToWideChar(CP_UTF8, 0, text, len, NULL, 0);
(void)usr; if (wsize)
{
HGLOBAL mem = (HGLOBAL)GlobalAlloc(GMEM_MOVEABLE, (wsize + 1) * sizeof(wchar_t));
if (mem)
{
wchar_t* wstr = (wchar_t*)GlobalLock(mem);
if (wstr)
{
MultiByteToWideChar(CP_UTF8, 0, text, len, wstr, wsize);
wstr[wsize] = 0;
GlobalUnlock(mem);
if (!OpenClipboard(NULL)) SetClipboardData(CF_UNICODETEXT, mem);
return; }
}
wsize = MultiByteToWideChar(CP_UTF8, 0, text, len, NULL, 0); }
if (!wsize) {
CloseClipboard(); CloseClipboard();
return;
} }
mem = (HGLOBAL)GlobalAlloc(GMEM_MOVEABLE, (wsize + 1) * sizeof(wchar_t));
if (!mem) {
CloseClipboard();
return;
}
wstr = (wchar_t*)GlobalLock(mem);
if (!wstr) {
GlobalFree(mem);
CloseClipboard();
return;
}
MultiByteToWideChar(CP_UTF8, 0, text, len, wstr, wsize);
wstr[wsize] = 0;
GlobalUnlock(mem);
if (!SetClipboardData(CF_UNICODETEXT, mem))
GlobalFree(mem);
CloseClipboard();
} }
NK_API struct nk_context* NK_API struct nk_context*
@ -997,6 +967,13 @@ nk_gdip_handle_event(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
nk_input_key(&gdip.ctx, NK_KEY_SCROLL_UP, down); nk_input_key(&gdip.ctx, NK_KEY_SCROLL_UP, down);
return 1; return 1;
case 'A':
if (ctrl) {
nk_input_key(&gdip.ctx, NK_KEY_TEXT_SELECT_ALL, down);
return 1;
}
break;
case 'C': case 'C':
if (ctrl) { if (ctrl) {
nk_input_key(&gdip.ctx, NK_KEY_COPY, down); nk_input_key(&gdip.ctx, NK_KEY_COPY, down);