diff --git a/plugin-mainmenu/lxqtmainmenu.cpp b/plugin-mainmenu/lxqtmainmenu.cpp index 045bd39..43d5051 100644 --- a/plugin-mainmenu/lxqtmainmenu.cpp +++ b/plugin-mainmenu/lxqtmainmenu.cpp @@ -63,8 +63,7 @@ LXQtMainMenu::LXQtMainMenu(const ILXQtPanelPluginStartupInfo &startupInfo): QObject(), ILXQtPanelPlugin(startupInfo), mMenu(0), - mShortcut(0), - mLockCascadeChanges(false) + mShortcut(0) { #ifdef HAVE_MENU_CACHE mMenuCache = NULL; @@ -84,8 +83,18 @@ LXQtMainMenu::LXQtMainMenu(const ILXQtPanelPluginStartupInfo &startupInfo): settingsChanged(); - connect(mShortcut, SIGNAL(activated()), &mDelayedPopup, SLOT(start())); - connect(mShortcut, SIGNAL(shortcutChanged(QString,QString)), this, SLOT(shortcutChanged(QString,QString))); + mShortcut = GlobalKeyShortcut::Client::instance()->addAction(QString{}, QString("/panel/%1/show_hide").arg(settings()->group()), tr("Show/hide main menu"), this); + if (mShortcut) + { + connect(mShortcut, &GlobalKeyShortcut::Action::registrationFinished, [this] { + if (mShortcut->shortcut().isEmpty()) + mShortcut->changeShortcut(DEFAULT_SHORTCUT); + else + mShortcutSeq = QKeySequence(mShortcut->shortcut()); + }); + connect(mShortcut, SIGNAL(activated()), &mDelayedPopup, SLOT(start())); + connect(mShortcut, SIGNAL(shortcutChanged(QString,QString)), this, SLOT(shortcutChanged(QString,QString))); + } } @@ -124,13 +133,8 @@ void LXQtMainMenu::shortcutChanged(const QString &/*oldShortcut*/, const QString { if (!newShortcut.isEmpty()) { - mLockCascadeChanges = true; - - settings()->setValue("dialog/shortcut", newShortcut); - settings()->sync(); mShortcutSeq = QKeySequence(newShortcut); - mLockCascadeChanges = false; } } @@ -161,9 +165,6 @@ void LXQtMainMenu::menuCacheReloadNotify(MenuCache* cache, gpointer user_data) ************************************************/ void LXQtMainMenu::settingsChanged() { - if (mLockCascadeChanges) - return; - if (settings()->value("showText", false).toBool()) { mButton.setText(settings()->value("text", "Start").toString()); @@ -213,18 +214,6 @@ void LXQtMainMenu::settingsChanged() #endif } - QString shortcut = settings()->value("shortcut", DEFAULT_SHORTCUT).toString(); - if (shortcut.isEmpty()) - shortcut = DEFAULT_SHORTCUT; - - if (!mShortcut) - mShortcut = GlobalKeyShortcut::Client::instance()->addAction(shortcut, QString("/panel/%1/show_hide").arg(settings()->group()), tr("Show/hide main menu"), this); - else if (mShortcut->shortcut() != shortcut) - { - mShortcut->changeShortcut(shortcut); - } - mShortcutSeq = QKeySequence(shortcut); - setMenuFontSize(); realign(); @@ -301,7 +290,7 @@ void LXQtMainMenu::setMenuFontSize() ************************************************/ QDialog *LXQtMainMenu::configureDialog() { - return new LXQtMainMenuConfiguration(*settings(), DEFAULT_SHORTCUT); + return new LXQtMainMenuConfiguration(*settings(), mShortcut, DEFAULT_SHORTCUT); } /************************************************ diff --git a/plugin-mainmenu/lxqtmainmenu.h b/plugin-mainmenu/lxqtmainmenu.h index 5253407..31e6ea9 100644 --- a/plugin-mainmenu/lxqtmainmenu.h +++ b/plugin-mainmenu/lxqtmainmenu.h @@ -95,7 +95,6 @@ private: XdgMenu mXdgMenu; #endif - bool mLockCascadeChanges; QTimer mDelayedPopup; QTimer mHideTimer; QKeySequence mShortcutSeq; diff --git a/plugin-mainmenu/lxqtmainmenuconfiguration.cpp b/plugin-mainmenu/lxqtmainmenuconfiguration.cpp index 332c523..5c9a09b 100644 --- a/plugin-mainmenu/lxqtmainmenuconfiguration.cpp +++ b/plugin-mainmenu/lxqtmainmenuconfiguration.cpp @@ -30,15 +30,17 @@ #include "ui_lxqtmainmenuconfiguration.h" #include #include +#include #include -LXQtMainMenuConfiguration::LXQtMainMenuConfiguration(QSettings &settings, const QString &defaultShortcut, QWidget *parent) : +LXQtMainMenuConfiguration::LXQtMainMenuConfiguration(QSettings &settings, GlobalKeyShortcut::Action * shortcut, const QString &defaultShortcut, QWidget *parent) : QDialog(parent), ui(new Ui::LXQtMainMenuConfiguration), mSettings(settings), mOldSettings(settings), - mDefaultShortcut(defaultShortcut) + mDefaultShortcut(defaultShortcut), + mShortcut(shortcut) { setAttribute(Qt::WA_DeleteOnClose); setObjectName("MainMenuConfigurationWindow"); @@ -63,6 +65,8 @@ LXQtMainMenuConfiguration::LXQtMainMenuConfiguration(QSettings &settings, const connect(ui->customFontCB, SIGNAL(toggled(bool)), this, SLOT(customFontChanged(bool))); connect(ui->customFontSizeSB, SIGNAL(valueChanged(int)), this, SLOT(customFontSizeChanged(int))); + + connect(mShortcut, &GlobalKeyShortcut::Action::shortcutChanged, this, &LXQtMainMenuConfiguration::globalShortcutChanged); } LXQtMainMenuConfiguration::~LXQtMainMenuConfiguration() @@ -81,7 +85,7 @@ void LXQtMainMenuConfiguration::loadSettings() menuFile = XdgMenu::getMenuFileName(); } ui->menuFilePathLE->setText(menuFile); - ui->shortcutEd->setText(mSettings.value("shortcut", "Alt+F1").toString()); + ui->shortcutEd->setText(nullptr != mShortcut ? mShortcut->shortcut() : mDefaultShortcut); ui->customFontCB->setChecked(mSettings.value("customFont", false).toBool()); LXQt::Settings lxqtSettings("lxqt"); //load system font size as init value @@ -116,10 +120,15 @@ void LXQtMainMenuConfiguration::chooseMenuFile() d->show(); } +void LXQtMainMenuConfiguration::globalShortcutChanged(const QString &/*oldShortcut*/, const QString &newShortcut) +{ + ui->shortcutEd->setText(newShortcut); +} + void LXQtMainMenuConfiguration::shortcutChanged(const QString &value) { - ui->shortcutEd->setText(value); - mSettings.setValue("shortcut", value); + if (mShortcut) + mShortcut->changeShortcut(value); } void LXQtMainMenuConfiguration::shortcutReset() diff --git a/plugin-mainmenu/lxqtmainmenuconfiguration.h b/plugin-mainmenu/lxqtmainmenuconfiguration.h index 874b02a..1d1cf4e 100644 --- a/plugin-mainmenu/lxqtmainmenuconfiguration.h +++ b/plugin-mainmenu/lxqtmainmenuconfiguration.h @@ -40,12 +40,16 @@ namespace Ui { class LXQtMainMenuConfiguration; } +namespace GlobalKeyShortcut { + class Action; +} + class LXQtMainMenuConfiguration : public QDialog { Q_OBJECT public: - explicit LXQtMainMenuConfiguration(QSettings &settings, const QString &defaultShortcut, QWidget *parent = 0); + explicit LXQtMainMenuConfiguration(QSettings &settings, GlobalKeyShortcut::Action * shortcut, const QString &defaultShortcut, QWidget *parent = 0); ~LXQtMainMenuConfiguration(); private: @@ -53,8 +57,11 @@ private: QSettings &mSettings; LXQt::SettingsCache mOldSettings; QString mDefaultShortcut; + GlobalKeyShortcut::Action * mShortcut; private slots: + void globalShortcutChanged(const QString &oldShortcut, const QString &newShortcut); + void shortcutChanged(const QString &value); /* Saves settings in conf file. */ @@ -63,7 +70,6 @@ private slots: void textButtonChanged(const QString &value); void showTextChanged(bool value); void chooseMenuFile(); - void shortcutChanged(const QString &value); void shortcutReset(); void customFontChanged(bool value); void customFontSizeChanged(int value); diff --git a/plugin-mount/button.cpp b/plugin-mount/button.cpp index 962f438..26473fa 100644 --- a/plugin-mount/button.cpp +++ b/plugin-mount/button.cpp @@ -32,7 +32,9 @@ Button::Button(QWidget * parent) : QToolButton(parent) { - setIcon(XdgIcon::fromTheme(QStringLiteral("drive-removable-media"))); + //Note: don't use the QStringLiteral here as it is causing a SEGFAULT in static finalization time + //(the string is released upon our *.so removal, but the reference is still in held in libqtxdg...) + setIcon(XdgIcon::fromTheme(QLatin1String("drive-removable-media"))); setToolTip(tr("Removable media/devices manager")); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); } diff --git a/plugin-mount/menudiskitem.cpp b/plugin-mount/menudiskitem.cpp index d5381fb..783ebf1 100644 --- a/plugin-mount/menudiskitem.cpp +++ b/plugin-mount/menudiskitem.cpp @@ -89,7 +89,9 @@ void MenuDiskItem::setMountStatus(bool mounted) void MenuDiskItem::updateMountStatus() { - static const QIcon icon = XdgIcon::fromTheme(mDevice.icon(), QStringLiteral("drive-removable-media")); + //Note: don't use the QStringLiteral here as it is causing a SEGFAULT in static finalization time + //(the string is released upon our *.so removal, but the reference is still in held in libqtxdg...) + static const QIcon icon = XdgIcon::fromTheme(mDevice.icon(), QLatin1String("drive-removable-media")); if (mDevice.isValid()) { diff --git a/plugin-taskbar/lxqttaskbar.cpp b/plugin-taskbar/lxqttaskbar.cpp index f7c024b..6fd6074 100644 --- a/plugin-taskbar/lxqttaskbar.cpp +++ b/plugin-taskbar/lxqttaskbar.cpp @@ -142,7 +142,7 @@ void LXQtTaskBar::dragEnterEvent(QDragEnterEvent* event) if (event->mimeData()->hasFormat(LXQtTaskGroup::mimeDataFormat())) { event->acceptProposedAction(); - buttonMove(nullptr, LXQtTaskGroup::mimeDataData(event->mimeData()), event->pos()); + buttonMove(nullptr, qobject_cast(event->source()), event->pos()); } else event->ignore(); QWidget::dragEnterEvent(event); @@ -154,23 +154,22 @@ void LXQtTaskBar::dragEnterEvent(QDragEnterEvent* event) void LXQtTaskBar::dragMoveEvent(QDragMoveEvent * event) { //we don't get any dragMoveEvents if dragEnter wasn't accepted - buttonMove(nullptr, LXQtTaskGroup::mimeDataData(event->mimeData()), event->pos()); + buttonMove(nullptr, qobject_cast(event->source()), event->pos()); QWidget::dragMoveEvent(event); } /************************************************ ************************************************/ -void LXQtTaskBar::buttonMove(LXQtTaskGroup * dst, QString const & srcWindow, QPoint const & pos) +void LXQtTaskBar::buttonMove(LXQtTaskGroup * dst, LXQtTaskGroup * src, QPoint const & pos) { - LXQtTaskGroup *src_group = mGroupsHash.value(srcWindow, nullptr); - if (!src_group) + int src_index; + if (!src || -1 == (src_index = mLayout->indexOf(src))) { qDebug() << "Dropped invalid"; return; } - const int src_index = mLayout->indexOf(src_group); const int size = mLayout->count(); Q_ASSERT(0 < size); //dst is nullptr in case the drop occured on empty space in taskbar @@ -245,8 +244,8 @@ void LXQtTaskBar::addWindow(WId window, QString const & groupId) connect(group, SIGNAL(visibilityChanged(bool)), this, SLOT(refreshPlaceholderVisibility())); connect(group, &LXQtTaskGroup::popupShown, this, &LXQtTaskBar::groupPopupShown); connect(group, SIGNAL(windowDisowned(WId)), this, SLOT(refreshTaskList())); - connect(group, &LXQtTaskButton::dragging, this, [this] (QString const & mimeWindow, QPoint const & pos) { - buttonMove(qobject_cast(sender()), mimeWindow, pos); + connect(group, &LXQtTaskButton::dragging, this, [this] (QObject * dragSource, QPoint const & pos) { + buttonMove(qobject_cast(sender()), qobject_cast(dragSource), pos); }); mLayout->addWidget(group); diff --git a/plugin-taskbar/lxqttaskbar.h b/plugin-taskbar/lxqttaskbar.h index 43635c8..661d603 100644 --- a/plugin-taskbar/lxqttaskbar.h +++ b/plugin-taskbar/lxqttaskbar.h @@ -95,7 +95,7 @@ private slots: private: void addWindow(WId window, QString const & groupId); - void buttonMove(LXQtTaskGroup * dst, QString const & srcWindow, QPoint const & pos); + void buttonMove(LXQtTaskGroup * dst, LXQtTaskGroup * src, QPoint const & pos); private: QHash mGroupsHash; diff --git a/plugin-taskbar/lxqttaskbutton.cpp b/plugin-taskbar/lxqttaskbutton.cpp index 36c35e9..b3cb5bc 100644 --- a/plugin-taskbar/lxqttaskbutton.cpp +++ b/plugin-taskbar/lxqttaskbutton.cpp @@ -70,17 +70,6 @@ void LeftAlignedTextStyle::drawItemText(QPainter * painter, const QRect & rect, } -/************************************************ - -************************************************/ -QString LXQtTaskButton::mimeDataData(QMimeData const * mime) -{ - QString data; - QDataStream stream(mime->data(mimeDataFormat())); - stream >> data; - return data; -} - /************************************************ ************************************************/ @@ -173,7 +162,7 @@ void LXQtTaskButton::dragEnterEvent(QDragEnterEvent *event) event->acceptProposedAction(); if (event->mimeData()->hasFormat(mimeDataFormat())) { - emit dragging(mimeDataData(event->mimeData()), event->pos()); + emit dragging(event->source(), event->pos()); setAttribute(Qt::WA_UnderMouse, false); } else { @@ -187,7 +176,7 @@ void LXQtTaskButton::dragMoveEvent(QDragMoveEvent * event) { if (event->mimeData()->hasFormat(mimeDataFormat())) { - emit dragging(mimeDataData(event->mimeData()), event->pos()); + emit dragging(event->source(), event->pos()); setAttribute(Qt::WA_UnderMouse, false); } } @@ -203,7 +192,7 @@ void LXQtTaskButton::dropEvent(QDropEvent *event) mDNDTimer->stop(); if (event->mimeData()->hasFormat(mimeDataFormat())) { - emit dropped(mimeDataData(event->mimeData()), event->pos()); + emit dropped(event->source(), event->pos()); setAttribute(Qt::WA_UnderMouse, false); } QToolButton::dropEvent(event); @@ -266,7 +255,20 @@ void LXQtTaskButton::mouseMoveEvent(QMouseEvent* event) QDrag *drag = new QDrag(this); drag->setMimeData(mimeData()); QIcon ico = icon(); - drag->setPixmap(ico.pixmap(ico.actualSize({32, 32}))); + QPixmap img = ico.pixmap(ico.actualSize({32, 32})); + drag->setPixmap(img); + switch (parentTaskBar()->panel()->position()) + { + case ILXQtPanel::PositionLeft: + case ILXQtPanel::PositionTop: + drag->setHotSpot({0, 0}); + break; + case ILXQtPanel::PositionRight: + case ILXQtPanel::PositionBottom: + drag->setHotSpot(img.rect().bottomRight()); + break; + } + sDraggging = true; drag->exec(); diff --git a/plugin-taskbar/lxqttaskbutton.h b/plugin-taskbar/lxqttaskbutton.h index d083199..fc6014b 100644 --- a/plugin-taskbar/lxqttaskbutton.h +++ b/plugin-taskbar/lxqttaskbutton.h @@ -85,7 +85,6 @@ public: void refreshIconGeometry(QRect const & geom); static QString mimeDataFormat() { return QLatin1String("lxqt/lxqttaskbutton"); } - static QString mimeDataData(QMimeData const * mime); /*! \return true if this buttom received DragEnter event (and no DragLeave event yet) * */ bool hasDragAndDropHover() const; @@ -136,8 +135,8 @@ private slots: void activateWithDraggable(); signals: - void dropped(QString const & mimeWindow, QPoint const & pos); - void dragging(QString const & mimeWindow, QPoint const & pos); + void dropped(QObject * dragSource, QPoint const & pos); + void dragging(QObject * dragSource, QPoint const & pos); }; typedef QHash LXQtTaskButtonHash;