sugar-toolkit-gtk3/shell/Shell.py
2006-07-10 13:42:34 +02:00

143 lines
3.8 KiB
Python
Executable File

import dbus
import gtk
import gobject
import wnck
from sugar.LogWriter import LogWriter
from ConsoleLogger import ConsoleLogger
from ActivityRegistry import ActivityRegistry
from HomeWindow import HomeWindow
from sugar import keybindings
from sugar.activity import Activity
from PresenceWindow import PresenceWindow
from sugar.chat.ActivityChat import ActivityChat
from Owner import ShellOwner
class ShellDbusService(dbus.service.Object):
def __init__(self, shell, bus_name):
dbus.service.Object.__init__(self, bus_name, '/com/redhat/Sugar/Shell')
self._shell = shell
def __toggle_people_idle(self):
self._shell.toggle_people()
@dbus.service.method('com.redhat.Sugar.Shell')
def toggle_people(self):
gobject.idle_add(self.__toggle_people_idle)
@dbus.service.method('com.redhat.Sugar.Shell')
def toggle_home(self):
self._shell.toggle_home()
@dbus.service.method('com.redhat.Sugar.Shell')
def toggle_console(self):
self._shell.toggle_console()
class Shell(gobject.GObject):
__gsignals__ = {
'close': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE,
([])),
}
def __init__(self):
gobject.GObject.__init__(self)
self._screen = wnck.screen_get_default()
def start(self):
self._console = ConsoleLogger()
keybindings.setup_global_keys(self._console.get_window(), self)
log_writer = LogWriter("Shell", False)
log_writer.start()
session_bus = dbus.SessionBus()
bus_name = dbus.service.BusName('com.redhat.Sugar.Shell', bus=session_bus)
ShellDbusService(self, bus_name)
self._owner = ShellOwner()
self._registry = ActivityRegistry()
self._home_window = HomeWindow(self)
keybindings.setup_global_keys(self._home_window, self)
self._home_window.show()
self._presence_window = PresenceWindow(self)
self._presence_window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
self._presence_window.set_skip_taskbar_hint(True)
self._presence_window.set_decorated(False)
keybindings.setup_global_keys(self._presence_window, self)
self._chat_windows = {}
def _toggle_window_visibility(self, window):
if window.get_property('visible'):
window.hide()
else:
window.show()
def toggle_home(self):
self._toggle_window_visibility(self._home_window)
def get_activity_from_xid(self, xid):
bus = dbus.SessionBus()
service = Activity.ACTIVITY_SERVICE_NAME + "%s" % xid
path = Activity.ACTIVITY_SERVICE_PATH + "/%s" % xid
proxy_obj = bus.get_object(service, path)
return dbus.Interface(proxy_obj, 'com.redhat.Sugar.Activity')
def get_current_activity(self):
window = self._screen.get_active_window()
if window and window.is_skip_tasklist():
window = self._screen.get_previously_active_window()
if window and not window.is_skip_tasklist():
return self.get_activity_from_xid(window.get_xid())
else:
return None
def toggle_people(self):
activity = self.get_current_activity()
if activity:
activity_id = activity.get_id()
if not self._chat_windows.has_key(activity_id):
window = gtk.Window()
window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
window.set_skip_taskbar_hint(True)
window.set_decorated(False)
keybindings.setup_global_keys(window, self)
chat = ActivityChat(activity)
window.add(chat)
chat.show()
self._chat_windows[activity_id] = window
else:
window = self._chat_windows[activity_id]
window.move(210, 10)
window.resize(380, 440)
self._toggle_window_visibility(window)
self._presence_window.move(10, 10)
self._presence_window.resize(180, 440)
self._presence_window.set_activity(activity)
self._toggle_window_visibility(self._presence_window)
def toggle_console(self):
self._toggle_window_visibility(self._console.get_window())
def get_registry(self):
return self._registry
if __name__ == "__main__":
shell = Shell()
shell.start()
try:
gtk.main()
except KeyboardInterrupt:
print 'Ctrl+c pressed, exiting...'