hggtk/hgcmd.py
author Steve Borho <steve@borho.org>
Wed, 02 Jan 2008 01:56:36 -0600
changeset 531 5c5f39324c00
parent 527 e0e4fa338fc4
child 566 7cba0c79391c
permissions -rw-r--r--
hggtk/hgcmd: cleaner method for closing dialog also fixes a long-standing copy-paste bug
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
171
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     1
#
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     2
# A simple dialog to execute random command for TortoiseHg
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     3
#
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     4
# Copyright (C) 2007 TK Soh <teekaysoh@gmail.com>
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     5
#
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     6
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     7
import pygtk
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     8
pygtk.require("2.0")
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
     9
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    10
import gtk
214
b2b08865b886 hggtk: use regular python thread to call popen in cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents: 171
diff changeset
    11
import gobject
171
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    12
import pango
269
41763e7da660 hggtk/cmd: run hg in unbuffered mode to display output a.s.a.p
TK Soh <teekaysoh@yahoo.com>
parents: 214
diff changeset
    13
import os
171
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    14
import threading
214
b2b08865b886 hggtk: use regular python thread to call popen in cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents: 171
diff changeset
    15
import Queue
404
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    16
from hglib import HgThread
455
1a562f070292 hggtk: set dialog icons
Steve Borho <steve@borho.org>
parents: 451
diff changeset
    17
from shlib import set_tortoise_icon
171
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    18
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    19
class CmdDialog(gtk.Dialog):
531
5c5f39324c00 hggtk/hgcmd: cleaner method for closing dialog
Steve Borho <steve@borho.org>
parents: 527
diff changeset
    20
    def __init__(self, cmdline, width=520, height=400):
404
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    21
        title = 'hg ' + ' '.join(cmdline[1:])
171
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    22
        gtk.Dialog.__init__(self,
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    23
                            title=title,
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    24
                            flags=gtk.DIALOG_MODAL, 
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    25
                            #buttons=(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    26
                            )
455
1a562f070292 hggtk: set dialog icons
Steve Borho <steve@borho.org>
parents: 451
diff changeset
    27
1a562f070292 hggtk: set dialog icons
Steve Borho <steve@borho.org>
parents: 451
diff changeset
    28
        set_tortoise_icon(self, 'hg.ico')
214
b2b08865b886 hggtk: use regular python thread to call popen in cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents: 171
diff changeset
    29
        self.cmdline = cmdline
b2b08865b886 hggtk: use regular python thread to call popen in cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents: 171
diff changeset
    30
171
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    31
        # construct dialog
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    32
        self.set_default_size(width, height)
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    33
        
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    34
        self._button_ok = gtk.Button("OK")
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    35
        self.action_area.pack_end(self._button_ok)
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    36
        
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    37
        scrolledwindow = gtk.ScrolledWindow()
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    38
        scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    39
        self.textview = gtk.TextView(buffer=None)
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    40
        self.textview.set_editable(False)
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    41
        self.textview.modify_font(pango.FontDescription("Monospace"))
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    42
        scrolledwindow.add(self.textview)
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    43
        self.textbuffer = self.textview.get_buffer()
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    44
        
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    45
        self.vbox.pack_start(scrolledwindow, True, True)
401
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
    46
        self.connect('map_event', self._on_window_map_event)
171
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    47
531
5c5f39324c00 hggtk/hgcmd: cleaner method for closing dialog
Steve Borho <steve@borho.org>
parents: 527
diff changeset
    48
        self._button_ok.connect('clicked', self._on_ok_clicked)
5c5f39324c00 hggtk/hgcmd: cleaner method for closing dialog
Steve Borho <steve@borho.org>
parents: 527
diff changeset
    49
        self.show_all()
171
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    50
531
5c5f39324c00 hggtk/hgcmd: cleaner method for closing dialog
Steve Borho <steve@borho.org>
parents: 527
diff changeset
    51
    def _on_ok_clicked(self, button):
