| 
									
										
										
										
											2007-01-20 13:38:58 +01:00
										 |  |  | #!/usr/bin/env python | 
					
						
							| 
									
										
										
										
											2006-10-15 01:24:45 +02:00
										 |  |  | # 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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-10-17 09:39:31 +02:00
										 |  |  | import sys | 
					
						
							|  |  |  | import os | 
					
						
							| 
									
										
										
										
											2007-03-09 17:29:03 +01:00
										 |  |  | from ConfigParser import ConfigParser | 
					
						
							| 
									
										
										
										
											2007-03-23 15:05:42 +01:00
										 |  |  | import gettext | 
					
						
							| 
									
										
										
										
											2007-10-09 21:18:54 +02:00
										 |  |  | import signal | 
					
						
							| 
									
										
										
										
											2006-10-17 09:39:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-27 10:35:59 +02:00
										 |  |  | import pygtk | 
					
						
							|  |  |  | pygtk.require('2.0') | 
					
						
							| 
									
										
										
										
											2006-10-16 13:34:43 +02:00
										 |  |  | import gtk | 
					
						
							| 
									
										
										
										
											2006-10-29 06:33:42 +01:00
										 |  |  | import gobject | 
					
						
							| 
									
										
										
										
											2007-09-22 14:49:21 +02:00
										 |  |  | import gst | 
					
						
							| 
									
										
										
										
											2006-10-16 13:34:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-10-17 09:39:31 +02:00
										 |  |  | from sugar import env | 
					
						
							| 
									
										
										
										
											2007-10-09 18:58:39 +02:00
										 |  |  | from sugar import logger | 
					
						
							| 
									
										
										
										
											2007-09-17 13:53:10 +02:00
										 |  |  | from sugar.profile import get_profile | 
					
						
							| 
									
										
										
										
											2006-10-17 09:39:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-09 17:38:05 +01:00
										 |  |  | sys.path.insert(0, env.get_shell_path()) | 
					
						
							| 
									
										
										
										
											2006-10-17 09:39:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-10-16 13:34:43 +02:00
										 |  |  | from view.Shell import Shell | 
					
						
							| 
									
										
										
										
											2007-07-02 14:34:41 +02:00
										 |  |  | from model.shellmodel import ShellModel | 
					
						
							| 
									
										
										
										
											2007-01-27 12:54:56 +01:00
										 |  |  | from shellservice import ShellService | 
					
						
							| 
									
										
										
										
											2007-09-03 15:10:12 +02:00
										 |  |  | from hardware import hardwaremanager | 
					
						
							| 
									
										
										
										
											2007-02-25 23:53:10 +01:00
										 |  |  | from intro import intro | 
					
						
							| 
									
										
										
										
											2007-10-09 21:18:54 +02:00
										 |  |  | import logsmanager | 
					
						
							| 
									
										
										
										
											2006-10-16 13:34:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  | def _start_matchbox(): | 
					
						
							|  |  |  |     cmd = ['matchbox-window-manager'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cmd.extend(['-use_titlebar', 'no']) | 
					
						
							| 
									
										
										
										
											2007-05-11 20:31:44 +02:00
										 |  |  |     cmd.extend(['-theme', 'sugar']) | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  |     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 | 
					
						
							|  |  |  |     # | 
					
						
							| 
									
										
										
										
											2007-08-20 22:41:21 +02:00
										 |  |  |     session_info_file = os.path.join(env.get_profile_path(), "session.info") | 
					
						
							|  |  |  |     f = open(session_info_file, "w") | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-23 15:05:42 +01:00
										 |  |  | def _setup_translations(): | 
					
						
							|  |  |  |     domain = 'sugar' | 
					
						
							|  |  |  |     gettext.bindtextdomain(domain, env.get_locale_path()) | 
					
						
							|  |  |  |     gettext.textdomain(domain) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-28 20:05:54 +02:00
										 |  |  | def check_cm(bus_name): | 
					
						
							| 
									
										
										
										
											2007-04-13 19:46:07 +02:00
										 |  |  |     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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-22 14:49:21 +02:00
										 |  |  | def _shell_started_cb(): | 
					
						
							|  |  |  |     # Unfreeze the display | 
					
						
							| 
									
										
										
										
											2007-09-03 15:10:12 +02:00
										 |  |  |     hw_manager = hardwaremanager.get_manager() | 
					
						
							|  |  |  |     hw_manager.set_dcon_freeze(0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-24 21:16:06 +02:00
										 |  |  |     startup_sound = os.path.join(env.get_data_path('startup.flac')) | 
					
						
							| 
									
										
										
										
											2007-09-22 14:49:21 +02:00
										 |  |  |     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) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-20 22:11:07 +02:00
										 |  |  | def main(): | 
					
						
							| 
									
										
										
										
											2007-09-22 14:49:21 +02:00
										 |  |  |     gobject.idle_add(_shell_started_cb) | 
					
						
							| 
									
										
										
										
											2007-09-03 15:10:12 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-09 21:18:54 +02:00
										 |  |  |     logsmanager.setup() | 
					
						
							| 
									
										
										
										
											2007-10-09 18:58:39 +02:00
										 |  |  |     logger.start('shell') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-20 21:02:58 +02:00
										 |  |  |     _save_session_info() | 
					
						
							|  |  |  |     _start_matchbox() | 
					
						
							|  |  |  |     _setup_translations() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-24 22:04:45 +02:00
										 |  |  |     icons_path = env.get_data_path('icons') | 
					
						
							|  |  |  |     gtk.icon_theme_get_default().append_search_path(icons_path) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-20 21:02:58 +02:00
										 |  |  |     # Do initial setup if needed | 
					
						
							| 
									
										
										
										
											2007-09-17 13:53:10 +02:00
										 |  |  |     if not get_profile().is_valid(): | 
					
						
							| 
									
										
										
										
											2007-08-20 21:02:58 +02:00
										 |  |  |         win = intro.IntroWindow() | 
					
						
							|  |  |  |         win.show_all() | 
					
						
							|  |  |  |         gtk.main() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-10-09 21:18:54 +02:00
										 |  |  |     # FIXME avoid zombie activity processes | 
					
						
							|  |  |  |     signal.signal(signal.SIGCHLD, signal.SIG_IGN) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-28 20:05:54 +02:00
										 |  |  |     if os.environ.has_key("SUGAR_TP_DEBUG"): | 
					
						
							| 
									
										
										
										
											2007-08-20 21:02:58 +02:00
										 |  |  |         # 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() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-28 20:05:54 +02:00
										 |  |  |         debug_flags = os.environ["SUGAR_TP_DEBUG"].split(',') | 
					
						
							|  |  |  |         for cm_name in debug_flags: | 
					
						
							|  |  |  |             if cm_name not in ["gabble", "salut"]: | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-20 21:02:58 +02:00
										 |  |  |             try: | 
					
						
							| 
									
										
										
										
											2007-08-28 20:05:54 +02:00
										 |  |  |                 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 | 
					
						
							| 
									
										
										
										
											2007-08-20 21:02:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     model = ShellModel() | 
					
						
							|  |  |  |     shell = Shell(model) | 
					
						
							|  |  |  |     service = ShellService(shell) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-20 22:41:21 +02:00
										 |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2007-08-20 21:02:58 +02:00
										 |  |  |     # 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() | 
					
						
							| 
									
										
										
										
											2006-10-16 13:34:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-24 18:00:36 +02:00
										 |  |  |     hw_manager = hardwaremanager.get_manager() | 
					
						
							|  |  |  |     hw_manager.startup() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-20 21:02:58 +02:00
										 |  |  |     try: | 
					
						
							|  |  |  |         gtk.main() | 
					
						
							|  |  |  |     except KeyboardInterrupt: | 
					
						
							|  |  |  |         print 'Ctrl+C pressed, exiting...' | 
					
						
							| 
									
										
										
										
											2006-12-14 23:21:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-20 22:41:21 +02:00
										 |  |  |     session_info_file = os.path.join(env.get_profile_path(), "session.info") | 
					
						
							|  |  |  |     os.remove(session_info_file) | 
					
						
							|  |  |  | 
 |