Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
# coding=utf8
# This file is part of Xpra.
# Copyright (C) 2012, 2013 Antoine Martin
# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
# later version. See the file COPYING for details.
import time
from math import sqrt
from xpra.log import Logger
log = Logger()
from xpra.server.stats.maths import queue_inspect, logp
def get_low_limit(mmap_enabled, window_dimensions):
#the number of pixels which can be considered 'low' in terms of backlog.
#Generally, just one full frame, (more with mmap because it is so fast)
low_limit = 1024*1024
ww, wh = window_dimensions
if ww>0 and wh>0:
low_limit = max(8*8, ww*wh)
if mmap_enabled:
#mmap can accumulate much more as it is much faster
low_limit *= 4
return low_limit
from xpra.scripts.server import run_server
return run_server(error_cb, options, mode, script_file, args)
elif mode in ("attach", "detach", "screenshot", "version", "info", "control", "_monitor"):
return run_client(error_cb, options, args, mode)
elif mode in ("stop", "exit") and (supports_server or supports_shadow):
nox()
return run_stopexit(mode, error_cb, options, args)
elif mode == "list" and (supports_server or supports_shadow):
return run_list(error_cb, options, args)
elif mode in ("_proxy", "_proxy_start", "_shadow_start") and (supports_server or supports_shadow):
nox()
return run_proxy(error_cb, options, script_file, args, mode, defaults)
elif mode == "initenv":
from xpra.scripts.server import xpra_runner_shell_script, write_runner_shell_script
script = xpra_runner_shell_script(script_file, os.getcwd(), options.socket_dir)
dotxpra = DotXpra(options.socket_dir)
write_runner_shell_script(dotxpra, script, False)
return 0
else:
error_cb("invalid mode '%s'" % mode)
return 1
except KeyboardInterrupt, e:
sys.stderr.write("\ncaught %s, exiting\n" % repr(e))
return 128+signal.SIGINT
soundlog("stop_receiving_sound() sound sink=%s", self.sound_sink)
ss = self.sound_sink
self.speaker_enabled = False
if ss is None:
return
self.sound_sink = None
self.send("sound-control", "stop")
def stop_receiving_sound_thread():
soundlog("UIXpraClient.stop_receiving_sound_thread()")
if ss is None:
log("stop_receiving_sound: sound not started!")
return
ss.cleanup()
self.emit("speaker-changed")
soundlog("UIXpraClient.stop_receiving_sound_thread() done")
thread.start_new_thread(stop_receiving_sound_thread, ())
def stop_sending_sound(self):
""" stop the sound source and emit client signal """
soundlog("stop_sending_sound() sound source=%s", self.sound_source)
ss = self.sound_source
self.microphone_enabled = False
self.sound_source = None
def stop_sending_sound_thread():
soundlog("UIXpraClient.stop_sending_sound_thread()")
if ss is None:
log.warn("stop_sending_sound: sound not started!")
return
ss.cleanup()
self.emit("microphone-changed")
soundlog("UIXpraClient.stop_sending_sound_thread() done")
thread.start_new_thread(stop_sending_sound_thread, ())
ss = self.sound_sink
self.speaker_enabled = False
if tell_server:
self.send("sound-control", "stop")
if ss is None:
return
self.sound_sink = None
def stop_receiving_sound_thread():
soundlog("UIXpraClient.stop_receiving_sound_thread()")
if ss is None:
log("stop_receiving_sound: sound not started!")
return
ss.cleanup()
self.emit("speaker-changed")
soundlog("UIXpraClient.stop_receiving_sound_thread() done")
thread.start_new_thread(stop_receiving_sound_thread, ())
add_event_receiver(root, self)
### Create the WM object
self._wm = Wm(self.clobber)
self._wm.connect("new-window", self._new_window_signaled)
self._wm.connect("bell", self._bell_signaled)
self._wm.connect("quit", lambda _: self.quit(True))
self.default_cursor_data = None
self.last_cursor_serial = None
self.send_cursor_pending = False
self.cursor_data = None
def get_default_cursor():
self.default_cursor_data = X11Keyboard.get_cursor_image()
log("get_default_cursor=%s", self.default_cursor_data)
trap.swallow_synced(get_default_cursor)
self._wm.enableCursors(True)
def force_quit(self):
pid = self.get_property("pid")
machine = self.get_property("client-machine")
localhost = gethostname()
if pid > 0 and machine is not None and machine == localhost:
if pid==os.getpid():
log.warn("force_quit() refusing to kill ourselves!")
else:
try:
os.kill(pid, 9)
except OSError:
log.warn("failed to kill() client with pid %s", pid)
trap.swallow_synced(X11Window.XKillClient, get_xwindow(self.client_window))
def _process_gibberish(self, packet):
[_, data] = packet
self.emit("received-gibberish", data)
_packet_handlers = {
"hello": _process_hello,
"new-window": _process_new_window,
"new-override-redirect": _process_new_override_redirect,
"draw": _process_draw,
"window-metadata": _process_window_metadata,
"configure-override-redirect": _process_configure_override_redirect,
"lost-window": _process_lost_window,
# "clipboard-*" packets are handled by a special case below.
Protocol.CONNECTION_LOST: _process_connection_lost,
Protocol.GIBBERISH: _process_gibberish,
}
def process_packet(self, proto, packet):
packet_type = packet[0]
if (isinstance(packet_type, str)
and packet_type.startswith("clipboard-")):
self._clipboard_helper.process_clipboard_packet(packet)
else:
self._packet_handlers[packet_type](self, packet)
gobject.type_register(XpraClient)
def x11_init(self):
X11ServerBase.x11_init(self)
init_x11_filter()
self._has_focus = 0
# Do this before creating the Wm object, to avoid clobbering its
# selecting SubstructureRedirect.
root = gtk.gdk.get_default_root_window()
root.set_events(root.get_events() | gtk.gdk.SUBSTRUCTURE_MASK)
root.property_change(gtk.gdk.atom_intern("XPRA_SERVER", False),
gtk.gdk.atom_intern("STRING", False),
8,
gtk.gdk.PROP_MODE_REPLACE,
xpra.__version__)
add_event_receiver(root, self)
### Create the WM object
self._wm = Wm(self.clobber)
self._wm.connect("new-window", self._new_window_signaled)
self._wm.connect("bell", self._bell_signaled)
self._wm.connect("quit", lambda _: self.quit(True))
self.default_cursor_data = None
self.last_cursor_serial = None
self.send_cursor_pending = False
self.cursor_data = None
def get_default_cursor():
self.default_cursor_data = X11Keyboard.get_cursor_image()
log("get_default_cursor=%s", self.default_cursor_data)
trap.swallow_synced(get_default_cursor)
def filter_client_caps(self, caps):
fc = self.filter_caps(caps, ("cipher", "digest", "aliases", "compression", "lz4"))
#update with options provided via config if any:
fc.update(self.session_options)
if self.video_encoder_types:
#pass list of encoding specs to client:
from xpra.codecs.video_helper import getVideoHelper
self.video_helper = getVideoHelper()
self.video_helper.init()
#serialize encodings defs into a dict:
encoding_defs = {}
e_found = []
#encoding: "h264" or "vp8", etc
for encoding in self.video_helper.get_encodings():
#ie: colorspace_specs = {"BGRX" : [codec_spec("x264"), codec_spec("nvenc")], "YUV422P" : ...
colorspace_specs = self.video_helper.get_encoder_specs(encoding)
#ie: colorspace="BGRX", especs=[codec_spec("x264"), codec_spec("nvenc")]
for colorspace, especs in colorspace_specs.items():
if colorspace not in ("BGRX", "BGRA", "RGBX", "RGBA"):
#don't bother with formats that require a CSC step for now
continue
for spec in especs: #ie: codec_spec("x264")
if spec.codec_type not in self.video_encoder_types:
debug("skipping encoder %s", spec.codec_type)