From 042d9f22fcbfc090971bf05fb45af3ab31fdac24 Mon Sep 17 00:00:00 2001 From: jules Date: Mon, 27 Jan 2014 17:39:21 +0000 Subject: [PATCH] Various changes to improve the behaviour of kiosk mode for DocumentWindows on win32. --- .../components/juce_Component.cpp | 16 ++++++++++++++ .../components/juce_ModalComponentManager.cpp | 5 +---- .../filebrowser/juce_FileChooser.cpp | 5 +---- .../native/juce_win32_Windowing.cpp | 3 +++ .../windows/juce_DocumentWindow.cpp | 13 ++++++----- .../windows/juce_ResizableWindow.cpp | 22 +++++++------------ .../windows/juce_TopLevelWindow.cpp | 1 + 7 files changed, 38 insertions(+), 27 deletions(-) diff --git a/modules/juce_gui_basics/components/juce_Component.cpp b/modules/juce_gui_basics/components/juce_Component.cpp index f19ec7cd10..7e3b9f4738 100644 --- a/modules/juce_gui_basics/components/juce_Component.cpp +++ b/modules/juce_gui_basics/components/juce_Component.cpp @@ -173,6 +173,22 @@ private: JUCE_DECLARE_NON_COPYABLE (MouseListenerList) }; +//============================================================================== +struct FocusRestorer +{ + FocusRestorer() : lastFocus (Component::getCurrentlyFocusedComponent()) {} + + ~FocusRestorer() + { + if (lastFocus != nullptr && ! lastFocus->isCurrentlyBlockedByAnotherModalComponent()) + lastFocus->grabKeyboardFocus(); + } + + WeakReference lastFocus; + + JUCE_DECLARE_NON_COPYABLE (FocusRestorer) +}; + //============================================================================== struct ScalingHelpers { diff --git a/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp b/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp index 44a4794541..00f170ce51 100644 --- a/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp +++ b/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp @@ -262,7 +262,7 @@ int ModalComponentManager::runEventLoopForCurrentComponent() if (Component* currentlyModal = getModalComponent (0)) { - WeakReference prevFocused (Component::getCurrentlyFocusedComponent()); + FocusRestorer focusRestorer; bool finished = false; attachCallback (currentlyModal, new ReturnValueRetriever (returnValue, finished)); @@ -276,9 +276,6 @@ int ModalComponentManager::runEventLoopForCurrentComponent() } } JUCE_CATCH_EXCEPTION - - if (prevFocused != nullptr && ! prevFocused->isCurrentlyBlockedByAnotherModalComponent()) - prevFocused->grabKeyboardFocus(); } return returnValue; diff --git a/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp b/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp index 01c8b32d29..71c148d312 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp @@ -79,7 +79,7 @@ bool FileChooser::browseForDirectory() bool FileChooser::showDialog (const int flags, FilePreviewComponent* const previewComp) { - WeakReference previouslyFocused (Component::getCurrentlyFocusedComponent()); + FocusRestorer focusRestorer; results.clear(); @@ -127,9 +127,6 @@ bool FileChooser::showDialog (const int flags, FilePreviewComponent* const previ } } - if (previouslyFocused != nullptr) - previouslyFocused->grabKeyboardFocus(); - return results.size() > 0; } #endif diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp index aa3e0963e1..ab14b16fcc 100644 --- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp @@ -3169,6 +3169,9 @@ String SystemClipboard::getTextFromClipboard() //============================================================================== void Desktop::setKioskComponent (Component* kioskModeComponent, bool enableOrDisable, bool /*allowMenusAndBars*/) { + if (TopLevelWindow* tlw = dynamic_cast (kioskModeComponent)) + tlw->setUsingNativeTitleBar (! enableOrDisable); + if (enableOrDisable) kioskModeComponent->setBounds (getDisplays().getMainDisplay().totalArea); } diff --git a/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp b/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp index 9afd1fbafb..83a0a9d814 100644 --- a/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp +++ b/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp @@ -249,17 +249,17 @@ void DocumentWindow::resized() BorderSize DocumentWindow::getBorderThickness() { - return BorderSize ((isFullScreen() || isUsingNativeTitleBar()) - ? 0 : (resizableBorder != nullptr ? 4 : 1)); + return ResizableWindow::getBorderThickness(); } BorderSize DocumentWindow::getContentComponentBorder() { BorderSize border (getBorderThickness()); - border.setTop (border.getTop() - + (isUsingNativeTitleBar() ? 0 : titleBarHeight) - + (menuBar != nullptr ? menuBarHeight : 0)); + if (! isKioskMode()) + border.setTop (border.getTop() + + (isUsingNativeTitleBar() ? 0 : titleBarHeight) + + (menuBar != nullptr ? menuBarHeight : 0)); return border; } @@ -273,6 +273,9 @@ Rectangle DocumentWindow::getTitleBarArea() { const BorderSize border (getBorderThickness()); + if (isKioskMode()) + return Rectangle(); + return Rectangle (border.getLeft(), border.getTop(), getWidth() - border.getLeftAndRight(), getTitleBarHeight()); } diff --git a/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp b/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp index 28c34e6217..f30defc08b 100644 --- a/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp +++ b/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp @@ -167,7 +167,10 @@ void ResizableWindow::setContentComponentSize (int width, int height) BorderSize ResizableWindow::getBorderThickness() { - return BorderSize (isUsingNativeTitleBar() ? 0 : ((resizableBorder != nullptr && ! isFullScreen()) ? 5 : 3)); + if (isUsingNativeTitleBar() || isKioskMode()) + return BorderSize(); + + return BorderSize ((resizableBorder != nullptr && ! isFullScreen()) ? 4 : 1); } BorderSize ResizableWindow::getContentComponentBorder() @@ -189,15 +192,11 @@ void ResizableWindow::visibilityChanged() void ResizableWindow::resized() { + const bool resizerHidden = isFullScreen() || isKioskMode() || isUsingNativeTitleBar(); + if (resizableBorder != nullptr) { - #if JUCE_WINDOWS || JUCE_LINUX - // hide the resizable border if the OS already provides one.. - resizableBorder->setVisible (! (isFullScreen() || isUsingNativeTitleBar())); - #else - resizableBorder->setVisible (! isFullScreen()); - #endif - + resizableBorder->setVisible (! resizerHidden); resizableBorder->setBorderThickness (getBorderThickness()); resizableBorder->setSize (getWidth(), getHeight()); resizableBorder->toBack(); @@ -205,12 +204,7 @@ void ResizableWindow::resized() if (resizableCorner != nullptr) { - #if JUCE_MAC - // hide the resizable border if the OS already provides one.. - resizableCorner->setVisible (! (isFullScreen() || isUsingNativeTitleBar())); - #else - resizableCorner->setVisible (! isFullScreen()); - #endif + resizableCorner->setVisible (! resizerHidden); const int resizerSize = 18; resizableCorner->setBounds (getWidth() - resizerSize, diff --git a/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp b/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp index 8cba8b31e9..0eb6ac47a3 100644 --- a/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp +++ b/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp @@ -242,6 +242,7 @@ void TopLevelWindow::setUsingNativeTitleBar (const bool shouldUseNativeTitleBar) { if (useNativeTitleBar != shouldUseNativeTitleBar) { + FocusRestorer focusRestorer; useNativeTitleBar = shouldUseNativeTitleBar; recreateDesktopWindow(); sendLookAndFeelChange();