1
# Xlib.ext.record -- RECORD extension module
3
# Copyright (C) 2006 Alex Badea <vamposdecampos@gmail.com>
5
# This program is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 2 of the License, or
8
# (at your option) any later version.
10
# This program is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
# GNU General Public License for more details.
15
# You should have received a copy of the GNU General Public License
16
# along with this program; if not, write to the Free Software
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
from Xlib.protocol import rq
26
FromClientSequence = 0x04
39
Record_Range8 = rq.Struct(
42
Record_Range16 = rq.Struct(
45
Record_ExtRange = rq.Struct(
46
rq.Object('major_range', Record_Range8),
47
rq.Object('minor_range', Record_Range16))
48
Record_Range = rq.Struct(
49
rq.Object('core_requests', Record_Range8),
50
rq.Object('core_replies', Record_Range8),
51
rq.Object('ext_requests', Record_ExtRange),
52
rq.Object('ext_replies', Record_ExtRange),
53
rq.Object('delivered_events', Record_Range8),
54
rq.Object('device_events', Record_Range8),
55
rq.Object('errors', Record_Range8),
56
rq.Bool('client_started'),
57
rq.Bool('client_died'))
59
Record_ClientInfo = rq.Struct(
60
rq.Card32('client_resource'),
61
rq.LengthOf('ranges', 4),
62
rq.List('ranges', Record_Range))
65
class RawField(rq.ValueField):
66
"""A field with raw data, stored as a string"""
70
def pack_value(self, val):
71
return val, len(val), None
73
def parse_binary_value(self, data, display, length, format):
77
class GetVersion(rq.ReplyRequest):
82
rq.Card16('major_version'),
83
rq.Card16('minor_version'))
86
rq.Card16('sequence_number'),
88
rq.Card16('major_version'),
89
rq.Card16('minor_version'),
92
def get_version(self, major, minor):
94
display = self.display,
95
opcode = self.display.get_extension_major(extname),
96
major_version = major,
97
minor_version = minor)
100
class CreateContext(rq.Request):
101
_request = rq.Struct(
105
rq.Card32('context'), # Record_RC
106
rq.Card8('element_header'), # Record_Element_Header
108
rq.LengthOf('clients', 4),
109
rq.LengthOf('ranges', 4),
110
rq.List('clients', rq.Card32Obj),
111
rq.List('ranges', Record_Range))
113
def create_context(self, datum_flags, clients, ranges):
114
context = self.display.allocate_resource_id()
116
display = self.display,
117
opcode = self.display.get_extension_major(extname),
119
element_header = datum_flags,
125
class RegisterClients(rq.Request):
126
_request = rq.Struct(
130
rq.Card32('context'), # Record_RC
131
rq.Card8('element_header'), # Record_Element_Header
133
rq.LengthOf('clients', 4),
134
rq.LengthOf('ranges', 4),
135
rq.List('clients', rq.Card32Obj),
136
rq.List('ranges', Record_Range))
138
def register_clients(self, context, element_header, clients, ranges):
140
display = self.display,
141
opcode = self.display.get_extension_major(extname),
143
element_header = element_header,
148
class UnregisterClients(rq.Request):
149
_request = rq.Struct(
153
rq.Card32('context'), # Record_RC
154
rq.LengthOf('clients', 4),
155
rq.List('clients', rq.Card32Obj))
157
def unregister_clients(self, context, clients):
159
display = self.display,
160
opcode = self.display.get_extension_major(extname),
165
class GetContext(rq.ReplyRequest):
166
_request = rq.Struct(
170
rq.Card32('context')) # Record_RC
173
rq.Card16('sequence_number'),
175
rq.Card8('element_header'), # Record_Element_Header
177
rq.LengthOf('client_info', 4),
179
rq.List('client_info', Record_ClientInfo))
181
def get_context(self, context):
183
display = self.display,
184
opcode = self.display.get_extension_major(extname),
188
class EnableContext(rq.ReplyRequest):
189
_request = rq.Struct(
193
rq.Card32('context')) # Record_RC
196
rq.Card8('category'),
197
rq.Card16('sequence_number'),
199
rq.Card8('element_header'), # Record_Element_Header
200
rq.Bool('client_swapped'),
202
rq.Card32('id_base'), # Record_XIDBase
203
rq.Card32('server_time'),
204
rq.Card32('recorded_sequence_number'),
208
# This request receives multiple responses, so we need to keep
209
# ourselves in the 'sent_requests' list in order to receive them all.
211
# See the discussion on ListFonstsWithInfo in request.py
213
def __init__(self, callback, *args, **keys):
214
self._callback = callback
215
apply(rq.ReplyRequest.__init__, (self, ) + args, keys)
217
def _parse_response(self, data):
218
r, d = self._reply.parse_binary(data, self._display)
221
if r.category == StartOfData:
222
# Hack ourselves a sequence number, used by the code in
223
# Xlib.protocol.display.Display.parse_request_response()
224
self.sequence_number = r.sequence_number
226
if r.category == EndOfData:
227
self._response_lock.acquire()
229
self._response_lock.release()
231
self._display.sent_requests.insert(0, self)
233
def enable_context(self, context, callback):
236
display = self.display,
237
opcode = self.display.get_extension_major(extname),
241
class DisableContext(rq.Request):
242
_request = rq.Struct(
246
rq.Card32('context')) # Record_RC
248
def disable_context(self, context):
250
display = self.display,
251
opcode = self.display.get_extension_major(extname),
255
class FreeContext(rq.Request):
256
_request = rq.Struct(
260
rq.Card32('context')) # Record_RC
262
def free_context(self, context):
264
display = self.display,
265
opcode = self.display.get_extension_major(extname),
267
self.display.free_resource_id(context)
270
def init(disp, info):
271
disp.extension_add_method('display', 'record_get_version', get_version)
272
disp.extension_add_method('display', 'record_create_context', create_context)
273
disp.extension_add_method('display', 'record_register_clients', register_clients)
274
disp.extension_add_method('display', 'record_unregister_clients', unregister_clients)
275
disp.extension_add_method('display', 'record_get_context', get_context)
276
disp.extension_add_method('display', 'record_enable_context', enable_context)
277
disp.extension_add_method('display', 'record_disable_context', disable_context)
278
disp.extension_add_method('display', 'record_free_context', free_context)