| 
									
										
										
										
											2007-01-20 13:38:58 +01:00
										 |  |  | #!/usr/bin/env python | 
					
						
							| 
									
										
										
										
											2006-10-16 13:35:07 +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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import sys | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  | import socket | 
					
						
							| 
									
										
										
										
											2007-08-13 01:17:37 +02:00
										 |  |  | import logging | 
					
						
							|  |  |  | from optparse import OptionParser | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | log = logging.getLogger( 'sugar-emulator' ) | 
					
						
							|  |  |  | log.setLevel( logging.DEBUG ) | 
					
						
							| 
									
										
										
										
											2006-10-16 13:35:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-06 12:01:59 +01:00
										 |  |  | import pygtk | 
					
						
							|  |  |  | pygtk.require('2.0') | 
					
						
							| 
									
										
										
										
											2007-01-16 01:21:15 +01:00
										 |  |  | import gtk | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  | import gobject | 
					
						
							| 
									
										
										
										
											2007-01-11 11:20:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-07 17:59:23 +02:00
										 |  |  | from sugar import env | 
					
						
							| 
									
										
										
										
											2007-06-29 22:11:28 +02:00
										 |  |  | from sugar import ltihooks | 
					
						
							| 
									
										
										
										
											2007-05-07 17:59:23 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  | def _get_display_number(): | 
					
						
							|  |  |  |     """Find a free display number trying to connect to 6000+ ports""" | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  |     log.info( "Attempting to find free port for X11 (Xephyr)" ) | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  |     retries = 20 | 
					
						
							|  |  |  |     display_number = 1 | 
					
						
							| 
									
										
										
										
											2007-05-30 18:48:40 +02:00
										 |  |  |     display_is_free = False | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     while not display_is_free and retries > 0: | 
					
						
							| 
									
										
										
										
											2007-05-30 18:48:40 +02:00
										 |  |  |         lockstr = "/tmp/.X%d-lock" % display_number | 
					
						
							|  |  |  |         if not os.path.exists(lockstr): | 
					
						
							|  |  |  |             s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 s.connect(('127.0.0.1', 6000 + display_number)) | 
					
						
							|  |  |  |                 s.close() | 
					
						
							|  |  |  |             except: | 
					
						
							|  |  |  |                 display_is_free = True | 
					
						
							|  |  |  |                 break | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-30 18:48:40 +02:00
										 |  |  |         display_number += 1 | 
					
						
							|  |  |  |         retries -= 1 | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if display_is_free: | 
					
						
							| 
									
										
										
										
											2007-05-30 18:48:40 +02:00
										 |  |  |         log.info( | 
					
						
							|  |  |  |             '  Found free port: #%s (%s)', | 
					
						
							|  |  |  |             display_number, display_number+6000 | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  |         return display_number | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         logging.error('Cannot find a free display.') | 
					
						
							|  |  |  |         sys.exit(0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-13 01:17:37 +02:00
										 |  |  | def _start_xephyr(dpi=None): | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  |     display = _get_display_number() | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  |     log.info( 'Starting the Xephyr nested X display on display %s', display ) | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     cmd = [ 'Xephyr' ] | 
					
						
							|  |  |  |     cmd.append(':%d' % display) | 
					
						
							|  |  |  |     cmd.append('-ac')  | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-15 15:26:30 +02:00
										 |  |  |     if gtk.gdk.screen_width() < 1200 or gtk.gdk.screen_height() < 900: | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  |         cmd.append('-fullscreen') | 
					
						
							| 
									
										
										
										
											2007-04-15 15:26:30 +02:00
										 |  |  |     else: | 
					
						
							|  |  |  |         cmd.append('-screen') | 
					
						
							|  |  |  |         cmd.append('%dx%d' % (1200, 900)) | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-13 01:17:37 +02:00
										 |  |  |     if not dpi: | 
					
						
							|  |  |  |         dpi = gtk.settings_get_default().get_property('gtk-xft-dpi') / 1024 | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  |     if dpi > 0: | 
					
						
							|  |  |  |         cmd.append('-dpi') | 
					
						
							| 
									
										
										
										
											2007-08-13 01:17:37 +02:00
										 |  |  |         cmd.append('%d' % dpi) | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  |     log.debug( 'Xephyr command: %s', " ".join( cmd ) ) | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  |     result = gobject.spawn_async(cmd, flags=gobject.SPAWN_SEARCH_PATH) | 
					
						
							|  |  |  |     pid = result[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     os.environ['DISPLAY'] = ":%d" % (display) | 
					
						
							|  |  |  |     os.environ['SUGAR_EMULATOR_PID'] = str(pid) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-20 14:45:39 +02:00
										 |  |  | def _start_matchbox(): | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  |     log.info( 'Starting the matchbox window manager' ) | 
					
						
							| 
									
										
										
										
											2007-04-20 14:45:39 +02:00
										 |  |  |     cmd = ['matchbox-window-manager'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cmd.extend(['-use_titlebar', 'no']) | 
					
						
							| 
									
										
										
										
											2007-08-20 12:34:29 +02:00
										 |  |  |     cmd.extend(['-theme', 'sugar']) | 
					
						
							| 
									
										
										
										
											2007-04-20 14:45:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  |     log.debug( 'Matchbox command: %s', " ".join( cmd) ) | 
					
						
							| 
									
										
										
										
											2007-04-20 14:45:39 +02:00
										 |  |  |     gobject.spawn_async(cmd, flags=gobject.SPAWN_SEARCH_PATH) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-15 15:28:25 +02:00
										 |  |  | def _setup_env(): | 
					
						
							|  |  |  |     os.environ['SUGAR_EMULATOR'] = 'yes' | 
					
						
							| 
									
										
										
										
											2007-04-15 15:37:05 +02:00
										 |  |  |      | 
					
						
							|  |  |  |     source_dir = os.path.dirname(os.path.abspath(__file__)) | 
					
						
							|  |  |  |     if os.path.isfile(os.path.join(source_dir, 'autogen.sh')): | 
					
						
							|  |  |  |         os.environ['SUGAR_PATH'] = source_dir | 
					
						
							|  |  |  |         if os.environ.has_key('PYTHONPATH'): | 
					
						
							|  |  |  |             path = os.environ['PYTHONPATH'] | 
					
						
							|  |  |  |             os.environ['PYTHONPATH'] = source_dir + ':' + path | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  |             log.info( 'Set PYTHONPATH=%s', os.environ['PYTHONPATH'] ) | 
					
						
							| 
									
										
										
										
											2006-10-16 17:22:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-13 01:17:37 +02:00
										 |  |  |     os.environ['GABBLE_LOGFILE'] = os.path.join( | 
					
						
							|  |  |  |             env.get_profile_path(), 'logs', 'telepathy-gabble.log') | 
					
						
							|  |  |  |     os.environ['SALUT_LOGFILE'] = os.path.join( | 
					
						
							|  |  |  |             env.get_profile_path(), 'logs', 'telepathy-salut.log') | 
					
						
							|  |  |  |     os.environ['STREAM_ENGINE_LOGFILE'] = os.path.join( | 
					
						
							|  |  |  |             env.get_profile_path(), 'logs', 'telepathy-stream-engine.log') | 
					
						
							| 
									
										
										
										
											2007-05-07 17:59:23 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  | def main(): | 
					
						
							|  |  |  |     """Script-level operations""" | 
					
						
							| 
									
										
										
										
											2007-08-13 01:17:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     parser = OptionParser() | 
					
						
							|  |  |  |     parser.add_option('-x', '--xo-style', dest='xo_style', | 
					
						
							|  |  |  |                       action='store_true', help='use the XO style') | 
					
						
							|  |  |  |     (options, args) = parser.parse_args() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  |     logging.basicConfig() | 
					
						
							| 
									
										
										
										
											2007-08-13 01:17:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  |     _setup_env() | 
					
						
							| 
									
										
										
										
											2007-08-13 01:17:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if options.xo_style: | 
					
						
							|  |  |  |         _start_xephyr(dpi=201) | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2007-08-13 01:17:37 +02:00
										 |  |  |         _start_xephyr() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if options.xo_style: | 
					
						
							|  |  |  |         os.environ['SUGAR_XO_STYLE'] = 'yes' | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         os.environ['SUGAR_XO_STYLE'] = 'no' | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     if options.xo_style: | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  |         gtkrc_filename = 'sugar-xo.gtkrc' | 
					
						
							| 
									
										
										
										
											2007-08-13 01:17:37 +02:00
										 |  |  |     else: | 
					
						
							|  |  |  |         gtkrc_filename = 'sugar.gtkrc' | 
					
						
							|  |  |  |         os.environ['SUGAR_XO_STYLE'] = 'no' | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  |      | 
					
						
							|  |  |  |     os.environ['GTK2_RC_FILES'] = env.get_data_path(gtkrc_filename) | 
					
						
							| 
									
										
										
										
											2007-08-13 01:17:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-20 12:34:29 +02:00
										 |  |  |     command = ['dbus-launch', 'dbus-launch', '--exit-with-session'] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-13 01:17:37 +02:00
										 |  |  |     if not args: | 
					
						
							| 
									
										
										
										
											2007-08-20 12:34:29 +02:00
										 |  |  |         command.append('sugar-shell') | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  |     else: | 
					
						
							|  |  |  |         _start_matchbox() | 
					
						
							| 
									
										
										
										
											2007-08-20 12:34:29 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if args[0].endswith('.py'): | 
					
						
							|  |  |  |             command.append('python') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         command.append(args[0]) | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2007-08-20 12:34:29 +02:00
										 |  |  |     log.info( "Attempting to launch sugar to replace this process: %s", " ".join(command)) | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  |     os.execlp( *command ) | 
					
						
							| 
									
										
										
										
											2007-04-15 15:28:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-22 05:01:56 +02:00
										 |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     main() |