| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-10-16 13:35:07 +02:00
										 |  |  | from sugar import env | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  | def _get_display_number(): | 
					
						
							|  |  |  |     """Find a free display number trying to connect to 6000+ ports""" | 
					
						
							|  |  |  |     retries = 20 | 
					
						
							|  |  |  |     display_number = 1 | 
					
						
							|  |  |  |     display_is_free = False     | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while not display_is_free and retries > 0: | 
					
						
							|  |  |  |         s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             s.connect(('127.0.0.1', 6000 + display_number)) | 
					
						
							|  |  |  |             s.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             display_number += 1 | 
					
						
							|  |  |  |             retries -= 1 | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             display_is_free = True | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if display_is_free: | 
					
						
							|  |  |  |         return display_number | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         logging.error('Cannot find a free display.') | 
					
						
							|  |  |  |         sys.exit(0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def _start_xephyr(width, height, dpi): | 
					
						
							|  |  |  |     display = _get_display_number() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cmd = [ 'Xephyr' ] | 
					
						
							|  |  |  |     cmd.append(':%d' % display) | 
					
						
							|  |  |  |     cmd.append('-ac')  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if width > 0 and height > 0: | 
					
						
							| 
									
										
										
										
											2007-03-17 10:37:15 +01:00
										 |  |  |         cmd.append('-screen') | 
					
						
							|  |  |  |         cmd.append('%dx%d' % (width, height)) | 
					
						
							| 
									
										
										
										
											2007-03-16 18:12:47 +01:00
										 |  |  |     else: | 
					
						
							|  |  |  |         cmd.append('-fullscreen') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if dpi > 0: | 
					
						
							|  |  |  |         cmd.append('-dpi') | 
					
						
							|  |  |  |         cmd.append(str(dpi)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | os.environ['SUGAR_EMULATOR'] = 'yes' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-01-16 01:21:15 +01:00
										 |  |  | if len(sys.argv) == 1: | 
					
						
							| 
									
										
										
										
											2007-03-09 17:38:05 +01:00
										 |  |  |     program = 'sugar-shell' | 
					
						
							| 
									
										
										
										
											2007-01-16 01:21:15 +01:00
										 |  |  | else: | 
					
						
							|  |  |  |     program = sys.argv[1] | 
					
						
							| 
									
										
										
										
											2006-10-16 17:22:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-23 15:45:54 +01:00
										 |  |  | if gtk.gdk.screen_width() < 1200 or gtk.gdk.screen_height() < 900: | 
					
						
							|  |  |  |     width = -1 | 
					
						
							|  |  |  |     height = -1 | 
					
						
							| 
									
										
										
										
											2007-01-31 17:49:56 +01:00
										 |  |  | else: | 
					
						
							| 
									
										
										
										
											2007-02-23 15:45:54 +01:00
										 |  |  |     width = 1200 | 
					
						
							|  |  |  |     height = 900 | 
					
						
							| 
									
										
										
										
											2006-10-16 17:22:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-04-07 03:42:51 +02:00
										 |  |  | _gtk_xft_dpi = float(gtk.settings_get_default().get_property('gtk-xft-dpi')) | 
					
						
							|  |  |  | _start_xephyr(width, height, _gtk_xft_dpi / 1024) | 
					
						
							| 
									
										
										
										
											2006-10-16 13:35:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-22 20:34:07 +01:00
										 |  |  | os.environ['GTK2_RC_FILES'] = env.get_data_path('gtkrc') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-09 17:38:05 +01:00
										 |  |  | os.execlp('dbus-launch', 'dbus-launch', '--exit-with-session', program) |