From 32feb69b35293c34ef5a9e1889b0e706d4eed525 Mon Sep 17 00:00:00 2001 From: Sascha Silbe Date: Fri, 29 Jul 2011 20:50:37 +0000 Subject: WIP: Use upstream gnome-session instead the copy shipped by sugar-toolkit sugar-toolkit ships an outdated copy of gnome-session. By using the upstream version instead we can benefit from work done by the GNOME developers, e.g. automatic start of accessibility helpers (and obviously bug fixes). This adds a dependency on gnome-session >= 2.91.4. --- diff --git a/bin/sugar-session b/bin/sugar-session index 40c9db7..b467c26 100755 --- a/bin/sugar-session +++ b/bin/sugar-session @@ -80,12 +80,6 @@ def start_ui_service(): ui_service = UIService() -def start_session_manager(): - from jarabe.model.session import get_session_manager - - session_manager = get_session_manager() - session_manager.start() - def unfreeze_dcon_cb(): logging.debug('STARTUP: unfreeze_dcon_cb') from jarabe.model import screen @@ -252,7 +246,6 @@ def main(): intro.check_profile() start_ui_service() - start_session_manager() sound.restore() diff --git a/bin/sugar.in b/bin/sugar.in index 12098db..9a79527 100644 --- a/bin/sugar.in +++ b/bin/sugar.in @@ -77,6 +77,4 @@ if [ -f ~/.sugar/debug ]; then fi echo Xcursor.theme: sugar | xrdb -merge -metacity --no-force-fullscreen -d $DISPLAY & - -exec sugar-session +exec gnome-session --session=sugar diff --git a/data/Makefile.am b/data/Makefile.am index 6a62d23..eb2f8cc 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -23,8 +23,12 @@ GTKRC_FILES = \ xsessionsdir = $(datadir)/xsessions xsessions_DATA = sugar.desktop +gnomesessiondir = $(datadir)/gnome-session/sessions +gnomesession_DATA = sugar.session + applicationsdir = $(datadir)/applications -applications_DATA = sugar-emulator.desktop +applications_DATA = sugar-emulator.desktop sugar-session.desktop \ + metacity-sugar.desktop mime_xml_in_files = sugar.xml.in mime_xml_files = $(mime_xml_in_files:.xml.in=.xml) diff --git a/data/metacity-sugar.desktop b/data/metacity-sugar.desktop new file mode 100644 index 0000000..d3b23f9 --- /dev/null +++ b/data/metacity-sugar.desktop @@ -0,0 +1,5 @@ +[Desktop Entry] +Name=Metacity for Sugar +Exec=metacity --no-force-fullscreen +Type=Application +NoDisplay=true diff --git a/data/sugar-session.desktop b/data/sugar-session.desktop new file mode 100644 index 0000000..57bf30e --- /dev/null +++ b/data/sugar-session.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Name=Sugar session +Comment=A combination of all core parts of the Sugar desktop: Neighbourhood, Group View, Home View, Journal and the Frame. +Exec=sugar-session +Type=Application +NoDisplay=true diff --git a/data/sugar.session b/data/sugar.session new file mode 100644 index 0000000..5b163e8 --- /dev/null +++ b/data/sugar.session @@ -0,0 +1,5 @@ +[GNOME Session] +Name=Sugar +RequiredComponents=sugar-session; +RequiredProviders=windowmanager; +DefaultProvider-windowmanager=metacity-sugar diff --git a/src/jarabe/controlpanel/gui.py b/src/jarabe/controlpanel/gui.py index 46810aa..85ea6bb 100644 --- a/src/jarabe/controlpanel/gui.py +++ b/src/jarabe/controlpanel/gui.py @@ -25,7 +25,7 @@ from sugar.graphics.icon import Icon from sugar.graphics import style from sugar.graphics.alert import Alert -from jarabe.model.session import get_session_manager +from jarabe.model import session from jarabe.controlpanel.toolbar import MainToolbar from jarabe.controlpanel.toolbar import SectionToolbar from jarabe import config @@ -330,8 +330,7 @@ class ControlPanel(gtk.Window): self._section_view.restart_alerts self._show_main_view() elif response_id is gtk.RESPONSE_APPLY: - session_manager = get_session_manager() - session_manager.logout() + session.logout() def __select_option_cb(self, button, event, option): self.show_section_view(option) diff --git a/src/jarabe/model/session.py b/src/jarabe/model/session.py index 9b277ff..bab155c 100644 --- a/src/jarabe/model/session.py +++ b/src/jarabe/model/session.py @@ -1,5 +1,3 @@ -# Copyright (C) 2008, Red Hat, Inc. -# # 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 @@ -21,72 +19,39 @@ import signal import sys import logging -from sugar import session from sugar import env -_session_manager = None - - -class SessionManager(session.SessionManager): - MODE_LOGOUT = 0 - MODE_SHUTDOWN = 1 - MODE_REBOOT = 2 - - def __init__(self): - session.SessionManager.__init__(self) - self._logout_mode = None - - def logout(self): - self._logout_mode = self.MODE_LOGOUT - self.initiate_shutdown() - - def shutdown(self): - self._logout_mode = self.MODE_SHUTDOWN - self.initiate_shutdown() +GNOME_SESSION_DBUS_SERVICE = 'org.gnome.SessionManager' +GNOME_SESSION_DBUS_INTERFACE = 'org.gnome.SessionManager' +GNOME_SESSION_DBUS_PATH = '/org/gnome/SessionManager' - def reboot(self): - self._logout_mode = self.MODE_REBOOT - self.initiate_shutdown() - def shutdown_completed(self): - if env.is_emulator(): - self._close_emulator() - elif self._logout_mode != self.MODE_LOGOUT: - try: - bus = dbus.SystemBus() - proxy = bus.get_object('org.freedesktop.ConsoleKit', - '/org/freedesktop/ConsoleKit/Manager') - pm = dbus.Interface(proxy, - 'org.freedesktop.ConsoleKit.Manager') +def logout(): + _end_session('logout') - if self._logout_mode == self.MODE_SHUTDOWN: - pm.Stop() - elif self._logout_mode == self.MODE_REBOOT: - pm.Restart() - except: - logging.exception('Can not stop sugar') - self.session.cancel_shutdown() - return - session.SessionManager.shutdown_completed(self) - gtk.main_quit() +def shutdown(): + _end_session('shutdown') - def _close_emulator(self): - gtk.main_quit() - if 'SUGAR_EMULATOR_PID' in os.environ: - pid = int(os.environ['SUGAR_EMULATOR_PID']) - os.kill(pid, signal.SIGTERM) +def reboot(): + _end_session('reboot') - # Need to call this ASAP so the atexit handlers get called before we - # get killed by the X (dis)connection - sys.exit() +def _end_session(mode): + if env.is_emulator(): + mode = 'logout' -def get_session_manager(): - global _session_manager + bus = dbus.SessionBus() + obj = bus.get_object(GNOME_SESSION_DBUS_SERVICE, GNOME_SESSION_DBUS_PATH) + session_manager = dbus.Interface(obj, GNOME_SESSION_DBUS_INTERFACE) - if _session_manager == None: - _session_manager = SessionManager() - return _session_manager + if mode in ['shutdown', 'reboot']: + # FIXME: There's no way to trigger a reboot. + # FIXME: The Shutdown dialog only has a Cancel button, so the user + # needs to wait 50 seconds. + session_manager.Shutdown() + elif mode == 'logout': + # 1 = Don't show confirmation UI + session_manager.Logout(1) diff --git a/src/jarabe/view/buddymenu.py b/src/jarabe/view/buddymenu.py index de5a772..7205c11 100644 --- a/src/jarabe/view/buddymenu.py +++ b/src/jarabe/view/buddymenu.py @@ -29,7 +29,7 @@ from sugar.graphics.icon import Icon from jarabe.model import shell from jarabe.model import friends -from jarabe.model.session import get_session_manager +from jarabe.model import session from jarabe.controlpanel.gui import ControlPanel import jarabe.desktop.homewindow @@ -113,13 +113,13 @@ class BuddyMenu(Palette): home_window.busy_during_delayed_action(action) def __logout_activate_cb(self, menu_item): - self._quit(get_session_manager().logout) + self._quit(session.logout) def __reboot_activate_cb(self, menu_item): - self._quit(get_session_manager().reboot) + self._quit(session.reboot) def __shutdown_activate_cb(self, menu_item): - self._quit(get_session_manager().shutdown) + self._quit(session.shutdown) def __controlpanel_activate_cb(self, menu_item): panel = ControlPanel() diff --git a/src/jarabe/view/keyhandler.py b/src/jarabe/view/keyhandler.py index d79bfe6..8af38d1 100644 --- a/src/jarabe/view/keyhandler.py +++ b/src/jarabe/view/keyhandler.py @@ -183,7 +183,7 @@ class KeyHandler(object): self._frame.notify_key_press() def handle_quit_emulator(self, event_time): - session.get_session_manager().shutdown() + session.shutdown() def handle_open_search(self, event_time): journalactivity.get_journal().focus_search() -- cgit v0.9.1