summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/widgets/qwidgetlinecontrol.cpp49
-rw-r--r--src/widgets/widgets/qwidgetlinecontrol_p.h3
-rw-r--r--tests/auto/widgets/widgets/qlineedit/qlineedit.pro4
-rw-r--r--tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp82
4 files changed, 82 insertions, 56 deletions
diff --git a/src/widgets/widgets/qwidgetlinecontrol.cpp b/src/widgets/widgets/qwidgetlinecontrol.cpp
index 2f5793bcba..73c3d14f9b 100644
--- a/src/widgets/widgets/qwidgetlinecontrol.cpp
+++ b/src/widgets/widgets/qwidgetlinecontrol.cpp
@@ -45,6 +45,8 @@
#include "qabstractitemview.h"
#include "qclipboard.h"
+#include <private/qguiapplication_p.h>
+#include <qplatformtheme_qpa.h>
#ifndef QT_NO_ACCESSIBILITY
#include "qaccessible.h"
#endif
@@ -374,6 +376,14 @@ void QWidgetLineControl::init(const QString &txt)
m_text = txt;
updateDisplayText();
m_cursor = m_text.length();
+ if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
+ m_keyboardScheme = theme->themeHint(QPlatformTheme::KeyboardScheme).toInt();
+ // Generalize for X11
+ if (m_keyboardScheme == QPlatformTheme::KdeKeyboardScheme
+ || m_keyboardScheme == QPlatformTheme::GnomeKeyboardScheme
+ || m_keyboardScheme == QPlatformTheme::CdeKeyboardScheme) {
+ m_keyboardScheme = QPlatformTheme::X11KeyboardScheme;
+ }
}
/*!
@@ -1630,10 +1640,11 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
else if (event == QKeySequence::Paste) {
if (!isReadOnly()) {
QClipboard::Mode mode = QClipboard::Clipboard;
-#ifdef Q_WS_X11
- if (event->modifiers() == (Qt::CTRL | Qt::SHIFT) && event->key() == Qt::Key_Insert)
+ if (m_keyboardScheme == QPlatformTheme::X11KeyboardScheme
+ && event->modifiers() == (Qt::CTRL | Qt::SHIFT)
+ && event->key() == Qt::Key_Insert) {
mode = QClipboard::Selection;
-#endif
+ }
paste(mode);
}
}
@@ -1664,12 +1675,14 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
end(1);
}
else if (event == QKeySequence::MoveToNextChar) {
-#if !defined(Q_WS_WIN) || defined(QT_NO_COMPLETER)
- if (hasSelectedText()) {
+#if defined(QT_NO_COMPLETER)
+ const bool inlineCompletion = false;
#else
- if (hasSelectedText() && m_completer
- && m_completer->completionMode() == QCompleter::InlineCompletion) {
+ const bool inlineCompletion = m_completer && m_completer->completionMode() == QCompleter::InlineCompletion;
#endif
+ if (hasSelectedText()
+ && (m_keyboardScheme != QPlatformTheme::WindowsKeyboardScheme
+ || inlineCompletion)) {
moveCursor(selectionEnd(), false);
} else {
cursorForward(0, visual ? 1 : (layoutDirection() == Qt::LeftToRight ? 1 : -1));
@@ -1679,12 +1692,14 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
cursorForward(1, visual ? 1 : (layoutDirection() == Qt::LeftToRight ? 1 : -1));
}
else if (event == QKeySequence::MoveToPreviousChar) {
-#if !defined(Q_WS_WIN) || defined(QT_NO_COMPLETER)
- if (hasSelectedText()) {
+#if defined(QT_NO_COMPLETER)
+ const bool inlineCompletion = false;
#else
- if (hasSelectedText() && m_completer
- && m_completer->completionMode() == QCompleter::InlineCompletion) {
+ const bool inlineCompletion = m_completer && m_completer->completionMode() == QCompleter::InlineCompletion;
#endif
+ if (hasSelectedText()
+ && (m_keyboardScheme != QPlatformTheme::WindowsKeyboardScheme
+ || inlineCompletion)) {
moveCursor(selectionStart(), false);
} else {
cursorForward(0, visual ? -1 : (layoutDirection() == Qt::LeftToRight ? -1 : 1));
@@ -1737,8 +1752,8 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
#endif // QT_NO_SHORTCUT
else {
bool handled = false;
-#ifdef Q_WS_MAC
- if (event->key() == Qt::Key_Up || event->key() == Qt::Key_Down) {
+ if (m_keyboardScheme == QPlatformTheme::MacKeyboardScheme
+ && (event->key() == Qt::Key_Up || event->key() == Qt::Key_Down)) {
Qt::KeyboardModifiers myModifiers = (event->modifiers() & ~Qt::KeypadModifier);
if (myModifiers & Qt::ShiftModifier) {
if (myModifiers == (Qt::ControlModifier|Qt::ShiftModifier)
@@ -1756,7 +1771,6 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
}
handled = true;
}
-#endif
if (event->modifiers() & Qt::ControlModifier) {
switch (event->key()) {
case Qt::Key_Backspace:
@@ -1771,13 +1785,13 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
complete(event->key());
break;
#endif
-#if defined(Q_WS_X11)
case Qt::Key_E:
- end(0);
+ if (m_keyboardScheme == QPlatformTheme::X11KeyboardScheme)
+ end(0);
break;
case Qt::Key_U:
- if (!isReadOnly()) {
+ if (m_keyboardScheme == QPlatformTheme::X11KeyboardScheme && !isReadOnly()) {
setSelection(0, text().size());
#ifndef QT_NO_CLIPBOARD
copy();
@@ -1785,7 +1799,6 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event)
del();
}
break;
-#endif
default:
if (!handled)
unknown = true;
diff --git a/src/widgets/widgets/qwidgetlinecontrol_p.h b/src/widgets/widgets/qwidgetlinecontrol_p.h
index a0191188a7..72f25e9068 100644
--- a/src/widgets/widgets/qwidgetlinecontrol_p.h
+++ b/src/widgets/widgets/qwidgetlinecontrol_p.h
@@ -100,6 +100,7 @@ public:
, m_threadChecks(false)
, m_textLayoutThread(0)
#endif
+ , m_keyboardScheme(0)
{
init(txt);
}
@@ -527,6 +528,8 @@ private Q_SLOTS:
void _q_clipboardChanged();
void _q_deleteSelected();
+private:
+ int m_keyboardScheme;
};
QT_END_NAMESPACE
diff --git a/tests/auto/widgets/widgets/qlineedit/qlineedit.pro b/tests/auto/widgets/widgets/qlineedit/qlineedit.pro
index 77b2ae537c..f674ea3f05 100644
--- a/tests/auto/widgets/widgets/qlineedit/qlineedit.pro
+++ b/tests/auto/widgets/widgets/qlineedit/qlineedit.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
TARGET = tst_qlineedit
-QT += widgets testlib
+QT += gui-private core-private widgets testlib
SOURCES += tst_qlineedit.cpp
-
-CONFIG += insignificant_test # QTBUG-21402
diff --git a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
index 645f47fc72..17632ec458 100644
--- a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
+++ b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
@@ -48,6 +48,8 @@
#include "qvalidator.h"
#include "qcompleter.h"
#include "qstandarditemmodel.h"
+#include "qplatformtheme_qpa.h"
+#include <private/qguiapplication_p.h>
#ifndef QT_NO_CLIPBOARD
#include "qclipboard.h"
@@ -300,6 +302,7 @@ private:
int lastCursorPos;
int newCursorPos;
QLineEdit *testWidget;
+ int m_keyboardScheme;
};
typedef QList<int> IntList;
@@ -327,9 +330,16 @@ void tst_QLineEdit::getSetCheck()
QCOMPARE(true, obj1.dragEnabled());
}
-tst_QLineEdit::tst_QLineEdit()
+tst_QLineEdit::tst_QLineEdit() : validInput(false), m_keyboardScheme(0)
{
- validInput = false;
+ if (const QPlatformTheme *theme = QGuiApplicationPrivate::platformTheme())
+ m_keyboardScheme = theme->themeHint(QPlatformTheme::KeyboardScheme).toInt();
+ // Generalize for X11
+ if (m_keyboardScheme == QPlatformTheme::KdeKeyboardScheme
+ || m_keyboardScheme == QPlatformTheme::GnomeKeyboardScheme
+ || m_keyboardScheme == QPlatformTheme::CdeKeyboardScheme) {
+ m_keyboardScheme = QPlatformTheme::X11KeyboardScheme;
+ }
}
tst_QLineEdit::~tst_QLineEdit()
@@ -1071,25 +1081,26 @@ void tst_QLineEdit::undo()
QVERIFY(!testWidget->isUndoAvailable());
QVERIFY(testWidget->text().isEmpty());
-#ifdef Q_WS_WIN
- // Repeat the test using shortcut instead of undo()
- for (i=0; i<insertString.size(); ++i) {
- if (insertIndex[i] > -1)
- testWidget->setCursorPosition(insertIndex[i]);
- if (insertMode[i] == REPLACE_UNTIL_END) {
- testWidget->setSelection(insertIndex[i], 8);
+
+ if (m_keyboardScheme == QPlatformTheme::WindowsKeyboardScheme) {
+ // Repeat the test using shortcut instead of undo()
+ for (i=0; i<insertString.size(); ++i) {
+ if (insertIndex[i] > -1)
+ testWidget->setCursorPosition(insertIndex[i]);
+ if (insertMode[i] == REPLACE_UNTIL_END)
+ testWidget->setSelection(insertIndex[i], 8);
+ if (use_keys)
+ QTest::keyClicks(testWidget, insertString[i]);
+ else
+ testWidget->insert(insertString[i]);
+ }
+ for (i=0; i<expectedString.size()-1; ++i) {
+ QCOMPARE(testWidget->text(), expectedString[i]);
+ QVERIFY(testWidget->isUndoAvailable());
+ QTest::keyClick(testWidget, Qt::Key_Backspace, Qt::AltModifier);
}
- if (use_keys)
- QTest::keyClicks(testWidget, insertString[i]);
- else
- testWidget->insert(insertString[i]);
- }
- for (i=0; i<expectedString.size()-1; ++i) {
- QCOMPARE(testWidget->text(), expectedString[i]);
- QVERIFY(testWidget->isUndoAvailable());
- QTest::keyClick(testWidget, Qt::Key_Backspace, Qt::AltModifier);
}
-#endif
+
}
void tst_QLineEdit::redo_data()
@@ -1152,21 +1163,22 @@ void tst_QLineEdit::redo()
QVERIFY(!testWidget->isRedoAvailable());
-#ifdef Q_WS_WIN
- // repeat test, this time using shortcuts instead of undo()/redo()
- while (!testWidget->text().isEmpty())
- QTest::keyClick(testWidget, Qt::Key_Backspace, Qt::AltModifier);
+ if (m_keyboardScheme == QPlatformTheme::WindowsKeyboardScheme) {
+ // repeat test, this time using shortcuts instead of undo()/redo()
- for (i = 0; i < expectedString.size(); ++i) {
- QVERIFY(testWidget->isRedoAvailable());
- QTest::keyClick(testWidget, Qt::Key_Backspace,
- Qt::ShiftModifier | Qt::AltModifier);
- QCOMPARE(testWidget->text() , expectedString[i]);
- }
+ while (!testWidget->text().isEmpty())
+ QTest::keyClick(testWidget, Qt::Key_Backspace, Qt::AltModifier);
- QVERIFY(!testWidget->isRedoAvailable());
-#endif
+ for (i = 0; i < expectedString.size(); ++i) {
+ QVERIFY(testWidget->isRedoAvailable());
+ QTest::keyClick(testWidget, Qt::Key_Backspace,
+ Qt::ShiftModifier | Qt::AltModifier);
+ QCOMPARE(testWidget->text() , expectedString[i]);
+ }
+
+ QVERIFY(!testWidget->isRedoAvailable());
+ }
}
void tst_QLineEdit::undo_keypressevents_data()
@@ -1263,7 +1275,7 @@ void tst_QLineEdit::undo_keypressevents_data()
// unselect any current selection
keys.addKeyClick(Qt::Key_Right);
-#ifdef Q_WS_WIN //Mac has a specialcase to handle jumping to the end of a selection
+#ifdef Q_OS_WIN //Mac has a specialcase to handle jumping to the end of a selection
keys.addKeyClick(Qt::Key_Left);
#endif
@@ -3080,6 +3092,7 @@ void tst_QLineEdit::leftKeyOnSelectedText()
#ifdef Q_OS_WIN
QCOMPARE(testWidget->cursorPosition(), 1);
#else
+ // Selection is cleared ands cursor remains at position 2.
// X11 used to behave like window prior to 4.2. Changes caused by QKeySequence
// resulted in an inadvertant change in behavior
QCOMPARE(testWidget->cursorPosition(), 2);
@@ -3624,9 +3637,8 @@ void tst_QLineEdit::taskQTBUG_7395_readOnlyShortcut()
void tst_QLineEdit::QTBUG697_paletteCurrentColorGroup()
{
-#ifndef Q_WS_X11
- QSKIP("Only tested on X11");
-#endif
+ if (m_keyboardScheme != QPlatformTheme::X11KeyboardScheme)
+ QSKIP("Only tested on X11");
QLineEdit le;
le.setText(" ");
QPalette p = le.palette();