@@ -209,6 +209,7 @@ def __init__(
209209 self ._display = display
210210 self ._w , self ._h = width , height
211211 self ._last_pointer : Optional [tuple [int , int ]] = None
212+ self ._last_pointer_delivery : Optional [dict [str , object ]] = None
212213
213214 def _exec (self , args : list [str ], * , binary : bool = False ):
214215 cmd = ["docker" , "exec" , "-e" , f"DISPLAY={ self ._display } " , self ._c , * args ]
@@ -323,6 +324,19 @@ def _remote_pointer(self) -> Optional[tuple[int, int]]:
323324 except (KeyError , ValueError ):
324325 return None
325326
327+ def pointer_delivery_diagnostic (self ) -> Optional [dict [str , object ]]:
328+ """Return only synthetic-fixture pointer delivery metadata.
329+
330+ This method exists for qualification diagnostics. It contains screen
331+ coordinates and no application text, record data, or screenshot.
332+ """
333+
334+ return (
335+ dict (self ._last_pointer_delivery )
336+ if self ._last_pointer_delivery is not None
337+ else None
338+ )
339+
326340 def pointer (self , x : int , y : int , button : str , down : bool ) -> None :
327341 btn = {"left" : "1" , "right" : "3" , "middle" : "2" }.get (button , "1" )
328342 self ._last_pointer = (int (x ), int (y ))
@@ -335,7 +349,8 @@ def pointer(self, x: int, y: int, button: str, down: bool) -> None:
335349 return
336350 target = (int (x ), int (y ))
337351 delivered = False
338- for _attempt in range (3 ):
352+ observed : Optional [tuple [int , int ]] = None
353+ for attempt in range (1 , 4 ):
339354 self ._exec (
340355 [
341356 "xdotool" ,
@@ -346,12 +361,19 @@ def pointer(self, x: int, y: int, button: str, down: bool) -> None:
346361 )
347362 deadline = time .monotonic () + 5.0
348363 while time .monotonic () < deadline :
349- if self ._remote_pointer () == target :
364+ observed = self ._remote_pointer ()
365+ if observed == target :
350366 delivered = True
351367 break
352368 time .sleep (0.1 )
353369 if delivered :
354370 break
371+ self ._last_pointer_delivery = {
372+ "target" : list (target ),
373+ "observed" : list (observed ) if observed is not None else None ,
374+ "attempts" : attempt ,
375+ "delivered" : delivered ,
376+ }
355377 if not delivered :
356378 raise RuntimeError (
357379 f"RDP fixture did not acknowledge pointer motion to { target } "
0 commit comments