Fix tab completion on exotic platforms
authorManuel Nickschas <sputnick@quassel-irc.org>
Mon, 5 May 2014 21:38:27 +0000 (23:38 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Mon, 5 May 2014 21:38:27 +0000 (23:38 +0200)
Turns out that using the tab key as an action shortcut in an input widget
does not work reliably on all platforms, at least on OS/2 - sometimes,
the event filter would be called instead of triggering the action.

To make this more robust, we disable the action (just using it as a container
for the custom shortcut) and always catch and handle the key in the event
filter which we need anyway.

Thanks to TeLLie for bisecting this issue and finding the culprit on OS/2.

src/uisupport/tabcompleter.cpp

index 9a83416..f2d2a16 100644 (file)
@@ -45,18 +45,19 @@ TabCompleter::TabCompleter(MultiLineEdit *_lineEdit)
     _enabled(false),
     _nickSuffix(": ")
 {
     _enabled(false),
     _nickSuffix(": ")
 {
-    // use both an Action and generic eventFilter, to make the shortcut configurable
-    // yet still be able to reset() when required
+    // This Action just serves as a container for the custom shortcut and isn't actually handled;
+    // apparently, using tab as an Action shortcut  in an input widget is unreliable on some platforms (e.g. OS/2)
     _lineEdit->installEventFilter(this);
     ActionCollection *coll = GraphicalUi::actionCollection("General");
     _lineEdit->installEventFilter(this);
     ActionCollection *coll = GraphicalUi::actionCollection("General");
-    coll->addAction("TabCompletionKey", new Action(tr("Tab completion"), coll,
+    Action *a = coll->addAction("TabCompletionKey", new Action(tr("Tab completion"), coll,
             this, SLOT(onTabCompletionKey()), QKeySequence(Qt::Key_Tab)));
             this, SLOT(onTabCompletionKey()), QKeySequence(Qt::Key_Tab)));
+    a->setEnabled(false); // avoid catching the shortcut
 }
 
 
 void TabCompleter::onTabCompletionKey()
 {
 }
 
 
 void TabCompleter::onTabCompletionKey()
 {
-    complete();
+    // do nothing; we use the event filter instead
 }
 
 
 }
 
 
@@ -179,9 +180,11 @@ bool TabCompleter::eventFilter(QObject *obj, QEvent *event)
 
     QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
 
 
     QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
 
-    if (keyEvent->key() != GraphicalUi::actionCollection("General")->action("TabCompletionKey")->shortcut()[0]) {
+    if (keyEvent->key() == GraphicalUi::actionCollection("General")->action("TabCompletionKey")->shortcut()[0])
+        complete();
+    else
         reset();
         reset();
-    }
+
     return false;
 }
 
     return false;
 }