From c7e8c4af3dbcec9973a161c319fcd63fd1086f23 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Mon, 20 Sep 2010 19:52:40 +0000 Subject: [PATCH] Workaround for a X11-issue in combination with KModifierKeyInfo: When constructing KModifierKeyInfo in the constructor of the context menu, the user interface might freeze. Thanks to Mark Gaiser for clarifying this with the KModifierKeyInfo maintainer and testing the workaround! CCMAIL: markg85@gmail.com svn path=/trunk/KDE/kdebase/apps/; revision=1177658 --- src/dolphincontextmenu.cpp | 21 +++++++++++++++------ src/dolphincontextmenu.h | 14 +++++++++++++- src/dolphinmainwindow.cpp | 5 +++++ 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp index 2a2994086..116edf4f0 100644 --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -53,6 +53,8 @@ #include "views/dolphinview.h" #include "views/viewmodecontroller.h" +KModifierKeyInfo* DolphinContextMenu::m_keyInfo = 0; + DolphinContextMenu::DolphinContextMenu(DolphinMainWindow* parent, const KFileItem& fileInfo, const KUrl& baseUrl) : @@ -65,7 +67,6 @@ DolphinContextMenu::DolphinContextMenu(DolphinMainWindow* parent, m_customActions(), m_popup(new KMenu(m_mainWindow)), m_shiftPressed(false), - m_keyInfo(), m_removeAction(0) { // The context menu either accesses the URLs of the selected items @@ -74,13 +75,14 @@ DolphinContextMenu::DolphinContextMenu(DolphinMainWindow* parent, m_selectedUrls = view->selectedUrls(); m_selectedItems = view->selectedItems(); - if (m_keyInfo.isKeyPressed(Qt::Key_Shift) || m_keyInfo.isKeyLatched(Qt::Key_Shift)) { - m_shiftPressed = true; + if (m_keyInfo != 0) { + if (m_keyInfo->isKeyPressed(Qt::Key_Shift) || m_keyInfo->isKeyLatched(Qt::Key_Shift)) { + m_shiftPressed = true; + } + connect(m_keyInfo, SIGNAL(keyPressed(Qt::Key, bool)), + this, SLOT(slotKeyModifierPressed(Qt::Key, bool))); } - connect(&m_keyInfo, SIGNAL(keyPressed(Qt::Key, bool)), - this, SLOT(slotKeyModifierPressed(Qt::Key, bool))); - m_removeAction = new QAction(this); connect(m_removeAction, SIGNAL(triggered()), this, SLOT(slotRemoveActionTriggered())); } @@ -123,6 +125,13 @@ void DolphinContextMenu::open() } } +void DolphinContextMenu::initializeModifierKeyInfo() +{ + if (m_keyInfo == 0) { + m_keyInfo = new KModifierKeyInfo(); + } +} + void DolphinContextMenu::slotKeyModifierPressed(Qt::Key key, bool pressed) { m_shiftPressed = (key == Qt::Key_Shift) && pressed; diff --git a/src/dolphincontextmenu.h b/src/dolphincontextmenu.h index ff8d13210..028dc4649 100644 --- a/src/dolphincontextmenu.h +++ b/src/dolphincontextmenu.h @@ -77,6 +77,17 @@ public: /** Opens the context menu model. */ void open(); + /** + * TODO: This method is a workaround for a X11-issue in combination + * with KModifierKeyInfo: When constructing KModifierKeyInfo in the + * constructor of the context menu, the user interface might freeze. + * To bypass this, the KModifierKeyInfo is constructed in DolphinMainWindow + * directly after starting the application. Remove this method, if + * the X11-issue got fixed (contact the maintainer of KModifierKeyInfo for + * more details). + */ + static void initializeModifierKeyInfo(); + private slots: /** * Is invoked if a key modifier has been pressed and updates the context @@ -155,8 +166,9 @@ private: QScopedPointer m_popup; bool m_shiftPressed; - KModifierKeyInfo m_keyInfo; QAction* m_removeAction; // Action that represents either 'Move To Trash' or 'Delete' + + static KModifierKeyInfo* m_keyInfo; }; #endif diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 722a90f93..e72c52bfc 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -116,6 +116,11 @@ DolphinMainWindow::DolphinMainWindow(int id) : m_settingsDialog(0), m_lastHandleUrlStatJob(0) { + // Workaround for a X11-issue in combination with KModifierInfo + // (see DolphinContextMenu::initializeModifierKeyInfo() for + // more information): + DolphinContextMenu::initializeModifierKeyInfo(); + setObjectName("Dolphin#"); m_viewTab.append(ViewTab()); -- 2.47.3