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.

98 lines
2.6 KiB
Python

import os
import dbus
import gtk
import wnck
import gobject
from sugar.LogWriter import LogWriter
from ConsoleLogger import ConsoleLogger
from ActivityRegistry import ActivityRegistry
from HomeWindow import HomeWindow
from sugar import keybindings
from sugar import env
from PeopleWindow import PeopleWindow
from Owner import ShellOwner
from PresenceService import PresenceService
from ActivityHost import ActivityHost
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 __show_people_idle(self):
self._shell.show_people()
@dbus.service.method('com.redhat.Sugar.Shell')
def show_people(self):
gobject.idle_add(self.__show_people_idle)
@dbus.service.method('com.redhat.Sugar.Shell')
def toggle_console(self):
self._shell.toggle_console()
class Shell:
def __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._ps = PresenceService.PresenceService()
self._owner = ShellOwner()
self._registry = ActivityRegistry()
self._registry.scan_directory(env.get_activities_dir())
self._registry.scan_directory(os.path.join(env.get_user_dir(), 'activities'))
self._home_window = HomeWindow(self)
keybindings.setup_global_keys(self._home_window, self)
self._home_window.show()
self._people_windows = {}
def _toggle_window_visibility(self, window):
if window.get_property('visible'):
window.hide()
else:
window.show()
def get_current_activity(self):
window = self._screen.get_active_window()
if window and window.get_window_type() == wnck.WINDOW_NORMAL:
return ActivityHost(window.get_xid())
else:
return None
def __people_dialog_delete_cb(self, window, event):
window.hide()
return True
def show_people(self):
activity = self.get_current_activity()
if activity:
if not self._people_windows.has_key(activity.get_id()):
dialog = PeopleWindow(self, activity)
dialog.connect('delete-event', self.__people_dialog_delete_cb)
keybindings.setup_global_keys(dialog, self)
self._people_windows[activity.get_id()] = dialog
else:
dialog = self._people_windows[activity.get_id()]
activity.show_dialog(dialog)
def toggle_console(self):
self._toggle_window_visibility(self._console.get_window())
def get_registry(self):
return self._registry