Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1# This file is part of Xpra. 

2# Copyright (C) 2012-2020 Antoine Martin <antoine@xpra.org> 

3# Xpra is released under the terms of the GNU GPL v2, or, at your option, any 

4# later version. See the file COPYING for details. 

5 

6#legacy compatibility file 

7 

8import sys 

9import signal 

10 

11from xpra.util import dump_all_frames, dump_gc_frames 

12from xpra.os_util import SIGNAMES, POSIX, get_util_logger 

13 

14 

15_glib_unix_signals = {} 

16def register_os_signals(callback, commandtype="", signals=(signal.SIGINT, signal.SIGTERM)): 

17 from gi.repository import GLib 

18 def handle_signal(signum): 

19 if commandtype is not None: 

20 try: 

21 sys.stderr.write("\n") 

22 sys.stderr.flush() 

23 cstr = "" 

24 if commandtype: 

25 cstr = commandtype+" " 

26 get_util_logger().info("%sgot signal %s", cstr, SIGNAMES.get(signum, signum)) 

27 except OSError: 

28 pass 

29 callback(signum) 

30 return True 

31 def os_signal(signum, _frame): 

32 GLib.idle_add(handle_signal, signum) 

33 return True 

34 for signum in signals: 

35 if POSIX: 

36 #replace the previous definition if we had one: 

37 global _glib_unix_signals 

38 current = _glib_unix_signals.get(signum, None) 

39 if current: 

40 GLib.source_remove(current) 

41 source_id = GLib.unix_signal_add(GLib.PRIORITY_HIGH, signum, handle_signal, signum) 

42 _glib_unix_signals[signum] = source_id 

43 else: 

44 signal.signal(signum, os_signal) 

45 

46def register_SIGUSR_signals(commandtype="Server"): 

47 if not POSIX: 

48 return 

49 log = get_util_logger() 

50 def sigusr1(_sig): 

51 log.info("SIGUSR1") 

52 dump_all_frames(log.info) 

53 return True 

54 def sigusr2(*_args): 

55 log.info("SIGUSR2") 

56 dump_gc_frames(log.info) 

57 return True 

58 register_os_signals(sigusr1, commandtype, (signal.SIGUSR1, )) 

59 register_os_signals(sigusr2, commandtype, (signal.SIGUSR2, )) 

60 

61 

62def install_signal_handlers(sstr, signal_handler): 

63 #only register the glib signal handler 

64 #once the main loop is running, 

65 #before that we just trigger a KeyboardInterrupt 

66 def do_install_signal_handlers(): 

67 register_os_signals(signal_handler, sstr) 

68 register_SIGUSR_signals(sstr) 

69 from gi.repository import GLib 

70 GLib.idle_add(do_install_signal_handlers)