Author: bonefish Date: 2010-11-24 19:34:40 +0100 (Wed, 24 Nov 2010) New Revision: 39614 Changeset: http://dev.haiku-os.org/changeset/39614 Modified: haiku/trunk/src/servers/app/Decorator.h haiku/trunk/src/servers/app/DefaultDecorator.cpp haiku/trunk/src/servers/app/DefaultDecorator.h haiku/trunk/src/servers/app/DefaultWindowBehaviour.cpp haiku/trunk/src/servers/app/DefaultWindowBehaviour.h Log: * Removed click_type enum. Introduced a private Action enum in DefaultWindowBehavior instead. DefaultDecorator uses the more appropriate Decorator::Region. * DefaultWindowBehavior::MouseTrackingState: Generalized the fActivateOnMouseUp handling. It is now named fWindowActionOnMouseUp and the virtual method MouseUpWindowAction() is called. Modified: haiku/trunk/src/servers/app/Decorator.h =================================================================== --- haiku/trunk/src/servers/app/Decorator.h 2010-11-24 18:04:27 UTC (rev 39613) +++ haiku/trunk/src/servers/app/Decorator.h 2010-11-24 18:34:40 UTC (rev 39614) @@ -25,28 +25,6 @@ class BRegion; -enum click_type { - CLICK_NONE = 0, - CLICK_ZOOM, - CLICK_CLOSE, - CLICK_MINIMIZE, - CLICK_TAB, - CLICK_DRAG, - CLICK_MOVE_TO_BACK, - CLICK_SLIDE_TAB, - - CLICK_RESIZE, - CLICK_RESIZE_L, - CLICK_RESIZE_T, - CLICK_RESIZE_R, - CLICK_RESIZE_B, - CLICK_RESIZE_LT, - CLICK_RESIZE_RT, - CLICK_RESIZE_LB, - CLICK_RESIZE_RB -}; - - class Decorator { public: enum Region { Modified: haiku/trunk/src/servers/app/DefaultDecorator.cpp =================================================================== --- haiku/trunk/src/servers/app/DefaultDecorator.cpp 2010-11-24 18:04:27 UTC (rev 39613) +++ haiku/trunk/src/servers/app/DefaultDecorator.cpp 2010-11-24 18:34:40 UTC (rev 39614) @@ -673,8 +673,8 @@ int32 index = (fButtonFocus ? 0 : 1) + (GetClose() ? 0 : 2); ServerBitmap* bitmap = fCloseBitmaps[index]; if (bitmap == NULL) { - bitmap = _GetBitmapForButton(CLICK_CLOSE, GetClose(), fButtonFocus, - rect.IntegerWidth(), rect.IntegerHeight(), this); + bitmap = _GetBitmapForButton(REGION_CLOSE_BUTTON, GetClose(), + fButtonFocus, rect.IntegerWidth(), rect.IntegerHeight(), this); fCloseBitmaps[index] = bitmap; } @@ -726,8 +726,8 @@ int32 index = (fButtonFocus ? 0 : 1) + (GetZoom() ? 0 : 2); ServerBitmap* bitmap = fZoomBitmaps[index]; if (bitmap == NULL) { - bitmap = _GetBitmapForButton(CLICK_ZOOM, GetZoom(), fButtonFocus, - rect.IntegerWidth(), rect.IntegerHeight(), this); + bitmap = _GetBitmapForButton(REGION_ZOOM_BUTTON, GetZoom(), + fButtonFocus, rect.IntegerWidth(), rect.IntegerHeight(), this); fZoomBitmaps[index] = bitmap; } @@ -1247,7 +1247,7 @@ ServerBitmap* -DefaultDecorator::_GetBitmapForButton(int32 item, bool down, bool focus, +DefaultDecorator::_GetBitmapForButton(Region item, bool down, bool focus, int32 width, int32 height, DefaultDecorator* object) { // TODO: the list of shared bitmaps is never freed @@ -1294,14 +1294,14 @@ BRect rect(0, 0, width - 1, height - 1); STRACE(("DefaultDecorator creating bitmap for %s %sfocus %s at size %ldx%ld\n", - item == CLICK_CLOSE ? "close" : "zoom", focus ? "" : "non-", + item == REGION_CLOSE_BUTTON ? "close" : "zoom", focus ? "" : "non-", down ? "down" : "up", width, height)); switch (item) { - case CLICK_CLOSE: + case REGION_CLOSE_BUTTON: object->_DrawBlendedRect(sBitmapDrawingEngine, rect, down, focus); break; - case CLICK_ZOOM: + case REGION_ZOOM_BUTTON: { // init the background sBitmapDrawingEngine->FillRect(rect, B_TRANSPARENT_COLOR); @@ -1321,6 +1321,9 @@ down, focus); break; } + + default: + break; } UtilityBitmap* bitmap = sBitmapDrawingEngine->ExportToBitmap(width, height, Modified: haiku/trunk/src/servers/app/DefaultDecorator.h =================================================================== --- haiku/trunk/src/servers/app/DefaultDecorator.h 2010-11-24 18:04:27 UTC (rev 39613) +++ haiku/trunk/src/servers/app/DefaultDecorator.h 2010-11-24 18:34:40 UTC (rev 39614) @@ -89,7 +89,7 @@ BRect rect, bool down, bool focus); void _LayoutTabItems(const BRect& tabRect); void _InvalidateBitmaps(); - static ServerBitmap* _GetBitmapForButton(int32 item, bool down, + static ServerBitmap* _GetBitmapForButton(Region item, bool down, bool focus, int32 width, int32 height, DefaultDecorator* object); Modified: haiku/trunk/src/servers/app/DefaultWindowBehaviour.cpp =================================================================== --- haiku/trunk/src/servers/app/DefaultWindowBehaviour.cpp 2010-11-24 18:04:27 UTC (rev 39613) +++ haiku/trunk/src/servers/app/DefaultWindowBehaviour.cpp 2010-11-24 18:34:40 UTC (rev 39614) @@ -92,10 +92,10 @@ struct DefaultWindowBehaviour::MouseTrackingState : State { MouseTrackingState(DefaultWindowBehaviour& behavior, BPoint where, - bool activateOnMouseUp, bool minimizeCheckOnMouseUp) + bool windowActionOnMouseUp, bool minimizeCheckOnMouseUp) : State(behavior), - fActivateOnMouseUp(activateOnMouseUp), + fWindowActionOnMouseUp(windowActionOnMouseUp), fMinimizeCheckOnMouseUp(minimizeCheckOnMouseUp), fLastMousePosition(where), fMouseMoveDistance(0), @@ -122,14 +122,12 @@ } } - // In FFM mode, activate the window and bring it to front in case - // this was a drag click but the mouse was not moved. - if (fActivateOnMouseUp) { - fActivateOnMouseUp = false; - // on R5, there is a time window for this feature - // ie, click and press too long, nothing will happen + // Perform the window action in case the mouse was not moved. + if (fWindowActionOnMouseUp) { + // There is a time window for this feature, i.e. click and press + // too long, nothing will happen. if (system_time() - fLastMoveTime < kWindowActivationTimeout) - fDesktop->ActivateWindow(fWindow); + MouseUpWindowAction(); } fBehavior._NextState(NULL); @@ -146,11 +144,11 @@ // the then current mouse position return; } - if (fActivateOnMouseUp || fMinimizeCheckOnMouseUp) { + if (fWindowActionOnMouseUp || fMinimizeCheckOnMouseUp) { if (now - fLastMoveTime >= kWindowActivationTimeout) { // This click is too long already for window activation/ // minimizing. - fActivateOnMouseUp = false; + fWindowActionOnMouseUp = false; fMinimizeCheckOnMouseUp = false; fLastMoveTime = now; } @@ -168,10 +166,10 @@ // If the window was moved enough, it doesn't come to // the front in FFM mode when the mouse is released. - if (fActivateOnMouseUp || fMinimizeCheckOnMouseUp) { + if (fWindowActionOnMouseUp || fMinimizeCheckOnMouseUp) { fMouseMoveDistance += delta.x * delta.x + delta.y * delta.y; if (fMouseMoveDistance > 16.0f) { - fActivateOnMouseUp = false; + fWindowActionOnMouseUp = false; fMinimizeCheckOnMouseUp = false; } else delta = B_ORIGIN; @@ -187,10 +185,18 @@ UpdateFFMFocus(isFake); } - virtual void MouseMovedAction(BPoint& delta, bigtime_t now) = 0; + virtual void MouseMovedAction(BPoint& delta, bigtime_t now) + { + } + virtual void MouseUpWindowAction() + { + // default is window activation + fDesktop->ActivateWindow(fWindow); + } + protected: - bool fActivateOnMouseUp : 1; + bool fWindowActionOnMouseUp : 1; bool fMinimizeCheckOnMouseUp : 1; BPoint fLastMousePosition; @@ -538,7 +544,7 @@ Decorator* decorator = fWindow->Decorator(); Region hitRegion = REGION_NONE; - click_type action = CLICK_NONE; + Action action = ACTION_NONE; bool inBorderRegion = false; if (decorator != NULL) @@ -575,48 +581,48 @@ // strange if (leftButton && (modifiers & B_SHIFT_KEY) != 0 && fWindow->Look() != kLeftTitledWindowLook) { - action = CLICK_SLIDE_TAB; + action = ACTION_SLIDE_TAB; break; } // otherwise fall through -- same handling as for the border... case REGION_BORDER: if (leftButton) - action = CLICK_DRAG; + action = ACTION_DRAG; else if (rightButton) - action = CLICK_MOVE_TO_BACK; + action = ACTION_RESIZE_BORDER; break; case REGION_CLOSE_BUTTON: if (leftButton) { action = (flags & B_NOT_CLOSABLE) == 0 - ? CLICK_CLOSE : CLICK_DRAG; + ? ACTION_CLOSE : ACTION_DRAG; } else if (rightButton) - action = CLICK_MOVE_TO_BACK; + action = ACTION_RESIZE_BORDER; break; case REGION_ZOOM_BUTTON: if (leftButton) { action = (flags & B_NOT_ZOOMABLE) == 0 - ? CLICK_ZOOM : CLICK_DRAG; + ? ACTION_ZOOM : ACTION_DRAG; } else if (rightButton) - action = CLICK_MOVE_TO_BACK; + action = ACTION_RESIZE_BORDER; break; case REGION_MINIMIZE_BUTTON: if (leftButton) { action = (flags & B_NOT_MINIMIZABLE) == 0 - ? CLICK_MINIMIZE : CLICK_DRAG; + ? ACTION_MINIMIZE : ACTION_DRAG; } else if (rightButton) - action = CLICK_MOVE_TO_BACK; + action = ACTION_RESIZE_BORDER; break; case REGION_RESIZE_CORNER: if (leftButton) { action = (flags & B_NOT_RESIZABLE) == 0 - ? CLICK_RESIZE : CLICK_DRAG; + ? ACTION_RESIZE : ACTION_DRAG; } else if (rightButton) - action = CLICK_MOVE_TO_BACK; + action = ACTION_RESIZE_BORDER; break; } } @@ -631,7 +637,7 @@ fResetClickCount = 0; } - if (action == CLICK_NONE) { + if (action == ACTION_NONE) { // No action -- if this is a click inside the window's contents, // let it be forwarded to the window. return inBorderRegion; @@ -642,13 +648,13 @@ // Ignore clicks on decorator buttons if the // non-floating window doesn't have focus if (!fWindow->IsFocus() && !fWindow->IsFloating() - && action != CLICK_MOVE_TO_BACK - && action != CLICK_RESIZE && action != CLICK_SLIDE_TAB) - action = CLICK_DRAG; + && action != ACTION_RESIZE_BORDER + && action != ACTION_RESIZE && action != ACTION_SLIDE_TAB) + action = ACTION_DRAG; } bool activateOnMouseUp = false; - if (action != CLICK_MOVE_TO_BACK) { + if (action != ACTION_RESIZE_BORDER) { // activate window if in click to activate mode, else only focus it if (desktopSettings.MouseMode() == B_NORMAL_MOUSE) { fDesktop->ActivateWindow(fWindow); @@ -660,34 +666,34 @@ // switch to the new state switch (action) { - case CLICK_CLOSE: - case CLICK_ZOOM: - case CLICK_MINIMIZE: + case ACTION_CLOSE: + case ACTION_ZOOM: + case ACTION_MINIMIZE: _NextState( new (std::nothrow) DecoratorButtonState(*this, hitRegion)); - STRACE_CLICK(("===> CLICK_CLOSE/ZOOM/MINIMIZE\n")); + STRACE_CLICK(("===> ACTION_CLOSE/ZOOM/MINIMIZE\n")); break; - case CLICK_DRAG: + case ACTION_DRAG: _NextState(new (std::nothrow) DragState(*this, where, activateOnMouseUp, clickCount == 2)); - STRACE_CLICK(("===> CLICK_DRAG\n")); + STRACE_CLICK(("===> ACTION_DRAG\n")); break; - case CLICK_RESIZE: + case ACTION_RESIZE: _NextState(new (std::nothrow) ResizeState(*this, where, activateOnMouseUp)); - STRACE_CLICK(("===> CLICK_RESIZE\n")); + STRACE_CLICK(("===> ACTION_RESIZE\n")); break; - case CLICK_SLIDE_TAB: + case ACTION_SLIDE_TAB: _NextState(new (std::nothrow) SlideTabState(*this, where)); - STRACE_CLICK(("===> CLICK_SLIDE_TAB\n")); + STRACE_CLICK(("===> ACTION_SLIDE_TAB\n")); break; - case CLICK_MOVE_TO_BACK: + case ACTION_RESIZE_BORDER: fDesktop->SendWindowBehind(fWindow); - STRACE_CLICK(("===> CLICK_MOVE_TO_BACK\n")); + STRACE_CLICK(("===> ACTION_RESIZE_BORDER\n")); break; default: Modified: haiku/trunk/src/servers/app/DefaultWindowBehaviour.h =================================================================== --- haiku/trunk/src/servers/app/DefaultWindowBehaviour.h 2010-11-24 18:04:27 UTC (rev 39613) +++ haiku/trunk/src/servers/app/DefaultWindowBehaviour.h 2010-11-24 18:34:40 UTC (rev 39614) @@ -48,6 +48,18 @@ REGION_RESIZE_CORNER }; + enum Action { + ACTION_NONE, + ACTION_ZOOM, + ACTION_CLOSE, + ACTION_MINIMIZE, + ACTION_TAB, + ACTION_DRAG, + ACTION_SLIDE_TAB, + ACTION_RESIZE, + ACTION_RESIZE_BORDER + }; + struct State; struct MouseTrackingState; struct DragState;