[Sugar-devel] [PATCH sugar 01/20] Move the sugar-session code inside jarabe

Daniel Narvaez dwnarvaez at gmail.com
Mon Dec 10 14:11:27 EST 2012


From: Daniel Narvaez <dwnarvaez at gmail.com>

It's quite unexpected to find a large amount of code outside the
package. Also it's not really much of a "session", it starts a
couple of other processes maybe, but it mostly setups stuff and
initialize the UI.
---
 bin/Makefile.am        |    3 +-
 bin/sugar-session      |  352 ------------------------------------------------
 bin/sugar.in           |    2 +-
 src/jarabe/Makefile.am |    3 +-
 src/jarabe/main.py     |  351 +++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 355 insertions(+), 356 deletions(-)
 delete mode 100755 bin/sugar-session
 create mode 100755 src/jarabe/main.py

diff --git a/bin/Makefile.am b/bin/Makefile.am
index 845816c..cb671da 100644
--- a/bin/Makefile.am
+++ b/bin/Makefile.am
@@ -2,8 +2,7 @@ python_scripts =		\
 	sugar-control-panel	\
 	sugar-emulator		\
 	sugar-install-bundle	\
-	sugar-launch		\
-	sugar-session
+	sugar-launch
 
 bin_SCRIPTS = 			\
 	sugar			\
