106 m_mainThreadId = ::GetCurrentThreadId(); 107 108 Create(NULL, 0, 0, 400, 300, TEXT(""), 0, 0, NULL); 109 } 110 111 GlassApplication::~GlassApplication() 112 { 113 if (m_grefThis) { 114 GetEnv()->DeleteGlobalRef(m_grefThis); 115 } 116 if (m_clipboard) { 117 GetEnv()->DeleteGlobalRef(m_clipboard); 118 } 119 } 120 121 LPCTSTR GlassApplication::GetWindowClassNameSuffix() 122 { 123 return szGlassToolkitWindow; 124 } 125 126 LRESULT GlassApplication::WindowProc(UINT msg, WPARAM wParam, LPARAM lParam) 127 { 128 switch (msg) { 129 case WM_DO_ACTION: 130 case WM_DO_ACTION_LATER: 131 { 132 Action * action = (Action *)wParam; 133 action->Do(); 134 if (msg == WM_DO_ACTION_LATER) { 135 delete action; 136 } 137 } 138 return 0; 139 case WM_CREATE: 140 pInstance = this; 141 STRACE(_T("GlassApplication: created.")); 142 break; 143 case WM_DESTROY: 144 //Alarm clipboard dispose if any. 145 //Please, use RegisterClipboardViewer(NULL) instead of UnregisterClipboardViewer. 157 ::SendMessage(m_hNextClipboardView, WM_CHANGECBCHAIN, wParam, lParam); 158 } 159 break; 160 case WM_DRAWCLIPBOARD: 161 if (NULL != m_clipboard) { 162 GetEnv()->CallVoidMethod(m_clipboard, midContentChanged); 163 CheckAndClearException(GetEnv()); 164 } 165 if (NULL != m_hNextClipboardView) { 166 ::SendMessage(m_hNextClipboardView, WM_DRAWCLIPBOARD, wParam, lParam); 167 } 168 break; 169 case WM_SETTINGCHANGE: 170 if ((UINT)wParam != SPI_SETWORKAREA) { 171 break; 172 } 173 // Fall through 174 case WM_DISPLAYCHANGE: 175 GlassScreen::HandleDisplayChange(); 176 break; 177 } 178 return ::DefWindowProc(GetHWND(), msg, wParam, lParam); 179 } 180 181 LRESULT CALLBACK GlassApplication::MouseLLHook(int nCode, WPARAM wParam, LPARAM lParam) 182 { 183 if (nCode >= 0) { 184 switch (wParam) { 185 case WM_LBUTTONDOWN: 186 case WM_RBUTTONDOWN: 187 case WM_MBUTTONDOWN: 188 case WM_NCLBUTTONDOWN: 189 case WM_NCMBUTTONDOWN: 190 case WM_NCRBUTTONDOWN: 191 case WM_NCXBUTTONDOWN: 192 case WM_MOUSEACTIVATE: 193 { 194 POINT pt = ((MSLLHOOKSTRUCT*)lParam)->pt; 195 HWND hwnd = ::GetAncestor(::WindowFromPoint(pt), GA_ROOT); 196 316 { 317 if (dwReason == DLL_PROCESS_ATTACH) { 318 GlassApplication::SetHInstance((HINSTANCE)hinstDLL); 319 } 320 return TRUE; 321 } 322 323 /* 324 * Class: com_sun_glass_ui_win_WinApplication 325 * Method: initIDs 326 * Signature: ()V 327 */ 328 JNIEXPORT void JNICALL Java_com_sun_glass_ui_win_WinApplication_initIDs 329 (JNIEnv *env, jclass cls) 330 { 331 javaIDs.Application.reportExceptionMID = 332 env->GetStaticMethodID(cls, "reportException", "(Ljava/lang/Throwable;)V"); 333 ASSERT(javaIDs.Application.reportExceptionMID); 334 if (CheckAndClearException(env)) return; 335 336 //NOTE: substitute the cls 337 cls = (jclass)env->FindClass("java/lang/Runnable"); 338 if (CheckAndClearException(env)) return; 339 340 javaIDs.Runnable.run = env->GetMethodID(cls, "run", "()V"); 341 ASSERT(javaIDs.Runnable.run); 342 if (CheckAndClearException(env)) return; 343 } 344 345 /* 346 * Class: com_sun_glass_ui_win_WinApplication 347 * Method: _init 348 * Signature: ()J 349 */ 350 JNIEXPORT jlong JNICALL Java_com_sun_glass_ui_win_WinApplication__1init 351 (JNIEnv *env, jobject _this) 352 { 353 // TODO: if/when we introduce JavaFX launcher, DPI awareness should 354 // be specified in its manifest instead of this call below 355 if (IS_WINVISTA) { 406 * Signature: ()V 407 */ 408 JNIEXPORT void JNICALL Java_com_sun_glass_ui_win_WinApplication__1terminateLoop 409 (JNIEnv * env, jobject self) 410 { 411 HWND hWnd = GlassApplication::GetToolkitHWND(); 412 if (::IsWindow(hWnd)) { 413 ::DestroyWindow(hWnd); 414 } 415 } 416 417 /* 418 * Class: com_sun_glass_ui_win_WinApplication 419 * Method: _enterNestedEventLoopImpl 420 * Signature: ()Ljava/lang/Object; 421 */ 422 JNIEXPORT jobject JNICALL Java_com_sun_glass_ui_win_WinApplication__1enterNestedEventLoopImpl 423 (JNIEnv * env, jobject self) 424 { 425 return GlassApplication::EnterNestedEventLoop(env); 426 } 427 428 /* 429 * Class: com_sun_glass_ui_win_WinApplication 430 * Method: _leaveNestedEventLoopImpl 431 * Signature: (Ljava/lang/Object;)V 432 */ 433 JNIEXPORT void JNICALL Java_com_sun_glass_ui_win_WinApplication__1leaveNestedEventLoopImpl 434 (JNIEnv * env, jobject self, jobject retValue) 435 { 436 GlassApplication::LeaveNestedEventLoop(env, retValue); 437 } 438 439 /* 440 * Class: com_sun_glass_ui_Application 441 * Method: _invokeAndWait 442 * Signature: (Ljava/lang/Runnable;)V 443 */ 444 JNIEXPORT void JNICALL Java_com_sun_glass_ui_win_WinApplication__1invokeAndWait 445 (JNIEnv * env, jobject japplication, jobject runnable) | 106 m_mainThreadId = ::GetCurrentThreadId(); 107 108 Create(NULL, 0, 0, 400, 300, TEXT(""), 0, 0, NULL); 109 } 110 111 GlassApplication::~GlassApplication() 112 { 113 if (m_grefThis) { 114 GetEnv()->DeleteGlobalRef(m_grefThis); 115 } 116 if (m_clipboard) { 117 GetEnv()->DeleteGlobalRef(m_clipboard); 118 } 119 } 120 121 LPCTSTR GlassApplication::GetWindowClassNameSuffix() 122 { 123 return szGlassToolkitWindow; 124 } 125 126 jstring GetThemeName(JNIEnv* env) 127 { 128 HIGHCONTRAST contrastInfo; 129 contrastInfo.cbSize = sizeof(HIGHCONTRAST); 130 SystemParametersInfo(SPI_GETHIGHCONTRAST, sizeof(HIGHCONTRAST), &contrastInfo, 0); 131 if (contrastInfo.dwFlags & HCF_HIGHCONTRASTON) { 132 size_t length = wcslen(contrastInfo.lpszDefaultScheme); 133 return env->NewString((jchar*)contrastInfo.lpszDefaultScheme, length); 134 } 135 return NULL; 136 } 137 138 LRESULT GlassApplication::WindowProc(UINT msg, WPARAM wParam, LPARAM lParam) 139 { 140 switch (msg) { 141 case WM_DO_ACTION: 142 case WM_DO_ACTION_LATER: 143 { 144 Action * action = (Action *)wParam; 145 action->Do(); 146 if (msg == WM_DO_ACTION_LATER) { 147 delete action; 148 } 149 } 150 return 0; 151 case WM_CREATE: 152 pInstance = this; 153 STRACE(_T("GlassApplication: created.")); 154 break; 155 case WM_DESTROY: 156 //Alarm clipboard dispose if any. 157 //Please, use RegisterClipboardViewer(NULL) instead of UnregisterClipboardViewer. 169 ::SendMessage(m_hNextClipboardView, WM_CHANGECBCHAIN, wParam, lParam); 170 } 171 break; 172 case WM_DRAWCLIPBOARD: 173 if (NULL != m_clipboard) { 174 GetEnv()->CallVoidMethod(m_clipboard, midContentChanged); 175 CheckAndClearException(GetEnv()); 176 } 177 if (NULL != m_hNextClipboardView) { 178 ::SendMessage(m_hNextClipboardView, WM_DRAWCLIPBOARD, wParam, lParam); 179 } 180 break; 181 case WM_SETTINGCHANGE: 182 if ((UINT)wParam != SPI_SETWORKAREA) { 183 break; 184 } 185 // Fall through 186 case WM_DISPLAYCHANGE: 187 GlassScreen::HandleDisplayChange(); 188 break; 189 case WM_THEMECHANGED: { 190 JNIEnv* env = GetEnv(); 191 jstring themeName = GetThemeName(env); 192 jboolean result = env->CallBooleanMethod(m_grefThis, javaIDs.Application.notifyThemeChangedMID, themeName); 193 if (CheckAndClearException(env)) return 1; 194 return !!result; 195 } 196 } 197 return ::DefWindowProc(GetHWND(), msg, wParam, lParam); 198 } 199 200 LRESULT CALLBACK GlassApplication::MouseLLHook(int nCode, WPARAM wParam, LPARAM lParam) 201 { 202 if (nCode >= 0) { 203 switch (wParam) { 204 case WM_LBUTTONDOWN: 205 case WM_RBUTTONDOWN: 206 case WM_MBUTTONDOWN: 207 case WM_NCLBUTTONDOWN: 208 case WM_NCMBUTTONDOWN: 209 case WM_NCRBUTTONDOWN: 210 case WM_NCXBUTTONDOWN: 211 case WM_MOUSEACTIVATE: 212 { 213 POINT pt = ((MSLLHOOKSTRUCT*)lParam)->pt; 214 HWND hwnd = ::GetAncestor(::WindowFromPoint(pt), GA_ROOT); 215 335 { 336 if (dwReason == DLL_PROCESS_ATTACH) { 337 GlassApplication::SetHInstance((HINSTANCE)hinstDLL); 338 } 339 return TRUE; 340 } 341 342 /* 343 * Class: com_sun_glass_ui_win_WinApplication 344 * Method: initIDs 345 * Signature: ()V 346 */ 347 JNIEXPORT void JNICALL Java_com_sun_glass_ui_win_WinApplication_initIDs 348 (JNIEnv *env, jclass cls) 349 { 350 javaIDs.Application.reportExceptionMID = 351 env->GetStaticMethodID(cls, "reportException", "(Ljava/lang/Throwable;)V"); 352 ASSERT(javaIDs.Application.reportExceptionMID); 353 if (CheckAndClearException(env)) return; 354 355 javaIDs.Application.notifyThemeChangedMID = 356 env->GetMethodID(cls, "notifyThemeChanged", "(Ljava/lang/String;)Z"); 357 ASSERT(javaIDs.Application.notifyThemeChangedMID); 358 if (CheckAndClearException(env)) return; 359 360 //NOTE: substitute the cls 361 cls = (jclass)env->FindClass("java/lang/Runnable"); 362 if (CheckAndClearException(env)) return; 363 364 javaIDs.Runnable.run = env->GetMethodID(cls, "run", "()V"); 365 ASSERT(javaIDs.Runnable.run); 366 if (CheckAndClearException(env)) return; 367 } 368 369 /* 370 * Class: com_sun_glass_ui_win_WinApplication 371 * Method: _init 372 * Signature: ()J 373 */ 374 JNIEXPORT jlong JNICALL Java_com_sun_glass_ui_win_WinApplication__1init 375 (JNIEnv *env, jobject _this) 376 { 377 // TODO: if/when we introduce JavaFX launcher, DPI awareness should 378 // be specified in its manifest instead of this call below 379 if (IS_WINVISTA) { 430 * Signature: ()V 431 */ 432 JNIEXPORT void JNICALL Java_com_sun_glass_ui_win_WinApplication__1terminateLoop 433 (JNIEnv * env, jobject self) 434 { 435 HWND hWnd = GlassApplication::GetToolkitHWND(); 436 if (::IsWindow(hWnd)) { 437 ::DestroyWindow(hWnd); 438 } 439 } 440 441 /* 442 * Class: com_sun_glass_ui_win_WinApplication 443 * Method: _enterNestedEventLoopImpl 444 * Signature: ()Ljava/lang/Object; 445 */ 446 JNIEXPORT jobject JNICALL Java_com_sun_glass_ui_win_WinApplication__1enterNestedEventLoopImpl 447 (JNIEnv * env, jobject self) 448 { 449 return GlassApplication::EnterNestedEventLoop(env); 450 } 451 452 /* 453 * Class: com_sun_glass_ui_win_WinApplication 454 * Method: _getHighContrastTheme 455 * Signature: ()Ljava/lang/String; 456 */ 457 JNIEXPORT jstring JNICALL Java_com_sun_glass_ui_win_WinApplication__1getHighContrastTheme 458 (JNIEnv * env, jobject self) 459 { 460 return GetThemeName(env); 461 } 462 463 /* 464 * Class: com_sun_glass_ui_win_WinApplication 465 * Method: _leaveNestedEventLoopImpl 466 * Signature: (Ljava/lang/Object;)V 467 */ 468 JNIEXPORT void JNICALL Java_com_sun_glass_ui_win_WinApplication__1leaveNestedEventLoopImpl 469 (JNIEnv * env, jobject self, jobject retValue) 470 { 471 GlassApplication::LeaveNestedEventLoop(env, retValue); 472 } 473 474 /* 475 * Class: com_sun_glass_ui_Application 476 * Method: _invokeAndWait 477 * Signature: (Ljava/lang/Runnable;)V 478 */ 479 JNIEXPORT void JNICALL Java_com_sun_glass_ui_win_WinApplication__1invokeAndWait 480 (JNIEnv * env, jobject japplication, jobject runnable) |