< prev index next >

src/java.desktop/windows/native/libawt/windows/awt_DnDDS.cpp

Print this page
rev 58018 : 8238575: DragSourceEvent.getLocation() returns wrong value on HiDPI screens (Windows)
Reviewed-by: XXX

*** 1,7 **** /* ! * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 280,290 **** } dragSource->m_dwPerformedDropEffect = DROPEFFECT_NONE; call_dSCddfinished(env, peer, res == DRAGDROP_S_DROP && effects != DROPEFFECT_NONE, convertDROPEFFECTToActions(effects), ! dragSource->m_dragPoint.x, dragSource->m_dragPoint.y); env->DeleteLocalRef(peer); DASSERT(AwtDropTarget::IsCurrentDnDDataObject(dragSource)); AwtDropTarget::SetCurrentDnDDataObject(NULL); --- 280,290 ---- } dragSource->m_dwPerformedDropEffect = DROPEFFECT_NONE; call_dSCddfinished(env, peer, res == DRAGDROP_S_DROP && effects != DROPEFFECT_NONE, convertDROPEFFECTToActions(effects), ! dragSource->m_dragPoint); env->DeleteLocalRef(peer); DASSERT(AwtDropTarget::IsCurrentDnDDataObject(dragSource)); AwtDropTarget::SetCurrentDnDDataObject(NULL);
*** 647,658 **** ::GetCursorPos(&dragPoint); if ( (dragPoint.x != m_dragPoint.x || dragPoint.y != m_dragPoint.y) && m_lastmods == modifiers) {//cannot move before cursor change ! call_dSCmouseMoved(env, m_peer, ! m_actions, modifiers, dragPoint.x, dragPoint.y); JNU_CHECK_EXCEPTION_RETURN(env, E_UNEXPECTED); m_dragPoint = dragPoint; } if ((modifiers & JAVA_BUTTON_MASK) == 0) { --- 647,657 ---- ::GetCursorPos(&dragPoint); if ( (dragPoint.x != m_dragPoint.x || dragPoint.y != m_dragPoint.y) && m_lastmods == modifiers) {//cannot move before cursor change ! call_dSCmouseMoved(env, m_peer, m_actions, modifiers, dragPoint); JNU_CHECK_EXCEPTION_RETURN(env, E_UNEXPECTED); m_dragPoint = dragPoint; } if ((modifiers & JAVA_BUTTON_MASK) == 0) {
*** 660,671 **** } else if (m_initmods == 0) { m_initmods = modifiers; } else if ((modifiers & JAVA_BUTTON_MASK) != (m_initmods & JAVA_BUTTON_MASK)) { return DRAGDROP_S_CANCEL; } else if (m_lastmods != modifiers) { ! call_dSCchanged(env, m_peer, ! m_actions, modifiers, dragPoint.x, dragPoint.y); m_bRestoreNodropCustomCursor = TRUE; } m_lastmods = modifiers; --- 659,669 ---- } else if (m_initmods == 0) { m_initmods = modifiers; } else if ((modifiers & JAVA_BUTTON_MASK) != (m_initmods & JAVA_BUTTON_MASK)) { return DRAGDROP_S_CANCEL; } else if (m_lastmods != modifiers) { ! call_dSCchanged(env, m_peer, m_actions, modifiers, dragPoint); m_bRestoreNodropCustomCursor = TRUE; } m_lastmods = modifiers;
*** 724,740 **** int invalid = (dwEffect == DROPEFFECT_NONE); if (invalid) { // Don't call dragExit if dragEnter and dragOver haven't been called. if (!m_enterpending) { ! call_dSCexit(env, m_peer, curs.x, curs.y); } m_droptarget = (HWND)NULL; m_enterpending = TRUE; } else if (m_droptarget != NULL) { (*(m_enterpending ? call_dSCenter : call_dSCmotion)) ! (env, m_peer, m_actions, modifiers, curs.x, curs.y); m_enterpending = FALSE; } if (m_droptarget != NULL) { --- 722,738 ---- int invalid = (dwEffect == DROPEFFECT_NONE); if (invalid) { // Don't call dragExit if dragEnter and dragOver haven't been called. if (!m_enterpending) { ! call_dSCexit(env, m_peer, curs); } m_droptarget = (HWND)NULL; m_enterpending = TRUE; } else if (m_droptarget != NULL) { (*(m_enterpending ? call_dSCenter : call_dSCmotion)) ! (env, m_peer, m_actions, modifiers, curs); m_enterpending = FALSE; } if (m_droptarget != NULL) {
*** 1174,1252 **** pmedium->pUnkForRelease = (IUnknown *)NULL; return S_OK; } DECLARE_JAVA_CLASS(dSCClazz, "sun/awt/windows/WDragSourceContextPeer") void AwtDragSource::call_dSCenter(JNIEnv* env, jobject self, jint targetActions, ! jint modifiers, jint x, jint y) { DECLARE_VOID_JAVA_METHOD(dSCenter, dSCClazz, "dragEnter", "(IIII)V"); DASSERT(!JNU_IsNull(env, self)); ! env->CallVoidMethod(self, dSCenter, targetActions, modifiers, x, y); if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) { env->ExceptionDescribe(); env->ExceptionClear(); } } void AwtDragSource::call_dSCmotion(JNIEnv* env, jobject self, jint targetActions, ! jint modifiers, jint x, jint y) { DECLARE_VOID_JAVA_METHOD(dSCmotion, dSCClazz, "dragMotion", "(IIII)V"); DASSERT(!JNU_IsNull(env, self)); ! env->CallVoidMethod(self, dSCmotion, targetActions, modifiers, x, y); if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) { env->ExceptionDescribe(); env->ExceptionClear(); } } void AwtDragSource::call_dSCchanged(JNIEnv* env, jobject self, jint targetActions, ! jint modifiers, jint x, jint y) { DECLARE_VOID_JAVA_METHOD(dSCchanged, dSCClazz, "operationChanged", "(IIII)V"); DASSERT(!JNU_IsNull(env, self)); ! env->CallVoidMethod(self, dSCchanged, targetActions, modifiers, x, y); if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) { env->ExceptionDescribe(); env->ExceptionClear(); } } void ! AwtDragSource::call_dSCexit(JNIEnv* env, jobject self, jint x, jint y) { DECLARE_VOID_JAVA_METHOD(dSCexit, dSCClazz, "dragExit", "(II)V"); DASSERT(!JNU_IsNull(env, self)); ! env->CallVoidMethod(self, dSCexit, x, y); if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) { env->ExceptionDescribe(); env->ExceptionClear(); } } void AwtDragSource::call_dSCddfinished(JNIEnv* env, jobject self, jboolean success, ! jint operations, jint x, jint y) { DECLARE_VOID_JAVA_METHOD(dSCddfinished, dSCClazz, "dragDropFinished", "(ZIII)V"); DASSERT(!JNU_IsNull(env, self)); ! env->CallVoidMethod(self, dSCddfinished, success, operations, x, y); if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) { env->ExceptionDescribe(); env->ExceptionClear(); } } void AwtDragSource::call_dSCmouseMoved(JNIEnv* env, jobject self, jint targetActions, ! jint modifiers, jint x, jint y) { DECLARE_VOID_JAVA_METHOD(dSCmouseMoved, dSCClazz, "dragMouseMoved", "(IIII)V"); DASSERT(!JNU_IsNull(env, self)); ! env->CallVoidMethod(self, dSCmouseMoved, targetActions, modifiers, x, y); if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) { env->ExceptionDescribe(); env->ExceptionClear(); } } --- 1172,1267 ---- pmedium->pUnkForRelease = (IUnknown *)NULL; return S_OK; } + static void ScaleDown(POINT &pt) { + HMONITOR monitor = MonitorFromPoint(pt, MONITOR_DEFAULTTOPRIMARY); + int screen = AwtWin32GraphicsDevice::GetScreenFromHMONITOR(monitor); + Devices::InstanceAccess devices; + AwtWin32GraphicsDevice *device = devices->GetDevice(screen); + if (device) { + pt.x = device->ScaleDownX(pt.x); + pt.y = device->ScaleDownY(pt.y); + } + } + DECLARE_JAVA_CLASS(dSCClazz, "sun/awt/windows/WDragSourceContextPeer") void AwtDragSource::call_dSCenter(JNIEnv* env, jobject self, jint targetActions, ! jint modifiers, POINT pt) { ! ScaleDown(pt); DECLARE_VOID_JAVA_METHOD(dSCenter, dSCClazz, "dragEnter", "(IIII)V"); DASSERT(!JNU_IsNull(env, self)); ! env->CallVoidMethod(self, dSCenter, targetActions, modifiers, pt.x, pt.y); if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) { env->ExceptionDescribe(); env->ExceptionClear(); } } void AwtDragSource::call_dSCmotion(JNIEnv* env, jobject self, jint targetActions, ! jint modifiers, POINT pt) { ! ScaleDown(pt); DECLARE_VOID_JAVA_METHOD(dSCmotion, dSCClazz, "dragMotion", "(IIII)V"); DASSERT(!JNU_IsNull(env, self)); ! env->CallVoidMethod(self, dSCmotion, targetActions, modifiers, pt.x, pt.y); if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) { env->ExceptionDescribe(); env->ExceptionClear(); } } void AwtDragSource::call_dSCchanged(JNIEnv* env, jobject self, jint targetActions, ! jint modifiers, POINT pt) { ! ScaleDown(pt); DECLARE_VOID_JAVA_METHOD(dSCchanged, dSCClazz, "operationChanged", "(IIII)V"); DASSERT(!JNU_IsNull(env, self)); ! env->CallVoidMethod(self, dSCchanged, targetActions, modifiers, pt.x, pt.y); if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) { env->ExceptionDescribe(); env->ExceptionClear(); } } void ! AwtDragSource::call_dSCexit(JNIEnv* env, jobject self, POINT pt) { ! ScaleDown(pt); DECLARE_VOID_JAVA_METHOD(dSCexit, dSCClazz, "dragExit", "(II)V"); DASSERT(!JNU_IsNull(env, self)); ! env->CallVoidMethod(self, dSCexit, pt.x, pt.y); if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) { env->ExceptionDescribe(); env->ExceptionClear(); } } void AwtDragSource::call_dSCddfinished(JNIEnv* env, jobject self, jboolean success, ! jint operations, POINT pt) { ! ScaleDown(pt); DECLARE_VOID_JAVA_METHOD(dSCddfinished, dSCClazz, "dragDropFinished", "(ZIII)V"); DASSERT(!JNU_IsNull(env, self)); ! env->CallVoidMethod(self, dSCddfinished, success, operations, pt.x, pt.y); if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) { env->ExceptionDescribe(); env->ExceptionClear(); } } void AwtDragSource::call_dSCmouseMoved(JNIEnv* env, jobject self, jint targetActions, ! jint modifiers, POINT pt) { ! ScaleDown(pt); DECLARE_VOID_JAVA_METHOD(dSCmouseMoved, dSCClazz, "dragMouseMoved", "(IIII)V"); DASSERT(!JNU_IsNull(env, self)); ! env->CallVoidMethod(self, dSCmouseMoved, targetActions, modifiers, pt.x, pt.y); if (!JNU_IsNull(env, safe_ExceptionOccurred(env))) { env->ExceptionDescribe(); env->ExceptionClear(); } }
< prev index next >