158158DEVICE = rq .Card16
159159DEVICEUSE = rq .Card8
160160
161+ PROPERTY_TYPE_FLOAT = 'FLOAT'
162+
161163class FP1616 (rq .Int32 ):
162164
163165 def check_value (self , value ):
@@ -426,6 +428,114 @@ def query_device(self, deviceid):
426428 deviceid = deviceid ,
427429 )
428430
431+ class XIListProperties (rq .ReplyRequest ):
432+ _request = rq .Struct (
433+ rq .Card8 ('opcode' ),
434+ rq .Opcode (56 ),
435+ rq .RequestLength (),
436+ DEVICEID ('deviceid' ),
437+ rq .Pad (2 ),
438+ )
439+
440+ _reply = rq .Struct (
441+ rq .ReplyCode (),
442+ rq .Pad (1 ),
443+ rq .Card16 ('sequence_number' ),
444+ rq .ReplyLength (),
445+ rq .LengthOf ('atoms' , 2 ),
446+ rq .Pad (22 ),
447+ rq .List ('atoms' , rq .Card32Obj ),
448+ )
449+
450+ def list_device_properties (self , deviceid ):
451+ return XIListProperties (
452+ display = self .display ,
453+ opcode = self .display .get_extension_major (extname ),
454+ deviceid = deviceid ,
455+ )
456+
457+ class XIGetProperty (rq .ReplyRequest ):
458+ _request = rq .Struct (
459+ rq .Card8 ('opcode' ),
460+ rq .Opcode (59 ),
461+ rq .RequestLength (),
462+ DEVICEID ('deviceid' ),
463+ rq .Card8 ('delete' ),
464+ rq .Pad (1 ),
465+ rq .Card32 ('property' ),
466+ rq .Card32 ('type' ),
467+ rq .Card32 ('offset' ),
468+ rq .Card32 ('length' ),
469+ )
470+
471+ _reply = rq .Struct (
472+ rq .ReplyCode (),
473+ rq .Pad (1 ),
474+ rq .Card16 ('sequence_number' ),
475+ rq .ReplyLength (),
476+ rq .Card32 ('type' ),
477+ rq .Card32 ('bytes_after' ),
478+ rq .LengthOf ('value' , 4 ),
479+ rq .Format ('value' , 1 ),
480+ rq .Pad (11 ),
481+ rq .PropertyData ('value' )
482+ )
483+
484+ def get_device_property (self , deviceid , property , type , offset , length , delete = False ):
485+ return XIGetProperty (
486+ display = self .display ,
487+ opcode = self .display .get_extension_major (extname ),
488+ deviceid = deviceid ,
489+ property = property ,
490+ type = type ,
491+ offset = offset ,
492+ length = length ,
493+ delete = delete ,
494+ )
495+
496+ class XIChangeProperty (rq .Request ):
497+ _request = rq .Struct (
498+ rq .Card8 ('opcode' ),
499+ rq .Opcode (57 ),
500+ rq .RequestLength (),
501+ DEVICEID ('deviceid' ),
502+ rq .Card8 ('mode' ),
503+ rq .Format ('value' , 1 ),
504+ rq .Card32 ('property' ),
505+ rq .Card32 ('type' ),
506+ rq .LengthOf ('value' , 4 ),
507+ rq .PropertyData ('value' ),
508+ )
509+
510+ def change_device_property (self , deviceid , property , type , mode , value ):
511+ return XIChangeProperty (
512+ display = self .display ,
513+ opcode = self .display .get_extension_major (extname ),
514+ deviceid = deviceid ,
515+ property = property ,
516+ type = type ,
517+ mode = mode ,
518+ value = value ,
519+ )
520+
521+ class XIDeleteProperty (rq .Request ):
522+ _request = rq .Struct (
523+ rq .Card8 ('opcode' ),
524+ rq .Opcode (58 ),
525+ rq .RequestLength (),
526+ DEVICEID ('deviceid' ),
527+ rq .Pad (2 ),
528+ rq .Card32 ('property' ),
529+ )
530+
531+ def delete_device_property (self , deviceid , property ):
532+ return XIDeleteProperty (
533+ display = self .display ,
534+ opcode = self .display .get_extension_major (extname ),
535+ deviceid = deviceid ,
536+ property = property ,
537+ )
538+
429539class XIGrabDevice (rq .ReplyRequest ):
430540 _request = rq .Struct (
431541 rq .Card8 ('opcode' ),
@@ -639,6 +749,14 @@ def ungrab_keycode(self, deviceid, keycode, modifiers):
639749 rq .List ('classes' , ClassInfo ),
640750)
641751
752+ PropertyEventData = rq .Struct (
753+ DEVICEID ('deviceid' ),
754+ rq .Card32 ('time' ),
755+ rq .Card32 ('property' ),
756+ rq .Card8 ('what' ),
757+ rq .Pad (11 ),
758+ )
759+
642760def init (disp , info ):
643761 disp .extension_add_method ('display' , 'xinput_query_version' , query_version )
644762 disp .extension_add_method ('window' , 'xinput_select_events' , select_events )
@@ -647,8 +765,13 @@ def init(disp, info):
647765 disp .extension_add_method ('display' , 'xinput_ungrab_device' , ungrab_device )
648766 disp .extension_add_method ('window' , 'xinput_grab_keycode' , grab_keycode )
649767 disp .extension_add_method ('window' , 'xinput_ungrab_keycode' , ungrab_keycode )
768+ disp .extension_add_method ('display' , 'xinput_get_device_property' , get_device_property )
769+ disp .extension_add_method ('display' , 'xinput_list_device_properties' , list_device_properties )
770+ disp .extension_add_method ('display' , 'xinput_change_device_property' , change_device_property )
771+ disp .extension_add_method ('display' , 'xinput_delete_device_property' , delete_device_property )
650772 if hasattr (disp ,"ge_add_event_data" ):
651773 for device_event in (ButtonPress , ButtonRelease , KeyPress , KeyRelease , Motion ):
652774 disp .ge_add_event_data (info .major_opcode , device_event , DeviceEventData )
653775 disp .ge_add_event_data (info .major_opcode , DeviceChanged , DeviceEventData )
654776 disp .ge_add_event_data (info .major_opcode , HierarchyChanged , HierarchyEventData )
777+ disp .ge_add_event_data (info .major_opcode , PropertyEvent , PropertyEventData )
0 commit comments