""" Advanced signal (e.g. ctrl+C) handling for IPython

So far, this only ignores ctrl + C in IPython file a subprocess
is executing, to get closer to how a "proper" shell behaves.

Other signal processing may be implemented later on.

If _ip.options.verbose is true, show exit status if nonzero

"""

import signal,os,sys
import IPython.ipapi
import subprocess

ip = IPython.ipapi.get()

def new_ipsystem_posix(cmd):
    """ ctrl+c ignoring replacement for system() command in iplib.
    
    Ignore ctrl + c in IPython process during the command execution. 
    The subprocess will still get the ctrl + c signal.
    
    posix implementation
    """
    
    p =  subprocess.Popen(cmd, shell = True)
    
    old_handler = signal.signal(signal.SIGINT, signal.SIG_IGN)
    pid,status = os.waitpid(p.pid,0)
    signal.signal(signal.SIGINT, old_handler)
    if status and ip.options.verbose:
        print "[exit status: %d]" % status
    
def new_ipsystem_win32(cmd):    
    """ ctrl+c ignoring replacement for system() command in iplib.
    
    Ignore ctrl + c in IPython process during the command execution. 
    The subprocess will still get the ctrl + c signal.
    
    win32 implementation
    """
    old_handler = signal.signal(signal.SIGINT, signal.SIG_IGN)
    status = os.system(cmd)
    signal.signal(signal.SIGINT, old_handler)
    if status and ip.options.verbose:
        print "[exit status: %d]" % status
    
    
def init():
    o = ip.options
    try:
        o.verbose
    except AttributeError:
        o.allow_new_attr (True )
        o.verbose = 0
        
    ip.IP.system = (sys.platform == 'win32' and new_ipsystem_win32 or 
                    new_ipsystem_posix)
    
init()
    