diff --git a/bin/sugar-session b/bin/sugar-session
deleted file mode 100755
index 3c86f3e..0000000
--- a/bin/sugar-session
+++ /dev/null
@@ -1,352 +0,0 @@
-#!/usr/bin/env python
-# Copyright (C) 2006, Red Hat, Inc.
-# Copyright (C) 2009, One Laptop Per Child Association Inc
-#
-# This program 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 2 of the License, or
-# (at your option) any later version.
-#
-# This program 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 this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-import os
-import sys
-import time
-import subprocess
-import shutil
-
-# Change the default encoding to avoid UnicodeDecodeError
-# http://lists.sugarlabs.org/archive/sugar-devel/2012-August/038928.html
-reload(sys)
-sys.setdefaultencoding('utf-8')
-
-if os.environ.get('SUGAR_LOGGER_LEVEL', '') == 'debug':
-    print '%r STARTUP: Starting the shell' % time.time()
-    sys.stdout.flush()
-
-import gettext
-import logging
-import sys
-
-from gi.repository import GLib
-from gi.repository import GConf
-from gi.repository import Gtk
-from gi.repository import Gdk
-from gi.repository import GdkX11
-from gi.repository import GObject
-from gi.repository import Gst
-import dbus.glib
-from gi.repository import Wnck
-
-_USE_XKL = False
-try:
-    from gi.repository import Xkl
-    _USE_XKL = True
-except ImportError:
-    logging.debug('Could not load xklavier for keyboard configuration')
-
-GLib.threads_init()
-Gdk.threads_init()
-dbus.glib.threads_init()
-
-Gst.init(sys.argv)
-
-def cleanup_logs(logs_dir):
-    """Clean up the log directory, moving old logs into a numbered backup
-    directory.  We only keep `_MAX_BACKUP_DIRS` of these backup directories
-    around; the rest are removed."""
-    if not os.path.isdir(logs_dir):
-        os.makedirs(logs_dir)
-
-    backup_logs = []
-    backup_dirs = []
-    for f in os.listdir(logs_dir):
-        path = os.path.join(logs_dir, f)
-        if os.path.isfile(path):
-            backup_logs.append(f)
-        elif os.path.isdir(path):
-            backup_dirs.append(path)
-
-    if len(backup_dirs) > 3:
-        backup_dirs.sort()
-        root = backup_dirs[0]
-        for f in os.listdir(root):
-            os.remove(os.path.join(root, f))
-        os.rmdir(root)
-
-    if len(backup_logs) > 0:
-        name = str(int(time.time()))
-        backup_dir = os.path.join(logs_dir, name)
-        os.mkdir(backup_dir)
-        for log in backup_logs:
-            source_path = os.path.join(logs_dir, log)
-            dest_path = os.path.join(backup_dir, log)
-            os.rename(source_path, dest_path)
-
-def start_ui_service():
-    from jarabe.view.service import UIService
-
-    ui_service = UIService()
-
-def start_session_manager():
-    from jarabe.model.session import get_session_manager
-
-    session_manager = get_session_manager()
-    session_manager.start()
-
-def unfreeze_dcon_cb():
-    logging.debug('STARTUP: unfreeze_dcon_cb')
-    from jarabe.model import screen
-
-    screen.set_dcon_freeze(0)
-
-def setup_frame_cb():
-    logging.debug('STARTUP: setup_frame_cb')
-    from jarabe import frame
-    frame.get_view()
-
-def setup_keyhandler_cb():
-    logging.debug('STARTUP: setup_keyhandler_cb')
-    from jarabe.view import keyhandler
-    from jarabe import frame
-    keyhandler.setup(frame.get_view())
-
-def setup_gesturehandler_cb():
-    logging.debug('STARTUP: setup_gesturehandler_cb')
-    from jarabe.view import gesturehandler
-    from jarabe import frame
-    gesturehandler.setup(frame.get_view())
-
-def setup_cursortracker_cb():
-    logging.debug('STARTUP: setup_cursortracker_cb')
-    from jarabe.view import cursortracker
-    cursortracker.setup()
-
-def setup_journal_cb():
-    logging.debug('STARTUP: setup_journal_cb')
-    from jarabe.journal import journalactivity
-    journalactivity.start()
-
-def show_software_updates_cb():
-    logging.debug('STARTUP: show_software_updates_cb')
-    if os.path.isfile(os.path.expanduser('~/.sugar-update')):
-        from jarabe.desktop import homewindow
-        home_window = homewindow.get_instance()
-        home_window.get_home_box().show_software_updates_alert()
-
-def setup_notification_service_cb():
-    from jarabe.model import notifications
-    notifications.init()
-
-def setup_file_transfer_cb():
-    from jarabe.model import filetransfer
-    filetransfer.init()
-
-def setup_keyboard_cb():
-    logging.debug('STARTUP: setup_keyboard_cb')
-
-    gconf_client = GConf.Client.get_default()
-    have_config = False
-
-    try:
-        display = GdkX11.x11_get_default_xdisplay()
-        if display is not None:
-            engine = Xkl.Engine.get_instance(display)
-        else:
-            logging.debug('setup_keyboard_cb: Could not get default display.')
-            return
-
-        configrec = Xkl.ConfigRec()
-        configrec.get_from_server(engine)
-
-        # FIXME, gconf_client_get_list not introspectable #681433
-        layouts_from_gconf = gconf_client.get(
-            '/desktop/sugar/peripherals/keyboard/layouts')
-        layouts_list = []
-        variants_list = []
-        if layouts_from_gconf:
-            for gval in layouts_from_gconf.get_list():
-                layout = gval.get_string()
-                layouts_list.append(layout.split('(')[0])
-                variants_list.append(layout.split('(')[1][:-1])
-
-            if layouts_list and variants_list:
-                have_config = True
-                configrec.set_layouts(layouts_list)
-                configrec.set_variants(variants_list)
-
-        model = gconf_client.get_string(\
-            '/desktop/sugar/peripherals/keyboard/model')
-        if model:
-            have_config = True
-            configrec.set_model(model)
-
-        options = []
-        # FIXME, gconf_client_get_list not introspectable #681433
-        options_from_gconf = gconf_client.get(\
-            '/desktop/sugar/peripherals/keyboard/options')
-        if options_from_gconf:
-            for gval in options_from_gconf.get_list():
-                option = gval.get_string()
-                options.append(option)
-            if options:
-                have_config = True
-                configrec.set_options(options)
-
-        if have_config:
-            configrec.activate(engine)
-    except Exception:
-        logging.exception('Error during keyboard configuration')
-
-def setup_window_manager():
-    logging.debug('STARTUP: window_manager')
-
-    # have to reset cursor(metacity sets it on startup)
-    if subprocess.call('echo $DISPLAY; xsetroot -cursor_name left_ptr', shell=True):
-        logging.warning('Can not reset cursor')
-
-    if subprocess.call('metacity-message disable-keybindings',
-            shell=True):
-        logging.warning('Can not disable metacity keybindings')
-
-    if subprocess.call('metacity-message disable-mouse-button-modifiers',
-            shell=True):
-        logging.warning('Can not disable metacity mouse button modifiers')
-
-def bootstrap():
-    setup_window_manager()
-
-    from jarabe.view import launcher
-    launcher.setup()
-
-    GObject.idle_add(setup_frame_cb)
-    GObject.idle_add(setup_keyhandler_cb)
-    GObject.idle_add(setup_gesturehandler_cb)
-    GObject.idle_add(setup_journal_cb)
-    GObject.idle_add(setup_notification_service_cb)
-    GObject.idle_add(setup_file_transfer_cb)
-    GObject.idle_add(show_software_updates_cb)
-
-    if _USE_XKL:
-        GObject.idle_add(setup_keyboard_cb)
-
-def set_fonts():
-    client = GConf.Client.get_default()
-    face = client.get_string('/desktop/sugar/font/default_face')
-    size = client.get_float('/desktop/sugar/font/default_size')
-    settings = Gtk.Settings.get_default()
-    settings.set_property("gtk-font-name", "%s %f" % (face, size))
-
-def set_theme():
-    settings = Gtk.Settings.get_default()
-    sugar_theme = 'sugar-72'
-    if 'SUGAR_SCALING' in os.environ:
-        if os.environ['SUGAR_SCALING'] == '100':
-            sugar_theme = 'sugar-100'
-    settings.set_property('gtk-theme-name', sugar_theme)
-    settings.set_property('gtk-icon-theme-name', 'sugar')
-
-def start_home():
-    from jarabe.desktop import homewindow
-
-    start_ui_service()
-    start_session_manager()
-
-    # open homewindow before window_manager to let desktop appear fast
-    home_window = homewindow.get_instance()
-    home_window.show()
-
-    screen = Wnck.Screen.get_default()
-    screen.connect('window-manager-changed', __window_manager_changed_cb)
-    _check_for_window_manager(screen)
-
-def intro_window_done_cb(window):
-    start_home()
-
-def main():
-    try:
-        from sugar3 import env
-        # Remove temporary files. See http://bugs.sugarlabs.org/ticket/1876
-        data_dir = os.path.join(env.get_profile_path(), 'data')
-        shutil.rmtree(data_dir, ignore_errors=True)
-        os.makedirs(data_dir)
-        cleanup_logs(env.get_logs_path())
-    except OSError, e:
-        # logs cleanup is not critical; it should not prevent sugar from
-        # starting if (for example) the disk is full or read-only.
-        print 'logs cleanup failed: %s' % e
-
-    from sugar3 import logger
-    # NOTE: This needs to happen so early because some modules register translatable
-    # strings in the module scope.
-    from jarabe import config
-    gettext.bindtextdomain('sugar', config.locale_path)
-    gettext.bindtextdomain('sugar-toolkit', config.locale_path)
-    gettext.textdomain('sugar')
-
-    from jarabe.model import sound
-    from jarabe import intro
-    from jarabe.intro.window import IntroWindow
-
-    logger.start('shell')
-
-    client = GConf.Client.get_default()
-    client.set_string('/apps/metacity/general/mouse_button_modifier',
-                      '<Super>')
-
-    timezone = client.get_string('/desktop/sugar/date/timezone')
-    if timezone is not None and timezone:
-        os.environ['TZ'] = timezone
-
-    set_fonts()
-    set_theme()
-
-    # this must be added early, so that it executes and unfreezes the screen
-    # even when we initially get blocked on the intro screen
-    GObject.idle_add(unfreeze_dcon_cb)
-
-    GObject.idle_add(setup_cursortracker_cb)
-    # make sure we have the correct cursor in the intro screen
-    # TODO #3204
-    if subprocess.call('echo $DISPLAY; xsetroot -cursor_name left_ptr', shell=True):
-        logging.warning('Can not reset cursor')
-
-    sound.restore()
-
-    sys.path.append(config.ext_path)
-
-    icons_path = os.path.join(config.data_path, 'icons')
-    Gtk.IconTheme.get_default().append_search_path(icons_path)
-
-    if not intro.check_profile():
-        win = IntroWindow()
-        win.connect("done", intro_window_done_cb)
-        win.show_all()
-    else:
-        start_home()
-
-    try:
-        Gtk.main()
-    except KeyboardInterrupt:
-        print 'Ctrl+C pressed, exiting...'
-
-
-def __window_manager_changed_cb(screen):
-    _check_for_window_manager(screen)
-
-
-def _check_for_window_manager(screen):
-    wm_name = screen.get_window_manager_name()
-    if wm_name is not None:
-        screen.disconnect_by_func(__window_manager_changed_cb)
-        bootstrap()
-
-
-main()
diff --git a/bin/sugar.in b/bin/sugar.in
index e7cb068..a2cee51 100644
--- a/bin/sugar.in
+++ b/bin/sugar.in
@@ -83,4 +83,4 @@ fi
 echo Xcursor.theme: sugar | xrdb -merge
 metacity --no-force-fullscreen -d $DISPLAY &
 
