Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/legacy
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2006-04-25 19:21:24 (GMT)
committer Dan Williams <dcbw@redhat.com>2006-04-25 19:21:24 (GMT)
commite5cd418e7ed952c1c760ea80f6df36944999faae (patch)
tree1aee93b2bad3001b3a5467dbfe02579ddfb01e17 /legacy
parentd5a9ca986d5ff1019bad3a801630c14b9c0f63f5 (diff)
Launch matchbox and other activities, use glib to spawn processes
Diffstat (limited to 'legacy')
-rwxr-xr-xlegacy/legacy.py128
1 files changed, 50 insertions, 78 deletions
diff --git a/legacy/legacy.py b/legacy/legacy.py
index 4f1042b..1dddd9e 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: