gajim-plural/gajim/gajim.py
Philipp Hörist 52cbae69ee Refactor Gajim startup
Remove as much as possible startup code from GtkApplication to stay
more true to our goal to separate GUI from the rest of Gajim
2018-04-25 19:16:38 +02:00

119 lines
3.4 KiB
Python

# -*- coding: utf-8 -*-
#
# Copyright (C) 2018 Philipp Hörist <philipp AT hoerist.com>
#
# This file is part of Gajim.
#
# Gajim 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, either version 3 of the License, or
# (at your option) any later version.
#
# Gajim 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 Gajim. If not, see <http://www.gnu.org/licenses/>.
import os
import sys
import signal
import platform
from ctypes import CDLL, byref, create_string_buffer
from ctypes.util import find_library
from distutils.version import LooseVersion as V
# Install _() in namespace
from gajim.common import i18n
_MIN_NBXMPP_VER = "0.6.4"
_MIN_GTK_VER = "3.22.0"
def _check_required_deps():
try:
import nbxmpp
except ImportError:
print('Gajim needs python-nbxmpp to run. Quitting…')
sys.exit(1)
from distutils.version import LooseVersion as V
if V(nbxmpp.__version__) < V(_MIN_NBXMPP_VER):
print('Gajim needs python-nbxmpp >= %s to run. '
'Quitting...' % _MIN_NBXMPP_VER)
sys.exit(1)
def _init_gui(gui):
if gui == 'GTK':
_init_gtk()
def _init_gtk():
import gi
gi.require_version('GLib', '2.0')
gi.require_version('Gio', '2.0')
gi.require_version('Gtk', '3.0')
gi.require_version('Gdk', '3.0')
gi.require_version('GObject', '2.0')
gi.require_version('Pango', '1.0')
from gi.repository import Gtk
gtk_ver = '%s.%s.%s' % (Gtk.get_major_version(),
Gtk.get_minor_version(),
Gtk.get_micro_version())
if V(gtk_ver) < V(_MIN_GTK_VER):
print('Gajim needs GTK+ >= %s to run. '
'Quitting...' % _MIN_GTK_VER)
sys.exit(1)
from gajim import gtkexcepthook
gtkexcepthook.init()
i18n.initialize_direction_mark()
from gajim.application import GajimApplication
application = GajimApplication()
_install_terminate(application)
application.run(sys.argv)
def _set_proc_title():
sysname = platform.system()
if sysname in ('Linux', 'FreeBSD', 'OpenBSD', 'NetBSD'):
libc = CDLL(find_library('c'))
# The constant defined in <linux/prctl.h> which is used to set the name
# of the process.
PR_SET_NAME = 15
if sysname == 'Linux':
proc_name = b'gajim'
buff = create_string_buffer(len(proc_name)+1)
buff.value = proc_name
libc.prctl(PR_SET_NAME, byref(buff), 0, 0, 0)
elif sysname in ('FreeBSD', 'OpenBSD', 'NetBSD'):
libc.setproctitle('gajim')
def _install_terminate(application):
def sigint_cb(num, stack):
print('SIGINT/SIGTERM received')
application.quit()
# ^C exits the application normally
signal.signal(signal.SIGINT, sigint_cb)
signal.signal(signal.SIGTERM, sigint_cb)
def main():
if sys.platform != 'win32':
if os.geteuid() == 0:
sys.exit("You must not launch gajim as root, it is insecure.")
_check_required_deps()
_set_proc_title()
_init_gui('GTK')