Spaces:
Runtime error
Runtime error
| # Xlib.ext.xfixes -- XFIXES extension module | |
| # | |
| # Copyright (C) 2010-2011 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 | |
| ''' | |
| A partial implementation of the XFIXES extension. Only the HideCursor and | |
| ShowCursor requests and SelectionNotify events are provided. | |
| ''' | |
| from Xlib.protocol import rq | |
| extname = 'XFIXES' | |
| XFixesSelectionNotify = 0 | |
| XFixesCursorNotify = 1 | |
| XFixesSetSelectionOwnerNotifyMask = (1 << 0) | |
| XFixesSelectionWindowDestroyNotifyMask = (1 << 1) | |
| XFixesSelectionClientCloseNotifyMask = (1 << 2) | |
| XFixesDisplayCursorNotifyMask = (1 << 0) | |
| XFixesSetSelectionOwnerNotify = 0 | |
| XFixesSelectionWindowDestroyNotify = 1 | |
| XFixesSelectionClientCloseNotify = 2 | |
| XFixesDisplayCursorNotify = 0 | |
| class QueryVersion(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 QueryVersion(display=self.display, | |
| opcode=self.display.get_extension_major(extname), | |
| major_version=4, | |
| minor_version=0) | |
| class HideCursor(rq.Request): | |
| _request = rq.Struct(rq.Card8('opcode'), | |
| rq.Opcode(29), | |
| rq.RequestLength(), | |
| rq.Window('window') | |
| ) | |
| def hide_cursor(self): | |
| HideCursor(display=self.display, | |
| opcode=self.display.get_extension_major(extname), | |
| window=self) | |
| class ShowCursor(rq.Request): | |
| _request = rq.Struct(rq.Card8('opcode'), | |
| rq.Opcode(30), | |
| rq.RequestLength(), | |
| rq.Window('window') | |
| ) | |
| def show_cursor(self): | |
| ShowCursor(display=self.display, | |
| opcode=self.display.get_extension_major(extname), | |
| window=self) | |
| class SelectSelectionInput(rq.Request): | |
| _request = rq.Struct(rq.Card8('opcode'), | |
| rq.Opcode(2), | |
| rq.RequestLength(), | |
| rq.Window('window'), | |
| rq.Card32('selection'), | |
| rq.Card32('mask') | |
| ) | |
| def select_selection_input(self, window, selection, mask): | |
| return SelectSelectionInput(opcode=self.display.get_extension_major(extname), | |
| display=self.display, | |
| window=window, | |
| selection=selection, | |
| mask=mask) | |
| class SelectionNotify(rq.Event): | |
| _code = None | |
| _fields = rq.Struct(rq.Card8('type'), | |
| rq.Card8('sub_code'), | |
| rq.Card16('sequence_number'), | |
| rq.Window('window'), | |
| rq.Window('owner'), | |
| rq.Card32('selection'), | |
| rq.Card32('timestamp'), | |
| rq.Card32('selection_timestamp'), | |
| rq.Pad(8)) | |
| class SetSelectionOwnerNotify(SelectionNotify): | |
| pass | |
| class SelectionWindowDestroyNotify(SelectionNotify): | |
| pass | |
| class SelectionClientCloseNotify(SelectionNotify): | |
| pass | |
| class SelectCursorInput(rq.Request): | |
| _request = rq.Struct(rq.Card8('opcode'), | |
| rq.Opcode(3), | |
| rq.RequestLength(), | |
| rq.Window('window'), | |
| rq.Card32('mask') | |
| ) | |
| def select_cursor_input(self, window, mask): | |
| return SelectCursorInput(opcode=self.display.get_extension_major(extname), | |
| display=self.display, | |
| window=window, | |
| cursor_serial=0, | |
| mask=mask) | |
| class GetCursorImage(rq.ReplyRequest): | |
| _request = rq.Struct(rq.Card8('opcode'), | |
| rq.Opcode(4), | |
| rq.RequestLength() | |
| ) | |
| _reply = rq.Struct(rq.ReplyCode(), | |
| rq.Pad(1), | |
| rq.Card16('sequence_number'), | |
| rq.ReplyLength(), | |
| rq.Int16('x'), | |
| rq.Int16('y'), | |
| rq.Card16('width'), | |
| rq.Card16('height'), | |
| rq.Card16('xhot'), | |
| rq.Card16('yhot'), | |
| rq.Card32('cursor_serial'), | |
| rq.Pad(8), | |
| rq.List('cursor_image', rq.Card32) | |
| ) | |
| def get_cursor_image(self, window): | |
| return GetCursorImage(opcode=self.display.get_extension_major(extname), | |
| display=self.display, | |
| ) | |
| class DisplayCursorNotify(rq.Event): | |
| _code = None | |
| _fields = rq.Struct(rq.Card8('type'), | |
| rq.Card8('sub_code'), | |
| rq.Card16('sequence_number'), | |
| rq.Window('window'), | |
| rq.Card32('cursor_serial'), | |
| rq.Card32('timestamp')) | |
| def init(disp, info): | |
| disp.extension_add_method('display', 'xfixes_select_selection_input', select_selection_input) | |
| disp.extension_add_method('display', 'xfixes_query_version', query_version) | |
| disp.extension_add_method('window', 'xfixes_hide_cursor', hide_cursor) | |
| disp.extension_add_method('window', 'xfixes_show_cursor', show_cursor) | |
| disp.extension_add_method('display', 'xfixes_select_cursor_input', select_cursor_input) | |
| disp.extension_add_method('display', 'xfixes_get_cursor_image', get_cursor_image) | |
| disp.extension_add_subevent(info.first_event + XFixesSelectionNotify, XFixesSetSelectionOwnerNotify, SetSelectionOwnerNotify) | |
| disp.extension_add_subevent(info.first_event + XFixesSelectionNotify, XFixesSelectionWindowDestroyNotify, SelectionWindowDestroyNotify) | |
| disp.extension_add_subevent(info.first_event + XFixesSelectionNotify, XFixesSelectionClientCloseNotify, SelectionClientCloseNotify) | |
| disp.extension_add_subevent(info.first_event + XFixesCursorNotify, XFixesDisplayCursorNotify, DisplayCursorNotify) | |