Ticket #13234: 20180313_1533_longpress.patch
File 20180313_1533_longpress.patch, 7.7 KB (added by , 6 years ago) |
---|
-
mythtv/libs/libmythtv/tv_play.cpp
diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp index d6fcb27..b6d27c9 100644
a b bool TV::eventFilter(QObject *o, QEvent *e) 3664 3664 3665 3665 // Intercept keypress events unless they need to be handled by a main UI 3666 3666 // screen (e.g. GuideGrid, ProgramFinder) 3667 QScopedPointer<QEvent> sNewEvent(NULL); 3668 if (GetMythMainWindow()->keyLongPressFilter(&e, sNewEvent)) 3669 return false; 3670 3667 3671 if (QEvent::KeyPress == e->type()) 3668 3672 return ignoreKeyPresses ? false : event(e); 3669 3673 if (MythGestureEvent::kEventType == e->type()) -
mythtv/libs/libmythui/mythmainwindow.cpp
diff --git a/mythtv/libs/libmythui/mythmainwindow.cpp b/mythtv/libs/libmythui/mythmainwindow.cpp index 1a60f0b..1a468bf 100644
a b using namespace std; 88 88 89 89 #define GESTURE_TIMEOUT 1000 90 90 #define STANDBY_TIMEOUT 90 // Minutes 91 #define LONGPRESS_INTERVAL 1000 91 92 92 93 #define LOC QString("MythMainWindow: ") 93 94 … … class MythMainWindowPrivate 199 200 disableIdle(false), 200 201 NC(NULL), 201 202 firstinit(true), 202 m_bSavedPOS(false) 203 m_bSavedPOS(false), 204 m_longPressKeyCode(0), 205 m_longPressTime(0) 203 206 { 204 207 } 205 208 … … class MythMainWindowPrivate 299 302 // window aspect 300 303 bool firstinit; 301 304 bool m_bSavedPOS; 305 // Support for long press 306 int m_longPressKeyCode; 307 ulong m_longPressTime; 302 308 }; 303 309 304 310 // Make keynum in QKeyEvent be equivalent to what's in QKeySequence … … void MythMainWindow::InitKeys() 1256 1262 RegisterKey("Global", "ESCAPE", QT_TRANSLATE_NOOP("MythControls", 1257 1263 "Escape"), "Esc"); 1258 1264 RegisterKey("Global", "MENU", QT_TRANSLATE_NOOP("MythControls", 1259 "Pop-up menu"), "M ");1265 "Pop-up menu"), "M,Meta+Enter"); 1260 1266 RegisterKey("Global", "INFO", QT_TRANSLATE_NOOP("MythControls", 1261 1267 "More information"), "I"); 1262 1268 RegisterKey("Global", "DELETE", QT_TRANSLATE_NOOP("MythControls", … … void MythMainWindow::InitKeys() 1386 1392 "System Exit"), ""); 1387 1393 RegisterKey("Main Menu", "STANDBYMODE",QT_TRANSLATE_NOOP("MythControls", 1388 1394 "Enter Standby Mode"), ""); 1395 RegisterKey("Long Press", "LONGPRESS1",QT_TRANSLATE_NOOP("MythControls", 1396 "Up to 16 Keys that allow Long Press"), "Enter"); 1397 RegisterKey("Long Press", "LONGPRESS2",QT_TRANSLATE_NOOP("MythControls", 1398 "Up to 16 Keys that allow Long Press"), ""); 1399 RegisterKey("Long Press", "LONGPRESS3",QT_TRANSLATE_NOOP("MythControls", 1400 "Up to 16 Keys that allow Long Press"), ""); 1401 RegisterKey("Long Press", "LONGPRESS4",QT_TRANSLATE_NOOP("MythControls", 1402 "Up to 16 Keys that allow Long Press"), ""); 1389 1403 } 1390 1404 1391 1405 void MythMainWindow::ReloadKeys() … … void MythMainWindow::mouseTimeout(void) 2162 2176 QCoreApplication::postEvent(this, e); 2163 2177 } 2164 2178 2179 // Return code = true to skip further processing, false to continue 2180 // sNewEvent: Caller must pass in a QScopedPointer that will be used 2181 // to delete a new event if one is created. 2182 bool MythMainWindow::keyLongPressFilter(QEvent **e, 2183 QScopedPointer<QEvent> &sNewEvent) 2184 { 2185 QEvent *newEvent = NULL; 2186 QKeyEvent *ke = dynamic_cast<QKeyEvent*>(*e); 2187 if (!ke) 2188 return false; 2189 int keycode = ke->key(); 2190 2191 switch ((*e)->type()) 2192 { 2193 case QEvent::KeyPress: 2194 { 2195 // Check if we are in the middle of a long press 2196 if (keycode != 0 && keycode == d->m_longPressKeyCode) 2197 { 2198 if (ke->timestamp() - d->m_longPressTime < LONGPRESS_INTERVAL 2199 || d->m_longPressTime == 0) 2200 { 2201 // waiting for release of key. 2202 return true; // discard the key press 2203 } 2204 else 2205 { 2206 // expired log press - generate long key 2207 newEvent = new QKeyEvent(QEvent::KeyPress, keycode, 2208 ke->modifiers() | Qt::MetaModifier, ke->nativeScanCode(), 2209 ke->nativeVirtualKey(), ke->nativeModifiers(), 2210 ke->text(), false,1); 2211 *e = newEvent; 2212 sNewEvent.reset(newEvent); 2213 d->m_longPressTime = 0; // indicate we have generated the long press 2214 return false; 2215 } 2216 } 2217 d->m_longPressKeyCode = 0; 2218 QStringList actions; 2219 bool handled = TranslateKeyPress("Long Press", 2220 ke, actions,false); 2221 if (handled) 2222 { 2223 // This shoudl never happen,, because we passed in false 2224 // to say do not process jump points and yet it returned true 2225 // to say it processed a jump point. 2226 LOG(VB_GUI, LOG_ERR, QString("TranslateKeyPress Long Press Invalid Response")); 2227 return true; 2228 } 2229 if (actions.size()>0 && actions[0].startsWith("LONGPRESS")) 2230 { 2231 // Beginning of a press 2232 d->m_longPressKeyCode = keycode; 2233 d->m_longPressTime = ke->timestamp(); 2234 return true; // discard the key press 2235 } 2236 break; 2237 } 2238 case QEvent::KeyRelease: 2239 { 2240 if (keycode != 0 && keycode == d->m_longPressKeyCode) 2241 { 2242 if (ke->isAutoRepeat()) 2243 return true; 2244 if (d->m_longPressTime > 0) 2245 { 2246 // short press or non-repeating keyboard - generate key 2247 Qt::KeyboardModifiers modifier = Qt::NoModifier; 2248 if (ke->timestamp() - d->m_longPressTime >= LONGPRESS_INTERVAL) 2249 // non-repeatng keyboard 2250 modifier = Qt::MetaModifier; 2251 newEvent = new QKeyEvent(QEvent::KeyPress, keycode, 2252 ke->modifiers() | modifier, ke->nativeScanCode(), 2253 ke->nativeVirtualKey(), ke->nativeModifiers(), 2254 ke->text(), false,1); 2255 *e = newEvent; 2256 sNewEvent.reset(newEvent); 2257 d->m_longPressKeyCode = 0; 2258 return false; 2259 } 2260 else 2261 { 2262 // end of long press 2263 d->m_longPressKeyCode = 0; 2264 return true; 2265 } 2266 } 2267 break; 2268 } 2269 } 2270 return false; 2271 } 2272 2165 2273 bool MythMainWindow::eventFilter(QObject *, QEvent *e) 2166 2274 { 2167 2275 MythGestureEvent *ge; … … bool MythMainWindow::eventFilter(QObject *, QEvent *e) 2170 2278 if (!d->AllowInput) 2171 2279 return true; 2172 2280 2281 QScopedPointer<QEvent> sNewEvent(NULL); 2282 if (keyLongPressFilter(&e, sNewEvent)) 2283 return false; 2284 2173 2285 switch (e->type()) 2174 2286 { 2175 2287 case QEvent::KeyPress: -
mythtv/libs/libmythui/mythmainwindow.h
diff --git a/mythtv/libs/libmythui/mythmainwindow.h b/mythtv/libs/libmythui/mythmainwindow.h index 9195982..79424c3 100644
a b class MUI_PUBLIC MythMainWindow : public QWidget 54 54 bool TranslateKeyPress(const QString &context, QKeyEvent *e, 55 55 QStringList &actions, bool allowJumps = true) 56 56 MUNUSED_RESULT; 57 bool keyLongPressFilter(QEvent **e, 58 QScopedPointer<QEvent> &sNewEvent); 57 59 58 60 void ReloadKeys(void); 59 61 void ClearKey(const QString &context, const QString &action);