-exec sugar-session
+exec python -m jarabe.main
diff --git a/src/jarabe/Makefile.am b/src/jarabe/Makefile.am
index 84bb213..d926d9f 100644
--- a/src/jarabe/Makefile.am
+++ b/src/jarabe/Makefile.am
@@ -10,7 +10,8 @@ SUBDIRS = 		\
 
 sugardir = $(pythondir)/jarabe
 sugar_PYTHON =		\
-	__init__.py
+	__init__.py	\
+	main.py
 
 nodist_sugar_PYTHON = config.py
 
diff --git a/src/jarabe/main.py b/src/jarabe/main.py
new file mode 100755
index 0000000..0b18320
--- /dev/null
+++ b/src/jarabe/main.py
@@ -0,0 +1,351 @@
+# Copyright (C) 2006, Red Hat, Inc.
+# Copyright (C) 2009, One Laptop Per Child Association Inc
+#
+# This program 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 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import os
+import sys
+import time
+import subprocess
+import shutil
+
+# Change the default encoding to avoid UnicodeDecodeError
+# http://lists.sugarlabs.org/archive/sugar-devel/2012-August/038928.html
+reload(sys)
+sys.setdefaultencoding('utf-8')
+
+if os.environ.get('SUGAR_LOGGER_LEVEL', '') == 'debug':
+    print '%r STARTUP: Starting the shell' % time.time()
+    sys.stdout.flush()
+
+import gettext
+import logging
+import sys
+
+from gi.repository import GLib
+from gi.repository import GConf
+from gi.repository import Gtk
+from gi.repository import Gdk
+from gi.repository import GdkX11
+from gi.repository import GObject
+from gi.repository import Gst
+import dbus.glib
+from gi.repository import Wnck
+
+_USE_XKL = False
+try:
+    from gi.repository import Xkl
+    _USE_XKL = True
+except ImportError:
+    logging.debug('Could not load xklavier for keyboard configuration')
+
+GLib.threads_init()
+Gdk.threads_init()
+dbus.glib.threads_init()
+
+Gst.init(sys.argv)
+
+def cleanup_logs(logs_dir):
+    """Clean up the log directory, moving old logs into a numbered backup
+    directory.  We only keep `_MAX_BACKUP_DIRS` of these backup directories
+    around; the rest are removed."""
+    if not os.path.isdir(logs_dir):
+        os.makedirs(logs_dir)
+
+    backup_logs = []
+    backup_dirs = []
+    for f in os.listdir(logs_dir):
+        path = os.path.join(logs_dir, f)
+        if os.path.isfile(path):
+            backup_logs.append(f)
+        elif os.path.isdir(path):
+            backup_dirs.append(path)
+
+    if len(backup_dirs) > 3:
+        backup_dirs.sort()
+        root = backup_dirs[0]
+        for f in os.listdir(root):
+            os.remove(os.path.join(root, f))
+        os.rmdir(root)
+
+    if len(backup_logs) > 0:
+        name = str(int(time.time()))
+        backup_dir = os.path.join(logs_dir, name)
+        os.mkdir(backup_dir)
+        for log in backup_logs:
+            source_path = os.path.join(logs_dir, log)
+            dest_path = os.path.join(backup_dir, log)
+            os.rename(source_path, dest_path)
+
+def start_ui_service():
+    from jarabe.view.service import UIService
+
+    ui_service = UIService()
+
+def start_session_manager():
+    from jarabe.model.session import get_session_manager
+
+    session_manager = get_session_manager()
+    session_manager.start()
+
+def unfreeze_dcon_cb():
+    logging.debug('STARTUP: unfreeze_dcon_cb')
+    from jarabe.model import screen
+
+    screen.set_dcon_freeze(0)
+
+def setup_frame_cb():
+    logging.debug('STARTUP: setup_frame_cb')
+    from jarabe import frame
+    frame.get_view()
+
+def setup_keyhandler_cb():
+    logging.debug('STARTUP: setup_keyhandler_cb')
+    from jarabe.view import keyhandler
+    from jarabe import frame
+    keyhandler.setup(frame.get_view())
+
+def setup_gesturehandler_cb():
+    logging.debug('STARTUP: setup_gesturehandler_cb')
+    from jarabe.view import gesturehandler
+    from jarabe import frame
+    gesturehandler.setup(frame.get_view())
+
+def setup_cursortracker_cb():
+    logging.debug('STARTUP: setup_cursortracker_cb')
+    from jarabe.view import cursortracker
+    cursortracker.setup()
+
+def setup_journal_cb():
+    logging.debug('STARTUP: setup_journal_cb')
+    from jarabe.journal import journalactivity
+    journalactivity.start()
+
+def show_software_updates_cb():
+    logging.debug('STARTUP: show_software_updates_cb')
+    if os.path.isfile(os.path.expanduser('~/.sugar-update')):
+        from jarabe.desktop import homewindow
+        home_window = homewindow.get_instance()
+        home_window.get_home_box().show_software_updates_alert()
+
+def setup_notification_service_cb():
+    from jarabe.model import notifications
+    notifications.init()
+
+def setup_file_transfer_cb():
+    from jarabe.model import filetransfer
+    filetransfer.init()
+
+def setup_keyboard_cb():
+    logging.debug('STARTUP: setup_keyboard_cb')
+
+    gconf_client = GConf.Client.get_default()
+    have_config = False
+
+    try:
+        display = GdkX11.x11_get_default_xdisplay()
+        if display is not None:
+            engine = Xkl.Engine.get_instance(display)
+        else:
+            logging.debug('setup_keyboard_cb: Could not get default display.')
+            return
+
+        configrec = Xkl.ConfigRec()
+        configrec.get_from_server(engine)
+
+        # FIXME, gconf_client_get_list not introspectable #681433
+        layouts_from_gconf = gconf_client.get(
+            '/desktop/sugar/peripherals/keyboard/layouts')
+        layouts_list = []
+        variants_list = []
+        if layouts_from_gconf:
+            for gval in layouts_from_gconf.get_list():
+                layout = gval.get_string()
+                layouts_list.append(layout.split('(')[0])
+                variants_list.append(layout.split('(')[1][:-1])
+
+            if layouts_list and variants_list:
+                have_config = True
+                configrec.set_layouts(layouts_list)
+                configrec.set_variants(variants_list)
+
+        model = gconf_client.get_string(\
+            '/desktop/sugar/peripherals/keyboard/model')
+        if model:
+            have_config = True
+            configrec.set_model(model)
+
+        options = []
+        # FIXME, gconf_client_get_list not introspectable #681433
+        options_from_gconf = gconf_client.get(\
+            '/desktop/sugar/peripherals/keyboard/options')
+        if options_from_gconf:
+            for gval in options_from_gconf.get_list():
+                option = gval.get_string()
+                options.append(option)
+            if options:
+                have_config = True
+                configrec.set_options(options)
+
+        if have_config:
+            configrec.activate(engine)
+    except Exception:
+        logging.exception('Error during keyboard configuration')
+
+def setup_window_manager():
+    logging.debug('STARTUP: window_manager')
+
+    # have to reset cursor(metacity sets it on startup)
+    if subprocess.call('echo $DISPLAY; xsetroot -cursor_name left_ptr', shell=True):
+        logging.warning('Can not reset cursor')
+
+    if subprocess.call('metacity-message disable-keybindings',
+            shell=True):
+        logging.warning('Can not disable metacity keybindings')
+
+    if subprocess.call('metacity-message disable-mouse-button-modifiers',
+            shell=True):
+        logging.warning('Can not disable metacity mouse button modifiers')
+
+def bootstrap():
+    setup_window_manager()
+
+    from jarabe.view import launcher
+    launcher.setup()
+
+    GObject.idle_add(setup_frame_cb)
+    GObject.idle_add(setup_keyhandler_cb)
+    GObject.idle_add(setup_gesturehandler_cb)
+    GObject.idle_add(setup_journal_cb)
+    GObject.idle_add(setup_notification_service_cb)
+    GObject.idle_add(setup_file_transfer_cb)
+    GObject.idle_add(show_software_updates_cb)
+
+    if _USE_XKL:
+        GObject.idle_add(setup_keyboard_cb)
+
+def set_fonts():
+    client = GConf.Client.get_default()
+    face = client.get_string('/desktop/sugar/font/default_face')
+    size = client.get_float('/desktop/sugar/font/default_size')
+    settings = Gtk.Settings.get_default()
+    settings.set_property("gtk-font-name", "%s %f" % (face, size))
+
+def set_theme():
+    settings = Gtk.Settings.get_default()
+    sugar_theme = 'sugar-72'
+    if 'SUGAR_SCALING' in os.environ:
+        if os.environ['SUGAR_SCALING'] == '100':
+            sugar_theme = 'sugar-100'
+    settings.set_property('gtk-theme-name', sugar_theme)
+    settings.set_property('gtk-icon-theme-name', 'sugar')
+
+def start_home():
+    from jarabe.desktop import homewindow
+
+    start_ui_service()
+    start_session_manager()
+
+    # open homewindow before window_manager to let desktop appear fast
+    home_window = homewindow.get_instance()
+    home_window.show()
+
+    screen = Wnck.Screen.get_default()
+    screen.connect('window-manager-changed', __window_manager_changed_cb)
+    _check_for_window_manager(screen)
+
+def intro_window_done_cb(window):
+    start_home()
+
+def main():
+    try:
+        from sugar3 import env
+        # Remove temporary files. See http://bugs.sugarlabs.org/ticket/1876
+        data_dir = os.path.join(env.get_profile_path(), 'data')
+        shutil.rmtree(data_dir, ignore_errors=True)
+        os.makedirs(data_dir)
+        cleanup_logs(env.get_logs_path())
+    except OSError, e:
+        # logs cleanup is not critical; it should not prevent sugar from
+        # starting if (for example) the disk is full or read-only.
+        print 'logs cleanup failed: %s' % e
+
+    from sugar3 import logger
+    # NOTE: This needs to happen so early because some modules register translatable
+    # strings in the module scope.
+    from jarabe import config
+    gettext.bindtextdomain('sugar', config.locale_path)
+    gettext.bindtextdomain('sugar-toolkit', config.locale_path)
+    gettext.textdomain('sugar')
+
+    from jarabe.model import sound
+    from jarabe import intro
+    from jarabe.intro.window import IntroWindow
+
+    logger.start('shell')
+
+    client = GConf.Client.get_default()
+    client.set_string('/apps/metacity/general/mouse_button_modifier',
+                      '<Super>')
+
+    timezone = client.get_string('/desktop/sugar/date/timezone')
+    if timezone is not None and timezone:
+        os.environ['TZ'] = timezone
+
+    set_fonts()
+    set_theme()
+
+    # this must be added early, so that it executes and unfreezes the screen
+    # even when we initially get blocked on the intro screen
+    GObject.idle_add(unfreeze_dcon_cb)
+
+    GObject.idle_add(setup_cursortracker_cb)
+    # make sure we have the correct cursor in the intro screen
+    # TODO #3204
+    if subprocess.call('echo $DISPLAY; xsetroot -cursor_name left_ptr', shell=True):
+        logging.warning('Can not reset cursor')
+
+    sound.restore()
+
+    sys.path.append(config.ext_path)
+
+    icons_path = os.path.join(config.data_path, 'icons')
+    Gtk.IconTheme.get_default().append_search_path(icons_path)
+
+    if not intro.check_profile():
+        win = IntroWindow()
+        win.connect("done", intro_window_done_cb)
+        win.show_all()
+    else:
+        start_home()
+
+    try:
+        Gtk.main()
+    except KeyboardInterrupt:
+        print 'Ctrl+C pressed, exiting...'
+
+
+def __window_manager_changed_cb(screen):
+    _check_for_window_manager(screen)
+
+
+def _check_for_window_manager(screen):
+    wm_name = screen.get_window_manager_name()
+    if wm_name is not None:
+        screen.disconnect_by_func(__window_manager_changed_cb)
+        bootstrap()
+
+
+main()
-- 
1.7.10.4



More information about the Sugar-devel mailing list