You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
3.7 KiB
Python

#!/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
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"
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:]
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):
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)
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, 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()
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()
self._plug.grab_focus()
def cleanup(self):
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:
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)