Implement session shutdown. For now we are forcefully

killing activities. We will need to implement some sort
of shutdown notification system but... for now this
works.
This commit is contained in:
Marco Pesenti Gritti 2006-06-19 22:39:57 -04:00
parent 5485a4f958
commit 8bcdb8f3dd
3 changed files with 81 additions and 49 deletions

View File

@ -1,41 +1,59 @@
import os
import signal
from ConfigParser import ConfigParser
import pygtk
pygtk.require('2.0')
import gtk
from sugar.shell import shell
from sugar.shell.shell import Shell
from sugar import env
def start():
shell.main()
class Session:
def __init__(self):
self._activity_processes = {}
activities = []
def start(self):
shell = Shell()
shell.connect('close', self._shell_close_cb)
shell.start()
activities_dirs = []
activities = []
activities_dirs = []
for data_dir in env.get_data_dirs():
act_dir = os.path.join(data_dir, env.get_activities_dir())
activities_dirs.append(act_dir)
for data_dir in env.get_data_dirs():
act_dir = os.path.join(data_dir, env.get_activities_dir())
activities_dirs.append(act_dir)
activities_dirs.append(os.path.join(env.get_user_dir(), 'activities'))
activities_dirs.append(os.path.join(env.get_user_dir(), 'activities'))
for activities_dir in activities_dirs:
if os.path.isdir(activities_dir):
for filename in os.listdir(activities_dir):
if filename.endswith(".activity"):
path = os.path.join(activities_dir, filename)
cp = ConfigParser()
cp.read([path])
python_class = cp.get('Activity', "python_class")
activities.append(python_class)
for activities_dir in activities_dirs:
if os.path.isdir(activities_dir):
for filename in os.listdir(activities_dir):
if filename.endswith(".activity"):
path = os.path.join(activities_dir, filename)
cp = ConfigParser()
cp.read([path])
python_class = cp.get('Activity', "python_class")
activities.append(python_class)
for activity in activities:
args = [ 'python', '-m', activity ]
os.spawnvp(os.P_NOWAIT, 'python', args)
for activity in activities:
args = [ 'python', '-m', activity ]
pid = os.spawnvp(os.P_NOWAIT, 'python', args)
self._activity_processes[activity] = pid
try:
gtk.main()
except KeyboardInterrupt:
print 'Ctrl+C pressed, exiting...'
try:
gtk.main()
except KeyboardInterrupt:
print 'Ctrl+C pressed, exiting...'
self.shutdown()
def _shell_close_cb(self, shell):
self.shutdown()
def shutdown(self):
# FIXME Obviously we want to notify the activities to
# shutt down rather then killing them down forcefully.
for name in self._activity_processes.keys():
print 'Shutting down %s' % (name)
os.kill(self._activity_processes[name], signal.SIGTERM)

View File

@ -472,31 +472,44 @@ class ConsoleLogger(dbus.service.Object):
buf = console.get_buffer()
buf.insert(buf.get_end_iter(), message)
def main():
console = ConsoleLogger()
class Shell(gobject.GObject):
__gsignals__ = {
'close': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
([])),
}
log_writer = LogWriter("Shell", False)
log_writer.start()
def __init__(self):
gobject.GObject.__init__(self)
session_bus = dbus.SessionBus()
service = dbus.service.BusName("com.redhat.Sugar.Shell", bus=session_bus)
def start(self):
console = ConsoleLogger()
activity_container = ActivityContainer(service, session_bus)
activity_container.show()
log_writer = LogWriter("Shell", False)
log_writer.start()
wm = WindowManager(activity_container.window)
wm.set_width(640, WindowManager.ABSOLUTE)
wm.set_height(480, WindowManager.ABSOLUTE)
wm.set_position(WindowManager.CENTER)
wm.show()
wm.manage()
session_bus = dbus.SessionBus()
service = dbus.service.BusName("com.redhat.Sugar.Shell", bus=session_bus)
console.set_parent_window(activity_container.window)
activity_container = ActivityContainer(service, session_bus)
activity_container.window.connect('destroy', self.__activity_container_destroy_cb)
activity_container.show()
wm = WindowManager(activity_container.window)
wm.set_width(640, WindowManager.ABSOLUTE)
wm.set_height(480, WindowManager.ABSOLUTE)
wm.set_position(WindowManager.CENTER)
wm.show()
wm.manage()
console.set_parent_window(activity_container.window)
def __activity_container_destroy_cb(self, activity_container):
self.emit('close')
if __name__ == "__main__":
main()
shell = Shell()
shell.start()
try:
gtk.main()
except KeyboardInterrupt:
print 'Ctrl+c pressed, exiting...'
pass

View File

@ -81,8 +81,9 @@ if console:
os.environ['SUGAR_USE_CONSOLE'] = 'yes'
print 'Redirecting output to the console, press ctrl+d to open it.'
from sugar.session import session
from sugar.session.session import Session
session = Session()
session.start()
if dbus_daemon_pid: