[Sugar-devel] [PATCH sugar] Drop sugar-emulator

Daniel Narvaez dwnarvaez at gmail.com
Sat Dec 15 18:24:50 EST 2012


From: Daniel Narvaez <dwnarvaez at gmail.com>

Replaced by the sugar-runner module.

Rationale:

* sugar-runner is similar in concept to sugar-emulator but it
provides a better user experience. It runs also from a text
console (into a standard X server). It works around Xephyr
issues like international keyboards and multiple outputs.
It tries to work out of the box everywhere, for example
by offering to tweak Xwrapper.config where necessary.
* sugar-runner is better tested with recent sugar code and
recent distributions. It also integrates with sugar-build.
* A separate module make sense here because most users will
never run this code. It's largely a collection of hacks
which are not necessary when running as a normal desktop
environment.

Why now:

* We are starting to use GSettings, which requires to setup
the xdg directories to avoid conflicts with GNOME. Thus we
would require to make changes to sugar-emulator to setup
these properly. Maintaining two separate implementation of
basically the same thing is a waste of resources.
* We are at the beginning of the cycle, the best time for
potentially disruptive changes.
---
 README                         |    1 -
 bin/Makefile.am                |    1 -
 bin/sugar-emulator             |   14 ---
 configure.ac                   |    1 -
 data/Makefile.am               |    3 -
 data/sugar-emulator.desktop.in |   10 ---
 src/jarabe/model/session.py    |   15 +---
 src/jarabe/model/sound.py      |   10 +--
 src/jarabe/util/Makefile.am    |    1 -
 src/jarabe/util/emulator.py    |  194 ----------------------------------------
 src/jarabe/view/keyhandler.py  |    5 --
 11 files changed, 5 insertions(+), 250 deletions(-)
 delete mode 100755 bin/sugar-emulator
 delete mode 100644 data/sugar-emulator.desktop.in
 delete mode 100644 src/jarabe/util/emulator.py

diff --git a/README b/README
index 1f89810..cfc196e 100644
--- a/README
+++ b/README
@@ -38,7 +38,6 @@ Alt+r  Rotate the screen
 Alt+o  Toggle overlay visibility
 Alt+=  Open the developer console
 Alt+0  Open the developer console
-Alt+q  Quit the emulator
 
 Ctrl+s Activate sketch mode in chat
 
diff --git a/bin/Makefile.am b/bin/Makefile.am
index cb671da..bd38323 100644
--- a/bin/Makefile.am
+++ b/bin/Makefile.am
@@ -1,6 +1,5 @@
 python_scripts =		\
 	sugar-control-panel	\
-	sugar-emulator		\
 	sugar-install-bundle	\
 	sugar-launch
 
diff --git a/bin/sugar-emulator b/bin/sugar-emulator
deleted file mode 100755
index 308aac7..0000000
--- a/bin/sugar-emulator
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-
-if [ "$(id -u)" -eq 0 -o "$(id -ru)" -eq 0 ] ; then
-	echo Refusing to run as root.
-	exit 3
-fi
-
-# Source debug definitions
-if [ -f ~/.sugar/debug ]; then
-        . ~/.sugar/debug
-fi
-
-# Start emulator
-python -c "import sys; from jarabe.util import emulator; sys.argv[0]='$0'; emulator.main()" "$@"
diff --git a/configure.ac b/configure.ac
index 137e53a..9eae29e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -48,7 +48,6 @@ bin/Makefile
 bin/sugar
 data/icons/Makefile
 data/Makefile
-data/sugar-emulator.desktop
 extensions/cpsection/aboutcomputer/Makefile
 extensions/cpsection/aboutme/Makefile
 extensions/cpsection/datetime/Makefile
diff --git a/data/Makefile.am b/data/Makefile.am
index 6a62d23..39bdb35 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -23,9 +23,6 @@ GTKRC_FILES =		\
 xsessionsdir = $(datadir)/xsessions
 xsessions_DATA = sugar.desktop
 
-applicationsdir = $(datadir)/applications
-applications_DATA = sugar-emulator.desktop
-
 mime_xml_in_files = sugar.xml.in
 mime_xml_files = $(mime_xml_in_files:.xml.in=.xml)
 @INTLTOOL_XML_RULE@
diff --git a/data/sugar-emulator.desktop.in b/data/sugar-emulator.desktop.in
deleted file mode 100644
index 6247bd7..0000000
--- a/data/sugar-emulator.desktop.in
+++ /dev/null
@@ -1,10 +0,0 @@
-[Desktop Entry]
-Encoding=UTF-8
-Name=Sugar
-GenericName=Sugar Emulator
-Comment=The emulator for the Sugar Desktop Environment
-Exec=@prefix@/bin/sugar-emulator
-Terminal=false
-Type=Application
-Icon=sugar-xo
-Categories=Education;Teaching;
diff --git a/src/jarabe/model/session.py b/src/jarabe/model/session.py
index a5cd4a4..a708633 100644
--- a/src/jarabe/model/session.py
+++ b/src/jarabe/model/session.py
@@ -54,9 +54,7 @@ class SessionManager(session.SessionManager):
         self.initiate_shutdown()
 
     def shutdown_completed(self):
-        if env.is_emulator():
-            self._close_emulator()
-        elif self._logout_mode != self.MODE_LOGOUT:
+        if self._logout_mode != self.MODE_LOGOUT:
             bus = dbus.SystemBus()
             if have_systemd():
                 try:
@@ -93,17 +91,6 @@ class SessionManager(session.SessionManager):
         session.SessionManager.shutdown_completed(self)
         Gtk.main_quit()
 
-    def _close_emulator(self):
-        Gtk.main_quit()
-
-        if 'SUGAR_EMULATOR_PID' in os.environ:
-            pid = int(os.environ['SUGAR_EMULATOR_PID'])
-            os.kill(pid, signal.SIGTERM)
-
-        # Need to call this ASAP so the atexit handlers get called before we
-        # get killed by the X (dis)connection
-        sys.exit()
-
 
 def get_session_manager():
     global _session_manager
diff --git a/src/jarabe/model/sound.py b/src/jarabe/model/sound.py
index 851228d..02ad04d 100644
--- a/src/jarabe/model/sound.py
+++ b/src/jarabe/model/sound.py
@@ -54,12 +54,10 @@ def set_muted(new_state):
 
 
 def save():
-    if env.is_emulator() is False:
-        client = GConf.Client.get_default()
-        client.set_int('/desktop/sugar/sound/volume', get_volume())
+    client = GConf.Client.get_default()
+    client.set_int('/desktop/sugar/sound/volume', get_volume())
 
 
 def restore():
-    if env.is_emulator() is False:
-        client = GConf.Client.get_default()
-        set_volume(client.get_int('/desktop/sugar/sound/volume'))
+    client = GConf.Client.get_default()
+    set_volume(client.get_int('/desktop/sugar/sound/volume'))
diff --git a/src/jarabe/util/Makefile.am b/src/jarabe/util/Makefile.am
index 3054b5a..17b9253 100644
--- a/src/jarabe/util/Makefile.am
+++ b/src/jarabe/util/Makefile.am
@@ -4,5 +4,4 @@ SUBDIRS = 		\
 sugardir = $(pythondir)/jarabe/util
 sugar_PYTHON =          \
 	__init__.py         \
-	emulator.py	    \
 	normalize.py
