From b72f00e30beff60e2ec551c4ed57d048061f1716 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Tue, 30 Oct 2007 23:05:16 +0000 Subject: Integrate control panel in the build so that I can actually distcheck. --- (limited to 'bin') diff --git a/bin/Makefile.am b/bin/Makefile.am index fd72139..327df30 100644 --- a/bin/Makefile.am +++ b/bin/Makefile.am @@ -2,8 +2,10 @@ bin_SCRIPTS = \ sugar \ sugar-activity \ sugar-backup \ + sugar-control-panel \ sugar-install-bundle \ - sugar-launch + sugar-launch \ + sugar-shell EXTRA_DIST = $(bin_SCRIPTS) sugar.in diff --git a/bin/sugar-control-panel b/bin/sugar-control-panel new file mode 100755 index 0000000..d978fed --- /dev/null +++ b/bin/sugar-control-panel @@ -0,0 +1,74 @@ +#!/usr/bin/env python + +# 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 + +sys.path.insert(0, env.get_shell_path()) + +import control + +def cmd_help(): + print 'Usage: sugar-control [ option ] key [ args ... ] \n\ + Control for the sugar environment. \n\ + Options: \n\ + -h, --help show this help message and exit \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:", ["help"]) + except getopt.GetoptError: + cmd_help() + sys.exit(2) + + output = None + verbose = False + + for opt, key in opts: + if opt in ("-h"): + method = getattr(control, 'set_' + key, None) + if method is None: + cmd_help() + sys.exit() + else: + print method.__doc__ + if opt in ("-g"): + method = getattr(control, 'print_' + key, None) + if method is None: + cmd_help() + sys.exit() + else: + method() + if opt in ("-s"): + method = getattr(control, 'set_' + key, None) + if method is None: + cmd_help() + sys.exit() + else: + try: + method(*args) + except Exception, e: + print "sugar-control: %s"% e + +if __name__ == '__main__': + main() diff --git a/bin/sugar-shell b/bin/sugar-shell new file mode 100755 index 0000000..8f78289 --- /dev/null +++ b/bin/sugar-shell @@ -0,0 +1,168 @@ +#!/usr/bin/env python +# 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 +import signal + +import pygtk +pygtk.require('2.0') +import gtk +import gobject +import gst + +from sugar import env +from sugar import logger +from sugar.profile import get_profile + +sys.path.insert(0, env.get_shell_path()) + +from view.Shell import Shell +from model.shellmodel import ShellModel +from shellservice import ShellService +from hardware import hardwaremanager +from intro import intro +import logsmanager + +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(): + domain = 'sugar' + gettext.bindtextdomain(domain, env.get_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) + + startup_sound = os.path.join(env.get_data_path('startup.flac')) + if os.path.exists(startup_sound): + player = gst.element_factory_make("playbin", "player") + player.set_property("uri", "file://" + startup_sound) + player.set_state(gst.STATE_PLAYING) + +def main(): + gobject.idle_add(_shell_started_cb) + + logsmanager.setup() + logger.start('shell') + + _save_session_info() + _start_matchbox() + _setup_translations() + + 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() + + # FIXME avoid zombie activity processes + signal.signal(signal.SIGCHLD, signal.SIG_IGN) + + 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) + +if __name__ == '__main__': + # running the gtk.main outside of the main() function allows us to + # profile startup times. To profile startup times replace the following + # call to main with: + # import cProfile + # cProfile.run('main()', '/home/olpc/sugar-startup.stats') + + main() + + hw_manager = hardwaremanager.get_manager() + hw_manager.startup() + + 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