[haiku-webkit-commits] r485 - webkit/trunk/WebKit/haiku/WebPositive

  • From: webkit@xxxxxxxxxxxxxxx
  • To: haiku-webkit-commits@xxxxxxxxxxxxx
  • Date: Tue, 04 May 2010 21:54:10 +0000

Author: stippi
Date: Tue May  4 21:54:10 2010
New Revision: 485
URL: http://mmlr.dyndns.org/changeset/485

Log:
Implemented an "auto-hide the interface" feature for the full-screen mode. The
mouse cursor will automatically hide if you don't move it, unless it's over the
interface. The interface will disappear after three seconds if the cursor is
not above it. It will re-appear when you touch the top of the screen with the
mouse. I find this the best solution, since the mouse is also used for
navigation in the page, and showing the interface based on some virtual area
of the interface would just get in the way.

Modified:
   webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.cpp
   webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.h
   webkit/trunk/WebKit/haiku/WebPositive/SettingsKeys.cpp
   webkit/trunk/WebKit/haiku/WebPositive/SettingsKeys.h

Modified: webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.cpp
==============================================================================
--- webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.cpp     Tue May  4 
19:34:13 2010        (r484)
+++ webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.cpp     Tue May  4 
21:54:10 2010        (r485)
@@ -64,6 +64,7 @@
 #include <GroupLayoutBuilder.h>
 #include <MenuBar.h>
 #include <MenuItem.h>
+#include <MessageRunner.h>
 #include <NodeInfo.h>
 #include <Path.h>
 #include <Roster.h>
@@ -78,31 +79,33 @@
 
 
 enum {
-       OPEN_LOCATION                           = 'open',
-       GO_BACK                                         = 'goba',
-       GO_FORWARD                                      = 'gofo',
-       STOP                                            = 'stop',
-       GOTO_URL                                        = 'goul',
-       RELOAD                                          = 'reld',
-       CLEAR_HISTORY                           = 'clhs',
-
-       CREATE_BOOKMARK                         = 'crbm',
-       SHOW_BOOKMARKS                          = 'shbm',
-
-       ZOOM_FACTOR_INCREASE            = 'zfin',
-       ZOOM_FACTOR_DECREASE            = 'zfdc',
-       ZOOM_FACTOR_RESET                       = 'zfrs',
-       ZOOM_TEXT_ONLY                          = 'zfto',
-
-       TOGGLE_FULLSCREEN                       = 'tgfs',
-
-       EDIT_SHOW_FIND_GROUP            = 'sfnd',
-       EDIT_HIDE_FIND_GROUP            = 'hfnd',
-       EDIT_FIND_NEXT                          = 'fndn',
-       EDIT_FIND_PREVIOUS                      = 'fndp',
-       FIND_TEXT_CHANGED                       = 'ftxt',
+       OPEN_LOCATION                                                           
= 'open',
+       GO_BACK                                                                 
        = 'goba',
+       GO_FORWARD                                                              
        = 'gofo',
+       STOP                                                                    
        = 'stop',
+       GOTO_URL                                                                
        = 'goul',
+       RELOAD                                                                  
        = 'reld',
+       CLEAR_HISTORY                                                           
= 'clhs',
+
+       CREATE_BOOKMARK                                                         
= 'crbm',
+       SHOW_BOOKMARKS                                                          
= 'shbm',
+
+       ZOOM_FACTOR_INCREASE                                            = 
'zfin',
+       ZOOM_FACTOR_DECREASE                                            = 
'zfdc',
+       ZOOM_FACTOR_RESET                                                       
= 'zfrs',
+       ZOOM_TEXT_ONLY                                                          
= 'zfto',
+
+       TOGGLE_FULLSCREEN                                                       
= 'tgfs',
+       TOGGLE_AUTO_HIDE_INTERFACE_IN_FULLSCREEN        = 'tgah',
+       CHECK_AUTO_HIDE_INTERFACE                                       = 
'cahi',
+
+       EDIT_SHOW_FIND_GROUP                                            = 
'sfnd',
+       EDIT_HIDE_FIND_GROUP                                            = 
'hfnd',
+       EDIT_FIND_NEXT                                                          
= 'fndn',
+       EDIT_FIND_PREVIOUS                                                      
= 'fndp',
+       FIND_TEXT_CHANGED                                                       
= 'ftxt',
 
-       SELECT_TAB                                      = 'sltb',
+       SELECT_TAB                                                              
        = 'sltb',
 };
 
 
