poezio.py 2.92 KB
Newer Older
1
#!/usr/bin/env python3
2
#
3
# Copyright 2010 Le Coz Florent <louiz@louiz.org>
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#
# This file is part of Poezio.
#
# Poezio 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, version 3 of the License.
#
# Poezio 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 Poezio.  If not, see <http://www.gnu.org/licenses/>.

19 20 21
"""
Starting point of poezio. Launches both the Connection and Gui
"""
22

23
import os
24
import curses
25
import sys
26
import traceback
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
import threading

sys.path.append(os.path.dirname(os.path.abspath(__file__)))

def installThreadExcepthook():
    """
    Workaround for sys.excepthook thread bug
    See http://bugs.python.org/issue1230540
    Python, you made me sad :(
    """
    init_old = threading.Thread.__init__
    def init(self, *args, **kwargs):
        init_old(self, *args, **kwargs)
        run_old = self.run
        def run_with_except_hook(*args, **kw):
            try:
                run_old(*args, **kw)
            except (KeyboardInterrupt, SystemExit):
                raise
            except:
                sys.excepthook(*sys.exc_info())
        self.run = run_with_except_hook
    threading.Thread.__init__ = init
50

51 52 53 54 55 56 57 58 59
class MyStdErr(object):
    def __init__(self, fd):
        """
        Change sys.stderr to something like /dev/null
        to disable any printout on the screen that would
        mess everything
        """
        self.old_stderr = sys.stderr
        sys.stderr = fd
60
    def restore(self):
61
        """
62
        Restore the good ol' sys.stderr, because we need
63 64
        it in order to print the tracebacks
        """
65
        sys.stderr.close()
66 67
        sys.stderr = self.old_stderr

68
# my_stderr = MyStdErr(open('/dev/null', 'a'))
69

70 71 72 73 74
def exception_handler(type_, value, trace):
    """
    on any traceback: exit ncurses and print the traceback
    then exit the program
    """
75
    my_stderr.restore()
76 77 78 79 80
    try:
        curses.endwin()
        curses.echo()
    except: # if an exception is raised but initscr has never been called yet
        pass
81
    traceback.print_exception(type_, value, trace, None, sys.stderr)
82 83
    import os                   # used to quit the program even from a thread
    os.abort()
84

85
# sys.excepthook = exception_handler
86

87
import signal
88
import logging
89

90 91 92
from connection import connection
from config import config, options
from core import core
93 94

if __name__ == '__main__':
95 96 97 98 99
    signal.signal(signal.SIGINT, signal.SIG_IGN) # ignore ctrl-c
    if options.debug:
        logging.basicConfig(filename=options.debug,level=logging.DEBUG)
    connection.start()  # Connect to remote server
    core.main_loop()    # Refresh the screen, wait for user events etc