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 \ pastebin-plugin.vala \ pidgin-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 (DesktopFilePlugin), typeof (HybridSearchPlugin), typeof (GnomeSessionPlugin), + typeof (MateSessionPlugin), typeof (GnomeScreenSaverPlugin), typeof (SystemManagementPlugin), typeof (CommandPlugin), diff -urN synapse-0.2.99.orig/src/plugins/Makefile.am synapse-0.2.99/src/plugins/Makefile.am --- synapse-0.2.99.orig/src/plugins/Makefile.am 2014-12-02 21:09:40.877899345 +0100 +++ synapse-0.2.99/src/plugins/Makefile.am 2014-12-02 21:13:38.577901026 +0100 @@ -44,6 +44,7 @@ gnome-bookmarks-plugin.vala \ gnome-session-plugin.vala \ gnome-screensaver-plugin.vala \ + mate-screensaver-plugin.vala \ hello-world-plugin.vala \ hybrid-search-plugin.vala \ launchpad-plugin.vala \ diff -urN synapse-0.2.99.orig/src/plugins/mate-screensaver-plugin.vala synapse-0.2.99/src/plugins/mate-screensaver-plugin.vala --- synapse-0.2.99.orig/src/plugins/mate-screensaver-plugin.vala 1970-01-01 01:00:00.000000000 +0100 +++ synapse-0.2.99/src/plugins/mate-screensaver-plugin.vala 2014-12-02 21:12:56.697900730 +0100 @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2010 Igor S. Mandrigin + * + * 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. + * + * Based on plugins code by Michal Hruby + * + */ + +namespace Synapse +{ + [DBus (name = "org.mate.ScreenSaver")] + public interface MateScreenSaver : Object + { + public const string UNIQUE_NAME = "org.mate.ScreenSaver"; + public const string OBJECT_PATH = "/org/mate/ScreenSaver"; + + public abstract async void lock () throws IOError; + } + + public class MateScreenSaverPlugin : Object, Activatable, ItemProvider + { + public bool enabled { get; set; default = true; } + + public void activate () + { + + } + + public void deactivate () + { + + } + + private class LockScreenAction : ActionMatch + { + public LockScreenAction () + { + Object (title: _("Lock Screen"), + description: _("Locks screen and starts screensaver."), + icon_name: "system-lock-screen", has_thumbnail: false); + } + + public override void do_action () + { + MateScreenSaverPlugin.lock_screen (); + } + } + + public static void lock_screen () + { + try { + MateScreenSaver dbus_interface = Bus.get_proxy_sync (BusType.SESSION, + MateScreenSaver.UNIQUE_NAME, + MateScreenSaver.OBJECT_PATH); + // we need the async variant cause Screensaver doesn't send the reply + dbus_interface.lock.begin (); + } catch (IOError err) { + warning ("%s", err.message); + } + } + + static void register_plugin () + { + PluginRegistry.get_default ().register_plugin ( + typeof (MateScreenSaverPlugin), + "Mate screensaver plugin", + _("Lock screen of your computer."), + "system-lock-screen", + register_plugin, + DBusService.get_default ().name_is_activatable (MateScreenSaver.UNIQUE_NAME), + _("Mate Screen Saver wasn't found") + ); + } + + static construct + { + register_plugin (); + } + + private Gee.List actions; + + construct + { + actions = new Gee.LinkedList (); + actions.add (new LockScreenAction ()); + } + + public async ResultSet? search (Query q) throws SearchError + { + // 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.99.orig/src/ui/synapse-main.vala synapse-0.2.99/src/ui/synapse-main.vala --- synapse-0.2.99.orig/src/ui/synapse-main.vala 2014-12-02 21:09:40.881232678 +0100 +++ synapse-0.2.99/src/ui/synapse-main.vala 2014-12-02 21:13:26.064567604 +0100 @@ -166,6 +166,7 @@ typeof (GnomeSessionPlugin), typeof (MateSessionPlugin), typeof (GnomeScreenSaverPlugin), + typeof (MateScreenSaverPlugin), typeof (SystemManagementPlugin), typeof (CommandPlugin), typeof (RhythmboxActions),