| 
									
										
										
										
											2006-07-12 17:21:22 +02:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2006-08-09 12:57:42 +02:00
										 |  |  | import logging | 
					
						
							| 
									
										
										
										
											2006-07-12 17:21:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-06 23:34:23 +02:00
										 |  |  | import dbus | 
					
						
							| 
									
										
										
										
											2006-07-25 23:00:45 +02:00
										 |  |  | import dbus.glib | 
					
						
							| 
									
										
										
										
											2006-07-08 15:47:51 +02:00
										 |  |  | import gtk | 
					
						
							| 
									
										
										
										
											2006-07-12 22:17:57 +02:00
										 |  |  | import gobject | 
					
						
							| 
									
										
										
										
											2006-07-27 10:35:59 +02:00
										 |  |  | import wnck | 
					
						
							| 
									
										
										
										
											2006-07-06 23:34:23 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-19 01:29:42 +02:00
										 |  |  | from home.HomeWindow import HomeWindow | 
					
						
							| 
									
										
										
										
											2006-07-10 13:42:34 +02:00
										 |  |  | from Owner import ShellOwner | 
					
						
							| 
									
										
										
										
											2006-08-22 16:15:34 +02:00
										 |  |  | from sugar.presence import PresenceService | 
					
						
							| 
									
										
										
										
											2006-07-20 11:34:06 +02:00
										 |  |  | from ActivityHost import ActivityHost | 
					
						
							| 
									
										
										
										
											2006-08-09 15:53:10 +02:00
										 |  |  | from ChatController import ChatController | 
					
						
							| 
									
										
										
										
											2006-08-09 12:57:42 +02:00
										 |  |  | from sugar.activity import ActivityFactory | 
					
						
							| 
									
										
										
										
											2006-08-09 18:29:33 +02:00
										 |  |  | from sugar.activity import Activity | 
					
						
							| 
									
										
										
										
											2006-09-01 15:11:52 +02:00
										 |  |  | from frame.Frame import Frame | 
					
						
							| 
									
										
										
										
											2006-08-25 14:39:58 +02:00
										 |  |  | from globalkeys import KeyGrabber | 
					
						
							| 
									
										
										
										
											2006-09-04 21:34:54 +02:00
										 |  |  | import conf | 
					
						
							| 
									
										
										
										
											2006-08-30 11:15:21 +02:00
										 |  |  | import sugar | 
					
						
							| 
									
										
										
										
											2006-07-09 17:37:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-20 12:13:47 +02:00
										 |  |  | 	def __show_console_idle(self): | 
					
						
							|  |  |  | 		self._shell.show_console() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-09 17:37:54 +02:00
										 |  |  | 	@dbus.service.method('com.redhat.Sugar.Shell') | 
					
						
							| 
									
										
										
										
											2006-07-20 12:13:47 +02:00
										 |  |  | 	def show_console(self): | 
					
						
							|  |  |  | 		gobject.idle_add(self.__show_console_idle) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-10 00:54:54 +02:00
										 |  |  | class Shell(gobject.GObject): | 
					
						
							|  |  |  | 	__gsignals__ = { | 
					
						
							| 
									
										
										
										
											2006-08-28 18:40:41 +02:00
										 |  |  | 		'activity-opened':  (gobject.SIGNAL_RUN_FIRST, | 
					
						
							|  |  |  | 							 gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])), | 
					
						
							|  |  |  | 		'activity-changed': (gobject.SIGNAL_RUN_FIRST, | 
					
						
							|  |  |  | 							 gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])), | 
					
						
							|  |  |  | 		'activity-closed':  (gobject.SIGNAL_RUN_FIRST, | 
					
						
							|  |  |  | 							 gobject.TYPE_NONE, ([gobject.TYPE_PYOBJECT])) | 
					
						
							| 
									
										
										
										
											2006-08-10 00:54:54 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-22 14:01:53 +02:00
										 |  |  | 	def __init__(self): | 
					
						
							| 
									
										
										
										
											2006-08-10 00:54:54 +02:00
										 |  |  | 		gobject.GObject.__init__(self) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-28 23:03:01 +02:00
										 |  |  | 		self._screen = wnck.screen_get_default() | 
					
						
							|  |  |  | 		self._hosts = {} | 
					
						
							|  |  |  | 		self._current_window = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-25 17:44:07 +02:00
										 |  |  | 		self._key_grabber = KeyGrabber() | 
					
						
							|  |  |  | 		self._key_grabber.connect('key-pressed', self.__global_key_pressed_cb) | 
					
						
							|  |  |  | 		self._key_grabber.grab('F1') | 
					
						
							|  |  |  | 		self._key_grabber.grab('F2') | 
					
						
							|  |  |  | 		self._key_grabber.grab('F3') | 
					
						
							|  |  |  | 		self._key_grabber.grab('F4') | 
					
						
							| 
									
										
										
										
											2006-08-28 16:53:29 +02:00
										 |  |  | 		self._key_grabber.grab('F5') | 
					
						
							| 
									
										
										
										
											2006-09-04 22:37:17 +02:00
										 |  |  | 		self._key_grabber.grab('F6') | 
					
						
							| 
									
										
										
										
											2006-08-25 12:28:52 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-22 16:15:34 +02:00
										 |  |  | 		self._home_window = HomeWindow(self) | 
					
						
							|  |  |  | 		self._home_window.show() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		self._screen.connect('window-opened', self.__window_opened_cb) | 
					
						
							|  |  |  | 		self._screen.connect('window-closed', self.__window_closed_cb) | 
					
						
							| 
									
										
										
										
											2006-08-28 18:40:41 +02:00
										 |  |  | 		self._screen.connect('active-window-changed', | 
					
						
							|  |  |  | 							 self.__active_window_changed_cb) | 
					
						
							| 
									
										
										
										
											2006-08-22 16:15:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-09 17:37:54 +02:00
										 |  |  | 		session_bus = dbus.SessionBus() | 
					
						
							|  |  |  | 		bus_name = dbus.service.BusName('com.redhat.Sugar.Shell', bus=session_bus) | 
					
						
							|  |  |  | 		ShellDbusService(self, bus_name) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-22 16:15:34 +02:00
										 |  |  | 		PresenceService.start() | 
					
						
							| 
									
										
										
										
											2006-08-30 11:46:14 +02:00
										 |  |  | 		self._pservice = PresenceService.get_instance() | 
					
						
							| 
									
										
										
										
											2006-08-22 16:15:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-26 02:04:15 +02:00
										 |  |  | 		self._owner = ShellOwner() | 
					
						
							|  |  |  | 		self._owner.announce() | 
					
						
							| 
									
										
										
										
											2006-07-10 13:42:34 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-30 11:46:14 +02:00
										 |  |  | 		self._home_window.set_owner(self._owner) | 
					
						
							| 
									
										
										
										
											2006-08-30 11:15:21 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-10 00:54:54 +02:00
										 |  |  | 		self._chat_controller = ChatController(self) | 
					
						
							|  |  |  | 		self._chat_controller.listen() | 
					
						
							| 
									
										
										
										
											2006-08-09 11:47:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-01 15:11:52 +02:00
										 |  |  | 		self._frame = Frame(self, self._owner) | 
					
						
							|  |  |  | 		self._frame.show_and_hide(10) | 
					
						
							| 
									
										
										
										
											2006-08-23 11:52:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-04 21:34:54 +02:00
										 |  |  | 	def __global_key_pressed_cb(self, grabber, key): | 
					
						
							|  |  |  | 		if key == 'F1': | 
					
						
							|  |  |  | 			self.set_zoom_level(sugar.ZOOM_ACTIVITY) | 
					
						
							|  |  |  | 		elif key == 'F2': | 
					
						
							|  |  |  | 			self.set_zoom_level(sugar.ZOOM_HOME) | 
					
						
							|  |  |  | 		elif key == 'F3': | 
					
						
							|  |  |  | 			self.set_zoom_level(sugar.ZOOM_FRIENDS) | 
					
						
							|  |  |  | 		elif key == 'F4': | 
					
						
							|  |  |  | 			self.set_zoom_level(sugar.ZOOM_MESH) | 
					
						
							|  |  |  | 		elif key == 'F5': | 
					
						
							|  |  |  | 			self._frame.toggle_visibility() | 
					
						
							| 
									
										
										
										
											2006-09-04 22:37:17 +02:00
										 |  |  | 		elif key == 'F6': | 
					
						
							|  |  |  | 			ActivityFactory.create('org.sugar.Terminal') | 
					
						
							| 
									
										
										
										
											2006-09-04 21:34:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-12 16:19:47 +02:00
										 |  |  | 	def set_console(self, console): | 
					
						
							|  |  |  | 		self._console = console | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-09 14:22:58 +02:00
										 |  |  | 	def __window_opened_cb(self, screen, window): | 
					
						
							|  |  |  | 		if window.get_window_type() == wnck.WINDOW_NORMAL: | 
					
						
							| 
									
										
										
										
											2006-08-17 14:23:52 +02:00
										 |  |  | 			host = ActivityHost(self, window) | 
					
						
							|  |  |  | 			self._hosts[window.get_xid()] = host | 
					
						
							|  |  |  | 			self.emit('activity-opened', host) | 
					
						
							| 
									
										
										
										
											2006-08-09 14:22:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-28 18:40:41 +02:00
										 |  |  | 	def __active_window_changed_cb(self, screen): | 
					
						
							|  |  |  | 		window = screen.get_active_window() | 
					
						
							|  |  |  | 		if window and window.get_window_type() == wnck.WINDOW_NORMAL: | 
					
						
							| 
									
										
										
										
											2006-08-28 23:03:01 +02:00
										 |  |  | 			if self._current_window != window: | 
					
						
							|  |  |  | 				self._current_window = window | 
					
						
							|  |  |  | 				self.emit('activity-changed', self.get_current_activity()) | 
					
						
							| 
									
										
										
										
											2006-08-28 18:40:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-09 14:22:58 +02:00
										 |  |  | 	def __window_closed_cb(self, screen, window): | 
					
						
							|  |  |  | 		if window.get_window_type() == wnck.WINDOW_NORMAL: | 
					
						
							|  |  |  | 			xid = window.get_xid() | 
					
						
							| 
									
										
										
										
											2006-08-22 16:15:34 +02:00
										 |  |  | 			if self._hosts.has_key(xid): | 
					
						
							|  |  |  | 				host = self._hosts[xid] | 
					
						
							|  |  |  | 				self.emit('activity-closed', host) | 
					
						
							| 
									
										
										
										
											2006-08-10 00:54:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-22 16:15:34 +02:00
										 |  |  | 				del self._hosts[xid] | 
					
						
							| 
									
										
										
										
											2006-07-09 17:37:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-09 15:53:10 +02:00
										 |  |  | 	def get_activity(self, activity_id): | 
					
						
							| 
									
										
										
										
											2006-08-12 00:29:32 +02:00
										 |  |  | 		for host in self._hosts.values(): | 
					
						
							| 
									
										
										
										
											2006-08-09 15:53:10 +02:00
										 |  |  | 			if host.get_id() == activity_id: | 
					
						
							|  |  |  | 				return host | 
					
						
							|  |  |  | 		return None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-20 11:34:06 +02:00
										 |  |  | 	def get_current_activity(self): | 
					
						
							| 
									
										
										
										
											2006-08-28 23:03:01 +02:00
										 |  |  | 		if self._current_window != None: | 
					
						
							|  |  |  | 			xid = self._current_window.get_xid() | 
					
						
							|  |  |  | 			return self._hosts[xid] | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			return None | 
					
						
							| 
									
										
										
										
											2006-07-09 17:37:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-20 12:13:47 +02:00
										 |  |  | 	def show_console(self): | 
					
						
							| 
									
										
										
										
											2006-08-11 15:21:11 +02:00
										 |  |  | 		self._console.show() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-07-20 12:13:47 +02:00
										 |  |  | 		activity = self.get_current_activity() | 
					
						
							|  |  |  | 		if activity: | 
					
						
							| 
									
										
										
										
											2006-08-22 14:01:53 +02:00
										 |  |  | 			registry = conf.get_activity_registry() | 
					
						
							| 
									
										
										
										
											2006-09-02 10:54:34 +02:00
										 |  |  | 			module = registry.get_activity(activity.get_type()) | 
					
						
							| 
									
										
										
										
											2006-08-11 15:21:11 +02:00
										 |  |  | 			self._console.set_page(module.get_id()) | 
					
						
							| 
									
										
										
										
											2006-08-09 12:57:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-04 17:00:45 +02:00
										 |  |  | 	def join_activity(self, bundle_id, activity_id): | 
					
						
							| 
									
										
										
										
											2006-08-12 00:29:32 +02:00
										 |  |  | 		activity = self.get_activity(activity_id) | 
					
						
							|  |  |  | 		if activity: | 
					
						
							|  |  |  | 			activity.present() | 
					
						
							| 
									
										
										
										
											2006-08-09 12:57:42 +02:00
										 |  |  | 		else: | 
					
						
							| 
									
										
										
										
											2006-08-30 11:15:21 +02:00
										 |  |  | 			activity_ps = self._pservice.get_activity(activity_id) | 
					
						
							| 
									
										
										
										
											2006-08-12 00:29:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			if activity_ps: | 
					
						
							| 
									
										
										
										
											2006-09-04 17:00:45 +02:00
										 |  |  | 				activity = ActivityFactory.create(bundle_id) | 
					
						
							| 
									
										
										
										
											2006-08-12 00:29:32 +02:00
										 |  |  | 				activity.join(activity_ps.object_path()) | 
					
						
							|  |  |  | 			else: | 
					
						
							|  |  |  | 				logging.error('Cannot start activity.') | 
					
						
							| 
									
										
										
										
											2006-08-09 12:57:42 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-02 10:54:34 +02:00
										 |  |  | 	def start_activity(self, activity_type): | 
					
						
							|  |  |  | 		activity = ActivityFactory.create(activity_type) | 
					
						
							|  |  |  | 		activity.execute('test', []) | 
					
						
							|  |  |  | 		return activity | 
					
						
							| 
									
										
										
										
											2006-07-08 15:47:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-10 00:54:54 +02:00
										 |  |  | 	def get_chat_controller(self): | 
					
						
							|  |  |  | 		return self._chat_controller | 
					
						
							| 
									
										
										
										
											2006-08-19 02:00:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-25 14:03:48 +02:00
										 |  |  | 	def set_zoom_level(self, level): | 
					
						
							| 
									
										
										
										
											2006-08-28 14:36:48 +02:00
										 |  |  | 		if level == sugar.ZOOM_ACTIVITY: | 
					
						
							| 
									
										
										
										
											2006-08-19 02:00:04 +02:00
										 |  |  | 			self._screen.toggle_showing_desktop(False) | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			self._screen.toggle_showing_desktop(True) | 
					
						
							| 
									
										
										
										
											2006-08-29 11:48:20 +02:00
										 |  |  | 			self._home_window.set_zoom_level(level) |