""" when the key is released, just ignore it - do NOT send it to the server! """ return True try: method = getattr(window, action) log.info( "key_handled_as_shortcut(%s,%s,%s,%s) has been handled by shortcut=%s", window, key_name, modifiers, depressed, shortcut) except AttributeError, e: log.error("key dropped, invalid method name in shortcut %s: %s", action, e) return True try: method() except Exception, e: log.error( "key_handled_as_shortcut(%s,%s,%s,%s) failed to execute shortcut=%s: %s", window, key_name, modifiers, depressed, shortcut, e) return True def handle_key_action(self, event, window, depressed): if self.readonly: return log.debug("handle_key_action(%s,%s,%s)", event, window, depressed) modifiers = self.mask_to_names(event.state) name = gdk.keyval_name(event.keyval) keyval = nn(event.keyval) keycode = event.hardware_keycode group = event.group #meant to be in PyGTK since 2.10, not used yet so just return False if we don't have it: is_modifier = hasattr(event, "is_modifier") and event.is_modifier translated = self._client_extras.translate_key(depressed, keyval, name,
def err(*msg): """ log an error message and return None """ from wimpiggy.log import Logger log = Logger() log.error(*msg) return None
if rm not in modifiers: #modifier is missing, bail out return False if not depressed: """ when the key is released, just ignore it - do NOT send it to the server! """ return True try: method = getattr(window, action) log.info("key_handled_as_shortcut(%s,%s,%s,%s) has been handled by shortcut=%s", window, key_name, modifiers, depressed, shortcut) except AttributeError, e: log.error("key dropped, invalid method name in shortcut %s: %s", action, e) return True try: method() except Exception, e: log.error("key_handled_as_shortcut(%s,%s,%s,%s) failed to execute shortcut=%s: %s", window, key_name, modifiers, depressed, shortcut, e) return True def handle_key_action(self, event, window, depressed): if self.readonly: return log.debug("handle_key_action(%s,%s,%s)", event, window, depressed) modifiers = self.mask_to_names(event.state) name = gdk.keyval_name(event.keyval) keyval = nn(event.keyval) keycode = event.hardware_keycode group = event.group #meant to be in PyGTK since 2.10, not used yet so just return False if we don't have it: is_modifier = hasattr(event, "is_modifier") and event.is_modifier translated = self._client_extras.translate_key(depressed, keyval, name, keycode, group, is_modifier, modifiers) if translated is None:
from wimpiggy.log import Logger log = Logger() from xpra.daemon_thread import make_daemon_thread from xpra.bytestreams import untilConcludes from xpra.bencode import bencode, bdecode rencode_dumps, rencode_loads = None, None try: try: from xpra.rencode import dumps as rencode_dumps #@UnresolvedImport from xpra.rencode import loads as rencode_loads #@UnresolvedImport except ImportError: pass except Exception, e: log.error("xpra.rencode is missing: %s", e) has_rencode = rencode_dumps is not None and rencode_loads is not None use_rencode = has_rencode and not os.environ.get("XPRA_USE_BENCODER", "0")=="1" #stupid python version breakage: if sys.version > '3': long = int #@ReservedAssignment unicode = str #@ReservedAssignment def zcompress(packet, level): return compress(bytes(packet, 'UTF-8'), level) else: def zcompress(packet, level): return compress(packet, level) def repr_ellipsized(obj, limit=100):
SOURCES.append("pulsesrc") if sys.platform.startswith("darwin"): SOURCES.append("osxaudiosrc") elif sys.platform.startswith("win"): SOURCES.append("directsoundsrc") if os.name == "posix": SOURCES += [ "alsasrc", "jackaudiosrc", "osssrc", "oss4src", "osxaudiosrc", "jackaudiosrc" ] SOURCES.append("audiotestsrc") DEFAULT_SRC = os.environ.get("XPRA_SOUND_DEFAULT_SRC", SOURCES[0]) if DEFAULT_SRC not in SOURCES: log.error( "invalid default sound source: '%s' is not in %s, using %s instead", DEFAULT_SRC, SOURCES, SOURCES[0]) DEFAULT_SRC = SOURCES[0] class SoundSource(SoundPipeline): __gsignals__ = { "new-buffer": n_arg_signal(2), } def __init__(self, src_type=DEFAULT_SRC, src_options={}, codec=MP3, encoder_options={}):
from wimpiggy.log import Logger log = Logger() from xpra.daemon_thread import make_daemon_thread from xpra.bytestreams import untilConcludes from xpra.bencode import bencode, bdecode rencode_dumps, rencode_loads = None, None try: try: from xpra.rencode import dumps as rencode_dumps #@UnresolvedImport from xpra.rencode import loads as rencode_loads #@UnresolvedImport except ImportError: pass except Exception, e: log.error("xpra.rencode is missing: %s", e) has_rencode = rencode_dumps is not None and rencode_loads is not None use_rencode = has_rencode and not os.environ.get("XPRA_USE_BENCODER", "0") == "1" #stupid python version breakage: if sys.version > '3': long = int #@ReservedAssignment unicode = str #@ReservedAssignment def zcompress(packet, level): return compress(bytes(packet, 'UTF-8'), level) else: def zcompress(packet, level): return compress(packet, level)
def run_server(parser, opts, mode, xpra_file, extra_args): if len(extra_args) != 1: parser.error("need exactly 1 extra argument") assert mode in ("start", "upgrade", "shadow") upgrading = mode == "upgrade" shadowing = mode == "shadow" display_name = extra_args.pop(0) if display_name.startswith(":") and not shadowing: n = display_name[1:] p = n.find(".") if p > 0: n = n[:p] try: dno = int(n) if dno >= 0 and dno < 10: sys.stderr.write("WARNING: low display number: %s\n" % dno) sys.stderr.write( "You are attempting to run the xpra server against what seems to be a default X11 display '%s'.\n" % display_name) sys.stderr.write("This is generally not what you want.\n") sys.stderr.write( "You should probably use a higher display number just to avoid any confusion (and also this warning message).\n" ) except: pass if opts.exit_with_children and not opts.children: sys.stderr.write( "--exit-with-children specified without any children to spawn; exiting immediately" ) return 1 atexit.register(run_cleanups) signal.signal(signal.SIGINT, deadly_signal) signal.signal(signal.SIGTERM, deadly_signal) from xpra.scripts.main import get_default_socket_dir dotxpra = DotXpra(opts.sockdir or get_default_socket_dir()) # This used to be given a display-specific name, but now we give it a # single fixed name and if multiple servers are started then the last one # will clobber the rest. This isn't great, but the tradeoff is that it # makes it possible to use bare 'ssh:hostname' display names and # autodiscover the proper numeric display name when only one xpra server # is running on the remote host. Might need to revisit this later if # people run into problems or autodiscovery turns out to be less useful # than expected. scriptpath = os.path.join(dotxpra.confdir(), "run-xpra") # Save the starting dir now, because we'll lose track of it when we # daemonize: starting_dir = os.getcwd() # Daemonize: if opts.daemon: logpath = dotxpra.log_path(display_name) + ".log" sys.stderr.write("Entering daemon mode; " + "any further errors will be reported to:\n" + (" %s\n" % logpath)) # Do some work up front, so any errors don't get lost. if os.path.exists(logpath): os.rename(logpath, logpath + ".old") logfd = os.open(logpath, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, o0666) assert logfd > 2 os.chdir("/") if os.fork(): os._exit(0) os.setsid() if os.fork(): os._exit(0) close_all_fds(exceptions=[logfd]) fd0 = os.open("/dev/null", os.O_RDONLY) if fd0 != 0: os.dup2(fd0, 0) os.close(fd0) os.dup2(logfd, 1) os.dup2(logfd, 2) os.close(logfd) # Make these line-buffered: sys.stdout = os.fdopen(1, "w", 1) sys.stderr = os.fdopen(2, "w", 1) # Write out a shell-script so that we can start our proxy in a clean # environment: scriptfile = open(scriptpath, "w") # Unix is a little silly sometimes: umask = os.umask(0) os.umask(umask) if hasattr(os, "fchmod"): os.fchmod(scriptfile.fileno(), o0700 & ~umask) else: os.chmod(scriptpath, o0700 & ~umask) scriptfile.write( xpra_runner_shell_script(xpra_file, starting_dir, opts.sockdir)) scriptfile.close() from wimpiggy.log import Logger log = Logger() # Initialize the sockets before the display, # That way, errors won't make us kill the Xvfb # (which may not be ours to kill at that point) sockets = [] if opts.bind_tcp: try: tcp_socket = create_tcp_socket(parser, opts.bind_tcp) sockets.append(tcp_socket) def cleanup_tcp_socket(): log.info("closing tcp socket %s", opts.bind_tcp) try: tcp_socket.close() except: pass _cleanups.append(cleanup_tcp_socket) except Exception, e: log.error("cannot start - failed to create tcp socket at %s: %s" % (opts.bind_tcp, e)) return 1
DEFAULT_SINK = "osxaudiosink" elif sys.platform.startswith("win"): SINKS.append("directsoundsink") DEFAULT_SINK = "directsoundsink" if os.name=="posix": SINKS += ["alsasink", "osssink", "oss4sink", "jackaudiosink"] GST_QUEUE_NO_LEAK = 0 GST_QUEUE_LEAK_UPSTREAM = 1 GST_QUEUE_LEAK_DOWNSTREAM = 2 QUEUE_LEAK = int(os.environ.get("XPRA_SOUND_QUEUE_LEAK", GST_QUEUE_NO_LEAK)) QUEUE_TIME = int(os.environ.get("XPRA_SOUND_QUEUE_TIME", "80"))*1000000 DEFAULT_SINK = os.environ.get("XPRA_SOUND_SINK", DEFAULT_SINK) if DEFAULT_SINK not in SINKS: log.error("invalid default sound sink: '%s' is not in %s, using %s instead", DEFAULT_SINK, SINKS, SINKS[0]) DEFAULT_SINK = SINKS[0] VOLUME = True QUEUE = True def sink_has_device_attribute(sink): return sink not in ("autoaudiosink", "jackaudiosink", "directsoundsink") class SoundSink(SoundPipeline): __gsignals__ = { "underrun": one_arg_signal, "eos": no_arg_signal
if has_pa(): SOURCES.append("pulsesrc") if sys.platform.startswith("darwin"): SOURCES.append("osxaudiosrc") elif sys.platform.startswith("win"): SOURCES.append("directsoundsrc") if os.name=="posix": SOURCES += ["alsasrc", "jackaudiosrc", "osssrc", "oss4src", "osxaudiosrc", "jackaudiosrc"] SOURCES.append("audiotestsrc") DEFAULT_SRC = os.environ.get("XPRA_SOUND_DEFAULT_SRC", SOURCES[0]) if DEFAULT_SRC not in SOURCES: log.error("invalid default sound source: '%s' is not in %s, using %s instead", DEFAULT_SRC, SOURCES, SOURCES[0]) DEFAULT_SRC = SOURCES[0] class SoundSource(SoundPipeline): __gsignals__ = { "new-buffer": n_arg_signal(2), } def __init__(self, src_type=DEFAULT_SRC, src_options={}, codec=MP3, encoder_options={}): assert src_type in SOURCES encoders = get_encoders(codec) assert len(encoders)>0, "no encoders found for %s" % codec SoundPipeline.__init__(self, codec) self.src_type = src_type
if not tray_icon_filename or not os.path.exists(tray_icon_filename): log.error("invalid tray icon filename: '%s'" % tray_icon_filename) try: from xpra.win32.win32_tray import Win32Tray self.tray = Win32Tray(self.get_tray_tooltip(), self.activate_menu, self.quit, tray_icon_filename) except Exception, e: log.error("failed to load native Windows NotifyIcon: %s", e) #cant do balloon without a tray: if self.tray and notifications: try: from xpra.win32.win32_balloon import notify self.notify = notify except Exception, e: log.error("failed to load native win32 balloon: %s", e) def mask_to_names(self, mask): names = ClientExtrasBase.mask_to_names(self, mask) log("mask_to_names(%s)=%s, emulate_altgr=%s", mask, names, self.emulate_altgr) if self.emulate_altgr: self.AltGr_modifiers(names) return names def AltGr_modifiers(self, modifiers, pressed=True): clear = ["mod1", "mod2", "control"] if pressed: if "mod5" not in modifiers: modifiers.append("mod5") else: clear.append("mod5")
log.error("invalid tray icon filename: '%s'" % tray_icon_filename) try: from xpra.win32.win32_tray import Win32Tray self.tray = Win32Tray(self.get_tray_tooltip(), self.activate_menu, self.quit, tray_icon_filename) except Exception, e: log.error("failed to load native Windows NotifyIcon: %s", e) #cant do balloon without a tray: if self.tray and notifications: try: from xpra.win32.win32_balloon import notify self.notify = notify except Exception, e: log.error("failed to load native win32 balloon: %s", e) def mask_to_names(self, mask): names = ClientExtrasBase.mask_to_names(self, mask) log("mask_to_names(%s)=%s, emulate_altgr=%s", mask, names, self.emulate_altgr) if self.emulate_altgr: self.AltGr_modifiers(names) return names def AltGr_modifiers(self, modifiers, pressed=True): clear = ["mod1", "mod2", "control"] if pressed: if "mod5" not in modifiers: modifiers.append("mod5") else:
elif sys.platform.startswith("win"): SINKS.append("directsoundsink") DEFAULT_SINK = "directsoundsink" if os.name == "posix": SINKS += ["alsasink", "osssink", "oss4sink", "jackaudiosink"] GST_QUEUE_NO_LEAK = 0 GST_QUEUE_LEAK_UPSTREAM = 1 GST_QUEUE_LEAK_DOWNSTREAM = 2 QUEUE_LEAK = int(os.environ.get("XPRA_SOUND_QUEUE_LEAK", GST_QUEUE_NO_LEAK)) QUEUE_TIME = int(os.environ.get("XPRA_SOUND_QUEUE_TIME", "80")) * 1000000 DEFAULT_SINK = os.environ.get("XPRA_SOUND_SINK", DEFAULT_SINK) if DEFAULT_SINK not in SINKS: log.error( "invalid default sound sink: '%s' is not in %s, using %s instead", DEFAULT_SINK, SINKS, SINKS[0]) DEFAULT_SINK = SINKS[0] VOLUME = True QUEUE = True def sink_has_device_attribute(sink): return sink not in ("autoaudiosink", "jackaudiosink", "directsoundsink") class SoundSink(SoundPipeline): __gsignals__ = {"underrun": one_arg_signal, "eos": no_arg_signal}
from wimpiggy.log import Logger log = Logger() from xpra.daemon_thread import make_daemon_thread from xpra.bencode import bencode, bdecode rencode_dumps, rencode_loads, rencode_version = None, None, None try: try: from xpra.rencode import dumps as rencode_dumps #@UnresolvedImport from xpra.rencode import loads as rencode_loads #@UnresolvedImport from xpra.rencode import __version__ rencode_version = __version__ log("found rencode version %s", rencode_version) except ImportError: log.error("rencode load error", exc_info=True) except Exception, e: log.error("xpra.rencode is missing: %s", e) has_rencode = rencode_dumps is not None and rencode_loads is not None and rencode_version is not None use_rencode = has_rencode and not os.environ.get("XPRA_USE_BENCODER", "0")=="1" #stupid python version breakage: if sys.version > '3': long = int #@ReservedAssignment unicode = str #@ReservedAssignment def zcompress(packet, level): return compress(bytes(packet, 'UTF-8'), level) else: def zcompress(packet, level): return compress(packet, level)
def run_server(parser, opts, mode, xpra_file, extra_args): if len(extra_args) != 1: parser.error("need exactly 1 extra argument") assert mode in ("start", "upgrade", "shadow") upgrading = mode == "upgrade" shadowing = mode == "shadow" display_name = extra_args.pop(0) if display_name.startswith(":") and not shadowing: n = display_name[1:] p = n.find(".") if p>0: n = n[:p] try: dno = int(n) if dno>=0 and dno<10: sys.stderr.write("WARNING: low display number: %s\n" % dno) sys.stderr.write("You are attempting to run the xpra server against what seems to be a default X11 display '%s'.\n" % display_name) sys.stderr.write("This is generally not what you want.\n") sys.stderr.write("You should probably use a higher display number just to avoid any confusion (and also this warning message).\n") except: pass if opts.exit_with_children and not opts.children: sys.stderr.write("--exit-with-children specified without any children to spawn; exiting immediately") return 1 atexit.register(run_cleanups) signal.signal(signal.SIGINT, deadly_signal) signal.signal(signal.SIGTERM, deadly_signal) from xpra.scripts.main import get_default_socket_dir dotxpra = DotXpra(opts.sockdir or get_default_socket_dir()) # This used to be given a display-specific name, but now we give it a # single fixed name and if multiple servers are started then the last one # will clobber the rest. This isn't great, but the tradeoff is that it # makes it possible to use bare 'ssh:hostname' display names and # autodiscover the proper numeric display name when only one xpra server # is running on the remote host. Might need to revisit this later if # people run into problems or autodiscovery turns out to be less useful # than expected. scriptpath = os.path.join(dotxpra.confdir(), "run-xpra") # Save the starting dir now, because we'll lose track of it when we # daemonize: starting_dir = os.getcwd() # Daemonize: if opts.daemon: logpath = dotxpra.log_path(display_name) + ".log" sys.stderr.write("Entering daemon mode; " + "any further errors will be reported to:\n" + (" %s\n" % logpath)) # Do some work up front, so any errors don't get lost. if os.path.exists(logpath): os.rename(logpath, logpath + ".old") logfd = os.open(logpath, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, o0666) assert logfd > 2 os.chdir("/") if os.fork(): os._exit(0) os.setsid() if os.fork(): os._exit(0) close_all_fds(exceptions=[logfd]) fd0 = os.open("/dev/null", os.O_RDONLY) if fd0 != 0: os.dup2(fd0, 0) os.close(fd0) os.dup2(logfd, 1) os.dup2(logfd, 2) os.close(logfd) # Make these line-buffered: sys.stdout = os.fdopen(1, "w", 1) sys.stderr = os.fdopen(2, "w", 1) # Write out a shell-script so that we can start our proxy in a clean # environment: scriptfile = open(scriptpath, "w") # Unix is a little silly sometimes: umask = os.umask(0) os.umask(umask) if hasattr(os, "fchmod"): os.fchmod(scriptfile.fileno(), o0700 & ~umask) else: os.chmod(scriptpath, o0700 & ~umask) scriptfile.write(xpra_runner_shell_script(xpra_file, starting_dir, opts.sockdir)) scriptfile.close() from wimpiggy.log import Logger log = Logger() # Initialize the sockets before the display, # That way, errors won't make us kill the Xvfb # (which may not be ours to kill at that point) sockets = [] if opts.bind_tcp: try: tcp_socket = create_tcp_socket(parser, opts.bind_tcp) sockets.append(tcp_socket) def cleanup_tcp_socket(): log.info("closing tcp socket %s", opts.bind_tcp) try: tcp_socket.close() except: pass _cleanups.append(cleanup_tcp_socket) except Exception, e: log.error("cannot start - failed to create tcp socket at %s: %s" % (opts.bind_tcp, e)) return 1
from wimpiggy.log import Logger log = Logger() from xpra.daemon_thread import make_daemon_thread from xpra.bencode import bencode, bdecode rencode_dumps, rencode_loads, rencode_version = None, None, None try: try: from xpra.rencode import dumps as rencode_dumps #@UnresolvedImport from xpra.rencode import loads as rencode_loads #@UnresolvedImport from xpra.rencode import __version__ rencode_version = __version__ log("found rencode version %s", rencode_version) except ImportError: log.error("rencode load error", exc_info=True) except Exception, e: log.error("xpra.rencode is missing: %s", e) has_rencode = rencode_dumps is not None and rencode_loads is not None and rencode_version is not None use_rencode = has_rencode and not os.environ.get("XPRA_USE_BENCODER", "0") == "1" #stupid python version breakage: if sys.version > '3': long = int #@ReservedAssignment unicode = str #@ReservedAssignment def zcompress(packet, level): return compress(bytes(packet, 'UTF-8'), level) else: