From e5cd418e7ed952c1c760ea80f6df36944999faae Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Tue, 25 Apr 2006 15:21:24 -0400 Subject: [PATCH] Launch matchbox and other activities, use glib to spawn processes --- legacy/legacy.py | 128 ++++++++++++++++++----------------------------- 1 file changed, 50 insertions(+), 78 deletions(-) diff --git a/legacy/legacy.py b/legacy/legacy.py index 4f1042bd..1dddd9e8 100755 --- a/legacy/legacy.py +++ b/legacy/legacy.py @@ -16,75 +16,16 @@ import gc import socket import types import select +import string +import time sys.path.append(os.getcwd()) sys.path.append('../shell/example-activity/') import activity XEPHYR_PATH = "/usr/bin/Xephyr" +MATCHBOX_PATH = "/usr/bin/matchbox-window-manager" - -def getfd(filespec, readOnly = 0): - if type(filespec) == types.IntType: - return (filespec, False) - if filespec == None: - filespec = "/dev/null" - - flags = os.O_RDWR | os.O_CREAT - if (readOnly): - flags = os.O_RDONLY - fd = os.open(filespec, flags, 0644) - return (fd, True) - -def exec_with_redirect(cmd, argv, display, stdin=0, stdout=1, stderr=2, setpgrp=True): - cmd = os.path.abspath(cmd) - if not os.access (cmd, os.X_OK): - raise RuntimeError(cmd + " can not be run") - - stdout_opened = False - stderr_opened = False - (stdin, stdin_opened) = getfd(stdin) - if stdout == stderr: - (stdout, stdout_opened) = getfd(stdout) - stderr = stdout - else: - (stdout, stdout_opened) = getfd(stdout) - (stderr, stderr_opened) = getfd(stderr) - - childpid = os.fork() - if (not childpid): - # Become leader of a new process group if requested - if setpgrp: - os.setpgrp() - - if stdin != 0: - os.dup2(stdin, 0) - os.close(stdin) - if stdout != 1: - os.dup2(stdout, 1) - if stdout != stderr: - os.close(stdout) - if stderr != 2: - os.dup2(stderr, 2) - os.close(stderr) - - try: - if display: - os.environ['DISPLAY'] = "0:%d" % display - os.execv(cmd, argv) - except OSError, e: - print "Could not execute command '%s'. Reason: %s" % (cmd, e) - sys.exit(1) - - # Close any files we may have opened - if stdin_opened: - os.close(stdin) - if stdout_opened: - os.close(stdout) - if stderr != stdout and stderr_opened: - os.close(stderr) - - return childpid class LegacyActivity(activity.Activity): @@ -93,38 +34,58 @@ class LegacyActivity(activity.Activity): self._act_name = os.path.basename(args[1]) self._display = 5 self._args = args[1:] + self._act_pid = None + self._matchbox_pid = None + self._xephyr_pid = None def _xephyr_function(self, pid, condition, data=None): print "Xephyr: PID: %d, condition: %s" % (pid, condition) + def _matchbox_function(self, pid, condition, data=None): + print "WM: PID: %d, condition: %s" % (pid, condition) + def _act_function(self, pid, condition, data=None): print "ACT: PID: %d, condition: %s" % (pid, condition) + if condition == 0: + self._act_pid = None + gtk.main_quit() + + def __key_press_event_cb(self, widget, event): + print event def _start(self): - cmd = XEPHYR_PATH - args = [] - args.append(XEPHYR_PATH) - args.append(":%d" % self._display) - args.append("-ac") - args.append("-parent") - args.append("%d" % self._plug.get_id()) - args.append("-host-cursor") - self._xephyr_pid = exec_with_redirect(cmd, args, None, None) + args = string.split("%s :%d -ac -parent %d -host-cursor" % (XEPHYR_PATH, self._display, self._plug.get_id())) + (self._xephyr_pid, a, b, c) = gobject.spawn_async(args, standard_output=sys.stdout, standard_error=sys.stderr) self._xephyr_watch = gobject.child_watch_add(self._xephyr_pid, self._xephyr_function) - cmd = os.path.abspath(self._args[0]) - args = [cmd] + envp = ["DISPLAY=:%d" % self._display] + envp.append("INPUTRC=/etc/inputrc") + envp.append("XMODIFIERS=@im=SCIM") + envp.append("GTK_IM_MODULE=scim") + try: + envp.append("LANG=%s" % os.environ['LANG']) + except: + envp.append("LANG=en_US.UTF-8") + + args = string.split("%s" % MATCHBOX_PATH) + (self._matchbox_pid, a, b, c) = gobject.spawn_async(args, envp=envp, standard_output=sys.stdout, standard_error=sys.stderr) + gobject.child_watch_add(self._matchbox_pid, self._matchbox_function) + + args = [os.path.abspath(self._args[0])] for arg in self._args[1:]: - args.append(arg) - self._act_pid = exec_with_redirect(cmd, args, self._display, None) - self._act_watch = gobject.child_watch_add(self._act_pid, self._act_function) + args.append(arg) + (self._act_pid, a, b, c) = gobject.spawn_async(args, envp=envp, standard_output=sys.stdout, standard_error=sys.stderr) + gobject.child_watch_add(self._act_pid, self._act_function) def activity_on_connected_to_shell(self): print "act %d: in activity_on_connected_to_shell" % self.activity_get_id() self.activity_set_tab_text(self._act_name) self._plug = self.activity_get_gtk_plug() + self._plug.add_events(gtk.gdk.ALL_EVENTS_MASK) + self._plug.connect("key-press-event", self.__key_press_event_cb) self._plug.show() self._start() + self._plug.grab_focus() def activity_on_disconnected_from_shell(self): print "act %d: in activity_on_disconnected_from_shell"%self.activity_get_id() @@ -140,10 +101,21 @@ class LegacyActivity(activity.Activity): def activity_on_got_focus(self): print "act %d: in activity_on_got_focus"%self.activity_get_id() + self._plug.grab_focus() def cleanup(self): - os.kill(self._xephyr_pid, 9) - os.kill(self._act_pid, 9) + try: + if self._act_pid: + os.kill(self._act_pid, 9) + time.sleep(0.2) + if self._xephyr_pid: + os.kill(self._xephyr_pid, 9) + time.sleep(0.2) + if self._matchbox_pid: + os.kill(self._matchbox_pid, 9) + time.sleep(0.2) + except OSError, e: + pass def run(self): try: