--- old/src/java.desktop/windows/native/libawt/windows/awt_Robot.cpp 2016-11-11 16:55:57.911191000 +0300 +++ new/src/java.desktop/windows/native/libawt/windows/awt_Robot.cpp 2016-11-11 16:55:57.419162900 +0300 @@ -31,9 +31,10 @@ #include "java_awt_event_InputEvent.h" #include -AwtRobot::AwtRobot( jobject peer ) +AwtRobot::AwtRobot(jobject peer, int screen) { JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + m_deviceIndex = screen; m_peerObject = env->NewWeakGlobalRef(peer); JNU_CHECK_EXCEPTION(env); JNI_SET_PDATA(peer, this); @@ -80,12 +81,14 @@ (PVOID)newSpeed, SPIF_SENDCHANGE); - int primaryIndex = AwtWin32GraphicsDevice::GetDefaultDeviceIndex(); Devices::InstanceAccess devices; - AwtWin32GraphicsDevice *device = devices->GetDevice(primaryIndex); + AwtWin32GraphicsDevice *device = devices->GetDevice(m_deviceIndex); - x = (device == NULL) ? x : device->ScaleUpX(x); - y = (device == NULL) ? y : device->ScaleUpY(y); + RECT rect = {0, 0, 0, 0}; + MonitorBounds(AwtWin32GraphicsDevice::GetMonitor(m_deviceIndex), &rect); + + x = rect.left + (device == NULL ? x : device->ScaleUpX(x)); + y = rect.top + (device == NULL ? y : device->ScaleUpY(y)); POINT curPos; ::GetCursorPos(&curPos); @@ -204,7 +207,9 @@ { DASSERT(width > 0 && height > 0); - HDC hdcScreen = ::CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); + MONITORINFOEX *pMonInfo = + (LPMONITORINFOEX)AwtWin32GraphicsDevice::GetMonitorInfo(m_deviceIndex); + HDC hdcScreen = ::CreateDC(TEXT("DISPLAY"), pMonInfo->szDevice, NULL, NULL); HDC hdcMem = ::CreateCompatibleDC(hdcScreen); HBITMAP hbitmap; HBITMAP hOldBitmap; @@ -218,14 +223,12 @@ } hOldBitmap = (HBITMAP)::SelectObject(hdcMem, hbitmap); - // REMIND: not multimon-friendly... - int primaryIndex = AwtWin32GraphicsDevice::GetDefaultDeviceIndex(); hOldPalette = - AwtWin32GraphicsDevice::SelectPalette(hdcMem, primaryIndex); - AwtWin32GraphicsDevice::RealizePalette(hdcMem, primaryIndex); + AwtWin32GraphicsDevice::SelectPalette(hdcMem, m_deviceIndex); + AwtWin32GraphicsDevice::RealizePalette(hdcMem, m_deviceIndex); Devices::InstanceAccess devices; - AwtWin32GraphicsDevice *device = devices->GetDevice(primaryIndex); + AwtWin32GraphicsDevice *device = devices->GetDevice(m_deviceIndex); int sWidth = (device == NULL) ? width : device->ScaleUpX(width); int sHeight = (device == NULL) ? height : device->ScaleUpY(height); @@ -369,11 +372,11 @@ // JNIEXPORT void JNICALL Java_sun_awt_windows_WRobotPeer_create( - JNIEnv * env, jobject self) + JNIEnv * env, jobject self, jint screen) { TRY; - new AwtRobot(self); + new AwtRobot(self, screen); CATCH_BAD_ALLOC; }