#!/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 os import sys import socket import pygtk pygtk.require('2.0') import gtk import gobject from sugar import env import _sugar 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: cmd.append('-screen %dx%d' % (width, height)) 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' if len(sys.argv) == 1: program = 'sugar-shell' else: program = sys.argv[1] if gtk.gdk.screen_width() < 1200 or gtk.gdk.screen_height() < 900: width = -1 height = -1 else: width = 1200 height = 900 _start_xephyr(width, height, min(_sugar.get_screen_dpi(), 96)) os.execlp('dbus-launch', 'dbus-launch', '--exit-with-session', program)