modules/graphics/src/main/native-glass/win/GlassApplication.cpp

Print this page




 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)