@@ -188,15 +191,18 @@
 
 
 BrowserWindow::BrowserWindow(BRect frame, SettingsMessage* appSettings,
-               const BString& url, ToolbarPolicy toolbarPolicy, BWebView* 
webView)
+               const BString& url, uint32 interfaceElements, BWebView* webView)
        :
        BWebWindow(frame, kApplicationName,
                B_DOCUMENT_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
                B_AUTO_UPDATE_SIZE_LIMITS | B_ASYNCHRONOUS_CONTROLS),
        fIsFullscreen(false),
+       fPulseRunner(NULL),
+       fVisibleInterfaceElements(interfaceElements),
        fAppSettings(appSettings),
        fZoomTextOnly(true),
-       fShowTabsIfSinglePageOpen(true)
+       fShowTabsIfSinglePageOpen(true),
+       fAutoHideInterfaceInFullscreenMode(false)
 {
        // Begin listening to settings changes and read some current values.
        fAppSettings->AddListener(BMessenger(this));
@@ -284,6 +290,10 @@
        fFullscreenItem = new BMenuItem("Fullscreen",
                new BMessage(TOGGLE_FULLSCREEN), B_RETURN);
        menu->AddItem(fFullscreenItem);
+       fAutoHideInterfaceInFullscreenItem = new BMenuItem("Auto hide interface 
"
+               "in fullscreen mode",
+               new BMessage(TOGGLE_AUTO_HIDE_INTERFACE_IN_FULLSCREEN));
+       menu->AddItem(fAutoHideInterfaceInFullscreenItem);
 
        mainMenu->AddItem(menu);
 
@@ -371,11 +381,15 @@
                .Add(new BSeparatorView(B_HORIZONTAL, B_PLAIN_BORDER))
        ;
 
-       BView* statusGroup = BGroupLayoutBuilder(B_HORIZONTAL, kElementSpacing)
-               .Add(fStatusText)
-               .Add(fLoadingProgressBar, 0.2)
-               .AddStrut(12 - kElementSpacing)
-               .SetInsets(kInsetSpacing, 0, kInsetSpacing, 0)
+       // Status bar group
+       BView* statusGroup = BGroupLayoutBuilder(B_VERTICAL)
+               .Add(new BSeparatorView(B_HORIZONTAL, B_PLAIN_BORDER))
+               .Add(BGroupLayoutBuilder(B_HORIZONTAL, kElementSpacing)
+                       .Add(fStatusText)
+                       .Add(fLoadingProgressBar, 0.2)
+                       .AddStrut(12 - kElementSpacing)
+                       .SetInsets(kInsetSpacing, 0, kInsetSpacing, 0)
+               )
        ;
 
        BitmapButton* toggleFullscreenButton = new BitmapButton(kWindowIconBits,
@@ -383,19 +397,20 @@
                new BMessage(TOGGLE_FULLSCREEN));
        
toggleFullscreenButton->SetBackgroundMode(BitmapButton::MENUBAR_BACKGROUND);
 
+       BView* menuBarGroup = BGroupLayoutBuilder(B_HORIZONTAL)
+               .Add(mainMenu)
+               .Add(toggleFullscreenButton, 0.0f)
+       ;
+
        // Layout
        AddChild(BGroupLayoutBuilder(B_VERTICAL)
 #if !INTEGRATE_MENU_INTO_TAB_BAR
-               .Add(BGroupLayoutBuilder(B_HORIZONTAL)
-                       .Add(mainMenu)
-                       .Add(toggleFullscreenButton, 0.0f)
-               )
+               .Add(menuBarGroup)
 #endif
                .Add(fTabManager->TabGroup())
                .Add(navigationGroup)
                .Add(fTabManager->ContainerView())
                .Add(findGroup)
-               .Add(new BSeparatorView(B_HORIZONTAL, B_PLAIN_BORDER))
                .Add(statusGroup)
        );
 
@@ -405,7 +420,7 @@
 
        fURLInputGroup->MakeFocus(true);
 
-       fMenuGroup = layoutItemFor(mainMenu);
+       fMenuGroup = layoutItemFor(menuBarGroup);
        fTabGroup = layoutItemFor(fTabManager->TabGroup());
        fNavigationGroup = layoutItemFor(navigationGroup);
        fFindGroup = layoutItemFor(findGroup);
@@ -416,14 +431,10 @@
        fToggleFullscreenButton->SetVisible(false);
 
        CreateNewTab(url, true, webView);
-
-       if (toolbarPolicy == DoNotHaveToolbar) {
-#if !INTEGRATE_MENU_INTO_TAB_BAR
-               fMenuGroup->SetVisible(false);
-#endif
-               fTabGroup->SetVisible(false);
-               fNavigationGroup->SetVisible(false);
-       }
+       _ShowInterface(true);
+       _SetAutoHideInterfaceInFullscreen(fAppSettings->GetValue(
+               kAutoHideInterfaceInFullscreenMode,
+               fAutoHideInterfaceInFullscreenMode));
 
        AddShortcut('F', B_COMMAND_KEY | B_SHIFT_KEY, new 
BMessage(EDIT_HIDE_FIND_GROUP));
 
@@ -447,6 +458,7 @@
 {
        fAppSettings->RemoveListener(BMessenger(this));
        delete fTabManager;
+       delete fPulseRunner;
 }
 
 
@@ -482,6 +494,13 @@
                        }
                }
        }