5c5f39324c00 hggtk/hgcmd: cleaner method for closing dialog
Steve Borho <steve@borho.org>
parents: 527
diff changeset
    52
        """ Ok button clicked handler. """
214
b2b08865b886 hggtk: use regular python thread to call popen in cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents: 171
diff changeset
    53
        self.response(gtk.RESPONSE_ACCEPT)
171
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    54
        
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    55
    def _on_window_map_event(self, event, param):
404
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    56
        self.hgthread = HgThread(self.cmdline[1:])
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    57
        self.hgthread.start()
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    58
        self._button_ok.set_sensitive(False)
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    59
        gobject.timeout_add(10, self.process_queue)
171
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    60
    
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    61
    def write(self, msg, append=True):
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    62
        msg = unicode(msg, 'iso-8859-1')
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    63
        if append:
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    64
            enditer = self.textbuffer.get_end_iter()
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    65
            self.textbuffer.insert(enditer, msg)
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    66
        else:
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    67
            self.textbuffer.set_text(msg)
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    68
214
b2b08865b886 hggtk: use regular python thread to call popen in cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents: 171
diff changeset
    69
    def process_queue(self):
b2b08865b886 hggtk: use regular python thread to call popen in cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents: 171
diff changeset
    70
        """
b2b08865b886 hggtk: use regular python thread to call popen in cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents: 171
diff changeset
    71
        Handle all the messages currently in the queue (if any).
b2b08865b886 hggtk: use regular python thread to call popen in cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents: 171
diff changeset
    72
        """
527
e0e4fa338fc4 hggtk/hgthread: thread-safe dialog mechanism for GtkUi
Steve Borho <steve@borho.org>
parents: 483
diff changeset
    73
        self.hgthread.process_dialogs()
404
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    74
        enditer = self.textbuffer.get_end_iter()
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    75
        while self.hgthread.getqueue().qsize():
214
b2b08865b886 hggtk: use regular python thread to call popen in cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents: 171
diff changeset
    76
            try:
404
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    77
                msg = self.hgthread.getqueue().get(0)
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    78
                msg = unicode(msg, 'iso-8859-1')
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    79
                self.textbuffer.insert(enditer, msg)
214
b2b08865b886 hggtk: use regular python thread to call popen in cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents: 171
diff changeset
    80
            except Queue.Empty:
b2b08865b886 hggtk: use regular python thread to call popen in cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents: 171
diff changeset
    81
                pass
404
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    82
        if threading.activeCount() == 1:
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    83
            self._button_ok.set_sensitive(True)
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    84
            return False # Stop polling this function
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    85
        else:
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    86
            return True
171
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    87
404
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
    88
def run(cmdline=[], **opts):
531
5c5f39324c00 hggtk/hgcmd: cleaner method for closing dialog
Steve Borho <steve@borho.org>
parents: 527
diff changeset
    89
    dlg = CmdDialog(cmdline)
5c5f39324c00 hggtk/hgcmd: cleaner method for closing dialog
Steve Borho <steve@borho.org>
parents: 527
diff changeset
    90
    dlg.connect('response', gtk.main_quit)
401
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
    91
    dlg.show_all()
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
    92
    gtk.gdk.threads_init()
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
    93
    gtk.gdk.threads_enter()
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
    94
    gtk.main()
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
    95
    gtk.gdk.threads_leave()
171
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    96
    
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    97
if __name__ == "__main__":
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
    98
    import sys
401
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
    99
    opts = {}
404
92cbcf266f60 hggtk: switch hgcmd.py to HgThread
Steve Borho <steve@borho.org>
parents: 402
diff changeset
   100
    opts['cmdline'] = sys.argv
401
9ab309fbc25c hggtk: gtk threads and hgproc cleanup
Steve Borho <steve@borho.org>
parents: 395
diff changeset
   101
    run(**opts)
171
bff456eb53ee hggtk: add simple cmd dialog
TK Soh <teekaysoh@yahoo.com>
parents:
diff changeset
   102