Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
crossover / opt / cxoffice / lib / python / cheatconsole.py
Size: Mime:
# (c) Copyright 2009-2015. CodeWeavers, Inc.

import code
import sys

import gtk
import gobject

import cxlog

import cxguitools

class CheatConsole(gtk.Window):
    def on_keypress(self, _widget, event):
        if gtk.gdk.keyval_name(event.keyval) == 'Return':
            line = self.input.get_text()
            self.input.set_text('')
            self.write('>>> %s\n' % line)
            self.console.push(line)
            return True
        return False

    def __init__(self):
        gtk.Window.__init__(self)

        self.vbox = gtk.VBox()
        self.add(self.vbox)

        self.output = gtk.TextView()
        self.vbox.pack_start(self.output, expand=True)
        self.output.set_size_request(0, 0) # size is set by parent
        self.output.set_wrap_mode(gtk.WRAP_WORD_CHAR)
        self.output.set_editable(False)

        self.input = gtk.Entry()
        self.vbox.pack_start(self.input, expand=False)
        self.input.connect('key-press-event', self.on_keypress)

        self.console = code.InteractiveConsole()
        sys.stdout = self
        sys.stderr = self

        self.set_title("Cheat console")
        self.set_default_size(800, 600)
        self.show_all()

        self.connect('destroy', self.on_destroy)

    def on_destroy(self, _widget):
        # pylint: disable=R0201
        cxguitools.toplevel_quit()

    def scroll_to_end(self):
        buf = self.output.get_buffer()
        end = buf.get_end_iter()
        self.output.scroll_to_iter(end, 0.0)

    def write(self, text):
        buf = self.output.get_buffer()
        end = buf.get_end_iter()
        buf.insert(end, text)
        gobject.idle_add(self.scroll_to_end)

def show_console():
    # pylint: disable=W0601
    global console
    try:
        # pylint: disable=W0104
        console
    except NameError:
        console = CheatConsole()

_CHEAT_SEQUENCE = ('Up', 'Up', 'Down', 'Down', 'Left', 'Right', 'Left', 'Right', 'B', 'A')
_LAST_KEYS = []

# evil hack to get the appropriate keypress events

def _event_handler(event, *_args):
    # pylint: disable=W0702
    try:
        if event.type == gtk.gdk.KEY_PRESS:
            _LAST_KEYS.append(gtk.gdk.keyval_name(event.keyval))
            while len(_LAST_KEYS) > len(_CHEAT_SEQUENCE):
                _LAST_KEYS.pop(0)
            if tuple(_LAST_KEYS) == _CHEAT_SEQUENCE:
                try:
                    gobject.idle_add(show_console)
                except:
                    import traceback
                    traceback.print_exc()
    # pylint: disable=W0704
    except:
        pass
    return gtk.main_do_event(event)

try:
    gtk.gdk.event_handler_set(_event_handler)
except:
    cxlog.log("could not install the gtk event handler")