#!/usr/bin/python

import os
import subprocess
import signal

from launcher import Launcher

launcher = Launcher()

def find_cmd (cmd_list):
    """
    Takes a list of command candidates and returns the first one that exists.
    Raises a system exit if none of the commands exist.
    """
    for cmd in cmd_list:
        if os.path.exists(cmd):
            return cmd
    
    raise SystemExit("None of the commands %s exist" % cmd_list)
    
try:
    # Kill gnome-panel in a way that it won't autorespawn
    pidof_cmd = find_cmd(["/sbin/pidof", "/bin/pidof", "/usr/bin/pidof"])
    
    pidof = subprocess.Popen([pidof_cmd, "gnome-panel"], stdout=subprocess.PIPE)
    pids = pidof.communicate()[0].split()
    pidof.wait()
    devnull = open("/dev/null", "w")
    for pid in pids:
        if launcher.is_verbose():
            print "Terminating panel process %s" % pid
        subprocess.call(["gdb", "-batch-silent",
                         "-ex", "call panel_session_do_not_restart()",
                         "-ex", "call exit(0)",
                         "-p", pid], stdout=devnull, stderr=devnull)
    devnull.close()
    
    if launcher.is_verbose():
        print "Starting shell"
    shell = launcher.start_shell()
    
    # Wait for shell to exit
    try:
        if launcher.is_verbose():
            print "Waiting for shell to exit"
        shell.wait()
        if launcher.is_verbose():
            print "Shell is dead"
    except KeyboardInterrupt, e:
        os.kill(shell.pid, signal.SIGKILL)
        shell.wait()
        if launcher.is_verbose():
            print "Shell killed"
finally:
    # Restart gnome-panel and window manager
    if launcher.is_verbose():
        print "Restarting Metacity and Gnome Panel"
        
    subprocess.Popen(["/usr/bin/metacity"])
    subprocess.Popen(["/usr/bin/gnome-panel"])