Spaces:
Runtime error
Runtime error
| # Xlib.ext.ge -- Generic Event extension module | |
| # | |
| # Copyright (C) 2012 Outpost Embedded, LLC | |
| # Forest Bond <forest.bond@rapidrollout.com> | |
| # | |
| # This library is free software; you can redistribute it and/or | |
| # modify it under the terms of the GNU Lesser General Public License | |
| # as published by the Free Software Foundation; either version 2.1 | |
| # of the License, or (at your option) any later version. | |
| # | |
| # This library is distributed in the hope that it will be useful, | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
| # See the GNU Lesser General Public License for more details. | |
| # | |
| # You should have received a copy of the GNU Lesser General Public | |
| # License along with this library; if not, write to the | |
| # Free Software Foundation, Inc., | |
| # 59 Temple Place, | |
| # Suite 330, | |
| # Boston, MA 02111-1307 USA | |
| ''' | |
| ge - Generic Event Extension | |
| ''' | |
| from Xlib.protocol import rq | |
| extname = 'Generic Event Extension' | |
| GenericEventCode = 35 | |
| class GEQueryVersion(rq.ReplyRequest): | |
| _request = rq.Struct( | |
| rq.Card8('opcode'), | |
| rq.Opcode(0), | |
| rq.RequestLength(), | |
| rq.Card32('major_version'), | |
| rq.Card32('minor_version'), | |
| ) | |
| _reply = rq.Struct( | |
| rq.ReplyCode(), | |
| rq.Pad(1), | |
| rq.Card16('sequence_number'), | |
| rq.ReplyLength(), | |
| rq.Card32('major_version'), | |
| rq.Card32('minor_version'), | |
| rq.Pad(16), | |
| ) | |
| def query_version(self): | |
| return GEQueryVersion( | |
| display=self.display, | |
| opcode=self.display.get_extension_major(extname), | |
| major_version=1, | |
| minor_version=0, | |
| ) | |
| class GenericEvent(rq.Event): | |
| _code = GenericEventCode | |
| _fields = rq.Struct( | |
| rq.Card8('type'), | |
| rq.Card8('extension'), | |
| rq.Card16('sequence_number'), | |
| rq.Card32('length'), | |
| rq.Card16('evtype'), | |
| # Some generic events make use of this space, but with | |
| # others the data is simply discarded. In any case we | |
| # don't need to explicitly pad this out as we are | |
| # always given at least 32 bytes and we save | |
| # everything after the first ten as the "data" field. | |
| #rq.Pad(22), | |
| ) | |
| def __init__(self, binarydata = None, display = None, **keys): | |
| if binarydata: | |
| data = binarydata[10:] | |
| binarydata = binarydata[:10] | |
| else: | |
| data = '' | |
| rq.Event.__init__( | |
| self, | |
| binarydata=binarydata, | |
| display=display, | |
| **keys | |
| ) | |
| if display: | |
| ge_event_data = getattr(display, 'ge_event_data', None) | |
| if ge_event_data: | |
| estruct = ge_event_data.get((self.extension, self.evtype), None) | |
| if estruct: | |
| data, _ = estruct.parse_binary(data, display) | |
| self._data['data'] = data | |
| def add_event_data(self, extension, evtype, estruct): | |
| if not hasattr(self.display, 'ge_event_data'): | |
| self.display.ge_event_data = {} | |
| self.display.ge_event_data[(extension, evtype)] = estruct | |
| def init(disp, info): | |
| disp.extension_add_method('display', 'ge_query_version', query_version) | |
| disp.extension_add_method('display', 'ge_add_event_data', add_event_data) | |
| disp.extension_add_event(GenericEventCode, GenericEvent) | |