Skip to content
Browse files

[gui] - fix repeated CKey presses - we also need to throttle if we ar…

…e called really often
  • Loading branch information...
1 parent decdfb9 commit dd6822c5a2f14f1102868866cefdc4b162c84a2c @Memphiz committed Jul 20, 2012
Showing with 17 additions and 6 deletions.
  1. +16 −6 xbmc/guilib/GUIBaseContainer.cpp
  2. +1 −0 xbmc/guilib/GUIBaseContainer.h
View
22 xbmc/guilib/GUIBaseContainer.cpp
@@ -59,6 +59,7 @@ CGUIBaseContainer::CGUIBaseContainer(int parentID, int controlID, float posX, fl
m_layout = NULL;
m_focusedLayout = NULL;
m_cacheItems = preloadItems;
+ m_scrollItemsPerFrame = 0.0f;
}
CGUIBaseContainer::~CGUIBaseContainer(void)
@@ -294,24 +295,33 @@ bool CGUIBaseContainer::OnAction(const CAction &action)
case ACTION_NAV_BACK:
{
if (!HasFocus()) return false;
+
if (action.GetHoldTime() > HOLD_TIME_START &&
((m_orientation == VERTICAL && (action.GetID() == ACTION_MOVE_UP || action.GetID() == ACTION_MOVE_DOWN)) ||
(m_orientation == HORIZONTAL && (action.GetID() == ACTION_MOVE_LEFT || action.GetID() == ACTION_MOVE_RIGHT))))
{ // action is held down - repeat a number of times
float speed = std::min(1.0f, (float)(action.GetHoldTime() - HOLD_TIME_START) / (HOLD_TIME_END - HOLD_TIME_START));
- unsigned int itemsPerFrame = 1;
- if (m_lastHoldTime) // number of rows/10 items/second max speed
- itemsPerFrame = std::max((unsigned int)1, (unsigned int)(speed * 0.0001f * GetRows() * (CTimeUtils::GetFrameTime() - m_lastHoldTime)));
+ unsigned int frameDuration = CTimeUtils::GetFrameTime() - m_lastHoldTime;
+
+ //scrollrate is minimum 4 items/sec and max rows/10 items/sec
+ m_scrollItemsPerFrame += std::max(0.004f*(float)frameDuration, (float)(speed * 0.0001f * GetRows() * frameDuration));
m_lastHoldTime = CTimeUtils::GetFrameTime();
+
+ if(m_scrollItemsPerFrame < 1.0f)//not enough hold time accumulated for one step
+ return true;
+
if (action.GetID() == ACTION_MOVE_LEFT || action.GetID() == ACTION_MOVE_UP)
- while (itemsPerFrame--) MoveUp(false);
+ while (m_scrollItemsPerFrame-- >= 1) MoveUp(false);
else
- while (itemsPerFrame--) MoveDown(false);
+ while (m_scrollItemsPerFrame-- >= 1) MoveDown(false);
return true;
}
else
{
- m_lastHoldTime = 0;
+ //if HOLD_TIME_START is reached we need
+ //a sane initial value for calculating m_scrollItemsPerPage
+ m_lastHoldTime = CTimeUtils::GetFrameTime();
+ m_scrollItemsPerFrame = 0.0f;
return CGUIControl::OnAction(action);
}
}
View
1 xbmc/guilib/GUIBaseContainer.h
@@ -208,6 +208,7 @@ class CGUIBaseContainer : public CGUIControl
// letter match searching
CStopWatch m_matchTimer;
CStdString m_match;
+ float m_scrollItemsPerFrame;
static const int letter_match_timeout = 1000;
};

0 comments on commit dd6822c

Please sign in to comment.
Something went wrong with that request. Please try again.