summaryrefslogtreecommitdiffstats
path: root/kcontrol/hwmanager/hwdevicetray.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kcontrol/hwmanager/hwdevicetray.cpp')
-rw-r--r--kcontrol/hwmanager/hwdevicetray.cpp970
1 files changed, 493 insertions, 477 deletions
diff --git a/kcontrol/hwmanager/hwdevicetray.cpp b/kcontrol/hwmanager/hwdevicetray.cpp
index 1980f90d1..6c8949275 100644
--- a/kcontrol/hwmanager/hwdevicetray.cpp
+++ b/kcontrol/hwmanager/hwdevicetray.cpp
@@ -1,8 +1,8 @@
/*
* Copyright 2015 Timothy Pearson <kb9vqf@pearsoncomputing.net>
- *
+ *
* This file is part of hwdevicetray, the TDE Hardware Device Monitor System Tray Application
- *
+ *
* hwdevicetray is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3
@@ -17,56 +17,148 @@
* License along with cryptocardwatcher. If not, see http://www.gnu.org/licenses/.
*/
-#include <tqtimer.h>
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <cstdlib>
+#include <unistd.h>
+
+#include <tqfileinfo.h>
#include <tqimage.h>
+#include <tqtimer.h>
#include <tqtooltip.h>
-#include <tqfileinfo.h>
+#include <tqvaluevector.h>
+#include <kcmultidialog.h>
+#include <kglobalaccel.h>
+#include <khelpmenu.h>
+#include "kprocess.h"
+#include <kpropertiesdialog.h>
#include <krun.h>
+#include <ksimpleconfig.h>
+#include <kstandarddirs.h>
+
#include <tdeaction.h>
#include <tdeapplication.h>
-#include <kcmultidialog.h>
-#include <kdebug.h>
-#include <khelpmenu.h>
-#include <kiconloader.h>
-#include <tdelocale.h>
-#include <tdepopupmenu.h>
-#include <kstdaction.h>
-#include <kstdguiitem.h>
#include <tdeglobal.h>
+#include <tdehardwaredevices.h>
+#include <tdelocale.h>
#include <tdemessagebox.h>
-#include <kpassivepopup.h>
-#include <kstandarddirs.h>
-#include <kpropertiesdialog.h>
-#include "passworddlg.h"
+#include "tdepassivepopupstack.h"
+#include <tdepopupmenu.h>
#include <dcopclient.h>
+#include <dcopref.h>
-#include <cstdlib>
-#include <unistd.h>
-
-#include "hwdevicetray_configdialog.h"
#include "hwdevicetray.h"
+#include "hwdevicetray_configdialog.h"
+
-HwDeviceSystemTray::HwDeviceSystemTray(TQWidget* parent, const char *name)
- : KSystemTray(parent, name), m_passDlg(NULL)
+// Storage Device Action
+namespace SDActions
+{
+ // use 'int' as underlying type to avoid exposing a bunch of unnecessary
+ // enums/structs in the class header file private methods' signature
+ // Note: must start from 0 because the Type value is also used as index
+ // of a TQValueVector
+ enum Type : int
+ {
+ Open = 0,
+ Mount,
+ Unmount,
+ Unlock,
+ Lock,
+ Eject,
+ SafeRemove,
+ Properties
+ };
+
+ struct Details
+ {
+ const char *iconName;
+ const char *actionName;
+ const char *collectionName;
+ };
+
+ // Allows to use a for loop to iterate over all action types
+ static const Type All[] = { Open, Mount, Unmount, Unlock, Lock, Eject, SafeRemove, Properties };
+
+ static const TQMap<Type, Details> populateMap()
+ {
+ TQMap<Type, Details> map;
+ map[Open] = { "window-new", I18N_NOOP("Open"), "open_menu" };
+ map[Mount] = { "drive-harddisk-mounted", I18N_NOOP("Mount"), "mount_menu" };
+ map[Unmount] = { "drive-harddisk-unmounted", I18N_NOOP("Unmount"), "unmount_menu" };
+ map[Unlock] = { "decrypted", I18N_NOOP("Unlock"), "unlock_menu" };
+ map[Lock] = { "encrypted", I18N_NOOP("Lock"), "lock_menu" };
+ map[Eject] = { "player_eject", I18N_NOOP("Eject"), "eject_menu" };
+ map[SafeRemove] = { "player_safe_removal", I18N_NOOP("Safe remove"), "safe_remove_menu" };
+ map[Properties] = { "edit", I18N_NOOP("Properties"), "properties_menu" };
+ return map;
+ }
+
+ static const TQMap<Type, Details> Data = populateMap();
+}
+
+// Storage Device Action Menu Entry, representing an action
+// and the storage device on which to perform it
+struct SDActionMenuEntry
+{
+ SDActions::Type actionType;
+ TQString uuid;
+};
+
+struct KnownDiskDeviceInfo
+{
+ TQString deviceLabel;
+ TQString node;
+};
+
+
+class HwDeviceSystemTrayPrivate
+{
+public:
+ HwDeviceSystemTrayPrivate()
+ {
+ }
+
+ ~HwDeviceSystemTrayPrivate()
+ {
+ }
+
+ // Members
+ TDEAction *m_deviceManagerAction;
+ TDEAction *m_quitAction;
+ TDEAction *m_shortcutKeysAction;
+ KHelpMenu *m_helpMenu;
+ TDEPopupMenu *m_LMBMenu;
+ TDEPopupMenu *m_RMBMenu;
+
+ TQMap<int, SDActionMenuEntry> m_actionMenuEntryMap;
+ TQMap<SDActions::Type, TDEActionMenu*> m_RMBActionMenuMap;
+
+ TQMap<TQString, KnownDiskDeviceInfo> m_knownDiskDevices;
+
+ TDEPassivePopupStackContainer *m_hardwareNotifierContainer;
+};
+
+
+HwDeviceSystemTray::HwDeviceSystemTray(TQWidget *parent, const char *name)
+ : KSystemTray(parent, name), d(new HwDeviceSystemTrayPrivate())
{
// Create notifier
- m_hardwareNotifierContainer = new TDEPassivePopupStackContainer();
- connect(m_hardwareNotifierContainer, TQT_SIGNAL(popupClicked(KPassivePopup*, TQPoint, TQString)), this, TQT_SLOT(devicePopupClicked(KPassivePopup*, TQPoint, TQString)));
+ d->m_hardwareNotifierContainer = new TDEPassivePopupStackContainer();
+ connect(d->m_hardwareNotifierContainer, TQ_SIGNAL(popupClicked(KPassivePopup*, TQPoint, TQString)), this, TQ_SLOT(devicePopupClicked(KPassivePopup*, TQPoint, TQString)));
- // Create help submenu
- m_help = new KHelpMenu(this, TDEGlobal::instance()->aboutData(), false, actionCollection());
- TDEPopupMenu *help = m_help->menu();
- help->connectItem(KHelpMenu::menuHelpContents, this, TQT_SLOT(slotHelpContents()));
+ initMenus();
setPixmap(KSystemTray::loadIcon("hwinfo"));
- setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
- connect(this, TQT_SIGNAL(quitSelected()), this, TQT_SLOT(_quit()));
+ setAlignment(TQt::AlignHCenter | TQt::AlignVCenter);
+ connect(this, TQ_SIGNAL(quitSelected()), this, TQ_SLOT(quitApp()));
TQToolTip::add(this, i18n("Device monitor"));
- m_parent = parent;
- globalKeys = new TDEGlobalAccel(TQT_TQOBJECT(this));
+ globalKeys = new TDEGlobalAccel(this);
TDEGlobalAccel* keys = globalKeys;
#include "hwdevicetray_bindings.cpp"
// the keys need to be read from tdeglobals, not kickerrc
@@ -74,46 +166,35 @@ HwDeviceSystemTray::HwDeviceSystemTray(TQWidget* parent, const char *name)
globalKeys->setEnabled(true);
globalKeys->updateConnections();
- connect(kapp, TQT_SIGNAL(settingsChanged(int)), TQT_SLOT(slotSettingsChanged(int)));
-
- new TDEActionMenu(i18n("Open"), SmallIcon("window-new", TQIconSet::Automatic), actionCollection(), "open_menu");
- new TDEActionMenu(i18n("Mount"), SmallIcon("drive-harddisk-mounted", TQIconSet::Automatic), actionCollection(), "mount_menu");
- new TDEActionMenu(i18n("Unmount"), SmallIcon("drive-harddisk-unmounted", TQIconSet::Automatic), actionCollection(), "unmount_menu");
- new TDEActionMenu(i18n("Unlock"), SmallIcon("decrypted", TQIconSet::Automatic), actionCollection(), "unlock_menu");
- new TDEActionMenu(i18n("Lock"), SmallIcon("encrypted", TQIconSet::Automatic), actionCollection(), "lock_menu");
- new TDEActionMenu(i18n("Eject"), SmallIcon("player_eject", TQIconSet::Automatic), actionCollection(), "eject_menu");
- new TDEActionMenu(i18n("Properties"), SmallIcon("edit", TQIconSet::Automatic), actionCollection(), "properties_menu");
+ connect(kapp, TQ_SIGNAL(settingsChanged(int)), TQ_SLOT(slotSettingsChanged(int)));
-#ifdef __TDE_HAVE_TDEHWLIB
TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
- connect(hwdevices, TQT_SIGNAL(hardwareAdded(TDEGenericDevice*)), this, TQT_SLOT(deviceAdded(TDEGenericDevice*)));
- connect(hwdevices, TQT_SIGNAL(hardwareRemoved(TDEGenericDevice*)), this, TQT_SLOT(deviceRemoved(TDEGenericDevice*)));
- connect(hwdevices, TQT_SIGNAL(hardwareUpdated(TDEGenericDevice*)), this, TQT_SLOT(deviceChanged(TDEGenericDevice*)));
-#endif
+ doDiskNotifications(true);
+ connect(hwdevices, TQ_SIGNAL(hardwareAdded(TDEGenericDevice*)), this, TQ_SLOT(deviceAdded(TDEGenericDevice*)));
+ connect(hwdevices, TQ_SIGNAL(hardwareRemoved(TDEGenericDevice*)), this, TQ_SLOT(deviceRemoved(TDEGenericDevice*)));
+ connect(hwdevices, TQ_SIGNAL(hardwareUpdated(TDEGenericDevice*)), this, TQ_SLOT(deviceChanged(TDEGenericDevice*)));
}
HwDeviceSystemTray::~HwDeviceSystemTray()
{
- delete m_hardwareNotifierContainer;
- if (m_passDlg)
- {
- delete m_passDlg;
- }
+ delete d->m_hardwareNotifierContainer;
+ delete d;
}
/*!
- * \b TQT_SLOT which called if hwdevicetray is exited by the user. In this case the user
+ * \b TQ_SLOT which called if hwdevicetray is exited by the user. In this case the user
* is asked through a yes/no box if "HwDeviceTray should start automatically on log in" and the
* result is written to the KDE configfile.
*/
-void HwDeviceSystemTray::_quit () {
- r_config = new KSimpleConfig("tdehwdevicetrayrc");
+void HwDeviceSystemTray::quitApp()
+{
+ KSimpleConfig *config = new KSimpleConfig("tdehwdevicetrayrc");
- TQString tmp1 = i18n ("Start device monitor automatically when you log in?");
- int tmp2 = KMessageBox::questionYesNo (0, tmp1, i18n("Question"), i18n("Start Automatically"), i18n("Do Not Start"));
- r_config->setGroup("General");
- r_config->writeEntry ("Autostart", tmp2 == KMessageBox::Yes);
- r_config->sync ();
+ TQString tmp1 = i18n("Start device monitor automatically when you log in?");
+ int tmp2 = KMessageBox::questionYesNo(0, tmp1, i18n("Question"), i18n("Start Automatically"), i18n("Do Not Start"));
+ config->setGroup("General");
+ config->writeEntry("Autostart", tmp2 == KMessageBox::Yes);
+ config->sync();
exit(0);
}
@@ -140,155 +221,193 @@ void HwDeviceSystemTray::showEvent (TQShowEvent *) {
resizeTrayIcon();
}
-void HwDeviceSystemTray::mousePressEvent(TQMouseEvent* e) {
- // Popup the context menu with left-click
- if (e->button() == Qt::LeftButton) {
- contextMenuAboutToShow(contextMenu());
- contextMenu()->popup(e->globalPos());
- e->accept();
- return;
+void HwDeviceSystemTray::mousePressEvent(TQMouseEvent* e)
+{
+ switch (e->button())
+ {
+ case TQt::LeftButton:
+ populateLMBMenu();
+ d->m_LMBMenu->popup(e->globalPos());
+ break;
+
+ case TQt::MidButton:
+ TQTimer::singleShot(0, this, TQ_SLOT(slotHardwareConfig()));
+ break;
+
+ case TQt::RightButton:
+ contextMenuAboutToShow(d->m_RMBMenu);
+ d->m_RMBMenu->popup(e->globalPos());
+ break;
+
+ default:
+ // do nothing
+ break;
}
-
- KSystemTray::mousePressEvent(e);
}
-bool HwDeviceSystemTray::isMonitoredDevice(TDEStorageDevice* sdevice) {
+bool HwDeviceSystemTray::isMonitoredDevice(TDEStorageDevice* sdevice)
+{
// Type selection logic largely duplicated from the media manager tdeioslave
- if ((sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) ||
- sdevice->checkDiskStatus(TDEDiskDeviceStatus::ContainsFilesystem) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::CDAudio) ||
- sdevice->checkDiskStatus(TDEDiskDeviceStatus::Blank)) &&
- !sdevice->checkDiskStatus(TDEDiskDeviceStatus::Hidden) &&
- (sdevice->isDiskOfType(TDEDiskDeviceType::HDD) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::CDROM) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::CDR) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::CDRW) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::CDMO) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::CDMRRW) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::CDMRRWW) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::DVDROM) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::DVDRAM) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::DVDR) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::DVDRW) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::DVDRDL) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::DVDRWDL) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::DVDPLUSR) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::DVDPLUSRW) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::DVDPLUSRDL) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::DVDPLUSRWDL) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::BDROM) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::BDR) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::BDRW) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::HDDVDROM) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::HDDVDR) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::HDDVDRW) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::CDAudio) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::CDVideo) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::DVDVideo) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::BDVideo) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::Floppy) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::Zip) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::Jaz) ||
- sdevice->isDiskOfType(TDEDiskDeviceType::Camera)))
+ return ((sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) ||
+ sdevice->checkDiskStatus(TDEDiskDeviceStatus::ContainsFilesystem) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::CDAudio) ||
+ sdevice->checkDiskStatus(TDEDiskDeviceStatus::Blank)) &&
+ !sdevice->checkDiskStatus(TDEDiskDeviceStatus::Hidden) &&
+ (sdevice->isDiskOfType(TDEDiskDeviceType::HDD) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::CDROM) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::CDR) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::CDRW) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::CDMO) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::CDMRRW) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::CDMRRWW) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::DVDROM) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::DVDRAM) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::DVDR) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::DVDRW) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::DVDRDL) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::DVDRWDL) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::DVDPLUSR) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::DVDPLUSRW) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::DVDPLUSRDL) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::DVDPLUSRWDL) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::BDROM) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::BDR) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::BDRW) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::HDDVDROM) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::HDDVDR) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::HDDVDRW) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::CDAudio) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::CDVideo) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::DVDVideo) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::BDVideo) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::Floppy) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::Zip) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::Jaz) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::Camera)));
+}
+
+void HwDeviceSystemTray::initMenus()
+{
+ // RMB menu
+ d->m_RMBMenu = contextMenu();
+
+ // Device actions
+ for (const SDActions::Type &actionType : SDActions::All)
{
- return true;
- }
- else {
- return false;
+ SDActions::Details ad = SDActions::Data[actionType];
+ d->m_RMBActionMenuMap.insert(actionType, new TDEActionMenu(i18n(ad.actionName),
+ SmallIcon(ad.iconName, TQIconSet::Automatic), actionCollection(), ad.collectionName));
}
-}
-void HwDeviceSystemTray::contextMenuAboutToShow(TDEPopupMenu* menu) {
- menu->clear();
- menu->setCheckable(true);
+ // Global Configuration
+ d->m_deviceManagerAction = new TDEAction(i18n("Show Device Manager..."), SmallIconSet("kcmpci"),
+ TDEShortcut(), this, TQ_SLOT(slotHardwareConfig()), actionCollection());
+ d->m_shortcutKeysAction = new TDEAction(i18n("Configure Shortcut Keys..."), SmallIconSet("configure"),
+ TDEShortcut(), this, TQ_SLOT(slotEditShortcutKeys()), actionCollection());
- populateMenu(menu);
+ // Help & Quit
+ d->m_helpMenu = new KHelpMenu(this, TDEGlobal::instance()->aboutData(), false, actionCollection());
+ d->m_helpMenu->menu()->connectItem(KHelpMenu::menuHelpContents, this, TQ_SLOT(slotHelpContents()));
+ d->m_quitAction = actionCollection()->action(KStdAction::name(KStdAction::Quit));
- menu->insertTitle(SmallIcon("configure"), i18n("Global Configuration"));
+ // LMB menu
+ d->m_LMBMenu = new TDEPopupMenu(this);
+}
- TDEAction *actHardwareConfig = new TDEAction(i18n("Show Device Manager..."), SmallIconSet("kcmpci"), TDEShortcut(), TQT_TQOBJECT(this), TQT_SLOT(slotHardwareConfig()), actionCollection());
- actHardwareConfig->plug(menu);
+TQString HwDeviceSystemTray::getDeviceLabel(TDEStorageDevice *sdevice)
+{
+ if (!sdevice)
+ {
+ return TQString::null;
+ }
+
+ DCOPRef mediamanager("kded", "mediamanager");
+ DCOPReply reply = mediamanager.call("properties", sdevice->deviceNode());
+ TQString deviceLabel = TQString::null;
+ if (reply.isValid())
+ {
+ // TODO R14.2.0: make sure the reply is a valid Medium
+ // once the media library is part of tdelibs
+ TQStringList properties = reply;
+ if (properties.size() >= 4)
+ {
+ deviceLabel = properties[3]; // medium label
+ }
+ }
- TDEAction *actShortcutKeys = new TDEAction(i18n("Configure Shortcut Keys..."), SmallIconSet("configure"), TDEShortcut(), TQT_TQOBJECT(this), TQT_SLOT(slotEditShortcutKeys()), actionCollection());
- actShortcutKeys->plug(menu);
+ if (deviceLabel.isEmpty())
+ {
+ deviceLabel = !sdevice->diskLabel().isEmpty() ? sdevice->diskLabel() : sdevice->friendlyName();
+ deviceLabel += " (" + sdevice->deviceNode() + ")";
+ }
- menu->insertItem(SmallIcon("help"), KStdGuiItem::help().text(), m_help->menu());
- TDEAction *quitAction = actionCollection()->action(KStdAction::name(KStdAction::Quit));
- quitAction->plug(menu);
+ return deviceLabel;
+}
- m_menu = menu;
+void HwDeviceSystemTray::addDeviceToLMBMenu(TDEStorageDevice *sdevice, const int type,
+ TDEActionMenu *actionMenu, int &actionMenuIdx)
+{
+ TQString uuid = !sdevice->diskUUID().isEmpty() ? sdevice->diskUUID() : sdevice->systemPath();
+ SDActions::Type actionType = (SDActions::Type)type;
+ SDActions::Details ad = SDActions::Data[actionType];
+ actionMenu->popupMenu()->insertItem(SmallIcon(ad.iconName), i18n(ad.actionName), actionMenuIdx);
+ actionMenu->popupMenu()->connectItem(actionMenuIdx, this,
+ TQ_SLOT(slotExecuteDeviceAction(int)));
+ d->m_actionMenuEntryMap[actionMenuIdx++] = { actionType, uuid };
}
-void HwDeviceSystemTray::configChanged() {
- //
+void HwDeviceSystemTray::addDeviceToRMBMenu(TDEStorageDevice *sdevice, const int type, int &actionMenuIdx)
+{
+ TQString uuid = !sdevice->diskUUID().isEmpty() ? sdevice->diskUUID() : sdevice->systemPath();
+ SDActions::Type actionType = (SDActions::Type)type;
+ TDEActionMenu *actionMenu = d->m_RMBActionMenuMap[actionType];
+ actionMenu->popupMenu()->insertItem(sdevice->icon(TDEIcon::SizeSmall),
+ getDeviceLabel(sdevice), actionMenuIdx);
+ actionMenu->popupMenu()->connectItem(actionMenuIdx, this,
+ TQ_SLOT(slotExecuteDeviceAction(int)));
+ actionMenu->setEnabled(true);
+ d->m_actionMenuEntryMap[actionMenuIdx++] = { actionType, uuid };
}
-void HwDeviceSystemTray::populateMenu(TDEPopupMenu* menu) {
- menu->insertTitle(SmallIcon("drive-harddisk-unmounted"), i18n("Storage Devices"));
-
- TDEActionMenu *openDeviceActionMenu = static_cast<TDEActionMenu*>(actionCollection()->action("open_menu"));
- TDEActionMenu *mountDeviceActionMenu = static_cast<TDEActionMenu*>(actionCollection()->action("mount_menu"));
- TDEActionMenu *unmountDeviceActionMenu = static_cast<TDEActionMenu*>(actionCollection()->action("unmount_menu"));
- TDEActionMenu *unlockDeviceActionMenu = static_cast<TDEActionMenu*>(actionCollection()->action("unlock_menu"));
- TDEActionMenu *lockDeviceActionMenu = static_cast<TDEActionMenu*>(actionCollection()->action("lock_menu"));
- TDEActionMenu *ejectDeviceActionMenu = static_cast<TDEActionMenu*>(actionCollection()->action("eject_menu"));
- TDEActionMenu *propertiesDeviceActionMenu = static_cast<TDEActionMenu*>(actionCollection()->action("properties_menu"));
-
- openDeviceActionMenu->popupMenu()->clear();
- mountDeviceActionMenu->popupMenu()->clear();
- unmountDeviceActionMenu->popupMenu()->clear();
- unlockDeviceActionMenu->popupMenu()->clear();
- lockDeviceActionMenu->popupMenu()->clear();
- ejectDeviceActionMenu->popupMenu()->clear();
- propertiesDeviceActionMenu->popupMenu()->clear();
-
- m_openMenuIndexMap.clear();
- m_mountMenuIndexMap.clear();
- m_unmountMenuIndexMap.clear();
- m_unlockMenuIndexMap.clear();
- m_lockMenuIndexMap.clear();
- m_ejectMenuIndexMap.clear();
- m_propertiesMenuIndexMap.clear();
+void HwDeviceSystemTray::contextMenuAboutToShow(TDEPopupMenu *menu)
+{
+ d->m_RMBMenu = menu;
+ menu->clear();
- // Find all storage devices and add them to the popup menus
- int lastOpenIndex = -1;
- int lastMountIndex = -1;
- int lastUnmountIndex = -1;
- int lastUnlockIndex = -1;
- int lastLockIndex = -1;
- int lastEjectIndex = -1;
- int lastPropertiesIndex = -1;
+ for (const SDActions::Type &actionType : SDActions::All)
+ {
+ TDEActionMenu *actionMenu = d->m_RMBActionMenuMap[actionType];
+ actionMenu->popupMenu()->clear();
+ actionMenu->setEnabled(false);
+ actionMenu->unplug(d->m_RMBMenu);
+ }
+
+ d->m_actionMenuEntryMap.clear();
+ // Find all storage devices, sort them by label and add them to the popup menus
+ TQValueVector<TQMap<TQString, TDEStorageDevice*>*> rmbMenuEntries(sizeof(SDActions::All) / sizeof(SDActions::Type), nullptr);
+ for (size_t idx = 0; idx < rmbMenuEntries.size(); ++idx)
+ {
+ rmbMenuEntries[idx] = new TQMap<TQString, TDEStorageDevice*>();
+ }
TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
TDEGenericHardwareList diskDeviceList = hwdevices->listByDeviceClass(TDEGenericDeviceType::Disk);
for (TDEGenericDevice *hwdevice = diskDeviceList.first(); hwdevice; hwdevice = diskDeviceList.next())
{
- TDEStorageDevice* sdevice = static_cast<TDEStorageDevice*>(hwdevice);
+ TDEStorageDevice *sdevice = static_cast<TDEStorageDevice*>(hwdevice);
if (isMonitoredDevice(sdevice))
{
- if (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) || sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted))
+ TQString deviceLabel = getDeviceLabel(sdevice);
+ if (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted))
{
if (sdevice->isDiskOfType(TDEDiskDeviceType::UnlockedCrypt))
{
- lastLockIndex = lockDeviceActionMenu->popupMenu()->insertItem(hwdevice->icon(TDEIcon::SizeSmall),
- i18n("%1 (%2)").arg(sdevice->friendlyName(), sdevice->deviceNode()));
- lockDeviceActionMenu->popupMenu()->connectItem(lastLockIndex, this, TQT_SLOT(slotLockDevice(int)));
- m_lockMenuIndexMap[lastLockIndex] = sdevice->diskUUID();
- if (m_lockMenuIndexMap[lastLockIndex] == "")
- {
- m_lockMenuIndexMap[lastLockIndex] = sdevice->systemPath();
- }
+ (*rmbMenuEntries[SDActions::Lock])[deviceLabel] = sdevice;
}
else
{
- lastUnlockIndex = unlockDeviceActionMenu->popupMenu()->insertItem(hwdevice->icon(TDEIcon::SizeSmall),
- i18n("%1 (%2)").arg(sdevice->friendlyName(), sdevice->deviceNode()));
- unlockDeviceActionMenu->popupMenu()->connectItem(lastUnlockIndex, this, TQT_SLOT(slotUnlockDevice(int)));
- m_unlockMenuIndexMap[lastUnlockIndex] = sdevice->diskUUID();
- if (m_unlockMenuIndexMap[lastUnlockIndex] == "")
- {
- m_unlockMenuIndexMap[lastUnlockIndex] = sdevice->systemPath();
- }
+ (*rmbMenuEntries[SDActions::Unlock])[deviceLabel] = sdevice;
}
}
@@ -296,302 +415,135 @@ void HwDeviceSystemTray::populateMenu(TDEPopupMenu* menu) {
{
if (sdevice->mountPath().isEmpty())
{
- lastMountIndex = mountDeviceActionMenu->popupMenu()->insertItem(hwdevice->icon(TDEIcon::SizeSmall),
- i18n("%1 (%2)").arg(sdevice->friendlyName(), sdevice->deviceNode()));
- mountDeviceActionMenu->popupMenu()->connectItem(lastMountIndex, this, TQT_SLOT(slotMountDevice(int)));
- m_mountMenuIndexMap[lastMountIndex] = sdevice->diskUUID();
- if (m_mountMenuIndexMap[lastMountIndex] == "")
- {
- m_mountMenuIndexMap[lastMountIndex] = sdevice->systemPath();
- }
+ (*rmbMenuEntries[SDActions::Mount])[deviceLabel] = sdevice;
}
else
{
- lastUnmountIndex = unmountDeviceActionMenu->popupMenu()->insertItem(hwdevice->icon(TDEIcon::SizeSmall),
- i18n("%1 (%2)").arg(sdevice->friendlyName(), sdevice->deviceNode()));
- unmountDeviceActionMenu->popupMenu()->connectItem(lastUnmountIndex, this, TQT_SLOT(slotUnmountDevice(int)));
- m_unmountMenuIndexMap[lastUnmountIndex] = sdevice->diskUUID();
- if (m_unmountMenuIndexMap[lastMountIndex] == "")
- {
- m_unmountMenuIndexMap[lastMountIndex] = sdevice->systemPath();
- }
+ (*rmbMenuEntries[SDActions::Unmount])[deviceLabel] = sdevice;
}
- // Both mounted and unmounted disks can be opened
- lastOpenIndex = openDeviceActionMenu->popupMenu()->insertItem(hwdevice->icon(TDEIcon::SizeSmall),
- i18n("%1 (%2)").arg(sdevice->friendlyName(), sdevice->deviceNode()));
- openDeviceActionMenu->popupMenu()->connectItem(lastOpenIndex, this, TQT_SLOT(slotOpenDevice(int)));
- m_openMenuIndexMap[lastOpenIndex] = sdevice->diskUUID();
- if (m_openMenuIndexMap[lastOpenIndex] == "")
- {
- m_openMenuIndexMap[lastOpenIndex] = sdevice->systemPath();
- }
+ // Mounted and unmounted disks can also be opened
+ (*rmbMenuEntries[SDActions::Open])[deviceLabel] = sdevice;
}
- if (sdevice->checkDiskStatus(TDEDiskDeviceStatus::Removable) ||
- sdevice->checkDiskStatus(TDEDiskDeviceStatus::Hotpluggable))
+ if (sdevice->checkDiskStatus(TDEDiskDeviceStatus::Removable))
{
- lastEjectIndex = ejectDeviceActionMenu->popupMenu()->insertItem(hwdevice->icon(TDEIcon::SizeSmall),
- i18n("%1 (%2)").arg(sdevice->friendlyName(), sdevice->deviceNode()));
- ejectDeviceActionMenu->popupMenu()->connectItem(lastEjectIndex, this, TQT_SLOT(slotEjectDevice(int)));
- m_ejectMenuIndexMap[lastEjectIndex] = sdevice->diskUUID();
- if (m_ejectMenuIndexMap[lastEjectIndex] == "")
- {
- m_ejectMenuIndexMap[lastEjectIndex] = sdevice->systemPath();
- }
- }
+ (*rmbMenuEntries[SDActions::Eject])[deviceLabel] = sdevice;
- lastPropertiesIndex = propertiesDeviceActionMenu->popupMenu()->insertItem(hwdevice->icon(TDEIcon::SizeSmall),
- i18n("%1 (%2)").arg(sdevice->friendlyName(), sdevice->deviceNode()));
- propertiesDeviceActionMenu->popupMenu()->connectItem(lastPropertiesIndex, this, TQT_SLOT(slotPropertiesDevice(int)));
- m_propertiesMenuIndexMap[lastPropertiesIndex] = sdevice->diskUUID();
- if (m_propertiesMenuIndexMap[lastPropertiesIndex] == "")
- {
- m_propertiesMenuIndexMap[lastPropertiesIndex] = sdevice->systemPath();
+ (*rmbMenuEntries[SDActions::SafeRemove])[deviceLabel] = sdevice;
}
- }
- }
- openDeviceActionMenu->setEnabled(lastOpenIndex != -1);
- mountDeviceActionMenu->setEnabled(lastMountIndex != -1);
- unmountDeviceActionMenu->setEnabled(lastUnmountIndex != -1);
- unlockDeviceActionMenu->setEnabled(lastUnlockIndex != -1);
- lockDeviceActionMenu->setEnabled(lastLockIndex != -1);
- ejectDeviceActionMenu->setEnabled(lastEjectIndex != -1);
- propertiesDeviceActionMenu->setEnabled(lastPropertiesIndex != -1);
-
- if (lastOpenIndex != -1)
- {
- openDeviceActionMenu->plug(menu);
- }
- if (lastMountIndex != -1)
- {
- mountDeviceActionMenu->plug(menu);
- }
- if (lastUnmountIndex != -1)
- {
- unmountDeviceActionMenu->plug(menu);
- }
- if (lastUnlockIndex != -1)
- {
- unlockDeviceActionMenu->plug(menu);
- }
- if (lastLockIndex != -1)
- {
- lockDeviceActionMenu->plug(menu);
- }
- if (lastEjectIndex != -1)
- {
- ejectDeviceActionMenu->plug(menu);
- }
- if (lastPropertiesIndex != -1)
- {
- propertiesDeviceActionMenu->plug(menu);
+ (*rmbMenuEntries[SDActions::Properties])[deviceLabel] = sdevice;
+ }
}
-}
-void HwDeviceSystemTray::slotOpenDevice(int parameter)
-{
- TQString uuid = m_openMenuIndexMap[parameter];
- if (!uuid.isEmpty())
+ // Plug in meaningful action menus
+ d->m_RMBMenu->insertTitle(SmallIcon("drive-harddisk-unmounted"), i18n("Storage Device Actions"), 0);
+ int actionMenuIdx = 0;
+ for (const SDActions::Type &actionType : SDActions::All)
{
- TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
- TDEGenericHardwareList diskDeviceList = hwdevices->listByDeviceClass(TDEGenericDeviceType::Disk);
- for (TDEGenericDevice *hwdevice = diskDeviceList.first(); hwdevice; hwdevice = diskDeviceList.next())
+ TDEActionMenu *actionMenu = d->m_RMBActionMenuMap[actionType];
+ for (TDEStorageDevice *sdevice : *rmbMenuEntries[actionType])
{
- TDEStorageDevice *sdevice = static_cast<TDEStorageDevice*>(hwdevice);
- if ((sdevice->diskUUID() == uuid) || (sdevice->systemPath() == uuid))
- {
- if (sdevice->isDiskOfType(TDEDiskDeviceType::Camera))
- {
- new KRun(TQString("media:/%1").arg(sdevice->friendlyName()));
- }
- else
- {
- new KRun(TQString("system:/media/%1").arg(TQFileInfo(sdevice->deviceNode()).baseName(true)));
- }
- return;
- }
+ addDeviceToRMBMenu(sdevice, actionType, actionMenuIdx);
}
- }
-}
-
-void HwDeviceSystemTray::slotMountDevice(int parameter)
-{
- TQString uuid = m_mountMenuIndexMap[parameter];
- if (!uuid.isEmpty())
- {
- TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
- TDEGenericHardwareList diskDeviceList = hwdevices->listByDeviceClass(TDEGenericDeviceType::Disk);
- for (TDEGenericDevice *hwdevice = diskDeviceList.first(); hwdevice; hwdevice = diskDeviceList.next())
+ if (actionMenu->isEnabled())
{
- TDEStorageDevice *sdevice = static_cast<TDEStorageDevice*>(hwdevice);
- if ((sdevice->diskUUID() == uuid) || (sdevice->systemPath() == uuid))
- {
- if (sdevice->mountPath().isEmpty())
- {
- TQStringVariantMap mountResult = sdevice->mountDevice();
- if (mountResult["result"].toBool() == false)
- {
- TQString errStr = mountResult.contains("errStr") ? mountResult["errStr"].toString() : TQString::null;
- TQString retcodeStr = mountResult.contains("retCode") ? mountResult["retCode"].toString() : i18n("not available");
- TQString qerror = i18n("<p>Technical details:<br>") + (!errStr.isEmpty() ? errStr : i18n("unknown"));
- KMessageBox::error(0, i18n("<qt><b>Unable to mount the device.</b>") + qerror + " (error code " +
- retcodeStr + ").</qt>", i18n("Mount failed"));
- }
- return;
- }
- }
+ actionMenu->plug(d->m_RMBMenu);
}
+ delete rmbMenuEntries[actionType];
+ rmbMenuEntries[actionType] = nullptr;
}
+
+ // Global Configuration
+ menu->insertTitle(SmallIcon("configure"), i18n("Global Configuration"));
+
+ d->m_deviceManagerAction->plug(menu);
+ d->m_shortcutKeysAction->plug(menu);
+
+ // Help & Quit
+ menu->insertSeparator();
+ menu->insertItem(SmallIcon("help"), KStdGuiItem::help().text(), d->m_helpMenu->menu());
+ d->m_quitAction->plug(menu);
}
-void HwDeviceSystemTray::slotUnmountDevice(int parameter)
+void HwDeviceSystemTray::populateLMBMenu()
{
- TQString uuid = m_unmountMenuIndexMap[parameter];
- if (!uuid.isEmpty())
+ d->m_LMBMenu->clear();
+ d->m_LMBMenu->insertTitle(SmallIcon("drive-harddisk-unmounted"), i18n("Storage Devices"), 0);
+
+ d->m_actionMenuEntryMap.clear();
+ int actionMenuIdx = 0;
+
+ // Find all storage devices and add them to the popup menus
+ TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
+ TDEGenericHardwareList diskDeviceList = hwdevices->listByDeviceClass(TDEGenericDeviceType::Disk);
+ TQMap<TQString, TDEActionMenu*> lmbMenuEntries;
+ for (TDEGenericDevice *hwdevice = diskDeviceList.first(); hwdevice; hwdevice = diskDeviceList.next())
{
- TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
- TDEGenericHardwareList diskDeviceList = hwdevices->listByDeviceClass(TDEGenericDeviceType::Disk);
- for (TDEGenericDevice *hwdevice = diskDeviceList.first(); hwdevice; hwdevice = diskDeviceList.next())
+ TDEStorageDevice *sdevice = static_cast<TDEStorageDevice*>(hwdevice);
+ if (isMonitoredDevice(sdevice) &&
+ (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted) ||
+ sdevice->checkDiskStatus(TDEDiskDeviceStatus::Mountable) ||
+ sdevice->checkDiskStatus(TDEDiskDeviceStatus::Removable)))
{
- TDEStorageDevice *sdevice = static_cast<TDEStorageDevice*>(hwdevice);
- if ((sdevice->diskUUID() == uuid) || (sdevice->systemPath() == uuid))
+ TQString deviceLabel = getDeviceLabel(sdevice);
+ TDEActionMenu *actionMenu = new TDEActionMenu(deviceLabel,
+ sdevice->icon(TDEIcon::SizeSmall));
+
+ if (sdevice->checkDiskStatus(TDEDiskDeviceStatus::Mountable))
{
- if (!sdevice->mountPath().isEmpty())
+ // Mounted and unmounted disks can also be opened
+ addDeviceToLMBMenu(sdevice, SDActions::Open, actionMenu, actionMenuIdx);
+
+ if (sdevice->mountPath().isEmpty())
{
- TQStringVariantMap unmountResult = sdevice->unmountDevice();
- if (unmountResult["result"].toBool() == false)
- {
- TQString errStr = unmountResult.contains("errStr") ? unmountResult["errStr"].toString() : TQString::null;
- TQString retcodeStr = unmountResult.contains("retCode") ? unmountResult["retCode"].toString() : i18n("not available");
- TQString qerror = i18n("<p>Technical details:<br>") + (!errStr.isEmpty() ? errStr : i18n("unknown"));
- KMessageBox::error(0, i18n("<qt><b>Unable to unmount the device.</b>") + qerror + " (error code " +
- retcodeStr + ").</qt>", i18n("Unmount failed"));
- }
- return;
+ addDeviceToLMBMenu(sdevice, SDActions::Mount, actionMenu, actionMenuIdx);
}
- }
- }
- }
-}
-
-void HwDeviceSystemTray::slotUnlockDevice(int parameter)
-{
- TQString uuid = m_unlockMenuIndexMap[parameter];
- if (!uuid.isEmpty())
- {
- TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
- TDEGenericHardwareList diskDeviceList = hwdevices->listByDeviceClass(TDEGenericDeviceType::Disk);
- for (TDEGenericDevice *hwdevice = diskDeviceList.first(); hwdevice; hwdevice = diskDeviceList.next())
- {
- TDEStorageDevice *sdevice = static_cast<TDEStorageDevice*>(hwdevice);
- if ((sdevice->diskUUID() == uuid) || (sdevice->systemPath() == uuid))
- {
- if (!m_passDlg)
+ else
{
- m_passDlg = new PasswordDlg();
- connect(m_passDlg, TQT_SIGNAL(user1Clicked()), this, TQT_SLOT(doUnlockDisk()));
+ addDeviceToLMBMenu(sdevice, SDActions::Unmount, actionMenu, actionMenuIdx);
}
- m_passDlg->setDevice(sdevice->deviceNode());
- m_passDlg->index = parameter;
- m_passDlg->clearPassword();
- m_passDlg->show();
}
- }
- }
-}
-void HwDeviceSystemTray::doUnlockDisk()
-{
- TQString uuid = m_unlockMenuIndexMap[m_passDlg->index];
- if (!uuid.isEmpty())
- {
- TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
- TDEGenericHardwareList diskDeviceList = hwdevices->listByDeviceClass(TDEGenericDeviceType::Disk);
- for (TDEGenericDevice *hwdevice = diskDeviceList.first(); hwdevice; hwdevice = diskDeviceList.next())
- {
- TDEStorageDevice *sdevice = static_cast<TDEStorageDevice*>(hwdevice);
- if ((sdevice->diskUUID() == uuid) || (sdevice->systemPath() == uuid))
+ if (sdevice->isDiskOfType(TDEDiskDeviceType::LUKS) ||
+ sdevice->isDiskOfType(TDEDiskDeviceType::OtherCrypted))
{
- TQStringVariantMap unlockResult = sdevice->unlockDevice(m_passDlg->getPassword());
- if (unlockResult["result"].toBool() == false)
+ if (sdevice->isDiskOfType(TDEDiskDeviceType::UnlockedCrypt))
{
- // Unlock failed!
- TQString errStr = unlockResult.contains("errStr") ? unlockResult["errStr"].toString() : TQString::null;
- TQString retcodeStr = unlockResult.contains("retCode") ? unlockResult["retCode"].toString() : i18n("not available");
- TQString qerror = i18n("<p>Technical details:<br>") + (!errStr.isEmpty() ? errStr : i18n("unknown"));
- KMessageBox::error(0, i18n("<qt><b>Unable to unlock the device.</b>") + qerror + " (error code " +
- retcodeStr + ").</qt>", i18n("Unlock failed"));
- m_passDlg->clearPassword();
+ addDeviceToLMBMenu(sdevice, SDActions::Lock, actionMenu, actionMenuIdx);
}
else
{
- m_passDlg->hide();
+ addDeviceToLMBMenu(sdevice, SDActions::Unlock, actionMenu, actionMenuIdx);
}
}
- }
- }
-}
-void HwDeviceSystemTray::slotLockDevice(int parameter)
-{
- TDEGenericDevice *hwdevice;
- TQString uuid = m_lockMenuIndexMap[parameter];
- if (!uuid.isEmpty())
- {
- TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
- TDEGenericHardwareList diskDeviceList = hwdevices->listByDeviceClass(TDEGenericDeviceType::Disk);
- for (hwdevice = diskDeviceList.first(); hwdevice; hwdevice = diskDeviceList.next()) {
- TDEStorageDevice *sdevice = static_cast<TDEStorageDevice*>(hwdevice);
- if ((sdevice->diskUUID() == uuid) || (sdevice->systemPath() == uuid))
+
+ if (sdevice->checkDiskStatus(TDEDiskDeviceStatus::Removable))
{
- TQStringVariantMap lockResult = sdevice->lockDevice();
- if (lockResult["result"].toBool() == false)
- {
- // Lock failed!
- TQString errStr = lockResult.contains("errStr") ? lockResult["errStr"].toString() : TQString::null;
- TQString retcodeStr = lockResult.contains("retCode") ? lockResult["retCode"].toString() : i18n("not available");
- TQString qerror = i18n("<p>Technical details:<br>") + (!errStr.isEmpty() ? errStr : i18n("unknown"));
- KMessageBox::error(0, i18n("<qt><b>Unable to lock the device.</b>") + qerror + " (error code " +
- retcodeStr + ").</qt>", i18n("Lock failed"));
- }
+ addDeviceToLMBMenu(sdevice, SDActions::Eject, actionMenu, actionMenuIdx);
+
+ addDeviceToLMBMenu(sdevice, SDActions::SafeRemove, actionMenu, actionMenuIdx);
}
+
+ addDeviceToLMBMenu(sdevice, SDActions::Properties, actionMenu, actionMenuIdx);
+
+ lmbMenuEntries[deviceLabel] = actionMenu;
}
}
-}
-
-void HwDeviceSystemTray::slotEjectDevice(int parameter)
-{
- TQString uuid = m_ejectMenuIndexMap[parameter];
- if (!uuid.isEmpty())
+ // Insert menu entries in sorted order
+ for (TDEActionMenu *am : lmbMenuEntries)
{
- TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
- TDEGenericHardwareList diskDeviceList = hwdevices->listByDeviceClass(TDEGenericDeviceType::Disk);
- for (TDEGenericDevice *hwdevice = diskDeviceList.first(); hwdevice; hwdevice = diskDeviceList.next())
- {
- TDEStorageDevice *sdevice = static_cast<TDEStorageDevice*>(hwdevice);
- if ((sdevice->diskUUID() == uuid) || (sdevice->systemPath() == uuid))
- {
- TQStringVariantMap ejectResult = sdevice->ejectDrive();
- if (ejectResult["result"].toBool() == false)
- {
- // Eject failed!
- TQString errStr = ejectResult.contains("errStr") ? ejectResult["errStr"].toString() : TQString::null;
- TQString retcodeStr = ejectResult.contains("retCode") ? ejectResult["retCode"].toString() : i18n("not available");
- TQString qerror = i18n("<p>Technical details:<br>") + (!errStr.isEmpty() ? errStr : i18n("unknown"));
- KMessageBox::error(0, i18n("<qt><b>Unable to eject the device.</b>") + qerror + " (error code " +
- retcodeStr + ").</qt>", i18n("Eject failed"));
- }
- return;
- }
- }
+ am->plug(d->m_LMBMenu);
}
}
-void HwDeviceSystemTray::slotPropertiesDevice(int parameter)
+void HwDeviceSystemTray::slotExecuteDeviceAction(int parameter)
{
- TQString uuid = m_propertiesMenuIndexMap[parameter];
+ TQString uuid = d->m_actionMenuEntryMap[parameter].uuid;
+ int actionType = d->m_actionMenuEntryMap[parameter].actionType;
if (!uuid.isEmpty())
{
TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
@@ -601,8 +553,42 @@ void HwDeviceSystemTray::slotPropertiesDevice(int parameter)
TDEStorageDevice *sdevice = static_cast<TDEStorageDevice*>(hwdevice);
if ((sdevice->diskUUID() == uuid) || (sdevice->systemPath() == uuid))
{
- new KPropertiesDialog(KURL(TQString("media:/%1").arg(sdevice->deviceNode())));
- return;
+ if (actionType == SDActions::Open)
+ {
+ if (sdevice->isDiskOfType(TDEDiskDeviceType::Camera))
+ {
+ new KRun(TQString("media:/%1").arg(sdevice->friendlyName()));
+ }
+ else
+ {
+ new KRun(TQString("system:/media/%1").arg(TQFileInfo(sdevice->deviceNode()).baseName(true)));
+ }
+ }
+ else if (actionType == SDActions::Properties)
+ {
+ new KPropertiesDialog(KURL(TQString("media:/%1").arg(sdevice->deviceNode())));
+ }
+ else
+ {
+ TQString opType = TQString::null;
+ if (actionType == SDActions::Mount) { opType = "-m"; }
+ else if (actionType == SDActions::Unmount) { opType = "-u"; }
+ else if (actionType == SDActions::Unlock) { opType = "-k"; }
+ else if (actionType == SDActions::Lock) { opType = "-l"; }
+ else if (actionType == SDActions::Eject) { opType = "-e"; }
+ else if (actionType == SDActions::SafeRemove) { opType = "-s"; }
+
+ if (!opType.isEmpty())
+ {
+ TDEProcess proc;
+ proc << "tdeio_media_mounthelper" << opType << sdevice->deviceNode();
+ if (!proc.start(TDEProcess::DontCare))
+ {
+ KMessageBox::error(this, i18n("Could not start tdeio_media_mounthelper process."),
+ i18n("Device monitor"));
+ }
+ }
+ }
}
}
}
@@ -635,87 +621,117 @@ void HwDeviceSystemTray::slotEditShortcutKeys() {
delete dlg;
}
-void HwDeviceSystemTray::deviceAdded(TDEGenericDevice* device) {
-#ifdef __TDE_HAVE_TDEHWLIB
+void HwDeviceSystemTray::doDiskNotifications(bool scanOnly)
+{
TDEConfig config("mediamanagerrc");
config.setGroup("Global");
- if (config.readBoolEntry("DeviceMonitorPopupsEnabled", true))
+ bool popupEnable = config.readBoolEntry("DeviceMonitorPopupsEnabled", true);
+
+ // Scan devices for changes and notify new devices if needed.
+ // This is necessary because the device information may not be available
+ // at the time the hardwareAdded signal is emitted
+ TQMap<TQString, KnownDiskDeviceInfo> oldKnownDevices = d->m_knownDiskDevices;
+ d->m_knownDiskDevices.clear();
+ TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
+ TDEGenericHardwareList diskDeviceList = hwdevices->listByDeviceClass(TDEGenericDeviceType::Disk);
+ for (TDEGenericDevice *hwdevice = diskDeviceList.first(); hwdevice; hwdevice = diskDeviceList.next())
{
- if (device->type() == TDEGenericDeviceType::Disk)
+ TDEStorageDevice *sdevice = static_cast<TDEStorageDevice*>(hwdevice);
+ if (isMonitoredDevice(sdevice))
{
- TDEStorageDevice* sdevice = static_cast<TDEStorageDevice*>(device);
- if (isMonitoredDevice(sdevice))
+ TQString sysPath = sdevice->systemPath();
+ if (oldKnownDevices.contains(sysPath))
{
- TQString uuid = sdevice->diskUUID();
- if (uuid == "")
+ d->m_knownDiskDevices[sysPath] = oldKnownDevices[sysPath];
+ oldKnownDevices.remove(sysPath);
+ }
+ else
+ {
+ TQString deviceLabel = getDeviceLabel(sdevice);
+ d->m_knownDiskDevices[sysPath] = { deviceLabel, sdevice->deviceNode() };
+ if (!scanOnly && popupEnable)
{
- uuid = sdevice->systemPath();
+ d->m_hardwareNotifierContainer->displayMessage(
+ i18n("A disk device has been added!"), deviceLabel,
+ SmallIcon("drive-harddisk-unmounted"), 0, 0, "ADD: " + sysPath);
}
- m_hardwareNotifierContainer->displayMessage(
- i18n("A disk device has been added!"),
- i18n("%1 (%2)").arg(sdevice->friendlyName(), sdevice->deviceNode()), SmallIcon("drive-harddisk-unmounted"),
- 0, 0, "ADD: " + uuid);
}
}
}
-#endif
+ // Notify devices which have been removed, if necessary
+ if (!scanOnly && popupEnable)
+ {
+ TQMap<TQString, KnownDiskDeviceInfo>::ConstIterator delIt;
+ for (delIt = oldKnownDevices.begin(); delIt != oldKnownDevices.end(); delIt++)
+ {
+ d->m_hardwareNotifierContainer->displayMessage(
+ i18n("A disk device has been removed!"), delIt.data().deviceLabel,
+ SmallIcon("drive-harddisk-unmounted"), 0, 0, "REMOVE: " + delIt.key());
+ }
+ }
}
-void HwDeviceSystemTray::deviceRemoved(TDEGenericDevice* device) {
-#ifdef __TDE_HAVE_TDEHWLIB
- TDEConfig config("mediamanagerrc");
- config.setGroup("Global");
- if (config.readBoolEntry("DeviceMonitorPopupsEnabled", true))
+void HwDeviceSystemTray::deviceAdded(TDEGenericDevice* device)
+{
+ if (device->type() == TDEGenericDeviceType::Disk)
{
- if (device->type() == TDEGenericDeviceType::Disk)
+ TDEStorageDevice *sdevice = static_cast<TDEStorageDevice*>(device);
+ // The device information may not be available at the time the hardwareAdded signal is emitted.
+ // In such case ignore the event and handle that at the subsequent hardwareUpdate signal emission.
+ TQString sysPath = sdevice->systemPath();
+ if (isMonitoredDevice(sdevice) && !d->m_knownDiskDevices.contains(sysPath))
{
- TDEStorageDevice* sdevice = static_cast<TDEStorageDevice*>(device);
- if (isMonitoredDevice(sdevice))
+ TQString deviceLabel = getDeviceLabel(sdevice);
+ d->m_knownDiskDevices[sysPath] = { deviceLabel, sdevice->deviceNode() };
+ TDEConfig config("mediamanagerrc");
+ config.setGroup("Global");
+ if (config.readBoolEntry("DeviceMonitorPopupsEnabled", true))
{
- TQString uuid = sdevice->diskUUID();
- if (uuid == "")
- {
- uuid = sdevice->systemPath();
- }
- m_hardwareNotifierContainer->displayMessage(
- i18n("A disk device has been removed!"),
- i18n("%1 (%2)").arg(sdevice->friendlyName(), sdevice->deviceNode()), SmallIcon("drive-harddisk-unmounted"),
- 0, 0, "REMOVE: " + uuid);
+ d->m_hardwareNotifierContainer->displayMessage(
+ i18n("A disk device has been added!"), deviceLabel,
+ SmallIcon("drive-harddisk-unmounted"), 0, 0, "ADD: " + sysPath);
}
}
}
-#endif
}
-void HwDeviceSystemTray::deviceChanged(TDEGenericDevice* device) {
-#ifdef __TDE_HAVE_TDEHWLIB
- TDEConfig config("mediamanagerrc");
- config.setGroup("Global");
- if (config.readBoolEntry("DeviceMonitorPopupsEnabled", true))
+void HwDeviceSystemTray::deviceRemoved(TDEGenericDevice* device)
+{
+ if (device->type() == TDEGenericDeviceType::Disk)
{
- if (device->type() == TDEGenericDeviceType::Disk)
+ TDEStorageDevice *sdevice = static_cast<TDEStorageDevice*>(device);
+ TQString sysPath = sdevice->systemPath();
+ if (isMonitoredDevice(sdevice) && d->m_knownDiskDevices.contains(sysPath))
{
- TDEStorageDevice* sdevice = static_cast<TDEStorageDevice*>(device);
- if (isMonitoredDevice(sdevice))
+ TDEConfig config("mediamanagerrc");
+ config.setGroup("Global");
+ if (config.readBoolEntry("DeviceMonitorPopupsEnabled", true))
{
- TQString uuid = sdevice->diskUUID();
- if (uuid == "")
- {
- uuid = sdevice->systemPath();
- }
- m_hardwareNotifierContainer->displayMessage(
- i18n("A disk device has been changed!"),
- i18n("%1 (%2)").arg(sdevice->friendlyName(), sdevice->deviceNode()), SmallIcon("drive-harddisk-unmounted"),
- 0, 0, "CHANGE: " + uuid);
+ TQString deviceLabel = getDeviceLabel(sdevice);
+ d->m_hardwareNotifierContainer->displayMessage(
+ i18n("A disk device has been removed!"), deviceLabel,
+ SmallIcon("drive-harddisk-unmounted"), 0, 0, "REMOVE: " + sysPath);
}
+ d->m_knownDiskDevices.remove(sysPath);
}
}
-#endif
+}
+
+void HwDeviceSystemTray::deviceChanged(TDEGenericDevice* device)
+{
+ doDiskNotifications(false);
}
void HwDeviceSystemTray::devicePopupClicked(KPassivePopup* popup, TQPoint point, TQString uuid) {
TDEGenericDevice *hwdevice;
if (uuid.startsWith("ADD: ")) {
+ TDEConfig config("mediamanagerrc");
+ config.setGroup("Global");
+ if (config.readBoolEntry("NotificationPopupsEnabled", true))
+ {
+ return;
+ }
+
uuid = uuid.right(uuid.length() - strlen("ADD: "));
if (uuid != "") {
TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();