Windows: Don't release clipboard data before use
This commit is contained in:
parent
0c2f7092e2
commit
52396b5a5c
|
@ -142,43 +142,50 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_NativeSysImplementation_openURL
|
||||||
return JNI_TRUE;
|
return JNI_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
const void * getClipboard(int type)
|
|
||||||
{
|
|
||||||
|
|
||||||
void * ret;
|
|
||||||
HANDLE hglb;
|
|
||||||
// Open the clipboard
|
|
||||||
if (!OpenClipboard(NULL))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
hglb = GetClipboardData(type);
|
|
||||||
if (hglb != NULL) {
|
|
||||||
ret = GlobalLock(hglb);
|
|
||||||
if (ret != NULL) {
|
|
||||||
GlobalUnlock(hglb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close the clipboard now we're done
|
|
||||||
CloseClipboard();
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT jstring JNICALL Java_org_lwjgl_NativeSysImplementation_getClipboard
|
JNIEXPORT jstring JNICALL Java_org_lwjgl_NativeSysImplementation_getClipboard
|
||||||
(JNIEnv * env, jobject ignored)
|
(JNIEnv * env, jobject ignored)
|
||||||
{
|
{
|
||||||
// Check to see if there's text available in the clipboard
|
// Check to see if there's text available in the clipboard
|
||||||
BOOL textAvailable = IsClipboardFormatAvailable(CF_TEXT);
|
BOOL textAvailable = IsClipboardFormatAvailable(CF_TEXT);
|
||||||
BOOL unicodeAvailable = IsClipboardFormatAvailable(CF_UNICODETEXT);
|
BOOL unicodeAvailable = IsClipboardFormatAvailable(CF_UNICODETEXT);
|
||||||
|
void *clipboard_data;
|
||||||
|
jstring ret;
|
||||||
|
HANDLE hglb;
|
||||||
|
const wchar_t * str;
|
||||||
|
|
||||||
if (unicodeAvailable) {
|
if (unicodeAvailable) {
|
||||||
const wchar_t * str = (const wchar_t *) getClipboard(CF_UNICODETEXT);
|
if (!OpenClipboard(NULL))
|
||||||
return (*env)->NewString(env, str, wcslen(str));
|
return NULL;
|
||||||
|
hglb = GetClipboardData(CF_UNICODETEXT);
|
||||||
|
if (hglb == NULL) {
|
||||||
|
CloseClipboard();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
clipboard_data = GlobalLock(hglb);
|
||||||
|
if (clipboard_data == NULL) {
|
||||||
|
CloseClipboard();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
str = (const wchar_t *)clipboard_data;
|
||||||
|
ret = (*env)->NewString(env, str, wcslen(str));
|
||||||
} else if (textAvailable) {
|
} else if (textAvailable) {
|
||||||
return NewStringNative(env, (const char *) getClipboard(CF_TEXT));
|
if (!OpenClipboard(NULL))
|
||||||
|
return NULL;
|
||||||
|
hglb = GetClipboardData(CF_TEXT);
|
||||||
|
if (hglb == NULL) {
|
||||||
|
CloseClipboard();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
clipboard_data = GlobalLock(hglb);
|
||||||
|
if (clipboard_data == NULL) {
|
||||||
|
CloseClipboard();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
ret = NewStringNative(env, (const char *) clipboard_data);
|
||||||
} else {
|
} else {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
GlobalUnlock(hglb);
|
||||||
|
CloseClipboard();
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue