Fix Copy/Paste/Select All for Text Input
This commit is contained in:
parent
1aae7b555a
commit
0435477a91
@ -761,7 +761,7 @@ nk_gdipfont_get_text_width(nk_handle handle, float height, const char *text, int
|
||||
|
||||
(void)height;
|
||||
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);
|
||||
|
||||
GdipMeasureString(gdip.memory, wstr, wsize, font->handle, &layout, gdip.format, &bbox, NULL, NULL);
|
||||
@ -779,92 +779,62 @@ nk_gdipfont_del(GdipFont *font)
|
||||
static void
|
||||
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;
|
||||
|
||||
if (!IsClipboardFormatAvailable(CF_UNICODETEXT) && OpenClipboard(NULL))
|
||||
return;
|
||||
|
||||
mem = (HGLOBAL)GetClipboardData(CF_UNICODETEXT);
|
||||
if (!mem) {
|
||||
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;
|
||||
}
|
||||
|
||||
if (IsClipboardFormatAvailable(CF_UNICODETEXT) && OpenClipboard(NULL))
|
||||
{
|
||||
HGLOBAL mem = 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();
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
nk_gdip_clipboard_copy(nk_handle usr, const char* text, int len)
|
||||
{
|
||||
HGLOBAL mem;
|
||||
wchar_t* wstr;
|
||||
int wsize;
|
||||
(void)usr;
|
||||
|
||||
if (!OpenClipboard(NULL))
|
||||
return;
|
||||
|
||||
wsize = MultiByteToWideChar(CP_UTF8, 0, text, len, NULL, 0);
|
||||
if (!wsize) {
|
||||
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;
|
||||
}
|
||||
|
||||
if (OpenClipboard(NULL))
|
||||
{
|
||||
int wsize = MultiByteToWideChar(CP_UTF8, 0, text, len, NULL, 0);
|
||||
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 (!SetClipboardData(CF_UNICODETEXT, mem))
|
||||
GlobalFree(mem);
|
||||
|
||||
SetClipboardData(CF_UNICODETEXT, mem);
|
||||
}
|
||||
}
|
||||
}
|
||||
CloseClipboard();
|
||||
}
|
||||
}
|
||||
|
||||
NK_API struct nk_context*
|
||||
nk_gdip_init(HWND hwnd, unsigned int width, unsigned int height)
|
||||
@ -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);
|
||||
return 1;
|
||||
|
||||
case 'A':
|
||||
if (ctrl) {
|
||||
nk_input_key(&gdip.ctx, NK_KEY_TEXT_SELECT_ALL, down);
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'C':
|
||||
if (ctrl) {
|
||||
nk_input_key(&gdip.ctx, NK_KEY_COPY, down);
|
||||
|
Loading…
Reference in New Issue
Block a user