From dbe42ac6d9c0be6be47d2c7545b4997070b4621f Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Mon, 04 Feb 2008 19:36:09 +0000 Subject: Make the shell scripts just a tiny wrapper which setup the python path and run main(). --- (limited to 'shell') diff --git a/shell/Makefile.am b/shell/Makefile.am index e3e9710..c1b7f78 100644 --- a/shell/Makefile.am +++ b/shell/Makefile.am @@ -2,8 +2,9 @@ SUBDIRS = controlpanel hardware model view intro sugardir = $(pkgdatadir)/shell sugar_PYTHON = \ - config.py \ + config.py \ logsmanager.py \ + main.py \ shellservice.py confdir = $(pkgdatadir)/shell diff --git a/shell/controlpanel/Makefile.am b/shell/controlpanel/Makefile.am index b772170..f89132c 100644 --- a/shell/controlpanel/Makefile.am +++ b/shell/controlpanel/Makefile.am @@ -1,4 +1,5 @@ sugardir = $(pkgdatadir)/shell/controlpanel sugar_PYTHON = \ __init__.py \ + cmd.py \ control.py diff --git a/shell/controlpanel/cmd.py b/shell/controlpanel/cmd.py new file mode 100644 index 0000000..634faa9 --- /dev/null +++ b/shell/controlpanel/cmd.py @@ -0,0 +1,80 @@ +# Copyright (C) 2007, One Laptop Per Child +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +import sys +import getopt +from gettext import gettext as _ + +from sugar import env + +from controlpanel import control + +def cmd_help(): + print _('Usage: sugar-control-panel [ option ] key [ args ... ] \n\ + Control for the sugar environment. \n\ + Options: \n\ + -h show this help message and exit \n\ + -l list all the available options \n\ + -h key show information about this key \n\ + -g key get the current value of the key \n\ + -s key set the current value for the key \n\ + ') + +def main(): + try: + opts, args = getopt.getopt(sys.argv[1:], "h:s:g:l", []) + except getopt.GetoptError: + cmd_help() + sys.exit(2) + + output = None + verbose = False + + if not opts: + cmd_help() + sys.exit() + + for opt, key in opts: + if opt in ("-h"): + method = getattr(control, 'set_' + key, None) + if method is None: + print _("sugar-control-panel: key=%s not an available option"% key) + sys.exit() + else: + print method.__doc__ + if opt in ("-l"): + elems = dir(control) + for elem in elems: + if elem.startswith('set_'): + print elem[4:] + if opt in ("-g"): + method = getattr(control, 'print_' + key, None) + if method is None: + print _("sugar-control-panel: key=%s not an available option"% key) + sys.exit() + else: + method() + if opt in ("-s"): + method = getattr(control, 'set_' + key, None) + if method is None: + print _("sugar-control-panel: key=%s not an available option"% key) + sys.exit() + else: + try: + method(*args) + except Exception, e: + print _("sugar-control-panel: %s"% e) diff --git a/shell/main.py b/shell/main.py new file mode 100644 index 0000000..350ce46 --- /dev/null +++ b/shell/main.py @@ -0,0 +1,153 @@ +# Copyright (C) 2006, 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 +# (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 + +import sys +import os +from ConfigParser import ConfigParser +import gettext + +# HACK we need to import numpy before gtk otherwise we traceback in +# some locales. See http://dev.laptop.org/ticket/5559. +import numpy + +import pygtk +pygtk.require('2.0') +import gtk +import gobject + +from sugar import env +from sugar import logger +from sugar.profile import get_profile + +from view.Shell import Shell +from model.shellmodel import ShellModel +from shellservice import ShellService +from hardware import hardwaremanager +from intro import intro +import logsmanager +import config + +def _start_matchbox(): + cmd = ['matchbox-window-manager'] + + cmd.extend(['-use_titlebar', 'no']) + cmd.extend(['-theme', 'sugar']) + cmd.extend(['-kbdconfig', env.get_shell_path('kbdconfig')]) + + gobject.spawn_async(cmd, flags=gobject.SPAWN_SEARCH_PATH) + +def _save_session_info(): + # Save our DBus Session Bus address somewhere it can be found + # + # WARNING!!! this is going away at some near future point, do not rely on it + # + session_info_file = os.path.join(env.get_profile_path(), "session.info") + f = open(session_info_file, "w") + + cp = ConfigParser() + cp.add_section('Session') + cp.set('Session', 'dbus_address', os.environ['DBUS_SESSION_BUS_ADDRESS']) + cp.set('Session', 'display', gtk.gdk.display_get_default().get_name()) + cp.write(f) + + f.close() + +def _setup_translations(): + locale_path = os.path.join(config.prefix, 'share', 'locale') + domain = 'sugar' + + gettext.bindtextdomain(domain, locale_path) + gettext.textdomain(domain) + +def check_cm(bus_name): + try: + import dbus + bus = dbus.SessionBus() + bus_object = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') + name = bus_object.GetNameOwner(bus_name, dbus_interface='org.freedesktop.DBus') + if name: + return True + except dbus.DBusException: + pass + return False + +def _shell_started_cb(): + # Unfreeze the display + hw_manager = hardwaremanager.get_manager() + hw_manager.set_dcon_freeze(0) + +def main(): + gobject.idle_add(_shell_started_cb) + + logsmanager.setup() + logger.start('shell') + + _save_session_info() + _start_matchbox() + _setup_translations() + + hw_manager = hardwaremanager.get_manager() + hw_manager.startup() + + icons_path = env.get_data_path('icons') + gtk.icon_theme_get_default().append_search_path(icons_path) + + # Do initial setup if needed + if not get_profile().is_valid(): + win = intro.IntroWindow() + win.show_all() + gtk.main() + + if os.environ.has_key("SUGAR_TP_DEBUG"): + # Allow the user time to start up telepathy connection managers + # using the Sugar DBus bus address + import time + from telepathy.client import ManagerRegistry + + registry = ManagerRegistry() + registry.LoadManagers() + + debug_flags = os.environ["SUGAR_TP_DEBUG"].split(',') + for cm_name in debug_flags: + if cm_name not in ["gabble", "salut"]: + continue + + try: + cm = registry.services[cm_name] + except KeyError: + print RuntimeError("%s connection manager not found!" % cm_name) + + while not check_cm(cm['busname']): + print "Waiting for %s on: DBUS_SESSION_BUS_ADDRESS=%s" % \ + (cm_name, os.environ["DBUS_SESSION_BUS_ADDRESS"]) + try: + time.sleep(5) + except KeyboardInterrupt: + print "Got Ctrl+C, continuing..." + break + + model = ShellModel() + shell = Shell(model) + service = ShellService(shell) + + try: + gtk.main() + except KeyboardInterrupt: + print 'Ctrl+C pressed, exiting...' + + session_info_file = os.path.join(env.get_profile_path(), "session.info") + os.remove(session_info_file) + -- cgit v0.9.1