flacjacket / pywayland

Python bindings for the libwayland library
Apache License 2.0
78 stars 16 forks source link

No signal can be received during Display.dispatch() #15

Open sloonz opened 3 years ago

sloonz commented 3 years ago
from pywayland.client import Display    

display = Display()    
display.connect()    

while True:    
    display.dispatch(block=True)    

This simple script ignores SIGINT (Control-C in a terminal). Adding signal.signal(signal.SIGUSR1, lambda *a: print("USR1")) shows that it ignores all signals.

The comparable C program does not display this behavior and can be stopped by pressing Control-C :

#include <stdio.h>     
#include <wayland-client.h>    

int    
main(int argc, char *argv[])    
{    
    struct wl_display *display = wl_display_connect(NULL);    
    while (wl_display_dispatch(display) != -1) {    
    }                
    wl_display_disconnect(display);                  
    return 0;                                       
}                                                   
and3rson commented 2 years ago

I can reproduce this. Any ideas on how to handle this?

Relevant issue: https://stackoverflow.com/a/14708549/3455614

The only workaround I've found is calling dispatch in a thread:

if __name__ == '__main__':
    Thread(target=main).start()
    while True:
        try:
            time.sleep(1)
        except KeyboardInterrupt:
            os.kill(os.getpid(), 9)