Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Pesenti Gritti <marco@localhost.localdomain>2006-08-11 13:21:11 (GMT)
committer Marco Pesenti Gritti <marco@localhost.localdomain>2006-08-11 13:21:11 (GMT)
commit884eef4bd52a33d13a1c509bf004842fa7b58652 (patch)
tree7e22f60ebdf97599ba247a79df3f097edd0e8f64
parent628271959c97c49b64ed16203a5d8a2d0202ede7 (diff)
Show all activities output in the console, just
activate the tab for the current activity.
-rw-r--r--shell/ConsoleWindow.py57
-rwxr-xr-xshell/Shell.py27
-rw-r--r--sugar/logger.py21
3 files changed, 70 insertions, 35 deletions
diff --git a/shell/ConsoleWindow.py b/shell/ConsoleWindow.py
index b5d977e..e9a2563 100644
--- a/shell/ConsoleWindow.py
+++ b/shell/ConsoleWindow.py
@@ -1,5 +1,20 @@
import gtk
+class Console(gtk.ScrolledWindow):
+ def __init__(self):
+ gtk.ScrolledWindow.__init__(self)
+ self.set_policy(gtk.POLICY_AUTOMATIC,
+ gtk.POLICY_AUTOMATIC)
+
+ self._textview = gtk.TextView()
+ self._textview.set_wrap_mode(gtk.WRAP_WORD)
+ self.add(self._textview)
+ self._textview.show()
+
+ def log(self, message):
+ buf = self._textview.get_buffer()
+ buf.insert(buf.get_end_iter(), message)
+
class ConsoleWindow(gtk.Window):
def __init__(self):
gtk.Window.__init__(self)
@@ -9,18 +24,32 @@ class ConsoleWindow(gtk.Window):
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()
+ self._nb = gtk.Notebook()
+ self.add(self._nb)
+ self._nb.show()
- def log(self, message):
- buf = self._console.get_buffer()
- buf.insert(buf.get_end_iter(), message)
+ self._consoles = {}
+
+ def _add_console(self, page_id):
+ console = Console()
+ page = self._nb.append_page(console, gtk.Label(page_id))
+ console.show()
+
+ self._consoles[page_id] = console
+
+ return console
+
+ def _get_console(self, page_id):
+ if not self._consoles.has_key(page_id):
+ console = self._add_console(page_id)
+ else:
+ console = self._consoles[page_id]
+ return console
+
+ def set_page(self, page_id):
+ page = self._nb.page_num(self._consoles[page_id])
+ self._nb.set_current_page(page)
+
+ def log(self, page_id, message):
+ console = self._get_console(page_id)
+ console.log(message)
diff --git a/shell/Shell.py b/shell/Shell.py
index b142963..9c87a25 100755
--- a/shell/Shell.py
+++ b/shell/Shell.py
@@ -31,9 +31,6 @@ class ShellDbusService(dbus.service.Object):
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')
def show_people(self):
gobject.idle_add(self.__show_people_idle)
@@ -44,7 +41,7 @@ class ShellDbusService(dbus.service.Object):
@dbus.service.method('com.redhat.Sugar.Shell')
def log(self, module_id, message):
- gobject.idle_add(self.__log_idle, (module_id, message))
+ self._shell.log(module_id, message)
class Shell(gobject.GObject):
__gsignals__ = {
@@ -57,13 +54,14 @@ class Shell(gobject.GObject):
self._screen = wnck.screen_get_default()
self._registry = registry
self._hosts = {}
- self._console_windows = {}
def start(self):
session_bus = dbus.SessionBus()
bus_name = dbus.service.BusName('com.redhat.Sugar.Shell', bus=session_bus)
ShellDbusService(self, bus_name)
+ self._console = ConsoleWindow()
+
sugar.logger.start('Shell', self)
self._owner = ShellOwner()
@@ -118,23 +116,13 @@ class Shell(gobject.GObject):
activity = self.get_current_activity()
activity.show_people()
- def get_console(self, module_id):
- 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):
+ self._console.show()
+
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)
- else:
- console = self.get_console('Shell')
- console.show()
+ self._console.set_page(module.get_id())
def join_activity(self, service):
info = self._registry.get_activity(service.get_type())
@@ -164,8 +152,7 @@ class Shell(gobject.GObject):
return None
def log(self, module_id, message):
- console = self.get_console(module_id)
- console.log(message)
+ self._console.log(module_id, message)
def get_registry(self):
return self._registry
diff --git a/sugar/logger.py b/sugar/logger.py
index 54cb15b..df5aebd 100644
--- a/sugar/logger.py
+++ b/sugar/logger.py
@@ -1,8 +1,14 @@
+import sys
import logging
+import traceback
+from cStringIO import StringIO
import dbus
import gobject
+__sugar_shell = None
+__console_id = None
+
class Handler(logging.Handler):
def __init__(self, shell, console_id):
logging.Handler.__init__(self)
@@ -13,8 +19,8 @@ class Handler(logging.Handler):
def _log(self):
for message in self._messages:
- # FIXME use a single dbus call
self._shell.log(self._console_id, message)
+ self._messages = []
return False
def emit(self, record):
@@ -22,6 +28,12 @@ class Handler(logging.Handler):
if len(self._messages) == 1:
gobject.idle_add(self._log)
+def __exception_handler(typ, exc, tb):
+ trace = StringIO()
+ traceback.print_exception(typ, exc, tb, None, trace)
+
+ __sugar_shell.log(__console_id, trace.getvalue())
+
def start(console_id, shell = None):
root_logger = logging.getLogger('')
root_logger.setLevel(logging.DEBUG)
@@ -32,3 +44,10 @@ def start(console_id, shell = None):
shell = dbus.Interface(proxy_obj, 'com.redhat.Sugar.Shell')
root_logger.addHandler(Handler(shell, console_id))
+
+ global __sugar_shell
+ global __console_id
+
+ __sugar_shell = shell
+ __console_id = console_id
+ sys.excepthook = __exception_handler