Make the console contextual to the activity and use the
window manager to activate it.
This commit is contained in:
		
							parent
							
								
									87cb115aa0
								
							
						
					
					
						commit
						d6ec6db880
					
				@ -14,6 +14,7 @@ class ActivityHost:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		self._activity = dbus.Interface(proxy_obj, 'com.redhat.Sugar.Activity')
 | 
							self._activity = dbus.Interface(proxy_obj, 'com.redhat.Sugar.Activity')
 | 
				
			||||||
		self._id = self._activity.get_id()
 | 
							self._id = self._activity.get_id()
 | 
				
			||||||
 | 
							self._default_type = self._activity.get_default_type()
 | 
				
			||||||
		self._window = gtk.gdk.window_foreign_new(xid)
 | 
							self._window = gtk.gdk.window_foreign_new(xid)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def get_id(self):
 | 
						def get_id(self):
 | 
				
			||||||
@ -25,6 +26,9 @@ class ActivityHost:
 | 
				
			|||||||
	def get_shared(self):
 | 
						def get_shared(self):
 | 
				
			||||||
		return self._activity.get_shared()
 | 
							return self._activity.get_shared()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def get_default_type(self):
 | 
				
			||||||
 | 
							return self._default_type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def show_dialog(self, dialog):
 | 
						def show_dialog(self, dialog):
 | 
				
			||||||
		dialog.show()
 | 
							dialog.show()
 | 
				
			||||||
		dialog.window.set_transient_for(self._window)
 | 
							dialog.window.set_transient_for(self._window)
 | 
				
			||||||
 | 
				
			|||||||
@ -1,49 +0,0 @@
 | 
				
			|||||||
import gtk
 | 
					 | 
				
			||||||
