1414CAM_RES = (480 , 320 )
1515
1616
17+ def wait_for_viewer_events (viewer , condition_fn , timeout = 2.0 , sleep_interval = 0.1 ):
18+ """Utility function to wait for viewer events to be processed in a threaded viewer."""
19+ if not viewer .run_in_thread :
20+ viewer .dispatch_pending_events ()
21+ viewer .dispatch_events ()
22+
23+ for _ in range (int (timeout / sleep_interval )):
24+ if condition_fn ():
25+ return
26+ time .sleep (sleep_interval )
27+ else :
28+ raise AssertionError ("Keyboard event not processed before timeout" )
29+
30+
1731@pytest .mark .required
1832@pytest .mark .skipif (not IS_INTERACTIVE_VIEWER_AVAILABLE , reason = "Interactive viewer not supported on this platform." )
1933@pytest .mark .xfail (sys .platform == "win32" , raises = OpenGL .error .Error , reason = "Invalid OpenGL context." )
@@ -79,9 +93,6 @@ def test_default_viewer_plugin():
7993
8094 assert len (pyrender_viewer ._keybindings ) > 0 , "Expected default keybindings to be registered."
8195
82- # Press key toggle world frame
83- pyrender_viewer .dispatch_event ("on_key_press" , Key .W , 0 )
84-
8596 # Add a custom keybind
8697 flags = [False , False , False ]
8798
@@ -109,20 +120,14 @@ def toggle_flag(idx):
109120 pyrender_viewer .dispatch_event ("on_key_press" , Key ._0 , 0 )
110121 # Press key with modifiers to toggle flag off
111122 pyrender_viewer .dispatch_event ("on_key_press" , Key ._1 , KeyMod .SHIFT | KeyMod .CTRL )
123+ # Press key toggle world frame
124+ pyrender_viewer .dispatch_event ("on_key_press" , Key .W , 0 )
112125
113- if pyrender_viewer .run_in_thread :
114- for i in range (100 ):
115- if flags [0 ] and flags [1 ]:
116- break
117- time .sleep (0.1 )
118- else :
119- pyrender_viewer .dispatch_pending_events ()
120- pyrender_viewer .dispatch_events ()
121-
122- assert pyrender_viewer .gs_context .world_frame_shown , "Expected world frame to be shown after pressing 'W' key."
126+ wait_for_viewer_events (pyrender_viewer , lambda : flags [0 ] and flags [1 ])
123127
124128 assert flags [0 ], "Expected custom keybind callback to toggle flag on."
125129 assert flags [1 ], "Expected custom keybind with key modifiers to toggle flag on."
130+ assert pyrender_viewer .gs_context .world_frame_shown , "Expected world frame to be shown after pressing 'W' key."
126131
127132 # Remove the keybind and press key to verify it no longer works
128133 scene .viewer .remove_keybind ("toggle_flag_0" )
@@ -131,14 +136,7 @@ def toggle_flag(idx):
131136 scene .viewer .remap_keybind ("toggle_flag_1" , new_key = Key ._2 , new_key_mods = None )
132137 pyrender_viewer .dispatch_event ("on_key_press" , Key ._2 , 0 )
133138
134- if pyrender_viewer .run_in_thread :
135- for i in range (1000 ):
136- if not flags [1 ]:
137- break
138- time .sleep (0.1 )
139- else :
140- pyrender_viewer .dispatch_pending_events ()
141- pyrender_viewer .dispatch_events ()
139+ wait_for_viewer_events (pyrender_viewer , lambda : not flags [1 ])
142140
143141 assert flags [0 ], "Keybind was not removed properly."
144142 assert not flags [1 ], "Expected rebinded keybind to toggle flag off."
0 commit comments