/
test_client.py
executable file
·119 lines (102 loc) · 2.94 KB
/
test_client.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#! /usr/bin/python
# Test program for client APIs.
import time
import os
import sys
import select
import glib
import termios
import tty
import ibus
from ibus import keysyms
from ibus import modifier
class DemoTerm:
def __init__(self):
self.__term_old = termios.tcgetattr(0)
tty.setraw(0)
self.__bus = ibus.Bus()
self.__ic = self.__bus.create_input_context("DemoTerm")
self.__bus.set_capabilities(self.__ic, 7)
self.__bus.connect("commit-string", self.__commit_string_cb)
self.__bus.connect("update-preedit", self.__update_preedit_cb)
self.__bus.connect("show-preedit", self.__show_preedit_cb)
self.__bus.connect("hide-preedit", self.__hide_preedit_cb)
self.__bus.connect("update-lookup-table", self.__update_lookup_table_cb)
self.__bus.connect("show-lookup-table", self.__show_lookup_table_cb)
self.__bus.connect("hide-lookup-table", self.__hide_lookup_table_cb)
glib.io_add_watch(0, glib.IO_IN, self.__stdin_cb)
# self.__master_fd, self.__slave_fd = os.openpty()
# self.__run_shell()
def __stdin_cb(self, fd, condition):
c = ord(os.read(0, 1))
if c == 3:
self.__loop.quit()
try:
if c == 22: # Ctrl + V => Ctrl + space
retval = self.__bus.process_key_event(self.__ic,
keysyms.space, True, modifier.CONTROL_MASK)
elif c == 127: # BackSpace
self.__bus.process_key_event(self.__ic,
keysyms.BackSpace, True, 0)
retval = True
else:
retval = self.__bus.process_key_event(self.__ic, c, True, 0)
except:
retval = False
if retval == False:
os.write(1, chr(c))
return True
def __commit_string_cb(self, bus, ic, text):
print "commit: %s\r" % text
def __update_preedit_cb(self, bus, ic, text, attrs, cursor_pos, visible):
if visible:
print "preedit: %s\r" % text
else:
print "preedit:\r"
def __show_preedit_cb(self, bus, ic):
print "preedit show\r"
def __hide_preedit_cb(self, bus, ic):
print "preedit hide\r"
def __update_lookup_table_cb(self, bus, ic, lookup_table, visible):
if visible:
candidates = lookup_table.get_canidates_in_current_page()
i = 1
line = u"lookup table:"
for c in candidates:
line += " %d.%s" % (i, c[0])
i += 1
print line, "\r"
else:
print "lookup table:\r"
def __show_lookup_table_cb(self, bus, ic):
print "lookup table show\r"
def __hide_lookup_table_cb(self, bus, ic):
print "lookup table hide\r"
def __run_shell(self):
pid = os.fork()
if pid == 0: # child
os.close(0)
os.close(1)
os.close(2)
os.close(self.__master_fd)
os.dup2(self.__slave_fd, 0)
os.dup2(self.__slave_fd, 1)
os.dup2(self.__slave_fd, 2)
os.close(self.__slave_fd)
os.execv('/bin/bash', ["bash"])
os.exit(1)
def run(self):
self.__loop = glib.MainLoop()
self.__loop.run()
def close(self):
termios.tcsetattr(0, termios.TCSAFLUSH, self.__term_old)
def main():
term = DemoTerm()
try:
term.run()
except:
import traceback
traceback.print_exc()
term.close()
if __name__ == "__main__":
main()