More cleanups and some fixes
This commit is contained in:
parent
ca2b08f8b6
commit
be806eb191
27
shell/Emulator.py
Normal file
27
shell/Emulator.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
from Process import Process
|
||||||
|
|
||||||
|
class XephyrProcess(Process):
|
||||||
|
def __init__(self):
|
||||||
|
# FIXME How to pick a free display number?
|
||||||
|
self._display = 100
|
||||||
|
cmd = 'Xephyr :%d -ac -screen 640x480' % (self._display)
|
||||||
|
Process.__init__(self, cmd)
|
||||||
|
|
||||||
|
def get_name(self):
|
||||||
|
return 'Xephyr'
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
Process.start(self)
|
||||||
|
os.environ['DISPLAY'] = ":%d" % (self._display)
|
||||||
|
|
||||||
|
class Emulator:
|
||||||
|
"""The OLPC emulator"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
process = XephyrProcess()
|
||||||
|
process.start()
|
@ -5,9 +5,11 @@ sugar_PYTHON = \
|
|||||||
__init__.py \
|
__init__.py \
|
||||||
ActivityRegistry.py \
|
ActivityRegistry.py \
|
||||||
ConsoleLogger.py \
|
ConsoleLogger.py \
|
||||||
|
Emulator.py \
|
||||||
Owner.py \
|
Owner.py \
|
||||||
HomeWindow.py \
|
HomeWindow.py \
|
||||||
PresenceWindow.py \
|
PresenceWindow.py \
|
||||||
|
Process.py \
|
||||||
Session.py \
|
Session.py \
|
||||||
Shell.py
|
Shell.py
|
||||||
|
|
||||||
|
16
shell/Process.py
Normal file
16
shell/Process.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import gobject
|
||||||
|
|
||||||
|
class Process:
|
||||||
|
def __init__(self, command):
|
||||||
|
self._pid = None
|
||||||
|
self._command = command
|
||||||
|
|
||||||
|
def get_name(self):
|
||||||
|
return self._command
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
args = self._command.split()
|
||||||
|
flags = gobject.SPAWN_SEARCH_PATH or gobject.SPAWN_STDERR_TO_DEV_NULL
|
||||||
|
result = gobject.spawn_async(args, flags=flags, standard_output=True)
|
||||||
|
self._pid = result[0]
|
||||||
|
self._stdout = result[2]
|
@ -1,30 +1,9 @@
|
|||||||
import os
|
import os
|
||||||
import signal
|
import gtk
|
||||||
|
import sugar.theme
|
||||||
import gobject
|
|
||||||
|
|
||||||
from Shell import Shell
|
from Shell import Shell
|
||||||
|
from Process import Process
|
||||||
class Process:
|
|
||||||
def __init__(self, command):
|
|
||||||
self._pid = None
|
|
||||||
self._command = command
|
|
||||||
|
|
||||||
def get_name(self):
|
|
||||||
return self._command
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
splitted_cmd = self._command.split()
|
|
||||||
try:
|
|
||||||
self._pid = os.spawnvp(os.P_NOWAIT, splitted_cmd[0], splitted_cmd)
|
|
||||||
except Exception, e:
|
|
||||||
logging.error('Cannot run %s' % (self.get_name()))
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
# FIXME Obviously we want to notify the processes to
|
|
||||||
# shut down rather then killing them down forcefully.
|
|
||||||
print 'Stopping %s (%d)' % (self.get_name(), self._pid)
|
|
||||||
os.kill(self._pid, signal.SIGTERM)
|
|
||||||
|
|
||||||
class ActivityProcess(Process):
|
class ActivityProcess(Process):
|
||||||
def __init__(self, module):
|
def __init__(self, module):
|
||||||
@ -36,17 +15,15 @@ class ActivityProcess(Process):
|
|||||||
|
|
||||||
class DbusProcess(Process):
|
class DbusProcess(Process):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
Process.__init__(self, "/bin/dbus-daemon --session --print-address")
|
Process.__init__(self, "dbus-daemon --session --print-address")
|
||||||
|
|
||||||
def get_name(self):
|
def get_name(self):
|
||||||
return 'Dbus'
|
return 'Dbus'
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
args = self._command.split()
|
Process.start(self)
|
||||||
(self._pid, ign1, dbus_stdout, ign3) = gobject.spawn_async(
|
|
||||||
args, flags=gobject.SPAWN_STDERR_TO_DEV_NULL, standard_output=True)
|
|
||||||
|
|
||||||
dbus_file = os.fdopen(dbus_stdout)
|
dbus_file = os.fdopen(self._stdout)
|
||||||
addr = dbus_file.readline()
|
addr = dbus_file.readline()
|
||||||
addr = addr.strip()
|
addr = addr.strip()
|
||||||
dbus_file.close()
|
dbus_file.close()
|
||||||
@ -59,61 +36,29 @@ class MatchboxProcess(Process):
|
|||||||
def get_name(self):
|
def get_name(self):
|
||||||
return 'Matchbox'
|
return 'Matchbox'
|
||||||
|
|
||||||
class XephyrProcess(Process):
|
|
||||||
def __init__(self):
|
|
||||||
# FIXME How to pick a free display number?
|
|
||||||
self._display = 100
|
|
||||||
cmd = 'Xephyr :%d -ac -screen 640x480' % (self._display)
|
|
||||||
Process.__init__(self, cmd)
|
|
||||||
|
|
||||||
def get_name(self):
|
|
||||||
return 'Xephyr'
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
Process.start(self)
|
|
||||||
os.environ['DISPLAY'] = ":%d" % (self._display)
|
|
||||||
|
|
||||||
class Session:
|
class Session:
|
||||||
"""Takes care of running the shell and all the sugar processes"""
|
"""Takes care of running the shell and all the sugar processes"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._processes = []
|
sugar.theme.setup()
|
||||||
|
|
||||||
self._shell = Shell()
|
self._shell = Shell()
|
||||||
self._shell.connect('close', self._shell_close_cb)
|
|
||||||
self._shell.start()
|
self._shell.start()
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
"""Start the session"""
|
"""Start the session"""
|
||||||
# FIXME We should not start this on the olpc
|
|
||||||
process = XephyrProcess()
|
|
||||||
self._processes.insert(0, process)
|
|
||||||
process.start()
|
|
||||||
|
|
||||||
process = DbusProcess()
|
process = DbusProcess()
|
||||||
self._processes.insert(0, process)
|
|
||||||
process.start()
|
process.start()
|
||||||
|
|
||||||
process = MatchboxProcess()
|
process = MatchboxProcess()
|
||||||
self._processes.insert(0, process)
|
|
||||||
process.start()
|
process.start()
|
||||||
|
|
||||||
registry = self._shell.get_registry()
|
registry = self._shell.get_registry()
|
||||||
for activity_module in registry.list_activities():
|
for activity_module in registry.list_activities():
|
||||||
process = ActivityProcess(activity_module)
|
process = ActivityProcess(activity_module)
|
||||||
self._processes.insert(0, process)
|
|
||||||
process.start()
|
process.start()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import gtk
|
|
||||||
gtk.main()
|
gtk.main()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print 'Ctrl+C pressed, exiting...'
|
print 'Ctrl+C pressed, exiting...'
|
||||||
self.shutdown()
|
|
||||||
|
|
||||||
def _shell_close_cb(self, shell):
|
|
||||||
self.shutdown()
|
|
||||||
|
|
||||||
def shutdown(self):
|
|
||||||
for process in self._processes:
|
|
||||||
process.stop()
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import dbus
|
import dbus
|
||||||
import gtk
|
import gtk
|
||||||
import gobject
|
|
||||||
import wnck
|
import wnck
|
||||||
|
|
||||||
from sugar.LogWriter import LogWriter
|
from sugar.LogWriter import LogWriter
|
||||||
@ -33,15 +32,8 @@ class ShellDbusService(dbus.service.Object):
|
|||||||
def toggle_console(self):
|
def toggle_console(self):
|
||||||
self._shell.toggle_console()
|
self._shell.toggle_console()
|
||||||
|
|
||||||
class Shell(gobject.GObject):
|
class Shell:
|
||||||
__gsignals__ = {
|
|
||||||
'close': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
|
|
||||||
([])),
|
|
||||||
}
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
gobject.GObject.__init__(self)
|
|
||||||
|
|
||||||
self._screen = wnck.screen_get_default()
|
self._screen = wnck.screen_get_default()
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
@ -132,11 +124,3 @@ class Shell(gobject.GObject):
|
|||||||
|
|
||||||
def get_registry(self):
|
def get_registry(self):
|
||||||
return self._registry
|
return self._registry
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
shell = Shell()
|
|
||||||
shell.start()
|
|
||||||
try:
|
|
||||||
gtk.main()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
print 'Ctrl+c pressed, exiting...'
|
|
||||||
|
@ -5,6 +5,8 @@ import os
|
|||||||
import pwd
|
import pwd
|
||||||
import random
|
import random
|
||||||
|
|
||||||
|
from Emulator import Emulator
|
||||||
|
|
||||||
def add_to_python_path(path):
|
def add_to_python_path(path):
|
||||||
sys.path.insert(0, path)
|
sys.path.insert(0, path)
|
||||||
if os.environ.has_key('PYTHONPATH'):
|
if os.environ.has_key('PYTHONPATH'):
|
||||||
@ -13,6 +15,10 @@ def add_to_python_path(path):
|
|||||||
else:
|
else:
|
||||||
os.environ['PYTHONPATH'] = path
|
os.environ['PYTHONPATH'] = path
|
||||||
|
|
||||||
|
# FIXE Don't run the emulator on the OLPC
|
||||||
|
emulator = Emulator()
|
||||||
|
emulator.start()
|
||||||
|
|
||||||
i = 0
|
i = 0
|
||||||
for arg in sys.argv:
|
for arg in sys.argv:
|
||||||
if arg == '--test-user':
|
if arg == '--test-user':
|
||||||
|
@ -7,6 +7,7 @@ sugar_PYTHON = \
|
|||||||
bots.py \
|
bots.py \
|
||||||
env.py \
|
env.py \
|
||||||
keybindings.py \
|
keybindings.py \
|
||||||
|
theme.py \
|
||||||
util.py \
|
util.py \
|
||||||
LogWriter.py
|
LogWriter.py
|
||||||
|
|
||||||
|
@ -1,11 +0,0 @@
|
|||||||
import pygtk
|
|
||||||
pygtk.require('2.0')
|
|
||||||
import gtk
|
|
||||||
|
|
||||||
settings = gtk.settings_get_default()
|
|
||||||
|
|
||||||
if settings.get_property('gtk-theme-name') != 'olpc':
|
|
||||||
settings.set_string_property('gtk-theme-name', 'olpc', '')
|
|
||||||
|
|
||||||
if settings.get_property('gtk-icon-theme-name') != 'olpc':
|
|
||||||
settings.set_string_property('gtk-icon-theme-name', 'olpc', '')
|
|
@ -11,6 +11,7 @@ import gtk, gobject
|
|||||||
from sugar.LogWriter import LogWriter
|
from sugar.LogWriter import LogWriter
|
||||||
from sugar import keybindings
|
from sugar import keybindings
|
||||||
import sugar.util
|
import sugar.util
|
||||||
|
import sugar.theme
|
||||||
|
|
||||||
SHELL_SERVICE_NAME = "caom.redhat.Sugar.Shell"
|
SHELL_SERVICE_NAME = "caom.redhat.Sugar.Shell"
|
||||||
SHELL_SERVICE_PATH = "/com/redhat/Sugar/Shell"
|
SHELL_SERVICE_PATH = "/com/redhat/Sugar/Shell"
|
||||||
@ -82,18 +83,10 @@ def create(activity_name, service = None, args = None):
|
|||||||
else:
|
else:
|
||||||
factory.create()
|
factory.create()
|
||||||
|
|
||||||
def _get_registry():
|
|
||||||
bus = dbus.SessionBus()
|
|
||||||
proxy_obj = bus.get_object("com.redhat.Sugar.ActivityRegistry",
|
|
||||||
"/com/redhat/Sugar/ActivityRegistry")
|
|
||||||
return dbus.Interface(proxy_obj, "com.redhat.Sugar.ActivityRegistry")
|
|
||||||
|
|
||||||
def list_activities():
|
|
||||||
registry = _get_registry()
|
|
||||||
return registry.list_activities()
|
|
||||||
|
|
||||||
def main(activity_name, activity_class):
|
def main(activity_name, activity_class):
|
||||||
"""Starts the activity main loop."""
|
"""Starts the activity main loop."""
|
||||||
|
sugar.theme.setup()
|
||||||
|
|
||||||
log_writer = LogWriter(activity_name)
|
log_writer = LogWriter(activity_name)
|
||||||
log_writer.start()
|
log_writer.start()
|
||||||
|
|
||||||
|
10
sugar/theme.py
Normal file
10
sugar/theme.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import gtk
|
||||||
|
|
||||||
|
def setup():
|
||||||
|
settings = gtk.settings_get_default()
|
||||||
|
|
||||||
|
if settings.get_property('gtk-theme-name') != 'olpc':
|
||||||
|
settings.set_string_property('gtk-theme-name', 'olpc', '')
|
||||||
|
|
||||||
|
if settings.get_property('gtk-icon-theme-name') != 'olpc':
|
||||||
|
settings.set_string_property('gtk-icon-theme-name', 'olpc', '')
|
Loading…
Reference in New Issue
Block a user