import dbus.service
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class ConsoleLogger(dbus.service.Object):
 | 
					 | 
				
			||||||
	def __init__(self):
 | 
					 | 
				
			||||||
		session_bus = dbus.SessionBus()
 | 
					 | 
				
			||||||
		bus_name = dbus.service.BusName('com.redhat.Sugar.Logger', bus=session_bus)
 | 
					 | 
				
			||||||
		object_path = '/com/redhat/Sugar/Logger'
 | 
					 | 
				
			||||||
		dbus.service.Object.__init__(self, bus_name, object_path)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		self._window = gtk.Window()
 | 
					 | 
				
			||||||
		self._window.set_title("Console")
 | 
					 | 
				
			||||||
		self._window.connect("delete_event", lambda w, e: w.hide_on_delete())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		self._nb = gtk.Notebook()
 | 
					 | 
				
			||||||
		self._window.add(self._nb)
 | 
					 | 
				
			||||||
		self._nb.show()
 | 
					 | 
				
			||||||
				
 | 
					 | 
				
			||||||
		self._consoles = {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	def get_window(self):
 | 
					 | 
				
			||||||
		return self._window
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	def _create_console(self, application):
 | 
					 | 
				
			||||||
		sw = gtk.ScrolledWindow()
 | 
					 | 
				
			||||||
		sw.set_policy(gtk.POLICY_AUTOMATIC,
 | 
					 | 
				
			||||||
					  gtk.POLICY_AUTOMATIC)
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		console = gtk.TextView()
 | 
					 | 
				
			||||||
		console.set_wrap_mode(gtk.WRAP_WORD)
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		sw.add(console)
 | 
					 | 
				
			||||||
		console.show()
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		self._nb.append_page(sw, gtk.Label(application))
 | 
					 | 
				
			||||||
		sw.show()
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		return console
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	@dbus.service.method('com.redhat.Sugar.Logger')
 | 
					 | 
				
			||||||
	def log(self, application, message):
 | 
					 | 
				
			||||||
		if self._consoles.has_key(application):
 | 
					 | 
				
			||||||
			console = self._consoles[application]
 | 
					 | 
				
			||||||
		else:
 | 
					 | 
				
			||||||
			console = self._create_console(application)
 | 
					 | 
				
			||||||
			self._consoles[application] = console
 | 
					 | 
				
			||||||
	
 | 
					 | 
				
			||||||
		buf = console.get_buffer() 
 | 
					 | 
				
			||||||
		buf.insert(buf.get_end_iter(), message)
 | 
					 | 
				
			||||||
							
								
								
									
										26
									
								
								shell/ConsoleWindow.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								shell/ConsoleWindow.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					import gtk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ConsoleWindow(gtk.Window):
 | 
				
			||||||
 | 
						def __init__(self):
 | 
				
			||||||
 | 
							gtk.Window.__init__(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							self.set_default_size(620, 440)
 | 
				
			||||||
 | 
							self.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
 | 
				
			||||||
 | 
							self.set_title("Console")
 | 
				
			||||||
 | 
							self.connect("delete_event", lambda w, e: w.hide_on_delete())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							sw = gtk.ScrolledWindow()
 | 
				
			||||||
 | 
							sw.set_policy(gtk.POLICY_AUTOMATIC,
 | 
				
			||||||
 | 
										  gtk.POLICY_AUTOMATIC)
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							self._console = gtk.TextView()
 | 
				
			||||||
 | 
							self._console.set_wrap_mode(gtk.WRAP_WORD)
 | 
				
			||||||
 | 
							sw.add(self._console)
 | 
				
			||||||
 | 
							self._console.show()
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							self.add(sw)
 | 
				
			||||||
 | 
							sw.show()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def log(self, message):
 | 
				
			||||||
 | 
							buf = self._console.get_buffer() 
 | 
				
			||||||
 | 
							buf.insert(buf.get_end_iter(), message)
 | 
				
			||||||
@ -9,6 +9,7 @@ class PeopleWindow(gtk.Window):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		self.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
 | 
							self.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
 | 
				
			||||||
		self.set_default_size(620, 440)
 | 
							self.set_default_size(620, 440)
 | 
				
			||||||
 | 
							self.connect("delete_event", lambda w, e: w.hide_on_delete())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		hbox = gtk.HBox(False, 12)
 | 
							hbox = gtk.HBox(False, 12)
 | 
				
			||||||
		hbox.set_border_width(12)
 | 
							hbox.set_border_width(12)
 | 
				
			||||||
 | 
				
			|||||||
@ -9,9 +9,9 @@ from sugar.LogWriter import LogWriter
 | 
				
			|||||||
from ConsoleLogger import ConsoleLogger
 | 
					from ConsoleLogger import ConsoleLogger
 | 
				
			||||||
from ActivityRegistry import ActivityRegistry
 | 
					from ActivityRegistry import ActivityRegistry
 | 
				
			||||||
from HomeWindow import HomeWindow
 | 
					from HomeWindow import HomeWindow
 | 
				
			||||||
from sugar import keybindings
 | 
					 | 
				
			||||||
from sugar import env
 | 
					from sugar import env
 | 
				
			||||||
from PeopleWindow import PeopleWindow
 | 
					from PeopleWindow import PeopleWindow
 | 
				
			||||||
 | 
					from ConsoleWindow import ConsoleWindow
 | 
				
			||||||
from Owner import ShellOwner
 | 
					from Owner import ShellOwner
 | 
				
			||||||
from PresenceService import PresenceService
 | 
					from PresenceService import PresenceService
 | 
				
			||||||
from ActivityHost import ActivityHost
 | 
					from ActivityHost import ActivityHost
 | 
				
			||||||
@ -24,22 +24,29 @@ class ShellDbusService(dbus.service.Object):
 | 
				
			|||||||
	def __show_people_idle(self):
 | 
						def __show_people_idle(self):
 | 
				
			||||||
		self._shell.show_people()		
 | 
							self._shell.show_people()		
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def __show_console_idle(self):
 | 
				
			||||||
 | 
							self._shell.show_console()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def __log_idle(self, (module_id, message)):
 | 
				
			||||||
 | 
							self._shell.log(module_id, message)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@dbus.service.method('com.redhat.Sugar.Shell')
 | 
						@dbus.service.method('com.redhat.Sugar.Shell')
 | 
				
			||||||
	def show_people(self):
 | 
						def show_people(self):
 | 
				
			||||||
		gobject.idle_add(self.__show_people_idle)
 | 
							gobject.idle_add(self.__show_people_idle)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@dbus.service.method('com.redhat.Sugar.Shell')
 | 
						@dbus.service.method('com.redhat.Sugar.Shell')
 | 
				
			||||||
	def toggle_console(self):
 | 
						def show_console(self):
 | 
				
			||||||
		self._shell.toggle_console()	
 | 
							gobject.idle_add(self.__show_console_idle)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@dbus.service.method('com.redhat.Sugar.Shell')
 | 
				
			||||||
 | 
						def log(self, module_id, message):
 | 
				
			||||||
 | 
							gobject.idle_add(self.__log_idle, (module_id, message))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Shell:
 | 
					class Shell:
 | 
				
			||||||
	def __init__(self):
 | 
						def __init__(self):
 | 
				
			||||||
		self._screen = wnck.screen_get_default()
 | 
							self._screen = wnck.screen_get_default()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def start(self):
 | 
						def start(self):
 | 
				
			||||||
		self._console = ConsoleLogger()
 | 
					 | 
				
			||||||
		keybindings.setup_global_keys(self._console.get_window(), self)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		log_writer = LogWriter("Shell", False)
 | 
							log_writer = LogWriter("Shell", False)
 | 
				
			||||||
		log_writer.start()
 | 
							log_writer.start()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -55,16 +62,10 @@ class Shell:
 | 
				
			|||||||
		self._registry.scan_directory(os.path.join(env.get_user_dir(), 'activities'))
 | 
							self._registry.scan_directory(os.path.join(env.get_user_dir(), 'activities'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		self._home_window = HomeWindow(self)
 | 
							self._home_window = HomeWindow(self)
 | 
				
			||||||
		keybindings.setup_global_keys(self._home_window, self)
 | 
					 | 
				
			||||||
		self._home_window.show()
 | 
							self._home_window.show()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		self._people_windows = {}
 | 
							self._people_windows = {}
 | 
				
			||||||
 | 
							self._console_windows = {}
 | 
				
			||||||
	def _toggle_window_visibility(self, window):
 | 
					 | 
				
			||||||
		if window.get_property('visible'):
 | 
					 | 
				
			||||||
			window.hide()
 | 
					 | 
				
			||||||
		else:
 | 
					 | 
				
			||||||
			window.show()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def get_current_activity(self):
 | 
						def get_current_activity(self):
 | 
				
			||||||
		window = self._screen.get_active_window()
 | 
							window = self._screen.get_active_window()
 | 
				
			||||||
@ -73,25 +74,34 @@ class Shell:
 | 
				
			|||||||
		else:
 | 
							else:
 | 
				
			||||||
			return None
 | 
								return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def __people_dialog_delete_cb(self, window, event):
 | 
					 | 
				
			||||||
		window.hide()
 | 
					 | 
				
			||||||
		return True
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	def show_people(self):
 | 
						def show_people(self):
 | 
				
			||||||
		activity = self.get_current_activity()
 | 
							activity = self.get_current_activity()
 | 
				
			||||||
		if activity:
 | 
							if activity:
 | 
				
			||||||
			if not self._people_windows.has_key(activity.get_id()):
 | 
								if not self._people_windows.has_key(activity.get_id()):
 | 
				
			||||||
				dialog = PeopleWindow(self, activity)
 | 
									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
 | 
									self._people_windows[activity.get_id()] = dialog
 | 
				
			||||||
			else:
 | 
								else:
 | 
				
			||||||
				dialog = self._people_windows[activity.get_id()]
 | 
									dialog = self._people_windows[activity.get_id()]
 | 
				
			||||||
 | 
					 | 
				
			||||||
			activity.show_dialog(dialog)
 | 
								activity.show_dialog(dialog)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def toggle_console(self):
 | 
						def get_console(self, module_id):
 | 
				
			||||||
		self._toggle_window_visibility(self._console.get_window())
 | 
							if not self._console_windows.has_key(module_id):
 | 
				
			||||||
 | 
								dialog = ConsoleWindow()
 | 
				
			||||||
 | 
								self._console_windows[module_id] = dialog
 | 
				
			||||||
 | 
							else:
 | 
				
			||||||
 | 
								dialog = self._console_windows[module_id]
 | 
				
			||||||
 | 
							return dialog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						def show_console(self):
 | 
				
			||||||
 | 
							activity = self.get_current_activity()
 | 
				
			||||||
 | 
							if activity:
 | 
				
			||||||
 | 
								module = self._registry.get_activity(activity.get_default_type())
 | 
				
			||||||
 | 
								console = self.get_console(module.get_id())
 | 
				
			||||||
 | 
								activity.show_dialog(console)
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						def log(self, module_id, message):
 | 
				
			||||||
 | 
							console = self.get_console(module_id)
 | 
				
			||||||
 | 
							console.log(message)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def get_registry(self):
 | 
						def get_registry(self):
 | 
				
			||||||
		return self._registry
 | 
							return self._registry
 | 
				
			||||||
 | 
				
			|||||||
@ -7,4 +7,5 @@
 | 
				
			|||||||
<Alt>c=close
 | 
					<Alt>c=close
 | 
				
			||||||
f1=desktop
 | 
					f1=desktop
 | 
				
			||||||
f2=!sugar-people
 | 
					f2=!sugar-people
 | 
				
			||||||
 | 
					f3=!sugar-console
 | 
				
			||||||
f4=!sugar-activity org.sugar.Terminal
 | 
					f4=!sugar-activity org.sugar.Terminal
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										8
									
								
								shell/sugar-console
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										8
									
								
								shell/sugar-console
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/python
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import dbus
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bus = dbus.SessionBus()
 | 
				
			||||||
 | 
					proxy_obj = bus.get_object('com.redhat.Sugar.Shell', '/com/redhat/Sugar/Shell')
 | 
				
			||||||
 | 
					shell = dbus.Interface(proxy_obj, 'com.redhat.Sugar.Shell')
 | 
				
			||||||
 | 
					shell.show_console()
 | 
				
			||||||
@ -6,5 +6,3 @@ bus = dbus.SessionBus()
 | 
				
			|||||||
proxy_obj = bus.get_object('com.redhat.Sugar.Shell', '/com/redhat/Sugar/Shell')
 | 
					proxy_obj = bus.get_object('com.redhat.Sugar.Shell', '/com/redhat/Sugar/Shell')
 | 
				
			||||||
shell = dbus.Interface(proxy_obj, 'com.redhat.Sugar.Shell')
 | 
					shell = dbus.Interface(proxy_obj, 'com.redhat.Sugar.Shell')
 | 
				
			||||||
shell.show_people()
 | 
					shell.show_people()
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -11,8 +11,8 @@ class LogWriter:
 | 
				
			|||||||
		self._use_console = use_console
 | 
							self._use_console = use_console
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		bus = dbus.SessionBus()
 | 
							bus = dbus.SessionBus()
 | 
				
			||||||
		proxy_obj = bus.get_object('com.redhat.Sugar.Logger', '/com/redhat/Sugar/Logger')
 | 
							proxy_obj = bus.get_object('com.redhat.Sugar.Shell', '/com/redhat/Sugar/Shell')
 | 
				
			||||||
		self._logger = dbus.Interface(proxy_obj, 'com.redhat.Sugar.Logger')
 | 
							self._logger = dbus.Interface(proxy_obj, 'com.redhat.Sugar.Shell')
 | 
				
			||||||
			
 | 
								
 | 
				
			||||||
	def start(self):
 | 
						def start(self):
 | 
				
			||||||
		if self._use_console:
 | 
							if self._use_console:
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,6 @@ import gtk
 | 
				
			|||||||
import gobject
 | 
					import gobject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from sugar.LogWriter import LogWriter
 | 
					from sugar.LogWriter import LogWriter
 | 
				
			||||||
from sugar import keybindings
 | 
					 | 
				
			||||||
import sugar.util
 | 
					import sugar.util
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ACTIVITY_SERVICE_NAME = "com.redhat.Sugar.Activity"
 | 
					ACTIVITY_SERVICE_NAME = "com.redhat.Sugar.Activity"
 | 
				
			||||||
@ -129,6 +128,12 @@ class ActivityDbusService(dbus.service.Object):
 | 
				
			|||||||
		"""Get the activity identifier"""
 | 
							"""Get the activity identifier"""
 | 
				
			||||||
		return self._activity.get_id()
 | 
							return self._activity.get_id()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@dbus.service.method(ACTIVITY_SERVICE_NAME)
 | 
				
			||||||
 | 
						def get_default_type(self):
 | 
				
			||||||
 | 
							"""Get the activity default type"""
 | 
				
			||||||
 | 
							return self._activity.get_default_type()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@dbus.service.method(ACTIVITY_SERVICE_NAME)
 | 
						@dbus.service.method(ACTIVITY_SERVICE_NAME)
 | 
				
			||||||
	def get_shared(self):
 | 
						def get_shared(self):
 | 
				
			||||||
		"""Get the activity identifier"""
 | 
							"""Get the activity identifier"""
 | 
				
			||||||
@ -152,8 +157,6 @@ class Activity(gtk.Window):
 | 
				
			|||||||
		self._activity_object = None
 | 
							self._activity_object = None
 | 
				
			||||||
		self._default_type = None
 | 
							self._default_type = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		keybindings.setup_global_keys(self)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		self.connect('realize', self.__realize)
 | 
							self.connect('realize', self.__realize)
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		self.present()
 | 
							self.present()
 | 
				
			||||||
 | 
				
			|||||||
@ -1,17 +0,0 @@
 | 
				
			|||||||
import gtk
 | 
					 | 
				
			||||||
import dbus
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# FIXME These should be handled by the wm, but it's incovenient
 | 
					 | 
				
			||||||
# to do that with matchbox at the moment
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def setup_global_keys(window, shell = None):
 | 
					 | 
				
			||||||
	if not shell:
 | 
					 | 
				
			||||||
		bus = dbus.SessionBus()
 | 
					 | 
				
			||||||
		proxy_obj = bus.get_object('com.redhat.Sugar.Shell', '/com/redhat/Sugar/Shell')
 | 
					 | 
				
			||||||
		shell = dbus.Interface(proxy_obj, 'com.redhat.Sugar.Shell')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	window.connect("key-press-event", __key_press_event_cb, shell)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def __key_press_event_cb(window, event, shell):
 | 
					 | 
				
			||||||
	if event.keyval == gtk.keysyms.F3:
 | 
					 | 
				
			||||||
		shell.toggle_console()
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user