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 17:50:59 (GMT)
committer Dan Williams <dcbw@redhat.com>2006-04-25 17:50:59 (GMT)
commit98a5c93881c6bafa3f5d67af157c56c187d4b3bd (patch)
treef6fadf35c143da2d71a32e39c7b07a04a88106e4 /legacy
parent8ee2dcc7ba92666b0bf1cc32a5ded1a3883c471e (diff)
Add a legacy app runner application based on Xephyr
Diffstat (limited to 'legacy')
-rwxr-xr-xlegacy/legacy.py161
1 files changed, 161 insertions, 0 deletions
diff --git a/legacy/legacy.py b/legacy/legacy.py
new file mode 100755
index 0000000..4f1042b
--- /dev/null
+++ b/legacy/legacy.py
@@ -0,0 +1,161 @@
+#!/usr/bin/python -t
+# -*- tab-width: 4; indent-tabs-mode: t -*-
+
+import dbus
+import dbus.service
+import dbus.glib
+
+import pygtk
+pygtk.require('2.0')
+import gtk, gobject
+
+import sys
+import os
+import pwd
+import gc
+import socket
+import types
+import select
+
+sys.path.append(os.getcwd())
+sys.path.append('../shell/example-activity/')
+import activity
+
+XEPHYR_PATH = "/usr/bin/Xephyr"
+
+
+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):
+
+ def __init__(self, args):
+ activity.Activity.__init__(self)
+ self._act_name = os.path.basename(args[1])
+ self._display = 5
+ self._args = args[1:]
+
+ def _xephyr_function(self, pid, condition, data=None):
+ print "Xephyr: PID: %d, condition: %s" % (pid, condition)
+
+ def _act_function(self, pid, condition, data=None):
+ print "ACT: PID: %d, condition: %s" % (pid, condition)
+
+ 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)
+ self._xephyr_watch = gobject.child_watch_add(self._xephyr_pid, self._xephyr_function)
+
+ cmd = os.path.abspath(self._args[0])
+ args = [cmd]
+ 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)
+
+ 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.show()
+ self._start()
+
+ def activity_on_disconnected_from_shell(self):
+ print "act %d: in activity_on_disconnected_from_shell"%self.activity_get_id()
+ print "act %d: Shell disappeared..."%self.activity_get_id()
+ gc.collect()
+
+ def activity_on_close_from_user(self):
+ print "act %d: in activity_on_close_from_user"%self.activity_get_id()
+ self.activity_shutdown()
+
+ def activity_on_lost_focus(self):
+ print "act %d: in activity_on_lost_focus"%self.activity_get_id()
+
+ def activity_on_got_focus(self):
+ print "act %d: in activity_on_got_focus"%self.activity_get_id()
+
+ def cleanup(self):
+ os.kill(self._xephyr_pid, 9)
+ os.kill(self._act_pid, 9)
+
+ def run(self):
+ try:
+ gtk.main()
+ except KeyboardInterrupt:
+ pass
+
+def main(args):
+ app = LegacyActivity(args)
+ app.activity_connect_to_shell()
+ app.run()
+ app.cleanup()
+
+if __name__ == "__main__":
+ main(sys.argv)