On 09/14/2010 11:46 AM, Rex Dieter wrote:
> To be clear, thepatch fixes both monolithic and plasma applet, and adds
> a solid method for enable/disable. So, it's more than just monolithic
> knm being affected here.
Posterity, attached are the 2 patches in question,
kdebase-workspace/solid adding new method
isNetworkingEnabled
and the ability to monitor
org.freedesktop.DBus.GLib.CSymbol impl_manager_enable
via dbus.
networkmanagement adds "enable networking" to knm (the part you're not
interested in, that's fine), and adapts the plasma applet to use
isNetworkingEnabled from solid.
-- Rex
Index: applet/nmpopup.h
===================================================================
--- applet/nmpopup.h (revision 1128863)
+++ applet/nmpopup.h (working copy)
@@ -30,6 +30,7 @@
#include <Plasma/PushButton>
#include <Plasma/TabBar>
+#include <solid/networking.h>
#include <solid/control/networkinterface.h>
#include "activatable.h"
@@ -65,6 +66,7 @@
void managerWirelessHardwareEnabledChanged(bool);
void wirelessEnabledToggled(bool checked);
void networkingEnabledToggled(bool checked);
+ void managerNetworkingEnabledChanged(bool);
void manageConnections();
void showMore();
void showMore(bool);
Index: applet/nmpopup.cpp
===================================================================
--- applet/nmpopup.cpp (revision 1128863)
+++ applet/nmpopup.cpp (working copy)
@@ -118,6 +118,8 @@
m_leftLayout->addItem(m_networkingCheckBox);
connect(m_networkingCheckBox, SIGNAL(toggled(bool)),
this, SLOT(networkingEnabledToggled(bool)));
+ connect(Solid::Control::NetworkManager::notifier(), SIGNAL(networkingEnabledChanged(bool)),
+ this, SLOT(managerNetworkingEnabledChanged(bool)));
// flight-mode checkbox
m_rfCheckBox = new Plasma::CheckBox(m_leftWidget);
@@ -384,6 +386,12 @@
m_rfCheckBox->setEnabled(!enabled);
}
+void NMPopup::managerNetworkingEnabledChanged(bool enabled)
+{
+ kDebug() << "NM daemon changed networking enable state" << enabled;
+ m_networkingCheckBox->setChecked(Solid::Control::NetworkManager::isNetworkingEnabled());
+}
+
void NMPopup::showMore()
{
showMore(m_showMoreButton->isChecked());
Index: monolithic/knetworkmanagertrayicon.h
===================================================================
--- monolithic/knetworkmanagertrayicon.h (revision 1128863)
+++ monolithic/knetworkmanagertrayicon.h (working copy)
@@ -91,6 +91,11 @@
void networkingStatusChanged(Solid::Networking::Status);
/**
+ * Enable networking in response to user action
+ */
+ void enableNetworking(bool);
+
+ /**
* Enable wireless in response to user action
*/
void enableWireless(bool);
@@ -101,6 +106,11 @@
void wirelessEnabledChanged();
/**
+ * Update UI in response to system network management networkong state changes
+ */
+ void networkingEnabledChanged();
+
+ /**
* Starts monitoring new network interfaces' state changes
*/
void networkInterfaceAdded(const QString&);
Index: monolithic/knetworkmanagertrayicon.cpp
===================================================================
--- monolithic/knetworkmanagertrayicon.cpp (revision 1128863)
+++ monolithic/knetworkmanagertrayicon.cpp (working copy)
@@ -66,6 +66,7 @@
KNetworkManagerTrayIconPrivate()
: list(0),
iconName(QLatin1String("networkmanager")),
+ networkingEnableAction(0),
flightModeAction(0),
prefsAction(0),
copyIpAddrAction(0),
@@ -77,6 +78,7 @@
QHash<Knm::Activatable *, QWidgetAction *> actions;
QStringList deviceUnis;
QString iconName;
+ KAction * networkingEnableAction;
KAction * flightModeAction;
KAction * prefsAction;
KAction * copyIpAddrAction;
@@ -112,6 +114,13 @@
setAssociatedWidget(contextMenu());
setStatus( (!d->active || Solid::Control::NetworkManager::status() == Solid::Networking::Unknown )? PARENT_ICON_CLASS::Passive : PARENT_ICON_CLASS::Active);
+ d->networkingEnableAction = new KAction(i18nc("@action:inmenu turns off networking", "Enable networking"), this);
+ d->networkingEnableAction->setCheckable(true);
+ d->networkingEnableAction->setChecked(Solid::Control::NetworkManager::isNetworkingEnabled());
+ connect(d->networkingEnableAction, SIGNAL(toggled(bool)), this, SLOT(enableNetworking(bool)));
+ connect(Solid::Control::NetworkManager::notifier(), SIGNAL(networkingEnabledChanged(bool)),
+ this, SLOT(networkingEnabledChanged()));
+
if (types.testFlag(Solid::Control::NetworkInterface::Ieee80211)) {
d->flightModeAction = new KAction(i18nc("@action:inmenu turns off wireless networking", "Enable wireless"), this);
d->flightModeAction->setCheckable(true);
@@ -202,7 +211,7 @@
}
}
- // if not active, add a warning notice and stop
+ // if not active, add a warning notice, show Networking and Wireless check buttons and stop
if (Solid::Control::NetworkManager::status() == Solid::Networking::Unknown) {
QString passiveText = i18nc("@action:inmenu Disable action text used when the NetworkManager daemon is not running", "Network Management disabled");
QString passiveTooltip = i18nc("@info:tooltip NetworkManager is not running, this client cannot do anything", "The system Network Management service is not running");
@@ -211,6 +220,12 @@
passiveAction->setToolTip(passiveTooltip);
passiveAction->setEnabled(false);
contextMenu()->addAction(passiveAction);
+
+ // show "Enable" check buttons
+ contextMenu()->addAction(d->networkingEnableAction);
+ if (!wirelessDeviceUnis.isEmpty() /*TODO Bluetooth too */ && d->interfaceTypes.testFlag(Solid::Control::NetworkInterface::Ieee80211)) {
+ contextMenu()->addAction(d->flightModeAction);
+ }
return;
}
@@ -311,9 +326,11 @@
// add the housekeeping actions
contextMenu()->addSeparator();
+ contextMenu()->addAction(d->networkingEnableAction);
if (!wirelessDeviceUnis.isEmpty() /*TODO Bluetooth too */ && d->interfaceTypes.testFlag(Solid::Control::NetworkInterface::Ieee80211)) {
contextMenu()->addAction(d->flightModeAction);
}
+ contextMenu()->addSeparator();
contextMenu()->addAction(d->prefsAction);
}
@@ -533,6 +550,12 @@
}
}
+void KNetworkManagerTrayIcon::enableNetworking(bool enabled)
+{
+ kDebug() << enabled;
+ Solid::Control::NetworkManager::setNetworkingEnabled(enabled);
+}
+
void KNetworkManagerTrayIcon::enableWireless(bool enabled)
{
kDebug() << enabled;
@@ -550,6 +573,12 @@
}
}
+void KNetworkManagerTrayIcon::networkingEnabledChanged()
+{
+ Q_D(KNetworkManagerTrayIcon);
+ d->networkingEnableAction->setChecked(Solid::Control::NetworkManager::isNetworkingEnabled());
+}
+
void KNetworkManagerTrayIcon::setActive(bool active)
{
Q_D(KNetworkManagerTrayIcon);
diff -up kdebase-workspace-4.4.85/libs/solid/control/ifaces/networkmanager.h.kde238325 kdebase-workspace-4.4.85/libs/solid/control/ifaces/networkmanager.h
--- kdebase-workspace-4.4.85/libs/solid/control/ifaces/networkmanager.h.kde238325 2009-04-28 08:46:11.000000000 -0500
+++ kdebase-workspace-4.4.85/libs/solid/control/ifaces/networkmanager.h 2010-06-08 14:40:43.554897330 -0500
@@ -164,6 +164,11 @@ namespace Ifaces
void wirelessHardwareEnabledChanged(bool enabled);
/**
+ * This signal is emitted when the status of overall networking changed
+ */
+ void networkingEnabledChanged(bool enabled);
+
+ /**
* This signal is emitted when the set of active connections changes
*/
void activeConnectionsChanged();
diff -up kdebase-workspace-4.4.85/libs/solid/control/networkmanager.cpp.kde238325 kdebase-workspace-4.4.85/libs/solid/control/networkmanager.cpp
--- kdebase-workspace-4.4.85/libs/solid/control/networkmanager.cpp.kde238325 2009-07-17 16:44:59.000000000 -0500
+++ kdebase-workspace-4.4.85/libs/solid/control/networkmanager.cpp 2010-06-08 14:40:43.555907737 -0500
@@ -56,6 +56,8 @@ Solid::Control::NetworkManagerPrivate::N
this, SIGNAL(wirelessEnabledChanged(bool)));
connect(managerBackend(), SIGNAL(wirelessHardwareEnabledChanged(bool)),
this, SIGNAL(wirelessHardwareEnabledChanged(bool)));
+ connect(managerBackend(), SIGNAL(networkingEnabledChanged(bool)),
+ this, SIGNAL(networkingEnabledChanged(bool)));
connect(managerBackend(), SIGNAL(activeConnectionsChanged()),
this, SIGNAL(activeConnectionsChanged()));
}
diff -up kdebase-workspace-4.4.85/libs/solid/control/networkmanager.h.kde238325 kdebase-workspace-4.4.85/libs/solid/control/networkmanager.h
--- kdebase-workspace-4.4.85/libs/solid/control/networkmanager.h.kde238325 2009-04-28 08:46:11.000000000 -0500
+++ kdebase-workspace-4.4.85/libs/solid/control/networkmanager.h 2010-06-08 14:40:43.555907737 -0500
@@ -170,6 +170,10 @@ namespace Control
*/
void wirelessHardwareEnabledChanged(bool enabled);
/**
+ * This signal is emitted when the status of overall networking changed
+ */
+ void networkingEnabledChanged(bool enabled);
+ /**
* This signal is emitted when the set of active connections changes
*/
void activeConnectionsChanged();
diff -up kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager-client.xml.kde238325 kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager-client.xml
--- kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager-client.xml.kde238325 2008-05-15 13:37:15.000000000 -0500
+++ kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager-client.xml 2010-06-08 14:40:43.549905432 -0500
@@ -39,6 +39,12 @@ object. dbus-glib generates the same bo
<arg name="sleep" type="b" direction="in"/>
</method>
+ <method name="Enable">
+ <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_manager_enable"/>
+ <arg name="enable" type="b" direction="in"/>
+ </method>
+
+ <property name="NetworkingEnabled" type="b" access="read"/>
<property name="WirelessEnabled" type="b" access="readwrite"/>
<property name="WirelessHardwareEnabled" type="b" access="read"/>
<property name="ActiveConnections" type="ao" access="read"/>
diff -up kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager.xml.kde238325 kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager.xml
--- kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager.xml.kde238325 2008-05-15 13:37:15.000000000 -0500
+++ kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/introspection/nm-manager.xml 2010-06-08 14:40:43.549905432 -0500
@@ -80,7 +80,10 @@
<method name="Sleep">
<annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_manager_sleep"/>
<tp:docstring>
- Control the NetworkManager daemon's sleep state. When asleep, all interfaces that it manages are deactivated. When awake, devices are available to be activated.
+ Control the NetworkManager daemon's sleep state. When asleep, all
+ interfaces that it manages are deactivated. When awake, devices are
+ available to be activated. This command should not be called directly
+ by users or clients; it is intended for system suspend/resume tracking.
</tp:docstring>
<arg name="sleep" type="b" direction="in">
<tp:docstring>
@@ -89,6 +92,30 @@
</arg>
</method>
+ <method name="Enable">
+ <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_manager_enable"/>
+ <tp:docstring>
+ Control whether overall networking is enabled or disabled. When
+ disabled, all interfaces that NM manages are deactivated. When enabled,
+ all managed interfaces are re-enabled and available to be activated.
+ This command should be used by clients that provide to users the ability
+ to enable/disable all networking.
+ </tp:docstring>
+ <arg name="enable" type="b" direction="in">
+ <tp:docstring>
+ If FALSE, indicates that all networking should be disabled. If TRUE,
+ indicates that NetworkManager should begin managing network devices.
+ </tp:docstring>
+ </arg>
+ </method>
+
+ <property name="NetworkingEnabled" type="b" access="read">
+ <tp:docstring>
+ Indicates if overall networking is currently enabled or not. See the
+ Enable() method.
+ </tp:docstring>
+ </property>
+
<property name="WirelessEnabled" type="b" access="readwrite">
<tp:docstring>
Indicates if wireless is currently enabled or not.
diff -up kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/nm-manager-clientinterface.h.kde238325 kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/nm-manager-clientinterface.h
--- kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/nm-manager-clientinterface.h.kde238325 2009-06-17 15:06:03.000000000 -0500
+++ kdebase-workspace-4.4.85/solid/networkmanager-0.7/dbus/nm-manager-clientinterface.h 2010-06-08 14:40:43.551895445 -0500
@@ -2,7 +2,7 @@
* This file was generated by qdbusxml2cpp version 0.7
* Command line was: qdbusxml2cpp -N -m -p nm-manager-clientinterface /space/kde/sources/trunk/KDE/kdebase/workspace/solid/networkmanager-0.7/dbus/introspection/nm-manager-client.xml
*
- * qdbusxml2cpp is Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * qdbusxml2cpp is Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
*
* This is an auto-generated file.
* Do not edit! All changes made to it will be lost.
@@ -39,6 +39,10 @@ public:
inline QList<QDBusObjectPath> activeConnections() const
{ return qvariant_cast< QList<QDBusObjectPath> >(internalPropGet("ActiveConnections")); }
+ Q_PROPERTY(bool NetworkingEnabled READ networkingEnabled)
+ inline bool networkingEnabled() const
+ { return qvariant_cast< bool >(internalPropGet("NetworkingEnabled")); }
+
Q_PROPERTY(uint State READ state)
inline uint state() const
{ return qvariant_cast< uint >(internalPropGet("State")); }
@@ -68,6 +72,13 @@ public Q_SLOTS: // METHODS
return asyncCallWithArgumentList(QLatin1String("DeactivateConnection"), argumentList);
}
+ inline QDBusPendingReply<> Enable(bool enable)
+ {
+ QList<QVariant> argumentList;
+ argumentList << qVariantFromValue(enable);
+ return asyncCallWithArgumentList(QLatin1String("Enable"), argumentList);
+ }
+
inline QDBusPendingReply<QList<QDBusObjectPath> > GetDevices()
{
QList<QVariant> argumentList;
diff -up kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager.cpp.kde238325 kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager.cpp
--- kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager.cpp.kde238325 2010-02-09 08:30:15.000000000 -0600
+++ kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager.cpp 2010-06-08 14:40:43.552905013 -0500
@@ -49,6 +49,14 @@ NMNetworkManager::NMNetworkManager(QObje
d->nmState = d->iface.state();
d->isWirelessHardwareEnabled = d->iface.wirelessHardwareEnabled();
d->isWirelessEnabled = d->iface.wirelessEnabled();
+ QVariant netEnabled = d->iface.property("NetworkingEnabled");
+ if (!netEnabled.isNull()) {
+ d->isNetworkingEnabled = netEnabled.toBool();
+ d->NetworkingEnabledPropertyAvailable = true;
+ } else {
+ d->isNetworkingEnabled = !(NM_STATE_UNKNOWN == d->nmState || NM_STATE_ASLEEP == d->nmState);
+ d->NetworkingEnabledPropertyAvailable = false;
+ }
connect( &d->iface, SIGNAL(DeviceAdded(const QDBusObjectPath &)),
this, SLOT(deviceAdded(const QDBusObjectPath &)));
connect( &d->iface, SIGNAL(DeviceRemoved(const QDBusObjectPath &)),
@@ -138,7 +146,7 @@ QObject *NMNetworkManager::createNetwork
bool NMNetworkManager::isNetworkingEnabled() const
{
Q_D(const NMNetworkManager);
- return !(NM_STATE_UNKNOWN == d->nmState || NM_STATE_ASLEEP == d->nmState);
+ return d->isNetworkingEnabled;
}
bool NMNetworkManager::isWirelessEnabled() const
@@ -182,7 +190,14 @@ void NMNetworkManager::deactivateConnect
void NMNetworkManager::setNetworkingEnabled(bool enabled)
{
Q_D(NMNetworkManager);
- d->iface.Sleep(!enabled);
+
+ QDBusPendingReply<> reply = d->iface.Enable(enabled);
+ reply.waitForFinished();
+ if (reply.isError()) {
+ kDebug(1441) << "Enable() D-Bus method not available:" << reply.error();
+ kDebug(1441) << "Calling Sleep() instead";
+ d->iface.Sleep(!enabled);
+ }
}
void NMNetworkManager::setWirelessEnabled(bool enabled)
@@ -211,9 +226,19 @@ void NMNetworkManager::stateChanged(uint
{
Q_D(NMNetworkManager);
if ( d->nmState != state ) {
+
+ // When "NetworkingEnabled" property is not available, set isNetworkingEnabled flag and emit signal here.
+ // It has to be done before emitting statusChanged(), else it would cause infinite status switching.
+ if (!d->NetworkingEnabledPropertyAvailable) {
+ d->isNetworkingEnabled = !(NM_STATE_UNKNOWN == state || NM_STATE_ASLEEP == state);
+ emit networkingEnabledChanged(d->isNetworkingEnabled);
+ }
+
+ // set new state
d->nmState = state;
emit statusChanged( convertNMState( state ) );
}
+
}
void NMNetworkManager::propertiesChanged(const QVariantMap &properties)
@@ -221,6 +246,7 @@ void NMNetworkManager::propertiesChanged
Q_D(NMNetworkManager);
kDebug(1441) << properties.keys();
QLatin1String activeConnKey("ActiveConnections");
+ QLatin1String netEnabledKey("NetworkingEnabled");
QLatin1String wifiHwKey("WirelessHardwareEnabled");
QLatin1String wifiEnabledKey("WirelessEnabled");
QVariantMap::const_iterator it = properties.find(activeConnKey);
@@ -248,6 +274,12 @@ void NMNetworkManager::propertiesChanged
kDebug(1441) << wifiEnabledKey << d->isWirelessEnabled;
emit wirelessEnabledChanged(d->isWirelessEnabled);
}
+ it = properties.find(netEnabledKey);
+ if ( it != properties.end()) {
+ d->isNetworkingEnabled = it->toBool();
+ kDebug(1441) << netEnabledKey << d->isNetworkingEnabled;
+ emit networkingEnabledChanged(d->isNetworkingEnabled);
+ }
}
Solid::Networking::Status NMNetworkManager::convertNMState(uint state)
diff -up kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager_p.h.kde238325 kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager_p.h
--- kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager_p.h.kde238325 2008-06-10 06:41:03.000000000 -0500
+++ kdebase-workspace-4.4.85/solid/networkmanager-0.7/manager_p.h 2010-06-08 14:40:43.552905013 -0500
@@ -35,6 +35,8 @@ public:
uint nmState;
bool isWirelessEnabled;
bool isWirelessHardwareEnabled;
+ bool isNetworkingEnabled;
+ bool NetworkingEnabledPropertyAvailable;
QStringList networkInterfaces;
QStringList activeConnections;
};
_______________________________________________
kde-networkmanager mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/kde-networkmanager