summaryrefslogtreecommitdiff
path: root/UnityCore
diff options
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2015-10-02 14:02:05 +0000
committerCI Train Bot <ci-train-bot@canonical.com>2015-10-02 14:02:05 +0000
commit9304ca7b15387572a39cc91542e3cc64fc851a19 (patch)
treef9792a40f98f6d6b7542f06d5ccf71a17afa72a5 /UnityCore
parentb8f8a52649fca093b357278a7b61ebcc99385e4a (diff)
parent9239a7575eec66b6750565550e2171b815abd4be (diff)
GnomeKeyGrabber: Don't allow an action to be grabbed multiple times
And always return the same action id for a specific key binding. Fixes: #1459571 Approved by: Andrea Azzarone (bzr r4018)
Diffstat (limited to 'UnityCore')
-rw-r--r--UnityCore/CMakeLists.txt2
-rw-r--r--UnityCore/GLibDBusNameWatcher.cpp44
-rw-r--r--UnityCore/GLibDBusNameWatcher.h54
-rw-r--r--UnityCore/GLibDBusProxy.cpp10
-rw-r--r--UnityCore/GLibDBusServer.cpp43
-rw-r--r--UnityCore/GLibDBusServer.h12
6 files changed, 141 insertions, 24 deletions
diff --git a/UnityCore/CMakeLists.txt b/UnityCore/CMakeLists.txt
index 92191c0d5..f055790d3 100644
--- a/UnityCore/CMakeLists.txt
+++ b/UnityCore/CMakeLists.txt
@@ -25,6 +25,7 @@ set (CORE_HEADERS
Filter.h
Filters.h
GenericPreview.h
+ GLibDBusNameWatcher.h
GLibDBusProxy.h
GLibDBusServer.h
GLibSignal.h
@@ -80,6 +81,7 @@ set (CORE_SOURCES
Filter.cpp
Filters.cpp
GenericPreview.cpp
+ GLibDBusNameWatcher.cpp
GLibDBusProxy.cpp
GLibDBusServer.cpp
GLibSignal.cpp
diff --git a/UnityCore/GLibDBusNameWatcher.cpp b/UnityCore/GLibDBusNameWatcher.cpp
new file mode 100644
index 000000000..92f311210
--- /dev/null
+++ b/UnityCore/GLibDBusNameWatcher.cpp
@@ -0,0 +1,44 @@
+// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
+/*
+ * Copyright (C) 2015 Canonical Ltd
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authored by: Marco Trevisan (Treviño) <marco.trevisan@canonical.com>
+ */
+
+#include "GLibDBusNameWatcher.h"
+#include "GLibWrapper.h"
+
+namespace unity
+{
+namespace glib
+{
+
+DBusNameWatcher::DBusNameWatcher(std::string const& name, GBusType bus_type, GBusNameWatcherFlags flags)
+ : watcher_id_(g_bus_watch_name(bus_type, name.c_str(), flags,
+ [] (GDBusConnection *connection, const gchar *name, const gchar *name_owner, gpointer self) {
+ static_cast<DBusNameWatcher*>(self)->appeared.emit(gchar_to_string(name), gchar_to_string(name_owner));
+ },
+ [] (GDBusConnection *connection, const gchar *name, gpointer self) {
+ static_cast<DBusNameWatcher*>(self)->vanished.emit(gchar_to_string(name));
+ }, this, nullptr))
+{}
+
+DBusNameWatcher::~DBusNameWatcher()
+{
+ g_bus_unwatch_name(watcher_id_);
+}
+
+} // namespace glib
+} // namespace unity
diff --git a/UnityCore/GLibDBusNameWatcher.h b/UnityCore/GLibDBusNameWatcher.h
new file mode 100644
index 000000000..b5901d3d4
--- /dev/null
+++ b/UnityCore/GLibDBusNameWatcher.h
@@ -0,0 +1,54 @@
+// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
+/*
+ * Copyright (C) 2015 Canonical Ltd
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authored by: Marco Trevisan (Treviño) <marco.trevisan@canonical.com>
+ */
+
+#ifndef UNITY_GLIB_DBUS_NAME_WATCHER_H
+#define UNITY_GLIB_DBUS_NAME_WATCHER_H
+
+#include <gio/gio.h>
+#include <memory>
+#include <sigc++/signal.h>
+
+namespace unity
+{
+namespace glib
+{
+
+class DBusNameWatcher
+{
+public:
+ typedef std::shared_ptr<DBusNameWatcher> Ptr;
+
+ DBusNameWatcher(std::string const& name, GBusType bus_type = G_BUS_TYPE_SESSION, GBusNameWatcherFlags flags = G_BUS_NAME_WATCHER_FLAGS_NONE);
+ virtual ~DBusNameWatcher();
+
+ sigc::signal<void, std::string const& /* name*/, std::string const& /* name owner*/> appeared;
+ sigc::signal<void, std::string const& /* name */> vanished;
+
+private:
+ // not copyable class
+ DBusNameWatcher(DBusNameWatcher const&) = delete;
+ DBusNameWatcher& operator=(DBusNameWatcher const&) = delete;
+
+ uint32_t watcher_id_;
+};
+
+} // namespace glib
+} // namespace unity
+
+#endif //UNITY_GLIB_DBUS_NAME_WATCHER_H
diff --git a/UnityCore/GLibDBusProxy.cpp b/UnityCore/GLibDBusProxy.cpp
index fabef7d48..1cd6f4d3d 100644
--- a/UnityCore/GLibDBusProxy.cpp
+++ b/UnityCore/GLibDBusProxy.cpp
@@ -344,7 +344,8 @@ void DBusProxy::Impl::WaitForProxy(GCancellable* cancellable,
// wait for the signal
*con = proxy_acquired.connect([con, canc, timeout, callback] ()
{
- if (!g_cancellable_is_cancelled(canc)) callback(glib::Error());
+ if (!g_cancellable_is_cancelled(canc))
+ callback(glib::Error());
timeout->Remove();
con->disconnect();
@@ -390,12 +391,15 @@ void DBusProxy::Impl::Call(string const& method_name,
if (!proxy_)
{
glib::Variant sinked_parameters(parameters);
- glib::Object<GCancellable>canc(target_canc, glib::AddRef());
+ glib::Object<GCancellable> canc(target_canc, glib::AddRef());
+
WaitForProxy(canc, timeout_msec, [this, method_name, sinked_parameters, callback, canc, flags, timeout_msec] (glib::Error const& err)
{
if (err)
{
- callback(glib::Variant(), err);
+ if (callback)
+ callback(glib::Variant(), err);
+
LOG_WARNING(logger) << "Cannot call method " << method_name
<< ": " << err;
}
diff --git a/UnityCore/GLibDBusServer.cpp b/UnityCore/GLibDBusServer.cpp
index 6d01f5994..49b70d7c0 100644
--- a/UnityCore/GLibDBusServer.cpp
+++ b/UnityCore/GLibDBusServer.cpp
@@ -87,7 +87,7 @@ struct DBusObject::Impl
if (self->method_cb_)
{
- ret = self->method_cb_(method_name ? method_name : "", parameters);
+ ret = self->method_cb_(gchar_to_string(method_name), parameters, gchar_to_string(sender), gchar_to_string(object_path));
LOG_INFO(logger_o) << "Called method: '" << method_name << " " << parameters
<< "' on object '" << object_path << "' with interface '"
@@ -295,13 +295,14 @@ struct DBusObject::Impl
void EmitGenericSignal(glib::Object<GDBusConnection> const& conn, std::string const& path,
std::string const& interface, std::string const& signal,
- GVariant* parameters = nullptr)
+ GVariant* parameters = nullptr, std::string const& dest = "")
{
LOG_INFO(logger_o) << "Emitting signal '" << signal << "'" << " for the interface "
<< "'" << interface << "' on object path '" << path << "'";
glib::Error error;
- g_dbus_connection_emit_signal(conn, nullptr, path.c_str(), interface.c_str(),
+ g_dbus_connection_emit_signal(conn, dest.empty() ? nullptr : dest.c_str(),
+ path.c_str(), interface.c_str(),
signal.c_str(), parameters, &error);
if (error)
@@ -312,7 +313,7 @@ struct DBusObject::Impl
}
}
- void EmitSignal(std::string const& signal, GVariant* parameters, std::string const& path)
+ void EmitSignal(std::string const& signal, GVariant* parameters, std::string const& dest, std::string const& path)
{
glib::Variant reffed_params(parameters);
@@ -333,7 +334,7 @@ struct DBusObject::Impl
return;
}
- EmitGenericSignal(conn_it->second, path, InterfaceName(), signal, parameters);
+ EmitGenericSignal(conn_it->second, path, InterfaceName(), signal, parameters, dest);
}
else
{
@@ -343,7 +344,7 @@ struct DBusObject::Impl
auto const& obj_path = pair.first;
auto const& conn = pair.second;
- EmitGenericSignal(conn, obj_path, InterfaceName(), signal, params);
+ EmitGenericSignal(conn, obj_path, InterfaceName(), signal, params, dest);
}
}
}
@@ -401,7 +402,7 @@ struct DBusObject::Impl
}
DBusObject* object_;
- MethodCallback method_cb_;
+ MethodCallbackFull method_cb_;
PropertyGetterCallback property_get_cb_;
PropertySetterCallback property_set_cb_;
@@ -420,6 +421,18 @@ DBusObject::~DBusObject()
void DBusObject::SetMethodsCallsHandler(MethodCallback const& func)
{
+ impl_->method_cb_ = nullptr;
+
+ if (func)
+ {
+ impl_->method_cb_ = [func] (std::string const& method, GVariant* parameters, std::string const&, std::string const&) {
+ return func(method, parameters);
+ };
+ }
+}
+
+void DBusObject::SetMethodsCallsHandlerFull(MethodCallbackFull const& func)
+{
impl_->method_cb_ = func;
}
@@ -448,9 +461,9 @@ void DBusObject::UnRegister(std::string const& path)
impl_->UnRegister(path);
}
-void DBusObject::EmitSignal(std::string const& signal, GVariant* parameters, std::string const& path)
+void DBusObject::EmitSignal(std::string const& signal, GVariant* parameters, std::string const& dest, std::string const& path)
{
- impl_->EmitSignal(signal, parameters, path);
+ impl_->EmitSignal(signal, parameters, dest, path);
}
void DBusObject::EmitPropertyChanged(std::string const& property, std::string const& path)
@@ -648,12 +661,10 @@ struct DBusServer::Impl
return DBusObject::Ptr();
}
- void EmitSignal(std::string const& interface, std::string const& signal, GVariant* parameters)
+ void EmitSignal(std::string const& interface, std::string const& signal, GVariant* parameters, std::string const& dest)
{
- auto const& obj = GetObject(interface);
-
- if (obj)
- obj->EmitSignal(signal, parameters);
+ if (DBusObject::Ptr const& obj = GetObject(interface))
+ obj->EmitSignal(signal, parameters, dest);
}
DBusServer* server_;
@@ -735,9 +746,9 @@ DBusObject::Ptr DBusServer::GetObject(std::string const& interface) const
return impl_->GetObject(interface);
}
-void DBusServer::EmitSignal(std::string const& interface, std::string const& signal, GVariant* parameters)
+void DBusServer::EmitSignal(std::string const& interface, std::string const& signal, GVariant* parameters, std::string const& dest)
{
- impl_->EmitSignal(interface, signal, parameters);
+ impl_->EmitSignal(interface, signal, parameters, dest);
}
} // namespace glib
diff --git a/UnityCore/GLibDBusServer.h b/UnityCore/GLibDBusServer.h
index 8957861be..b064c4360 100644
--- a/UnityCore/GLibDBusServer.h
+++ b/UnityCore/GLibDBusServer.h
@@ -40,11 +40,13 @@ public:
DBusObject(std::string const& introspection_xml, std::string const& interface_name);
virtual ~DBusObject();
- typedef std::function<GVariant*(std::string const&, GVariant*)> MethodCallback;
- typedef std::function<GVariant*(std::string const&)> PropertyGetterCallback;
- typedef std::function<bool(std::string const&, GVariant*)> PropertySetterCallback;
+ typedef std::function<GVariant*(std::string const& /*method*/, GVariant* /*parameters*/)> MethodCallback;
+ typedef std::function<GVariant*(std::string const& /*method*/, GVariant* /*parameters*/, std::string const& /*sender*/, std::string const& /*object_path*/)> MethodCallbackFull;
+ typedef std::function<GVariant*(std::string const& /*name*/)> PropertyGetterCallback;
+ typedef std::function<bool(std::string const& /*name*/, GVariant* /*value*/)> PropertySetterCallback;
void SetMethodsCallsHandler(MethodCallback const&);
+ void SetMethodsCallsHandlerFull(MethodCallbackFull const&);
void SetPropertyGetter(PropertyGetterCallback const&);
void SetPropertySetter(PropertySetterCallback const&);
@@ -53,7 +55,7 @@ public:
bool Register(glib::Object<GDBusConnection> const&, std::string const& path);
void UnRegister(std::string const& path = "");
- void EmitSignal(std::string const& signal, GVariant* parameters = nullptr, std::string const& path = "");
+ void EmitSignal(std::string const& signal, GVariant* parameters = nullptr, std::string const& dest = "", std::string const& path = "");
void EmitPropertyChanged(std::string const& property, std::string const& path = "");
sigc::signal<void, std::string const&> registered;
@@ -91,7 +93,7 @@ public:
std::list<DBusObject::Ptr> GetObjects() const;
DBusObject::Ptr GetObject(std::string const& interface) const;
- void EmitSignal(std::string const& interface, std::string const& signal, GVariant* parameters = nullptr);
+ void EmitSignal(std::string const& interface, std::string const& signal, GVariant* parameters = nullptr, std::string const& dest = "");
bool IsConnected() const;
std::string const& Name() const;