/* * Copyright (C) 2011 Canonical, Ltd. * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License * version 3.0 as published by the Free Software Foundation. * * This library 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 version 3.0 for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . * * Authored by Mikkel Kamstrup Erlandsen * */ /* * IMPLEMENTATION NOTE: * We want the generated C API to be nice and not too Vala-ish. We must * anticipate that libunity consumers will be written in both Vala , C, * and through GObject Introspection * */ using GLib; namespace Unity { /** * The Unity.Inspector is a singleton that can be used to inspect the * state of Unity. * * One of the most basic and most useful applications of the inspector * is to check if Unity is running or not. * */ public class Inspector : Object { /** * Boolean property determining whether Unity is running or not. You * can use this property to determine whether Unity is running or not. */ public bool unity_running { get { return _unity_running; } } private bool _unity_running = false; /** * Property holding the unique DBus name of the Unity process if * Unity is running, or null otherwise. */ public string? unity_bus_name { get { return _unity_bus_name; } } private string? _unity_bus_name = null; private DBusConnection bus; private uint unity_watcher; private static Inspector? singleton = null; /** * Get the default singleton Unity.Inspector instance, creating it * dynamically if necessary. * * @return The singleton Unity.Inspector. If calling from C do not * free this instance. * */ public static unowned Inspector get_default () { if (singleton == null) singleton = new Inspector (); return singleton; } /* Constructor is private to bar 3rd parties from creating instances */ private Inspector () { try { bus = Bus.get_sync (BusType.SESSION); unity_watcher = Bus.watch_name_on_connection (bus, "com.canonical.Unity", BusNameWatcherFlags.NONE, on_unity_appeared, on_unity_vanished); var is_running = bus.call_sync ("org.freedesktop.DBus", "/org/freedesktop/dbus", "org.freedesktop.DBus", "NameHasOwner", new Variant ("(s)", "com.canonical.Unity"), new VariantType ("(b)"), DBusCallFlags.NONE, -1); is_running.get ("(b)", out _unity_running); } catch (Error e) { critical ("Unable to connect to session bus: %s", e.message); } } private void on_unity_appeared (DBusConnection conn, string name, string name_owner) { if (name != "com.canonical.Unity") { critical ("Internal error in libunity: Got name owner notification " + "from '%s'. Expected 'com.canonical.Unity'", name); return; } _unity_running = true; _unity_bus_name = name_owner; notify_property ("unity-running"); notify_property ("unity-bus-name"); } private void on_unity_vanished (DBusConnection conn, string name) { _unity_running = false; _unity_bus_name = null; notify_property ("unity-running"); notify_property ("unity-bus-name"); } } /* class Unity.Inspector */ } /* namespace */