poezio.py 3.73 KB
Newer Older
louiz’'s avatar
louiz’ committed
1
# Copyright 2010-2011 Florent Le Coz <louiz@louiz.org>
2 3 4 5
#
# This file is part of Poezio.
#
# Poezio is free software: you can redistribute it and/or modify
6
# it under the terms of the zlib license. See the COPYING file.
7 8 9
"""
Starting point of poezio. Launches both the Connection and Gui
"""
10

11
import sys
12
import os
13
import signal
14

mathieui's avatar
mathieui committed
15

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
def test_curses():
    """
    Check if the system ncurses linked with python has unicode capabilities.
    """
    import curses
    if hasattr(curses, 'unget_wch'):
        return True
    print("""\
ERROR: The current python executable is linked with a ncurses version that \
has no unicode capabilities.

This could mean that:
    - python was built on a system where readline is linked against \
libncurses and not libncursesw
    - python was built without ncursesw headers available

Please file a bug for your distribution or fix that on your system and then \
recompile python.
Poezio is currently unable to read your input or draw its interface properly,\
 so it will now exit.""")
    return False

mathieui's avatar
mathieui committed
38

39 40 41 42 43 44 45 46 47 48 49 50 51 52
def test_env():
    """
    Check if the environment has the right variables set
    """
    unset = set()
    for i in ('HOME', 'PATH', 'TERM'):
        if not os.environ.get(i):
            unset.add(i)
    if unset:
        variables = ', '.join('$%s' % i for i in unset)
        print('ERROR: %s not set' % variables)
        return False
    return True

53

Link Mauve's avatar
Link Mauve committed
54
def test_unicode():
mathieui's avatar
mathieui committed
55
    from . import poopt
Link Mauve's avatar
Link Mauve committed
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
    try:
        poopt.wcswidth('✔')
    except UnicodeError:
        print("""\
ERROR: The current system is misconfigured for Unicode.

Check your locale setup, especially the $LANG environment variable and \
whether it matches a locale built on your system.  Also check that it is a \
.UTF-8 locale, and not using some legacy encoding.

Poezio is unable to display characters properly, so it will now exit.""")
        return False
    return True


louiz’'s avatar
pylint  
louiz’ committed
71 72
def main():
    """
Link Mauve's avatar
Link Mauve committed
73
    Entry point.
louiz’'s avatar
pylint  
louiz’ committed
74
    """
75 76
    sys.stdout.write("\x1b]0;poezio\x07")
    sys.stdout.flush()
mathieui's avatar
mathieui committed
77
    from poezio import config
78
    config.run_cmdline_args()
79 80 81 82
    config.create_global_config()
    config.setup_logging()
    config.post_logging_setup()

mathieui's avatar
mathieui committed
83
    from poezio.config import options
84

85 86 87 88
    if options.check_config:
        config.check_config()
        sys.exit(0)

89 90 91
    from poezio.asyncio import monkey_patch_asyncio_slixmpp
    monkey_patch_asyncio_slixmpp()

mathieui's avatar
mathieui committed
92
    from poezio import theming
93 94
    theming.update_themes_dir()

mathieui's avatar
mathieui committed
95
    from poezio import logger
96
    logger.create_logger()
97

mathieui's avatar
mathieui committed
98
    from poezio import roster
99 100
    roster.create_roster()

mathieui's avatar
mathieui committed
101
    from poezio import core
102

mathieui's avatar
mathieui committed
103
    signal.signal(signal.SIGINT, signal.SIG_IGN)  # ignore ctrl-c
104
    cocore = core.Core()
mathieui's avatar
mathieui committed
105
    signal.signal(signal.SIGUSR1, cocore.sigusr_handler)  # reload the config
mathieui's avatar
mathieui committed
106 107
    signal.signal(signal.SIGHUP, cocore.exit_from_signal)
    signal.signal(signal.SIGTERM, cocore.exit_from_signal)
mathieui's avatar
mathieui committed
108 109
    if options.debug:
        cocore.debug = True
louiz’'s avatar
pylint  
louiz’ committed
110
    cocore.start()
111

112
    from slixmpp.exceptions import IqError, IqTimeout
mathieui's avatar
mathieui committed
113

114 115 116 117 118
    def swallow_iqerrors(loop, context):
        """Do not log unhandled iq errors and timeouts"""
        if not isinstance(context['exception'], (IqError, IqTimeout)):
            loop.default_exception_handler(context)

119 120 121 122
    # Warning: asyncio must always be imported after the config. Otherwise
    # the asyncio logger will not follow our configuration and won't write
    # the tracebacks in the correct file, etc
    import asyncio
123
    loop = asyncio.get_event_loop()
124
    loop.set_exception_handler(swallow_iqerrors)
125

126 127
    loop.add_reader(sys.stdin, cocore.on_input_readable)
    loop.add_signal_handler(signal.SIGWINCH, cocore.sigwinch_handler)
128
    cocore.xmpp.start()
129
    loop.run_forever()
130
    # We reach this point only when loop.stop() is called
131 132
    try:
        cocore.reset_curses()
133 134
    except:
        pass