tracelog.py
author Germán Póo-Caamaño <gpoo@calcifer.org>
Sun, 20 Jul 2008 09:40:32 -0400
changeset 1180 1c95c2301e5f
parent 1161 fa4bb5ff5dee
permissions -rw-r--r--
nautilus: fix actions when the menu is invoked outside a repository
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1159
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     1
#
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     2
# A PyGtk-based Python Trace Collector window
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     3
#
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     4
# Copyright (C) 2007 TK Soh <teekaysoh@gmail.com>
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     5
#
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     6
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     7
import pygtk
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     8
pygtk.require("2.0")
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     9
import gtk
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    10
import gobject
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    11
import pango
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    12
import threading
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    13
import Queue
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    14
import win32trace
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    15
1160
9557254e63ce tracelog: fix hglib import issue
TK Soh <teekaysoh@yahoo.com>
parents: 1159
diff changeset
    16
try:
9557254e63ce tracelog: fix hglib import issue
TK Soh <teekaysoh@yahoo.com>
parents: 1159
diff changeset
    17
    from hggtk.hglib import toutf
9557254e63ce tracelog: fix hglib import issue
TK Soh <teekaysoh@yahoo.com>
parents: 1159
diff changeset
    18
except ImportError:
1161
fa4bb5ff5dee tracelog: fallback to system encoding if hglib not available
TK Soh <teekaysoh@yahoo.com>
parents: 1160
diff changeset
    19
    import locale
fa4bb5ff5dee tracelog: fallback to system encoding if hglib not available
TK Soh <teekaysoh@yahoo.com>
parents: 1160
diff changeset
    20
    _encoding = locale.getpreferredencoding()
1160
9557254e63ce tracelog: fix hglib import issue
TK Soh <teekaysoh@yahoo.com>
parents: 1159
diff changeset
    21
    def toutf(s):
1161
fa4bb5ff5dee tracelog: fallback to system encoding if hglib not available
TK Soh <teekaysoh@yahoo.com>
parents: 1160
diff changeset
    22
        return s.decode(_encoding, 'replace').encode('utf-8')
1159
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    23
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    24
class TraceLog():
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    25
    def __init__(self):
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    26
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    27
        self.window.set_title("Python Trace Collector")
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    28
        
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    29
        # construct window
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    30
        self.window.set_default_size(700, 400)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    31
        self.main_area = gtk.VBox()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    32
        self.window.add(self.main_area)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    33
        
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    34
        # mimic standard dialog widgets
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    35
        self.action_area = gtk.HBox()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    36
        self.main_area.pack_end(self.action_area, False, False, 5)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    37
        sep = gtk.HSeparator()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    38
        self.main_area.pack_end(sep, False, False, 0)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    39
        self.vbox = gtk.VBox()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    40
        self.main_area.pack_end(self.vbox)        
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    41
        
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    42
        # add python trace ouput window
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    43
        scrolledwindow = gtk.ScrolledWindow()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    44
        scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    45
        self.textview = gtk.TextView(buffer=None)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    46
        self.textview.set_editable(False)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    47
        self.textview.modify_font(pango.FontDescription("Monospace"))
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    48
        scrolledwindow.add(self.textview)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    49
        self.textview.set_editable(False)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    50
        self.textbuffer = self.textview.get_buffer()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    51
        self.vbox.pack_start(scrolledwindow, True, True)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    52
        self.vbox.show_all()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    53
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    54
        # add buttons
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    55
        self._button_quit = gtk.Button("Quit")
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    56
        self._button_quit.connect('clicked', self._on_ok_clicked)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    57
        self.action_area.pack_end(self._button_quit, False, False, 5)        
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    58
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    59
        self._button_clear = gtk.Button("Clear")
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    60
        self._button_clear.connect('clicked', self._on_clear_clicked)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    61
        self.action_area.pack_end(self._button_clear, False, False, 5)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    62
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    63
        # add assorted window event handlers
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    64
        self.window.connect('map_event', self._on_window_map_event)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    65
        self.window.connect('delete_event', self._on_window_close_clicked)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    66
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    67
    def _on_ok_clicked(self, button):
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    68
        self._stop_read_thread()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    69
        gtk.main_quit()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    70
        
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    71
    def _on_clear_clicked(self, button):
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    72
        self.write("", False)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    73
        
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    74
    def _on_window_close_clicked(self, event, param):
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    75
        self._stop_read_thread()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    76
        gtk.main_quit()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    77
        
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    78
    def _on_window_map_event(self, event, param):
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    79
        self._begin_trace()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    80
    
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    81
    def _begin_trace(self):
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    82
        self.queue = Queue.Queue()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    83
        win32trace.InitRead()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    84
        self.write("Collecting Python Trace Output...\n")
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    85
        gobject.timeout_add(10, self._process_queue)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    86
        self._start_read_thread()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    87
        
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    88
    def _start_read_thread(self):
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    89
        self._read_trace = True
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    90
        self.thread1 = threading.Thread(target=self._do_read_trace)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    91
        self.thread1.start()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    92
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    93
    def _stop_read_thread(self):
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    94
        self._read_trace = False
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    95
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    96
        # wait for worker thread to to fix Unhandled exception in thread
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    97
        self.thread1.join() 
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    98
        
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    99
    def _process_queue(self):
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   100
        """
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   101
        Handle all the messages currently in the queue (if any).
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   102
        """
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   103
        while self.queue.qsize():
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   104
            try:
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   105
                msg = self.queue.get(0)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   106
                self.write(msg)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   107
            except Queue.Empty:
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   108
                pass
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   109
                
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   110
        return True
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   111
        
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   112
    def _do_read_trace(self):
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   113
        """
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   114
        print buffer collected in win32trace
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   115
        """
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   116
        while self._read_trace:
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   117
            msg = win32trace.read()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   118
            if msg:
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   119
                self.queue.put(msg)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   120
        
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   121
    def write(self, msg, append=True):
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   122
        msg = toutf(msg)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   123
        if append:
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   124
            enditer = self.textbuffer.get_end_iter()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   125
            self.textbuffer.insert(enditer, msg)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   126
        else:
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   127
            self.textbuffer.set_text(msg)
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   128
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   129
    def main(self):
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   130
        self.window.show_all()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   131
        gtk.main()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   132
        
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   133
def run():
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   134
    dlg = TraceLog()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   135
    dlg.main()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   136
    
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   137
if __name__ == "__main__":
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   138
    run()
d3567aa402ad hggtk: move tracelog to top directory
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   139