Ticket #4880: DeskbarAutoHideFeature.diff
File DeskbarAutoHideFeature.diff, 13.3 KB (added by , 13 years ago) |
---|
-
src/apps/deskbar/BarWindow.h
54 54 virtual void WorkspaceActivated(int32 workspace, 55 55 bool activate); 56 56 virtual void ScreenChanged(BRect size, color_space depth); 57 virtual void DispatchMessage(BMessage* message,58 BHandler* handler);59 57 virtual void MessageReceived(BMessage* message); 60 58 virtual void Minimize(bool minimize); 61 59 -
src/apps/deskbar/BarView.h
57 57 const float kHModeHeight = 21.0f; 58 58 const float kMenuBarHeight = 21.0f; 59 59 const float kStatusHeight = 22.0f; 60 const float kHModeHiddenHeight = 1.0f; 61 const float kMaxPreventHidingDist = 80.0f; 60 62 61 63 class BShelf; 62 64 class TBarMenuBar; … … 78 80 virtual void MessageReceived(BMessage* message); 79 81 virtual void MouseMoved(BPoint where, uint32 transit, 80 82 const BMessage* dragMessage); 83 virtual void MouseDown(BPoint where); 81 84 82 85 void SaveSettings(); 83 void Update AutoRaise();86 void UpdateEventMask(); 84 87 void UpdatePlacement(); 85 88 void ChangeState(int32 state, bool vertical, bool left, bool top); 89 void RaiseDeskbar(bool raise); 90 void HideDeskbar(bool hide); 86 91 87 92 bool Vertical() const; 88 93 bool Left() const; … … 136 141 TExpandoMenuBar* ExpandoMenuBar() const; 137 142 TBarMenuBar* BarMenuBar() const; 138 143 TDragRegion* DragRegion() const { return fDragRegion; } 139 144 140 145 private: 141 146 friend class TBeMenu; 142 147 friend class PreferencesWindow; -
src/apps/deskbar/BarApp.h
81 81 const uint32 kSuperExpando = 'SprE'; 82 82 const uint32 kExpandNewTeams = 'ExTm'; 83 83 const uint32 kAutoRaise = 'AtRs'; 84 const uint32 kAutoHide = 'AtHd'; 84 85 const uint32 kRestartTracker = 'Trak'; 85 86 86 87 // from roster_private.h … … 110 111 bool superExpando; 111 112 bool expandNewTeams; 112 113 bool autoRaise; 114 bool autoHide; 113 115 bool recentAppsEnabled; 114 116 bool recentDocsEnabled; 115 117 bool recentFoldersEnabled; -
src/apps/deskbar/BarWindow.cpp
106 106 107 107 108 108 void 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_KEY119 | B_SHIFT_KEY)) == (B_CONTROL_KEY | B_COMMAND_KEY)) {120 // The window key was pressed - enter dragging code121 fBarView->DragRegion()->MouseDown(122 fBarView->DragRegion()->DragRegion().LeftTop());123 return;124 }125 }126 127 BWindow::DispatchMessage(message, handler);128 }129 130 131 void132 109 TBarWindow::MenusBeginning() 133 110 { 134 111 BPath path; … … 182 159 sBeMenu->UnlockLooper(); 183 160 } 184 161 185 fBarView->Update AutoRaise();162 fBarView->UpdateEventMask(); 186 163 } 187 164 188 165 -
src/apps/deskbar/PreferencesWindow.h
57 57 58 58 BCheckBox* fWindowAlwaysOnTop; 59 59 BCheckBox* fWindowAutoRaise; 60 BCheckBox* fWindowAutoHide; 60 61 }; 61 62 62 63 #endif // _PREFERENCES_WINDOW_H -
src/apps/deskbar/BarView.cpp
110 110 SetViewColor(ui_color(B_MENU_BACKGROUND_COLOR)); 111 111 SetFont(be_plain_font); 112 112 113 Update AutoRaise();113 UpdateEventMask(); 114 114 UpdatePlacement(); 115 115 116 116 fTrackingHookData.fTrackingHook = MenuTrackingHook; … … 182 182 { 183 183 if (Window() == NULL || EventMask() == 0) 184 184 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; 185 196 197 bool isTopMost = Window()->Feel() == B_FLOATING_ALL_WINDOW_FEEL; 198 186 199 // Auto-Raise 187 188 200 where = ConvertToScreen(where); 189 201 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(); 202 BRect screenFrame = screen.Frame(); 203 if ((where.x == screenFrame.left || where.x == screenFrame.right 204 || where.y == screenFrame.top || where.y == screenFrame.bottom) 205 && Window()->Frame().Contains(where)) { 206 // cursor is on a screen edge within the window frame 207 208 if (!alwaysOnTop && autoRaise && !isTopMost) 209 RaiseDeskbar(true); 210 211 if (autoHide && IsHidden()) 212 HideDeskbar(false); 213 } else { 214 // cursor is not on screen edge 215 BRect preventHideArea = Window()->Frame().InsetByCopy( 216 -kMaxPreventHidingDist, -kMaxPreventHidingDist); 217 218 if (preventHideArea.Contains(where)) 219 return; 220 221 // cursor to bar distance above threshold 222 if (!alwaysOnTop && autoRaise && isTopMost) 223 RaiseDeskbar(false); 224 225 if (autoHide && !IsHidden()) 226 HideDeskbar(true); 196 227 } 197 228 } 198 229 199 230 200 231 void 232 TBarView::MouseDown(BPoint where) 233 { 234 where = ConvertToScreen(where); 235 236 if (Window()->Frame().Contains(where)) { 237 Window()->Activate(); 238 239 if ((modifiers() & (B_CONTROL_KEY | B_COMMAND_KEY | B_OPTION_KEY 240 | B_SHIFT_KEY)) == (B_CONTROL_KEY | B_COMMAND_KEY)) { 241 // The window key was pressed - enter dragging code 242 DragRegion()->MouseDown( 243 DragRegion()->DragRegion().LeftTop()); 244 return; 245 } 246 } else { 247 // hide deskbar if required 248 desk_settings* settings = ((TBarApp*)be_app)->Settings(); 249 bool alwaysOnTop = settings->alwaysOnTop; 250 bool autoRaise = settings->autoRaise; 251 bool autoHide = settings->autoHide; 252 bool isTopMost = Window()->Feel() == B_FLOATING_ALL_WINDOW_FEEL; 253 254 if (!alwaysOnTop && autoRaise && isTopMost) 255 RaiseDeskbar(false); 256 257 if (autoHide && !IsHidden()) 258 HideDeskbar(true); 259 } 260 } 261 262 263 void 201 264 TBarView::PlaceBeMenu() 202 265 { 203 266 // top or bottom, full … … 334 397 { 335 398 float windowHeight = 0; 336 399 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; 400 bool calcHiddenSize = ((TBarApp*)be_app)->Settings()->autoHide 401 && IsHidden() && !DragRegion()->IsDragging(); 402 403 if (!calcHiddenSize) 404 { 405 if (fState == kFullState) { 406 windowHeight = screenFrame.bottom; 407 windowWidth = fBarMenuBar->Frame().Width(); 408 } else if (fState == kExpandoState) { 409 if (fVertical) 410 // top left or right 411 windowHeight = fExpando->Frame().bottom; 412 else { 413 // top or bottom, full 414 fExpando->CheckItemSizes(0); 415 windowHeight = kHModeHeight; 416 windowWidth = screenFrame.Width(); 417 } 344 418 } else { 419 // four corners 420 if (fTrayLocation != 0) 421 windowHeight = fDragRegion->Frame().bottom; 422 else 423 windowHeight = fBarMenuBar->Frame().bottom; 424 } 425 } else { 426 windowHeight = kHModeHiddenHeight; 427 428 if (fState == kExpandoState && !fVertical) { 345 429 // top or bottom, full 346 430 fExpando->CheckItemSizes(0); 347 windowHeight = kHModeHeight;348 431 windowWidth = screenFrame.Width(); 349 } 350 } else { 351 // four corners 352 if (fTrayLocation != 0) 353 windowHeight = fDragRegion->Frame().bottom; 354 else 355 windowHeight = fBarMenuBar->Frame().bottom; 432 } else 433 windowWidth = kHModeHiddenHeight; 356 434 } 357 435 358 436 *width = windowWidth; 359 437 *height = windowHeight; 360 438 } … … 408 486 settings->showTime = ShowingClock(); 409 487 410 488 fReplicantTray->RememberClockSettings(); 411 settings->alwaysOnTop412 = (Window()->Feel() & B_FLOATING_ALL_WINDOW_FEEL) != 0;413 489 } 414 490 415 491 416 492 void 417 TBarView::Update AutoRaise()493 TBarView::UpdateEventMask() 418 494 { 419 if (((TBarApp*)be_app)->Settings()->autoRaise) 495 if (((TBarApp*)be_app)->Settings()->autoRaise 496 || ((TBarApp*)be_app)->Settings()->autoHide) 420 497 SetEventMask(B_POINTER_EVENTS, B_NO_POINTER_HISTORY); 421 498 else 422 499 SetEventMask(0); … … 443 520 fTop = top; 444 521 445 522 // Send a message to the preferences window to let it know to enable 446 // or disable dpreference items523 // or disable preference items 447 524 if (stateChanged || vertSwap) 448 525 be_app->PostMessage(kStateChanged); 449 526 … … 507 584 } 508 585 509 586 587 void 588 TBarView::RaiseDeskbar(bool raise) 589 { 590 if (raise) 591 Window()->SetFeel(B_FLOATING_ALL_WINDOW_FEEL); 592 else 593 Window()->SetFeel(B_NORMAL_WINDOW_FEEL); 594 } 595 596 597 void 598 TBarView::HideDeskbar(bool hide) 599 { 600 BScreen screen(Window()); 601 BRect screenFrame = screen.Frame(); 602 603 if (hide) { 604 Hide(); 605 PositionWindow(screenFrame); 606 SizeWindow(screenFrame); 607 } else { 608 Show(); 609 SizeWindow(screenFrame); 610 PositionWindow(screenFrame); 611 } 612 } 613 614 510 615 // window placement functions 511 616 512 617 bool -
src/apps/deskbar/BarApp.cpp
206 206 storedSettings.AddBool("superExpando", fSettings.superExpando); 207 207 storedSettings.AddBool("expandNewTeams", fSettings.expandNewTeams); 208 208 storedSettings.AddBool("autoRaise", fSettings.autoRaise); 209 storedSettings.AddBool("autoHide", fSettings.autoHide); 209 210 storedSettings.AddBool("recentAppsEnabled", 210 211 fSettings.recentAppsEnabled); 211 212 storedSettings.AddBool("recentDocsEnabled", … … 241 242 settings.superExpando = false; 242 243 settings.expandNewTeams = false; 243 244 settings.autoRaise = false; 245 settings.autoHide = false; 244 246 settings.recentAppsEnabled = true; 245 247 settings.recentDocsEnabled = true; 246 248 settings.recentFoldersEnabled = true; … … 290 292 storedSettings.FindBool("superExpando", &settings.superExpando); 291 293 storedSettings.FindBool("expandNewTeams", &settings.expandNewTeams); 292 294 storedSettings.FindBool("autoRaise", &settings.autoRaise); 295 storedSettings.FindBool("autoHide", &settings.autoHide); 293 296 storedSettings.FindBool("recentAppsEnabled", 294 297 &settings.recentAppsEnabled); 295 298 storedSettings.FindBool("recentDocsEnabled", … … 408 411 409 412 case kAlwaysTop: 410 413 fSettings.alwaysOnTop = !fSettings.alwaysOnTop; 411 412 414 fBarWindow->SetFeel(fSettings.alwaysOnTop ? 413 415 B_FLOATING_ALL_WINDOW_FEEL : B_NORMAL_WINDOW_FEEL); 416 fPreferencesWindow->PostMessage(kStateChanged); 414 417 break; 415 418 416 419 case kAutoRaise: 417 fSettings.autoRaise = !fSettings.autoRaise; 420 fSettings.autoRaise = fSettings.alwaysOnTop ? false : 421 !fSettings.autoRaise; 418 422 419 423 fBarWindow->Lock(); 420 BarView()->Update AutoRaise();424 BarView()->UpdateEventMask(); 421 425 fBarWindow->Unlock(); 422 426 break; 423 427 428 case kAutoHide: 429 fSettings.autoHide = !fSettings.autoHide; 430 431 fBarWindow->Lock(); 432 BarView()->UpdateEventMask(); 433 BarView()->HideDeskbar(fSettings.autoHide); 434 fBarWindow->Unlock(); 435 break; 436 424 437 case kTrackerFirst: 425 438 fSettings.trackerAlwaysFirst = !fSettings.trackerAlwaysFirst; 426 439 -
src/apps/deskbar/StatusView.h
197 197 198 198 int32 DragRegionLocation() const; 199 199 void SetDragRegionLocation(int32); 200 201 bool IsDragging() {return IsTracking();} 200 202 201 203 private: 202 204 TBarView* fBarView; -
src/apps/deskbar/PreferencesWindow.cpp
62 62 new BMessage(kAlwaysTop)); 63 63 fWindowAutoRaise = new BCheckBox(B_TRANSLATE("Auto-raise"), 64 64 new BMessage(kAutoRaise)); 65 fWindowAutoHide = new BCheckBox(B_TRANSLATE("Auto-hide"), 66 new BMessage(kAutoHide)); 65 67 66 68 BTextView* docTextView = fMenuRecentDocumentCount->TextView(); 67 69 BTextView* appTextView = fMenuRecentApplicationCount->TextView(); … … 122 124 123 125 fWindowAlwaysOnTop->SetValue(appSettings->alwaysOnTop); 124 126 fWindowAutoRaise->SetValue(appSettings->autoRaise); 127 fWindowAutoHide->SetValue(appSettings->autoHide); 125 128 126 129 _EnableDisableDependentItems(); 127 130 … … 134 137 135 138 fWindowAlwaysOnTop->SetTarget(be_app); 136 139 fWindowAutoRaise->SetTarget(be_app); 140 fWindowAutoHide->SetTarget(be_app); 137 141 138 142 // Layout 139 143 fMenuBox = new BBox("fMenuBox"); … … 196 200 .AddGroup(B_VERTICAL, 1) 197 201 .Add(fWindowAlwaysOnTop) 198 202 .Add(fWindowAutoRaise) 203 .Add(fWindowAutoHide) 199 204 .AddGlue() 200 205 .SetInsets(10, 10, 10, 10) 201 206 .End() … … 301 306 fMenuRecentFolderCount->SetEnabled(true); 302 307 else 303 308 fMenuRecentFolderCount->SetEnabled(false); 309 310 if (fWindowAlwaysOnTop->Value() == B_CONTROL_ON) 311 fWindowAutoRaise->SetEnabled(false); 312 else 313 fWindowAutoRaise->SetEnabled(true); 304 314 } 305 315 306 316 … … 310 320 if (!active && IsMinimized()) 311 321 PostMessage(B_QUIT_REQUESTED); 312 322 } 313