diff -urN synapse-0.2.10.orig/src/plugins/Makefile.am synapse-0.2.10/src/plugins/Makefile.am --- synapse-0.2.10.orig/src/plugins/Makefile.am 2013-08-18 18:33:35.710536590 +0200 +++ synapse-0.2.10/src/plugins/Makefile.am 2013-08-18 18:33:44.427203171 +0200 @@ -45,6 +45,7 @@ hybrid-search-plugin.vala \ launchpad-plugin.vala \ locate-plugin.vala \ + mate-session-plugin.vala \ opensearch.vala \ pass-plugin.vala \ pastebin-plugin.vala \ diff -urN synapse-0.2.10.orig/src/plugins/mate-session-plugin.vala synapse-0.2.10/src/plugins/mate-session-plugin.vala --- synapse-0.2.10.orig/src/plugins/mate-session-plugin.vala 1970-01-01 01:00:00.000000000 +0100 +++ synapse-0.2.10/src/plugins/mate-session-plugin.vala 2013-08-18 18:33:44.427203171 +0200 @@ -0,0 +1,196 @@ +/* + * Copyright (C) 2010 Michal Hruby + * + * This program 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 2 of the License, or + * (at your option) any later version. + * + * 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, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Authored by Michal Hruby + * + */ + +namespace Synapse +{ + [DBus (name = "org.mate.SessionManager")] + public interface MateSessionManager: Object + { + public const string UNIQUE_NAME = "org.mate.SessionManager"; + public const string OBJECT_PATH = "/org/mate/SessionManager"; + + public abstract bool can_shutdown () throws IOError; + public abstract void shutdown () throws IOError; + public abstract void request_reboot () throws IOError; + public abstract void logout (uint32 mode = 0) throws IOError; + } + + public class MateSessionPlugin: Object, Activatable, ItemProvider + { + public bool enabled { get; set; default = true; } + + public void activate () + { + + } + + public void deactivate () + { + + } + + private class ShutDownAction: ActionMatch + { + public ShutDownAction () + { + Object (title: _("Shut Down"), + description: _("Turn your computer off"), + icon_name: "system-shutdown", has_thumbnail: false); + } + + public override void do_action () + { + try + { + MateSessionManager dbus_interface = Bus.get_proxy_sync (BusType.SESSION, + MateSessionManager.UNIQUE_NAME, + MateSessionManager.OBJECT_PATH); + + dbus_interface.shutdown (); + } + catch (IOError err) + { + warning ("%s", err.message); + } + } + } + + private class RebootAction: ActionMatch + { + public RebootAction () + { + Object (title: _("Restart"), + description: _("Restart your computer"), + icon_name: "system-shutdown", has_thumbnail: false); + } + + public override void do_action () + { + try + { + MateSessionManager dbus_interface = Bus.get_proxy_sync (BusType.SESSION, + MateSessionManager.UNIQUE_NAME, + MateSessionManager.OBJECT_PATH); + + dbus_interface.request_reboot (); + } + catch (IOError err) + { + warning ("%s", err.message); + } + } + } + + private class LogOutAction: ActionMatch + { + public LogOutAction () + { + Object (title: _("Log Out"), + description: _("Close your session and return to the login screen"), + icon_name: "gnome-logout", has_thumbnail: false); + } + + public override void do_action () + { + try + { + MateSessionManager dbus_interface = Bus.get_proxy_sync (BusType.SESSION, + MateSessionManager.UNIQUE_NAME, + MateSessionManager.OBJECT_PATH); + + /* + * 0: Normal. + * 1: No confirmation inferface should be shown. + * 2: Forcefully logout. No confirmation will be shown and any inhibitors will be ignored. + */ + dbus_interface.logout (1); + } + catch (IOError err) + { + warning ("%s", err.message); + } + } + } + + static void register_plugin () + { + PluginRegistry.get_default ().register_plugin ( + typeof (MateSessionPlugin), + "MATE Session", + _ ("Log out from your session."), + "mate-session-logout", + register_plugin, + DBusService.get_default ().name_has_owner (MateSessionManager.UNIQUE_NAME), + _ ("MATE Session Manager wasn't found") + ); + } + + static construct + { + register_plugin (); + } + + private bool session_manager_available = false; + private Gee.List actions; + + construct + { + var cache = DBusService.get_default (); + session_manager_available = cache.name_has_owner (MateSessionManager.UNIQUE_NAME); + message ("%s %s available", MateSessionManager.UNIQUE_NAME, + session_manager_available ? "is" : "isn't"); + + actions = new Gee.LinkedList (); + actions.add (new LogOutAction ()); + // TODO: add a config option to enable these actions (for example when ConsoleKit is not available) + //actions.add (new RebootAction ()); + //actions.add (new ShutDownAction ()); + } + + public async ResultSet? search (Query q) throws SearchError + { + if (!session_manager_available) return null; + // we only search for actions + if (!(QueryFlags.ACTIONS in q.query_type)) return null; + + var result = new ResultSet (); + + var matchers = Query.get_matchers_for_query (q.query_string, 0, + RegexCompileFlags.OPTIMIZE | RegexCompileFlags.CASELESS); + + foreach (var action in actions) + { + foreach (var matcher in matchers) + { + if (matcher.key.match (action.title)) + { + result.add (action, matcher.value - MatchScore.INCREMENT_SMALL); + break; + } + } + } + + q.check_cancellable (); + + return result; + } + } +} diff -urN synapse-0.2.10.orig/src/ui/synapse-main.vala synapse-0.2.10/src/ui/synapse-main.vala --- synapse-0.2.10.orig/src/ui/synapse-main.vala 2013-08-18 18:33:35.710536590 +0200 +++ synapse-0.2.10/src/ui/synapse-main.vala 2013-08-18 18:33:44.427203171 +0200 @@ -165,6 +165,7 @@ typeof (HybridSearchPlugin), typeof (GnomeBookmarksPlugin), typeof (GnomeSessionPlugin), + typeof (MateSessionPlugin), typeof (ScreenSaverPlugin), typeof (SystemManagementPlugin), typeof (CommandPlugin),