~justin-fathomdb/nova/justinsb-openstack-api-volumes

« back to all changes in this revision

Viewing changes to vendor/Twisted-10.0.0/twisted/conch/insults/client.py

  • Committer: Jesse Andrews
  • Date: 2010-05-28 06:05:26 UTC
  • Revision ID: git-v1:bf6e6e718cdc7488e2da87b21e258ccc065fe499
initial commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
"""
 
2
You don't really want to use this module. Try insults.py instead.
 
3
"""
 
4
 
 
5
from twisted.internet import protocol
 
6
 
 
7
class InsultsClient(protocol.Protocol):
 
8
 
 
9
    escapeTimeout = 0.2
 
10
 
 
11
    def __init__(self):
 
12
        self.width = self.height = None
 
13
        self.xpos = self.ypos = 0
 
14
        self.commandQueue = []
 
15
        self.inEscape = ''
 
16
 
 
17
    def setSize(self, width, height):
 
18
        call = 0
 
19
        if self.width:
 
20
            call = 1
 
21
        self.width = width
 
22
        self.height = height
 
23
        if call:
 
24
            self.windowSizeChanged()
 
25
 
 
26
    def dataReceived(self, data):
 
27
        from twisted.internet import reactor
 
28
        for ch in data:
 
29
            if ch == '\x1b':
 
30
                if self.inEscape:
 
31
                    self.keyReceived(ch)
 
32
                    self.inEscape = ''
 
33
                else:
 
34
                    self.inEscape = ch
 
35
                    self.escapeCall = reactor.callLater(self.escapeTimeout,
 
36
                                                        self.endEscape)
 
37
            elif ch in 'ABCD' and self.inEscape:
 
38
                self.inEscape = ''
 
39
                self.escapeCall.cancel()
 
40
                if ch == 'A':
 
41
                    self.keyReceived('<Up>')
 
42
                elif ch == 'B':
 
43
                    self.keyReceived('<Down>')
 
44
                elif ch == 'C':
 
45
                    self.keyReceived('<Right>')
 
46
                elif ch == 'D':
 
47
                    self.keyReceived('<Left>')
 
48
            elif self.inEscape:
 
49
                self.inEscape += ch
 
50
            else:
 
51
                self.keyReceived(ch)
 
52
 
 
53
    def endEscape(self):
 
54
        ch = self.inEscape
 
55
        self.inEscape = ''
 
56
        self.keyReceived(ch)
 
57
 
 
58
    def initScreen(self):
 
59
        self.transport.write('\x1b=\x1b[?1h')
 
60
 
 
61
    def gotoXY(self, x, y):
 
62
        """Go to a position on the screen.
 
63
        """
 
64
        self.xpos = x
 
65
        self.ypos = y
 
66
        self.commandQueue.append(('gotoxy', x, y))
 
67
 
 
68
    def writeCh(self, ch):
 
69
        """Write a character to the screen.  If we're at the end of the row,
 
70
        ignore the write.
 
71
        """
 
72
        if self.xpos < self.width - 1:
 
73
            self.commandQueue.append(('write', ch))
 
74
            self.xpos += 1
 
75
 
 
76
    def writeStr(self, s):
 
77
        """Write a string to the screen.  This does not wrap a the edge of the
 
78
        screen, and stops at \\r and \\n.
 
79
        """
 
80
        s = s[:self.width-self.xpos]
 
81
        if '\n' in s:
 
82
            s=s[:s.find('\n')]
 
83
        if '\r' in s:
 
84
            s=s[:s.find('\r')]
 
85
        self.commandQueue.append(('write', s))
 
86
        self.xpos += len(s)
 
87
 
 
88
    def eraseToLine(self):
 
89
        """Erase from the current position to the end of the line.
 
90
        """
 
91
        self.commandQueue.append(('eraseeol',))
 
92
 
 
93
    def eraseToScreen(self):
 
94
        """Erase from the current position to the end of the screen.
 
95
        """
 
96
        self.commandQueue.append(('eraseeos',))
 
97
    
 
98
    def clearScreen(self):
 
99
        """Clear the screen, and return the cursor to 0, 0.
 
100
        """
 
101
        self.commandQueue = [('cls',)]
 
102
        self.xpos = self.ypos = 0
 
103
 
 
104
    def setAttributes(self, *attrs):
 
105
        """Set the attributes for drawing on the screen.
 
106
        """
 
107
        self.commandQueue.append(('attributes', attrs))
 
108
 
 
109
    def refresh(self):
 
110
        """Redraw the screen.
 
111
        """
 
112
        redraw = ''
 
113
        for command in self.commandQueue:
 
114
            if command[0] == 'gotoxy':
 
115
                redraw += '\x1b[%i;%iH' % (command[2]+1, command[1]+1)
 
116
            elif command[0] == 'write':
 
117
                redraw += command[1]
 
118
            elif command[0] == 'eraseeol':
 
119
                redraw += '\x1b[0K'
 
120
            elif command[0] == 'eraseeos':
 
121
                redraw += '\x1b[OJ'
 
122
            elif command[0] == 'cls':
 
123
                redraw += '\x1b[H\x1b[J'
 
124
            elif command[0] == 'attributes':
 
125
                redraw += '\x1b[%sm' % ';'.join(map(str, command[1]))
 
126
            else:
 
127
                print command
 
128
        self.commandQueue = []
 
129
        self.transport.write(redraw)
 
130
 
 
131
    def windowSizeChanged(self):
 
132
        """Called when the size of the window changes.
 
133
        Might want to redraw the screen here, or something.
 
134
        """
 
135
 
 
136
    def keyReceived(self, key):
 
137
        """Called when the user hits a key.
 
138
        """