+       if (message->what == B_MOUSE_MOVED || message->what == B_MOUSE_DOWN
+               || message->what == B_MOUSE_UP) {
+               message->FindPoint("where", &fLastMousePos);
+               if (message->FindInt64("when", &fLastMouseMovedTime) != B_OK)
+                       fLastMouseMovedTime = system_time();
+               _CheckAutoHideInterface();
+       }
        BWebWindow::DispatchMessage(message, target);
 }
 
@@ -629,6 +648,15 @@
                        _ToggleFullscreen();
                        break;
 
+               case TOGGLE_AUTO_HIDE_INTERFACE_IN_FULLSCREEN:
+                       _SetAutoHideInterfaceInFullscreen(
+                               !fAutoHideInterfaceInFullscreenMode);
+                       break;
+
+               case CHECK_AUTO_HIDE_INTERFACE:
+                       _CheckAutoHideInterface();
+                       break;
+
                case EDIT_FIND_NEXT:
                        CurrentWebView()->FindString(fFindTextControl->Text(), 
true,
                                fFindCaseSensitiveCheckBox->Value());
@@ -758,6 +786,9 @@
                        } else if (name == kSettingsKeyNewTabPolicy
                                && message->FindUInt32("value", &value) == 
B_OK) {
                                fNewTabPolicy = value;
+                       } else if (name == kAutoHideInterfaceInFullscreenMode
+                               && message->FindBool("value", &flag) == B_OK) {
+                               _SetAutoHideInterfaceInFullscreen(flag);
                        }
                        break;
                }
@@ -960,7 +991,7 @@
 {
        if (windowFrame.IsValid()) {
                BrowserWindow* window = new BrowserWindow(windowFrame, 
fAppSettings,
-                       BString(), DoNotHaveToolbar, view);
+                       BString(), INTERFACE_ELEMENT_STATUS, view);
                window->Show();
        } else
                CreateNewTab(BString(), activate, view);
@@ -1016,13 +1047,11 @@
        if (view != CurrentWebView())
                return;
 
-       if (fLoadingProgressBar) {
-               if (progress < 100 && fLoadingProgressBar->IsHidden())
-                       fLoadingProgressBar->Show();
-               else if (progress == 100 && !fLoadingProgressBar->IsHidden())
-                       fLoadingProgressBar->Hide();
-               fLoadingProgressBar->SetTo(progress);
-       }
+       if (progress < 100 && fLoadingProgressBar->IsHidden())
+               fLoadingProgressBar->Show();
+       else if (progress == 100 && !fLoadingProgressBar->IsHidden())
+               fLoadingProgressBar->Hide();
+       fLoadingProgressBar->SetTo(progress);
 }
 
 
@@ -1035,7 +1064,7 @@
        BString status(url);
        status << " failed.";
        view->WebPage()->SetStatusMessage(status);
-       if (fLoadingProgressBar && !fLoadingProgressBar->IsHidden())
+       if (!fLoadingProgressBar->IsHidden())
                fLoadingProgressBar->Hide();
 }
 
@@ -1049,7 +1078,7 @@
        BString status(url);
        status << " finished.";
        view->WebPage()->SetStatusMessage(status);
-       if (fLoadingProgressBar && !fLoadingProgressBar->IsHidden())
+       if (!fLoadingProgressBar->IsHidden())
                fLoadingProgressBar->Hide();
 
        NavigationCapabilitiesChanged(fBackButton->IsEnabled(),
@@ -1753,6 +1782,8 @@
 
                SetFlags(Flags() & ~(B_NOT_RESIZABLE | B_NOT_MOVABLE));
                SetLook(B_DOCUMENT_WINDOW_LOOK);
+
+               _ShowInterface(true);
        } else {
                fNonFullscreenWindowFrame = Frame();
                _ResizeToScreen();
@@ -1774,3 +1805,79 @@
        ResizeTo(screen.Frame().Width(), screen.Frame().Height());
 }
 