diff --git a/src/jarabe/util/emulator.py b/src/jarabe/util/emulator.py
deleted file mode 100644
index 72b0d26..0000000
--- a/src/jarabe/util/emulator.py
+++ /dev/null
@@ -1,194 +0,0 @@
-# Copyright (C) 2006-2008, Red Hat, 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 signal
-import subprocess
-import sys
-import time
-from optparse import OptionParser
-from gettext import gettext as _
-
-from gi.repository import Gtk
-from gi.repository import Gdk
-from gi.repository import GObject
-
-from sugar3 import env
-
-
-ERROR_NO_DISPLAY = 30
-ERROR_NO_SERVER = 31
-default_dimensions = (800, 600)
-
-
-def _run_xephyr(display, dpi, dimensions, fullscreen):
-    cmd = ['Xephyr']
-    cmd.append(':%d' % display)
-    cmd.append('-ac')
-    cmd += ['-title', _('Sugar in a window')]
-
-    screen_size = (Gdk.Screen.width(), Gdk.Screen.height())
-
-    if (not dimensions) and (fullscreen is None) and \
-       (screen_size <= default_dimensions):
-        # no forced settings, screen too small => fit screen
-        fullscreen = True
-    elif not dimensions:
-        # screen is big enough or user has en/disabled fullscreen manually
-        # => use default size (will get ignored for fullscreen)
-        dimensions = '%dx%d' % default_dimensions
-
-    if not dpi:
-        dpi = Gtk.Settings.get_default().get_property('gtk-xft-dpi') / 1024
-
-    if fullscreen:
-        cmd.append('-fullscreen')
-
-    if dimensions:
-        cmd.append('-screen')
-        cmd.append(dimensions)
-
-    if dpi:
-        cmd.append('-dpi')
-        cmd.append('%d' % dpi)
-
-    cmd.append('-noreset')
-
-    try:
-        pipe = subprocess.Popen(cmd)
-
-    except OSError, exc:
-        sys.stderr.write('Error executing server: %s\n' % (exc, ))
-        return None
-
-    return pipe
-
-
-def _check_server(display):
-    result = subprocess.call(['xdpyinfo', '-display', ':%d' % display],
-                             stdout=open(os.devnull, 'w'),
-                             stderr=open(os.devnull, 'w'))
-    return result == 0
-
-
-def _kill_pipe(pipe):
-    """Terminate and wait for child process."""
-    try:
-        os.kill(pipe.pid, signal.SIGTERM)
-    except OSError:
-        pass
-
-    pipe.wait()
-
-
-def _start_xephyr(dpi, dimensions, fullscreen):
-    for display in range(30, 40):
-        if not _check_server(display):
-            pipe = _run_xephyr(display, dpi, dimensions, fullscreen)
-            if pipe is None:
-                return None, None
-
-            for i_ in range(10):
-                if _check_server(display):
-                    return pipe, display
-
-                time.sleep(0.1)
-
-            _kill_pipe(pipe)
-
-    return None, None
-
-
-def _start_window_manager():
-    cmd = ['metacity']
-
-    cmd.extend(['--no-force-fullscreen'])
-
-    GObject.spawn_async(cmd, flags=GObject.SPAWN_SEARCH_PATH)
-
-
-def _setup_env(display, scaling, emulator_pid):
-    # We need to remove the environment related to gnome-keyring-daemon,
-    # so a new instance of gnome-keyring-daemon can be started and
-    # registered properly.
-    for variable in ['GPG_AGENT_INFO', 'SSH_AUTH_SOCK',
-                     'GNOME_KEYRING_CONTROL', 'GNOME_KEYRING_PID']:
-        if variable in os.environ:
-            del os.environ[variable]
-
-    os.environ['SUGAR_EMULATOR'] = 'yes'
-    os.environ['GABBLE_LOGFILE'] = os.path.join(
-            env.get_profile_path(), 'logs', 'telepathy-gabble.log')
-    os.environ['SALUT_LOGFILE'] = os.path.join(
-            env.get_profile_path(), 'logs', 'telepathy-salut.log')
-    os.environ['MC_LOGFILE'] = os.path.join(
-            env.get_profile_path(), 'logs', 'mission-control.log')
-    os.environ['STREAM_ENGINE_LOGFILE'] = os.path.join(
-            env.get_profile_path(), 'logs', 'telepathy-stream-engine.log')
-    os.environ['DISPLAY'] = ':%d' % (display)
-    os.environ['SUGAR_EMULATOR_PID'] = emulator_pid
-    os.environ['MC_ACCOUNT_DIR'] = os.path.join(
-            env.get_profile_path(), 'accounts')
-
-    if scaling:
-        os.environ['SUGAR_SCALING'] = scaling
-
-
-def main():
-    """Script-level operations"""
-
-    parser = OptionParser()
-    parser.add_option('-d', '--dpi', dest='dpi', type='int',
-                      help='Emulator dpi')
-    parser.add_option('-s', '--scaling', dest='scaling',
-                      help='Sugar scaling in %')
-    parser.add_option('-i', '--dimensions', dest='dimensions',
-                      help='Emulator dimensions (ex. 1200x900)')
-    parser.add_option('-f', '--fullscreen', dest='fullscreen',
-                      action='store_true', default=None,
-                      help='Run emulator in fullscreen mode')
-    parser.add_option('-F', '--no-fullscreen', dest='fullscreen',
-                      action='store_false',
-                      help='Do not run emulator in fullscreen mode')
-    (options, args) = parser.parse_args()
-
-    if not os.environ.get('DISPLAY'):
-        sys.stderr.write('DISPLAY not set, cannot connect to host X server.\n')
-        return ERROR_NO_DISPLAY
-
-    server, display = _start_xephyr(options.dpi, options.dimensions,
-                                    options.fullscreen)
-    if server is None:
-        sys.stderr.write('Failed to start server. Please check output above'
-            ' for any error message.\n')
-        return ERROR_NO_SERVER
-
-    _setup_env(display, options.scaling, str(server.pid))
-
-    command = ['dbus-launch', '--exit-with-session']
-
-    if not args:
-        command.append('sugar')
-    else:
-        _start_window_manager()
-
-        if args[0].endswith('.py'):
-            command.append('python')
-
-        command.append(args[0])
-
-    subprocess.call(command)
-    _kill_pipe(server)
diff --git a/src/jarabe/view/keyhandler.py b/src/jarabe/view/keyhandler.py
index cb47d17..d96a88c 100644
--- a/src/jarabe/view/keyhandler.py
+++ b/src/jarabe/view/keyhandler.py
@@ -57,9 +57,7 @@ _actions_table = {
     '<alt><shift>Tab': 'previous_window',
     '<alt>Escape': 'close_window',
     'XF86WebCam': 'open_search',
-# the following are intended for emulator users
     '<alt><shift>f': 'frame',
-    '<alt><shift>q': 'quit_emulator',
     'XF86Search': 'open_search',
     '<alt><shift>o': 'open_search'
 }
@@ -156,9 +154,6 @@ class KeyHandler(object):
     def handle_frame(self, event_time):
         self._frame.notify_key_press()
 
-    def handle_quit_emulator(self, event_time):
-        session.get_session_manager().shutdown()
-
     def handle_open_search(self, event_time):
         journalactivity.get_journal().show_journal()
 
-- 
1.7.10.4



More information about the Sugar-devel mailing list