/* * Copyright © 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * * Authored by: Pete Woods */ #include #include #include using namespace std; namespace util = lomiri::util; namespace lomiri { namespace gmenuharness { void waitForCore (GObject * obj, const string& signalName, unsigned int timeout) { shared_ptr loop(g_main_loop_new(nullptr, false), &g_main_loop_unref); /* Our two exit criteria */ util::ResourcePtr> signal( g_signal_connect_swapped(obj, signalName.c_str(), G_CALLBACK(g_main_loop_quit), loop.get()), [obj](gulong s) { g_signal_handler_disconnect(obj, s); }); util::ResourcePtr> timer(g_timeout_add(timeout, [](gpointer user_data) -> gboolean { g_main_loop_quit((GMainLoop *)user_data); return G_SOURCE_CONTINUE; }, loop.get()), &g_source_remove); /* Wait for sync */ g_main_loop_run(loop.get()); } void menuWaitForItems(const shared_ptr& menu, unsigned int timeout) { waitForCore(G_OBJECT(menu.get()), "items-changed", timeout); } void g_object_deleter(gpointer object) { g_clear_object(&object); } void gvariant_deleter(GVariant* varptr) { if (varptr != nullptr) { g_variant_unref(varptr); } } } // namespace gmenuharness } // namespace lomiri