+
+void
+BrowserWindow::_SetAutoHideInterfaceInFullscreen(bool doIt)
+{
+       if (fAutoHideInterfaceInFullscreenMode == doIt)
+               return;
+
+       fAutoHideInterfaceInFullscreenMode = doIt;
+       fAutoHideInterfaceInFullscreenItem->SetMarked(doIt);
+       if (fAppSettings->GetValue(kAutoHideInterfaceInFullscreenMode, doIt)
+               != doIt) {
+               fAppSettings->SetValue(kAutoHideInterfaceInFullscreenMode, 
doIt);
+       }
+
+       if (fAutoHideInterfaceInFullscreenMode) {
+               BMessage message(CHECK_AUTO_HIDE_INTERFACE);
+               fPulseRunner = new BMessageRunner(BMessenger(this), &message, 
300000);
+       } else {
+               delete fPulseRunner;
+               fPulseRunner = NULL;
+       }
+}
+
+
+void
+BrowserWindow::_CheckAutoHideInterface()
+{
+       if (!fIsFullscreen || !fAutoHideInterfaceInFullscreenMode)
+               return;
+
+       bigtime_t now = system_time();
+       float navigationGroupBottom = fNavigationGroup->IsVisible() ?
+               fNavigationGroup->Frame().bottom : 0;
+       if (fLastMousePos.y > navigationGroupBottom
+               && now - fLastMouseMovedTime > 1500000) {
+               be_app->ObscureCursor();
+       }
+
+       if (fLastMousePos.y == 0)
+               _ShowInterface(true);
+       else if (fNavigationGroup->IsVisible()
+               && fLastMousePos.y > fNavigationGroup->Frame().bottom
+               && now - fLastMouseMovedTime > 3000000) {
+               // NOTE: Do not re-use navigationGroupBottom in the above
+               // check, since we only want to hide the interface when it is 
visible.
+               _ShowInterface(false);
+       }
+}
+
+
+void
+BrowserWindow::_ShowInterface(bool show)
+{
+       if (show) {
+#if !INTEGRATE_MENU_INTO_TAB_BAR
+               fMenuGroup->SetVisible(
+                       (fVisibleInterfaceElements & INTERFACE_ELEMENT_MENU) != 
0);
+#endif
+               fTabGroup->SetVisible(
+                       (fVisibleInterfaceElements & INTERFACE_ELEMENT_TABS) != 
0);
+               fNavigationGroup->SetVisible(
+                       (fVisibleInterfaceElements & 
INTERFACE_ELEMENT_NAVIGATION) != 0);
+               fStatusGroup->SetVisible(
+                       (fVisibleInterfaceElements & INTERFACE_ELEMENT_STATUS) 
!= 0);
+       } else {
+               fMenuGroup->SetVisible(false);
+               fTabGroup->SetVisible(false);
+               fNavigationGroup->SetVisible(false);
+               fStatusGroup->SetVisible(false);
+       }
+       // TODO: Setting the group visible seems to unhide the status bar.
+       // Fix in Haiku?
+       if (!fLoadingProgressBar->IsHidden())
+               fLoadingProgressBar->Hide();
+}
+

Modified: webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.h
==============================================================================
--- webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.h       Tue May  4 
19:34:13 2010        (r484)
+++ webkit/trunk/WebKit/haiku/WebPositive/BrowserWindow.h       Tue May  4 
21:54:10 2010        (r485)
@@ -41,6 +41,7 @@
 class BLayoutItem;
 class BMenu;
 class BMenuItem;
+class BMessageRunner;
 class BPath;
 class BStatusBar;
 class BStringView;
@@ -51,25 +52,29 @@
 class TabManager;
 class URLInputGroup;
 
