Ticket #4880: DeskBarAutoHideFeature.diff

File DeskBarAutoHideFeature.diff, 13.4 KB (added by x-ist, 11 years ago)

Now correctly handling the AlwaysOnTop as well.

  • BarWindow.h

     
    5454    virtual void                WorkspaceActivated(int32 workspace,
    5555                                    bool activate);
    5656    virtual void                ScreenChanged(BRect size, color_space depth);
    57     virtual void                DispatchMessage(BMessage* message,
    58                                     BHandler* handler);
    5957    virtual void                MessageReceived(BMessage* message);
    6058    virtual void                Minimize(bool minimize);
    6159
  • BarView.h

     
    5757const float kHModeHeight = 21.0f;
    5858const float kMenuBarHeight = 21.0f;
    5959const float kStatusHeight = 22.0f;
     60const float kHModeHiddenHeight = 1.0f;
     61const float kMaxPreventHidingDist = 80.0f;
    6062
    6163class BShelf;
    6264class TBarMenuBar;
     
    7880        virtual void MessageReceived(BMessage* message);
    7981        virtual void MouseMoved(BPoint where, uint32 transit,
    8082            const BMessage* dragMessage);
     83        virtual void MouseDown(BPoint where);
    8184
    8285        void SaveSettings();
    83         void UpdateAutoRaise();
     86        void UpdateEventMask();
    8487        void UpdatePlacement();
    8588        void ChangeState(int32 state, bool vertical, bool left, bool top);
     89        void RaiseDeskbar(bool raise);
     90        void HideDeskbar(bool hide);
    8691
    8792        bool Vertical() const;
    8893        bool Left() const;
     
    136141        TExpandoMenuBar* ExpandoMenuBar() const;
    137142        TBarMenuBar* BarMenuBar() const;
    138143        TDragRegion* DragRegion() const { return fDragRegion; }
    139 
     144           
    140145    private:
    141146        friend class TBeMenu;
    142147        friend class PreferencesWindow;
  • BarApp.h

     
    8181const uint32 kSuperExpando = 'SprE';
    8282const uint32 kExpandNewTeams = 'ExTm';
    8383const uint32 kAutoRaise = 'AtRs';
     84const uint32 kAutoHide = 'AtHd';
    8485const uint32 kRestartTracker = 'Trak';
    8586
    8687// from roster_private.h
     
    110111    bool superExpando;
    111112    bool expandNewTeams;
    112113    bool autoRaise;
     114    bool autoHide;
    113115    bool recentAppsEnabled;
    114116    bool recentDocsEnabled;
    115117    bool recentFoldersEnabled;
  • BarWindow.cpp

     
    8989        B_TRANSLATE_SYSTEM_NAME("Deskbar"), B_BORDERED_WINDOW,
    9090        B_WILL_ACCEPT_FIRST_CLICK | B_NOT_ZOOMABLE | B_NOT_CLOSABLE
    9191        | B_NOT_MINIMIZABLE | B_NOT_MOVABLE | B_NOT_RESIZABLE
    92         | B_AVOID_FRONT | B_ASYNCHRONOUS_CONTROLS,
     92        | B_ASYNCHRONOUS_CONTROLS,
    9393        B_ALL_WORKSPACES)
    9494{
    9595    desk_settings* settings = ((TBarApp*)be_app)->Settings();
     
    106106
    107107
    108108void
    109 TBarWindow::DispatchMessage(BMessage* message, BHandler* handler)
    110 {
    111     // Activate the window when you click on it (ie. on the tray area,
    112     // the menu part will do this automatically)
    113     if (message->what == B_MOUSE_DOWN) {
    114         if (!((TBarApp*)be_app)->Settings()->autoRaise)
    115             Activate(true);
    116 
    117         if (_IsFocusMessage(message)
    118             && (modifiers() & (B_CONTROL_KEY | B_COMMAND_KEY | B_OPTION_KEY
    119                     | B_SHIFT_KEY)) == (B_CONTROL_KEY | B_COMMAND_KEY)) {
    120             // The window key was pressed - enter dragging code
    121             fBarView->DragRegion()->MouseDown(
    122                 fBarView->DragRegion()->DragRegion().LeftTop());
    123             return;
    124         }
    125     }
    126 
    127     BWindow::DispatchMessage(message, handler);
    128 }
    129 
    130 
    131 void
    132109TBarWindow::MenusBeginning()
    133110{
    134111    BPath path;
     
    182159        sBeMenu->UnlockLooper();
    183160    }
    184161
    185     fBarView->UpdateAutoRaise();
     162    fBarView->UpdateEventMask();
    186163}
    187164
    188165
  • PreferencesWindow.h

     
    5757
    5858            BCheckBox*      fWindowAlwaysOnTop;
    5959            BCheckBox*      fWindowAutoRaise;
     60            BCheckBox*      fWindowAutoHide;
    6061};
    6162
    6263#endif  // _PREFERENCES_WINDOW_H
  • BarView.cpp

     
    110110    SetViewColor(ui_color(B_MENU_BACKGROUND_COLOR));
    111111    SetFont(be_plain_font);
    112112
    113     UpdateAutoRaise();
     113    UpdateEventMask();
    114114    UpdatePlacement();
    115115
    116116    fTrackingHookData.fTrackingHook = MenuTrackingHook;
     
    182182{
    183183    if (Window() == NULL || EventMask() == 0)
    184184        return;
     185   
     186    desk_settings* settings = ((TBarApp*)be_app)->Settings();
     187    bool alwaysOnTop = settings->alwaysOnTop;
     188    bool autoRaise = settings->autoRaise;
     189    bool autoHide = settings->autoHide;
     190       
     191    if (!autoRaise && !autoHide)
     192        return;
     193       
     194    if (DragRegion()->IsDragging()) {
     195        return;
     196    }
    185197
     198    bool isTopMost = Window()->Feel() == B_FLOATING_ALL_WINDOW_FEEL;
     199    bool isHidden = IsHidden();
     200   
    186201    // Auto-Raise
    187 
    188202    where = ConvertToScreen(where);
    189203    BScreen screen(Window());
    190     BRect frame = screen.Frame();
    191     if (where.x == frame.left || where.x == frame.right
    192         || where.y == frame.top || where.y == frame.bottom) {
    193         // cursor is on screen edge
    194         if (Window()->Frame().Contains(where))
    195             Window()->Activate();
     204    BRect screenFrame = screen.Frame();
     205    if ((where.x == screenFrame.left || where.x == screenFrame.right
     206        || where.y == screenFrame.top || where.y == screenFrame.bottom)
     207        && Window()->Frame().Contains(where)) {
     208        // cursor is on a screen edge within the window frame
     209
     210        if (!alwaysOnTop && autoRaise && !isTopMost) {
     211            RaiseDeskbar(true);
     212        }
     213       
     214        if (autoHide && isHidden) {
     215            HideDeskbar(false);
     216        }
     217    } else {
     218        // cursor is not on screen edge
     219        BRect preventHideArea = Window()->Frame().InsetByCopy(
     220            -kMaxPreventHidingDist, -kMaxPreventHidingDist);
     221
     222        if (preventHideArea.Contains(where))
     223            return;
     224           
     225        // cursor to bar distance above threshold
     226        if (!alwaysOnTop && autoRaise && isTopMost) {
     227            RaiseDeskbar(false);
     228        }
     229       
     230        if (autoHide && !isHidden) {
     231            HideDeskbar(true);
     232        }
    196233    }
    197234}
    198235
    199236
    200237void
     238TBarView::MouseDown(BPoint where)
     239{
     240    where = ConvertToScreen(where);
     241
     242    if (Window()->Frame().Contains(where)) {
     243        Window()->Activate();
     244
     245        if ((modifiers() & (B_CONTROL_KEY | B_COMMAND_KEY | B_OPTION_KEY
     246                    | B_SHIFT_KEY)) == (B_CONTROL_KEY | B_COMMAND_KEY)) {
     247            // The window key was pressed - enter dragging code
     248            DragRegion()->MouseDown(
     249                DragRegion()->DragRegion().LeftTop());
     250            return;
     251        }
     252    } else {
     253        // hide deskbar if required
     254        desk_settings* settings = ((TBarApp*)be_app)->Settings();
     255        bool alwaysOnTop = settings->alwaysOnTop;
     256        bool autoRaise = settings->autoRaise;
     257        bool autoHide = settings->autoHide;
     258        bool isTopMost = Window()->Feel() == B_FLOATING_ALL_WINDOW_FEEL;
     259        bool isHidden = IsHidden();     
     260       
     261        if (!alwaysOnTop && autoRaise && isTopMost) {
     262            RaiseDeskbar(false);
     263        }
     264       
     265        if (autoHide && !isHidden) {
     266            HideDeskbar(true);
     267        }
     268    }
     269}
     270
     271
     272void
    201273TBarView::PlaceBeMenu()
    202274{
    203275    // top or bottom, full
     
    334406{
    335407    float windowHeight = 0;
    336408    float windowWidth = sMinimumWindowWidth;
    337     if (fState == kFullState) {
    338         windowHeight = screenFrame.bottom;
    339         windowWidth = fBarMenuBar->Frame().Width();
    340     } else if (fState == kExpandoState) {
    341         if (fVertical) {
    342             // top left or right
    343             windowHeight = fExpando->Frame().bottom;
     409    bool calcHiddenSize = ((TBarApp*)be_app)->Settings()->autoHide
     410                                && IsHidden() && !DragRegion()->IsDragging();
     411   
     412    if (!calcHiddenSize)
     413    {
     414        if (fState == kFullState) {
     415            windowHeight = screenFrame.bottom;
     416            windowWidth = fBarMenuBar->Frame().Width();
     417        } else if (fState == kExpandoState) {
     418            if (fVertical) {
     419                // top left or right
     420                windowHeight = fExpando->Frame().bottom;
     421            } else {
     422                // top or bottom, full
     423                fExpando->CheckItemSizes(0);
     424                windowHeight = kHModeHeight;   
     425                windowWidth = screenFrame.Width();
     426            }
    344427        } else {
     428            // four corners
     429            if (fTrayLocation != 0)
     430                windowHeight = fDragRegion->Frame().bottom;
     431            else
     432                windowHeight = fBarMenuBar->Frame().bottom;
     433        }
     434    } else {
     435        windowHeight = kHModeHiddenHeight;
     436       
     437        if (fState == kExpandoState && !fVertical) {
    345438            // top or bottom, full
    346439            fExpando->CheckItemSizes(0);
    347             windowHeight = kHModeHeight;
    348440            windowWidth = screenFrame.Width();
     441        } else {
     442            windowWidth = kHModeHiddenHeight;
    349443        }
    350     } else {
    351         // four corners
    352         if (fTrayLocation != 0)
    353             windowHeight = fDragRegion->Frame().bottom;
    354         else
    355             windowHeight = fBarMenuBar->Frame().bottom;
    356444    }
    357 
     445   
    358446    *width = windowWidth;
    359447    *height = windowHeight;
    360448}
     
    408496    settings->showTime = ShowingClock();
    409497
    410498    fReplicantTray->RememberClockSettings();
    411     settings->alwaysOnTop
    412         = (Window()->Feel() & B_FLOATING_ALL_WINDOW_FEEL) != 0;
    413499}
    414500
    415501
    416502void
    417 TBarView::UpdateAutoRaise()
     503TBarView::UpdateEventMask()
    418504{
    419     if (((TBarApp*)be_app)->Settings()->autoRaise)
     505    if (((TBarApp*)be_app)->Settings()->autoRaise
     506        || ((TBarApp*)be_app)->Settings()->autoHide)
    420507        SetEventMask(B_POINTER_EVENTS, B_NO_POINTER_HISTORY);
    421508    else
    422509        SetEventMask(0);
     
    443530    fTop = top;
    444531
    445532    // Send a message to the preferences window to let it know to enable
    446     // or disabled preference items
     533    // or disable preference items
    447534    if (stateChanged || vertSwap)
    448535        be_app->PostMessage(kStateChanged);
    449536
     
    507594}
    508595
    509596
     597void
     598TBarView::RaiseDeskbar(bool raise)
     599{
     600    if (raise)
     601        Window()->SetFeel(B_FLOATING_ALL_WINDOW_FEEL);
     602    else
     603        Window()->SetFeel(B_NORMAL_WINDOW_FEEL);
     604}
     605
     606
     607void
     608TBarView::HideDeskbar(bool hide)
     609{
     610    BScreen screen(Window());
     611    BRect screenFrame = screen.Frame();
     612   
     613    if (hide) {
     614        Hide();
     615        PositionWindow(screenFrame);
     616        SizeWindow(screenFrame);
     617    } else {
     618        Show();
     619        SizeWindow(screenFrame);
     620        PositionWindow(screenFrame);
     621    }
     622}
     623
     624
    510625// window placement functions
    511626
    512627bool
  • BarApp.cpp

     
    206206        storedSettings.AddBool("superExpando", fSettings.superExpando);
    207207        storedSettings.AddBool("expandNewTeams", fSettings.expandNewTeams);
    208208        storedSettings.AddBool("autoRaise", fSettings.autoRaise);
     209        storedSettings.AddBool("autoHide", fSettings.autoHide);
    209210        storedSettings.AddBool("recentAppsEnabled",
    210211            fSettings.recentAppsEnabled);
    211212        storedSettings.AddBool("recentDocsEnabled",
     
    241242    settings.superExpando = false;
    242243    settings.expandNewTeams = false;
    243244    settings.autoRaise = false;
     245    settings.autoHide = false;
    244246    settings.recentAppsEnabled = true;
    245247    settings.recentDocsEnabled = true;
    246248    settings.recentFoldersEnabled = true;
     
    290292            storedSettings.FindBool("superExpando", &settings.superExpando);
    291293            storedSettings.FindBool("expandNewTeams", &settings.expandNewTeams);
    292294            storedSettings.FindBool("autoRaise", &settings.autoRaise);
     295            storedSettings.FindBool("autoHide", &settings.autoHide);
    293296            storedSettings.FindBool("recentAppsEnabled",
    294297                &settings.recentAppsEnabled);
    295298            storedSettings.FindBool("recentDocsEnabled",
     
    408411
    409412        case kAlwaysTop:
    410413            fSettings.alwaysOnTop = !fSettings.alwaysOnTop;
    411 
    412414            fBarWindow->SetFeel(fSettings.alwaysOnTop ?
    413415                B_FLOATING_ALL_WINDOW_FEEL : B_NORMAL_WINDOW_FEEL);
     416            fPreferencesWindow->PostMessage(kStateChanged);
    414417            break;
    415418
    416419        case kAutoRaise:
    417             fSettings.autoRaise = !fSettings.autoRaise;
     420            if (fSettings.alwaysOnTop)
     421                fSettings.autoRaise = false;
     422            else
     423                fSettings.autoRaise = !fSettings.autoRaise;
    418424
    419425            fBarWindow->Lock();
    420             BarView()->UpdateAutoRaise();
     426            BarView()->UpdateEventMask();
    421427            fBarWindow->Unlock();
    422428            break;
    423429
     430        case kAutoHide:
     431            fSettings.autoHide = !fSettings.autoHide;
     432
     433            fBarWindow->Lock();
     434            BarView()->UpdateEventMask();
     435            BarView()->HideDeskbar(fSettings.autoHide);
     436            fBarWindow->Unlock();
     437            break;
     438           
    424439        case kTrackerFirst:
    425440            fSettings.trackerAlwaysFirst = !fSettings.trackerAlwaysFirst;
    426441
  • StatusView.h

     
    197197
    198198    int32 DragRegionLocation() const;
    199199    void SetDragRegionLocation(int32);
     200   
     201    bool IsDragging() {return IsTracking();}
    200202
    201203private:
    202204    TBarView* fBarView;
  • PreferencesWindow.cpp

     
    6262        new BMessage(kAlwaysTop));
    6363    fWindowAutoRaise = new BCheckBox(B_TRANSLATE("Auto-raise"),
    6464        new BMessage(kAutoRaise));
     65    fWindowAutoHide = new BCheckBox(B_TRANSLATE("Auto-hide"),
     66        new BMessage(kAutoHide));
    6567
    6668    BTextView* docTextView = fMenuRecentDocumentCount->TextView();
    6769    BTextView* appTextView = fMenuRecentApplicationCount->TextView();
     
    122124
    123125    fWindowAlwaysOnTop->SetValue(appSettings->alwaysOnTop);
    124126    fWindowAutoRaise->SetValue(appSettings->autoRaise);
     127    fWindowAutoHide->SetValue(appSettings->autoHide);
    125128
    126129    _EnableDisableDependentItems();
    127130
     
    134137
    135138    fWindowAlwaysOnTop->SetTarget(be_app);
    136139    fWindowAutoRaise->SetTarget(be_app);
     140    fWindowAutoHide->SetTarget(be_app);
    137141
    138142    // Layout
    139143    fMenuBox = new BBox("fMenuBox");
     
    196200        .AddGroup(B_VERTICAL, 1)
    197201            .Add(fWindowAlwaysOnTop)
    198202            .Add(fWindowAutoRaise)
     203            .Add(fWindowAutoHide)
    199204            .AddGlue()
    200205            .SetInsets(10, 10, 10, 10)
    201206            .End()
     
    301306        fMenuRecentFolderCount->SetEnabled(true);
    302307    else
    303308        fMenuRecentFolderCount->SetEnabled(false);
     309
     310    if (fWindowAlwaysOnTop->Value() == B_CONTROL_ON)
     311        fWindowAutoRaise->SetEnabled(false);
     312    else
     313        fWindowAutoRaise->SetEnabled(true);
    304314}
    305315
    306316
     
    310320    if (!active && IsMinimized())
    311321        PostMessage(B_QUIT_REQUESTED);
    312322}
    313