Ticket #1440: 1440.patch

File 1440.patch, 3.9 KB (added by sascha_silbe, 15 years ago)

sugar-emulator: kill X server on exit

  • src/jarabe/util/emulator.py

    From: Sascha Silbe <sascha@silbe.org>
    Subject: [PATCH] sugar-emulator: kill X server on exit (#1440)
    
    If sugar aborts abnormally, the X server might keep running, so we should kill
    it off after sugar returns.
    
    Signed-off-by: Sascha Silbe <sascha@silbe.org>
    
    ---
     src/jarabe/util/emulator.py |   71 ++++++++++++++++++++++++-------------------
     1 files changed, 40 insertions(+), 31 deletions(-)
    
    diff --git a/src/jarabe/util/emulator.py b/src/jarabe/util/emulator.py
    index d2dacb5..f1f4504 100644
    a b  
    1616
    1717import os
    1818import random
     19import signal
    1920import subprocess
    2021import time
    2122from optparse import OptionParser
    import gobject 
    2526
    2627from sugar import env
    2728
     29
    2830default_dimensions = (800, 600)
    2931def _run_xephyr(display, dpi, dimensions, fullscreen):
    3032    cmd = [ 'Xephyr' ]
    def _run_xephyr(display, dpi, dimensions, fullscreen): 
    5658        cmd.append('-dpi')
    5759        cmd.append('%d' % dpi)
    5860
    59     result = gobject.spawn_async(cmd, flags=gobject.SPAWN_SEARCH_PATH)
    60     pid = result[0]
     61    pipe = subprocess.Popen(cmd)
    6162
    6263    os.environ['DISPLAY'] = ":%d" % (display)
    63     os.environ['SUGAR_EMULATOR_PID'] = str(pid)
     64    os.environ['SUGAR_EMULATOR_PID'] = str(pipe.pid)
     65    return pipe
     66
    6467
    65 def _check_xephyr(display):
     68def _check_server(display):
    6669    result = subprocess.call(['xdpyinfo', '-display', ':%d' % display],
    6770                             stdout=open(os.devnull, "w"),
    6871                             stderr=open(os.devnull, "w"))
    6972    return result == 0
    7073
     74
     75def _kill_pipe(pipe):
     76    """Terminate and wait for child process."""
     77    try:
     78        os.kill(pipe.pid, signal.SIGTERM)
     79    except OSError:
     80        pass
     81
     82    pipe.wait()
     83
     84
    7185def _start_xephyr(dpi, dimensions, fullscreen):
    72     # FIXME evil workaround until F10 Xephyr is fixed
    73     if os.path.exists('/etc/fedora-release'):
    74         if open('/etc/fedora-release').read().startswith('Fedora release 10'):
    75             display = random.randint(100, 500)
    76             _run_xephyr(display, dpi, dimensions, fullscreen)
    77             return  display
    78 
    79     for display in range(100, 110):
    80         if not _check_xephyr(display):
    81             _run_xephyr(display, dpi, dimensions, fullscreen)
    82 
    83             tries = 10
    84             while tries > 0:
    85                 if _check_xephyr(display):
    86                     return display
    87                 else:
    88                     tries -= 1
    89                     time.sleep(0.1)
    90 
    91 def _start_window_manager(display):
     86    for display in range(30, 40):
     87        if not _check_server(display):
     88            pipe = _run_xephyr(display, dpi, dimensions, fullscreen)
     89
     90            for i_ in range(10):
     91                if _check_server(display):
     92                    return pipe
     93
     94                time.sleep(0.1)
     95
     96            _kill_pipe(pipe)
     97
     98
     99def _start_window_manager():
    92100    cmd = ['metacity']
    93101
    94     cmd.extend(['--no-force-fullscreen', '-d', ':%d' % display])
     102    cmd.extend(['--no-force-fullscreen'])
    95103
    96104    gobject.spawn_async(cmd, flags=gobject.SPAWN_SEARCH_PATH)
    97105
    def main(): 
    146154
    147155    _setup_env()
    148156
    149     display = _start_xephyr(options.dpi, options.dimensions, options.fullscreen)
     157    server = _start_xephyr(options.dpi, options.dimensions, options.fullscreen)
    150158
    151159    if options.scaling:
    152160        os.environ['SUGAR_SCALING'] = options.scaling
    153161
    154     command = ['dbus-launch', 'dbus-launch', '--exit-with-session']
     162    command = ['dbus-launch', '--exit-with-session']
    155163
    156164    if not args:
    157         command.extend(['sugar', '-d', ':%d' % display])
     165        command.append('sugar')
    158166    else:
    159         _start_window_manager(display)
     167        _start_window_manager()
    160168
    161169        if args[0].endswith('.py'):
    162170            command.append('python')
    163171
    164172        command.append(args[0])
    165    
    166     os.execlp(*command)
     173
     174    subprocess.call(command)
     175    _kill_pipe(server)