| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 #include "SkTypes.h" | 8 #include "SkTypes.h" |
| 9 | 9 |
| 10 #if defined(SK_BUILD_FOR_WIN) | 10 #if defined(SK_BUILD_FOR_WIN) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 fContext = EGL_NO_CONTEXT; | 53 fContext = EGL_NO_CONTEXT; |
| 54 fSurface = EGL_NO_SURFACE; | 54 fSurface = EGL_NO_SURFACE; |
| 55 #endif | 55 #endif |
| 56 fHGLRC = NULL; | 56 fHGLRC = NULL; |
| 57 #endif | 57 #endif |
| 58 fAttached = kNone_BackEndType; | 58 fAttached = kNone_BackEndType; |
| 59 fFullscreen = false; | 59 fFullscreen = false; |
| 60 } | 60 } |
| 61 | 61 |
| 62 SkOSWindow::~SkOSWindow() { | 62 SkOSWindow::~SkOSWindow() { |
| 63 this->setFullscreen(false); | |
| 64 #if SK_SUPPORT_GPU | 63 #if SK_SUPPORT_GPU |
| 65 if (fHGLRC) { | 64 if (fHGLRC) { |
| 66 wglDeleteContext((HGLRC)fHGLRC); | 65 wglDeleteContext((HGLRC)fHGLRC); |
| 67 } | 66 } |
| 68 #if SK_ANGLE | 67 #if SK_ANGLE |
| 69 if (EGL_NO_CONTEXT != fContext) { | 68 if (EGL_NO_CONTEXT != fContext) { |
| 70 eglDestroyContext(fDisplay, fContext); | 69 eglDestroyContext(fDisplay, fContext); |
| 71 fContext = EGL_NO_CONTEXT; | 70 fContext = EGL_NO_CONTEXT; |
| 72 } | 71 } |
| 73 | 72 |
| 74 if (EGL_NO_SURFACE != fSurface) { | 73 if (EGL_NO_SURFACE != fSurface) { |
| 75 eglDestroySurface(fDisplay, fSurface); | 74 eglDestroySurface(fDisplay, fSurface); |
| 76 fSurface = EGL_NO_SURFACE; | 75 fSurface = EGL_NO_SURFACE; |
| 77 } | 76 } |
| 78 | 77 |
| 79 if (EGL_NO_DISPLAY != fDisplay) { | 78 if (EGL_NO_DISPLAY != fDisplay) { |
| 80 eglTerminate(fDisplay); | 79 eglTerminate(fDisplay); |
| 81 fDisplay = EGL_NO_DISPLAY; | 80 fDisplay = EGL_NO_DISPLAY; |
| 82 } | 81 } |
| 83 #endif // SK_ANGLE | 82 #endif // SK_ANGLE |
| 84 #endif // SK_SUPPORT_GPU | 83 #endif // SK_SUPPORT_GPU |
| 85 gHwndToOSWindowMap.remove(fHWND); | 84 this->closeWindow(); |
| 86 DestroyWindow((HWND)fHWND); | |
| 87 } | 85 } |
| 88 | 86 |
| 89 static SkKey winToskKey(WPARAM vk) { | 87 static SkKey winToskKey(WPARAM vk) { |
| 90 static const struct { | 88 static const struct { |
| 91 WPARAM fVK; | 89 WPARAM fVK; |
| 92 SkKey fKey; | 90 SkKey fKey; |
| 93 } gPair[] = { | 91 } gPair[] = { |
| 94 { VK_BACK, kBack_SkKey }, | 92 { VK_BACK, kBack_SkKey }, |
| 95 { VK_CLEAR, kBack_SkKey }, | 93 { VK_CLEAR, kBack_SkKey }, |
| 96 { VK_RETURN, kOK_SkKey }, | 94 { VK_RETURN, kOK_SkKey }, |
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 presentANGLE(); | 604 presentANGLE(); |
| 607 break; | 605 break; |
| 608 #endif // SK_ANGLE | 606 #endif // SK_ANGLE |
| 609 #endif // SK_SUPPORT_GPU | 607 #endif // SK_SUPPORT_GPU |
| 610 default: | 608 default: |
| 611 SkASSERT(false); | 609 SkASSERT(false); |
| 612 break; | 610 break; |
| 613 } | 611 } |
| 614 } | 612 } |
| 615 | 613 |
| 616 void SkOSWindow::setFullscreen(bool fullscreen) { | 614 bool SkOSWindow::makeFullscreen() { |
| 617 if (fullscreen == fFullscreen) { | 615 if (fFullscreen) { |
| 618 return; | 616 return true; |
| 619 } | 617 } |
| 620 if (fHGLRC) { | 618 if (fHGLRC) { |
| 621 this->detachGL(); | 619 this->detachGL(); |
| 622 } | 620 } |
| 623 // This is hacked together from various sources on the web. It can certainly
be improved and be | 621 // This is hacked together from various sources on the web. It can certainly
be improved and be |
| 624 // made more robust. | 622 // made more robust. |
| 625 if (fullscreen) { | 623 |
| 626 // Save current window/resolution information. | 624 // Save current window/resolution information. We do this in case we ever im
plement switching |
| 627 fSavedWindowState.fZoomed = SkToBool(IsZoomed((HWND)fHWND)); | 625 // back to windowed mode. |
| 628 if (fSavedWindowState.fZoomed) { | 626 fSavedWindowState.fZoomed = SkToBool(IsZoomed((HWND)fHWND)); |
| 629 SendMessage((HWND)fHWND, WM_SYSCOMMAND, SC_RESTORE, 0); | 627 if (fSavedWindowState.fZoomed) { |
| 630 } | 628 SendMessage((HWND)fHWND, WM_SYSCOMMAND, SC_RESTORE, 0); |
| 631 fSavedWindowState.fStyle = GetWindowLong((HWND)fHWND, GWL_STYLE); | |
| 632 fSavedWindowState.fExStyle = GetWindowLong((HWND)fHWND, GWL_EXSTYLE); | |
| 633 GetWindowRect((HWND)fHWND, &fSavedWindowState.fRect); | |
| 634 DEVMODE dmScreenSettings; // Device Mode | |
| 635 memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // Makes Sur
e Memory's Cleared | |
| 636 dmScreenSettings.dmSize=sizeof(dmScreenSettings); // Size Of The D
evmode Structure | |
| 637 EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dmScreenSettings); | |
| 638 fSavedWindowState.fScreenWidth = dmScreenSettings.dmPelsWidth; | |
| 639 fSavedWindowState.fScreenHeight = dmScreenSettings.dmPelsHeight; | |
| 640 fSavedWindowState.fScreenBits = dmScreenSettings.dmBitsPerPel; | |
| 641 fSavedWindowState.fHWND = fHWND; | |
| 642 } | 629 } |
| 630 fSavedWindowState.fStyle = GetWindowLong((HWND)fHWND, GWL_STYLE); |
| 631 fSavedWindowState.fExStyle = GetWindowLong((HWND)fHWND, GWL_EXSTYLE); |
| 632 GetWindowRect((HWND)fHWND, &fSavedWindowState.fRect); |
| 633 DEVMODE currScreenSettings; |
| 634 memset(&currScreenSettings,0,sizeof(currScreenSettings)); |
| 635 currScreenSettings.dmSize = sizeof(currScreenSettings); |
| 636 EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &currScreenSettings); |
| 637 fSavedWindowState.fScreenWidth = currScreenSettings.dmPelsWidth; |
| 638 fSavedWindowState.fScreenHeight = currScreenSettings.dmPelsHeight; |
| 639 fSavedWindowState.fScreenBits = currScreenSettings.dmBitsPerPel; |
| 640 fSavedWindowState.fHWND = fHWND; |
| 643 | 641 |
| 644 if (fullscreen) { | 642 // Try different sizes to find an allowed setting? Use ChangeDisplaySettings
Ex? |
| 645 // Try different sizes to find an allowed setting? Use ChangeDisplaySett
ingsEx? | 643 static const int kWidth = 1280; |
| 646 static const int kWidth = 1280; | 644 static const int kHeight = 1024; |
| 647 static const int kHeight = 1024; | 645 DEVMODE newScreenSettings; |
| 648 DEVMODE dmScreenSettings; | 646 memset(&newScreenSettings, 0, sizeof(newScreenSettings)); |
| 649 memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); | 647 newScreenSettings.dmSize = sizeof(newScreenSettings); |
| 650 dmScreenSettings.dmSize=sizeof(dmScreenSettings); | 648 newScreenSettings.dmPelsWidth = kWidth; |
| 651 dmScreenSettings.dmPelsWidth = kWidth; | 649 newScreenSettings.dmPelsHeight = kHeight; |
| 652 dmScreenSettings.dmPelsHeight = kHeight; | 650 newScreenSettings.dmBitsPerPel = 32; |
| 653 dmScreenSettings.dmBitsPerPel = 32; | 651 newScreenSettings.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; |
| 654 dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; | 652 if (ChangeDisplaySettings(&newScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE
_SUCCESSFUL) { |
| 655 if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHA
NGE_SUCCESSFUL) { | 653 return false; |
| 656 return; | 654 } |
| 657 } | 655 RECT WindowRect; |
| 658 RECT WindowRect; | 656 WindowRect.left = 0; |
| 659 WindowRect.left = 0; | 657 WindowRect.right = kWidth; |
| 660 WindowRect.right = kWidth; | 658 WindowRect.top = 0; |
| 661 WindowRect.top = 0; | 659 WindowRect.bottom = kHeight; |
| 662 WindowRect.bottom = kHeight; | 660 ShowCursor(FALSE); |
| 663 ShowCursor(FALSE); | 661 AdjustWindowRectEx(&WindowRect, WS_POPUP, FALSE, WS_EX_APPWINDOW); |
| 664 AdjustWindowRectEx(&WindowRect, WS_POPUP, FALSE, WS_EX_APPWINDOW); | 662 HWND fsHWND = CreateWindowEx( |
| 665 HWND fsHWND = CreateWindowEx( | 663 WS_EX_APPWINDOW, |
| 666 WS_EX_APPWINDOW, | 664 fWinInit.fClass, |
| 667 fWinInit.fClass, | 665 NULL, |
| 668 NULL, | 666 WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_POPUP, |
| 669 WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_POPUP, | 667 0, 0, WindowRect.right-WindowRect.left, WindowRect.bottom-WindowRect.top
, |
| 670 0, 0, WindowRect.right-WindowRect.left, WindowRect.bottom-WindowRect
.top, | 668 NULL, |
| 671 NULL, | 669 NULL, |
| 672 NULL, | 670 fWinInit.fInstance, |
| 673 fWinInit.fInstance, | 671 NULL |
| 674 NULL | 672 ); |
| 675 ); | 673 if (!fsHWND) { |
| 676 if (!fsHWND) { | 674 return false; |
| 677 return; | 675 } |
| 678 } | 676 // Hide the old window and set the entry in the global mapping for this SkOS
Window to the |
| 679 // Hide the old window and set the entry in the global mapping for this
SkOSWindow to the | 677 // new HWND. |
| 680 // new HWND. | 678 ShowWindow((HWND)fHWND, SW_HIDE); |
| 681 ShowWindow((HWND)fHWND, SW_HIDE); | 679 gHwndToOSWindowMap.remove(fHWND); |
| 682 gHwndToOSWindowMap.remove(fHWND); | 680 fHWND = fsHWND; |
| 683 fHWND = fsHWND; | 681 gHwndToOSWindowMap.set(fHWND, this); |
| 684 gHwndToOSWindowMap.set(fHWND, this); | 682 this->updateSize(); |
| 685 this->updateSize(); | |
| 686 } else { | |
| 687 DEVMODE dmScreenSettings; | |
| 688 memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); | |
| 689 dmScreenSettings.dmSize=sizeof(dmScreenSettings); | |
| 690 dmScreenSettings.dmPelsWidth = fSavedWindowState.fScreenWidth; | |
| 691 dmScreenSettings.dmPelsHeight = fSavedWindowState.fScreenHeight; | |
| 692 dmScreenSettings.dmBitsPerPel = fSavedWindowState.fScreenBits; | |
| 693 dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; | |
| 694 if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHA
NGE_SUCCESSFUL) { | |
| 695 return; | |
| 696 } | |
| 697 gHwndToOSWindowMap.remove(fHWND); | |
| 698 DestroyWindow((HWND)fHWND); | |
| 699 fHWND = fSavedWindowState.fHWND; | |
| 700 gHwndToOSWindowMap.set(fHWND, this); | |
| 701 ShowWindow((HWND)fHWND, SW_SHOW); | |
| 702 SetWindowLong((HWND)fHWND, GWL_STYLE, fSavedWindowState.fStyle); | |
| 703 SetWindowLong((HWND)fHWND, GWL_EXSTYLE, fSavedWindowState.fExStyle); | |
| 704 | 683 |
| 705 int width = fSavedWindowState.fRect.right - fSavedWindowState.fRect.left
; | 684 fFullscreen = true; |
| 706 int height = fSavedWindowState.fRect.right - fSavedWindowState.fRect.lef
t; | 685 return true; |
| 707 SetWindowPos((HWND)fHWND, NULL, fSavedWindowState.fRect.left, fSavedWind
owState.fRect.top, | |
| 708 width, height, | |
| 709 SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); | |
| 710 if (fSavedWindowState.fZoomed) { | |
| 711 SendMessage((HWND)fHWND, WM_SYSCOMMAND, SC_MAXIMIZE, 0); | |
| 712 } | |
| 713 this->updateSize(); | |
| 714 } | |
| 715 fFullscreen = fullscreen; | |
| 716 } | 686 } |
| 717 | 687 |
| 718 void SkOSWindow::setVsync(bool enable) { | 688 void SkOSWindow::setVsync(bool enable) { |
| 719 SkWGLExtensions wgl; | 689 SkWGLExtensions wgl; |
| 720 wgl.swapInterval(enable ? 1 : 0); | 690 wgl.swapInterval(enable ? 1 : 0); |
| 721 } | 691 } |
| 722 | 692 |
| 723 void SkOSWindow::closeWindow() { | 693 void SkOSWindow::closeWindow() { |
| 724 this->setFullscreen(false); | |
| 725 DestroyWindow((HWND)fHWND); | 694 DestroyWindow((HWND)fHWND); |
| 695 if (fFullscreen) { |
| 696 DestroyWindow((HWND)fSavedWindowState.fHWND); |
| 697 } |
| 698 gHwndToOSWindowMap.remove(fHWND); |
| 726 } | 699 } |
| 727 #endif | 700 #endif |
| OLD | NEW |