-enum ToolbarPolicy {
-       HaveToolbar,
-       DoNotHaveToolbar
+enum {
+       INTERFACE_ELEMENT_MENU                  = 1 << 0,
+       INTERFACE_ELEMENT_TABS                  = 1 << 1,
+       INTERFACE_ELEMENT_NAVIGATION    = 1 << 2,
+       INTERFACE_ELEMENT_STATUS                = 1 << 3,
+
+       INTERFACE_ELEMENT_ALL                   = 0xffff
 };
 
 enum NewPagePolicy {
-       OpenBlankPage           = 0,
-       OpenStartPage           = 1,
-       OpenSearchPage          = 2,
-       CloneCurrentPage        = 3
+       OpenBlankPage                                   = 0,
+       OpenStartPage                                   = 1,
+       OpenSearchPage                                  = 2,
+       CloneCurrentPage                                = 3
 };
 
 enum {
-       NEW_WINDOW = 'nwnd',
-       NEW_TAB = 'ntab',
-       WINDOW_OPENED = 'wndo',
-       WINDOW_CLOSED = 'wndc',
-       SHOW_DOWNLOAD_WINDOW = 'sdwd',
-       SHOW_SETTINGS_WINDOW = 'sswd'
+       NEW_WINDOW                                              = 'nwnd',
+       NEW_TAB                                                 = 'ntab',
+       WINDOW_OPENED                                   = 'wndo',
+       WINDOW_CLOSED                                   = 'wndc',
+       SHOW_DOWNLOAD_WINDOW                    = 'sdwd',
+       SHOW_SETTINGS_WINDOW                    = 'sswd'
 };
 
 #define INTEGRATE_MENU_INTO_TAB_BAR 0
@@ -80,7 +85,8 @@
                                                                
BrowserWindow(BRect frame,
                                                                        
SettingsMessage* appSettings,
                                                                        const 
BString& url,
-                                                                       
ToolbarPolicy = HaveToolbar,
+                                                                       uint32 
interfaceElements
+                                                                               
= INTERFACE_ELEMENT_ALL,
                                                                        
BWebView* webView = NULL);
        virtual                                         ~BrowserWindow();
 
@@ -172,6 +178,9 @@
 
                        void                            _ToggleFullscreen();
                        void                            _ResizeToScreen();
+                       void                            
_SetAutoHideInterfaceInFullscreen(bool doIt);
+                       void                            
_CheckAutoHideInterface();
+                       void                            _ShowInterface(bool 
show);
 
 private:
                        BMenu*                          fHistoryMenu;
@@ -184,6 +193,7 @@
                        BMenuItem*                      fFindNextMenuItem;
                        BMenuItem*                      fZoomTextOnlyMenuItem;
                        BMenuItem*                      fFullscreenItem;
+                       BMenuItem*                      
fAutoHideInterfaceInFullscreenItem;
                        BMenuItem*                      fBackMenuItem;
                        BMenuItem*                      fForwardMenuItem;
 
@@ -207,11 +217,16 @@
 
                        bool                            fIsFullscreen;
                        BRect                           
fNonFullscreenWindowFrame;
+                       BMessageRunner*         fPulseRunner;
+                       uint32                          
fVisibleInterfaceElements;
+                       bigtime_t                       fLastMouseMovedTime;
+                       BPoint                          fLastMousePos;
 
                        // cached settings
                        SettingsMessage*        fAppSettings;
                        bool                            fZoomTextOnly;
                        bool                            
fShowTabsIfSinglePageOpen;
+                       bool                            
fAutoHideInterfaceInFullscreenMode;
                        uint32                          fNewWindowPolicy;
                        uint32                          fNewTabPolicy;
                        BString                         fStartPageURL;

Modified: webkit/trunk/WebKit/haiku/WebPositive/SettingsKeys.cpp
==============================================================================
--- webkit/trunk/WebKit/haiku/WebPositive/SettingsKeys.cpp      Tue May  4 
19:34:13 2010        (r484)
+++ webkit/trunk/WebKit/haiku/WebPositive/SettingsKeys.cpp      Tue May  4 
21:54:10 2010        (r485)
@@ -45,3 +45,6 @@
 const char* kSettingsKeyUseProxy = "use http proxy";
 const char* kSettingsKeyProxyAddress = "http proxy address";
 const char* kSettingsKeyProxyPort = "http proxy port";
+
+const char* kAutoHideInterfaceInFullscreenMode
+       = "auto hide interface in full screen mode";

Modified: webkit/trunk/WebKit/haiku/WebPositive/SettingsKeys.h
==============================================================================
--- webkit/trunk/WebKit/haiku/WebPositive/SettingsKeys.h        Tue May  4 
19:34:13 2010        (r484)
+++ webkit/trunk/WebKit/haiku/WebPositive/SettingsKeys.h        Tue May  4 
21:54:10 2010        (r485)
@@ -46,4 +46,6 @@
 extern const char* kSettingsKeyProxyAddress;
 extern const char* kSettingsKeyProxyPort;
 
+extern const char* kAutoHideInterfaceInFullscreenMode;
+
 #endif // SETTINGS_KEYS_H

Other related posts:

  • » [haiku-webkit-commits] r485 - webkit/trunk/WebKit/haiku/WebPositive - webkit