Hello community, here is the log from the commit of package xpra for openSUSE:Factory checked in at 2019-07-28 10:22:57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/xpra (Old) and /work/SRC/openSUSE:Factory/.xpra.new.4126 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "xpra" Sun Jul 28 10:22:57 2019 rev:7 rq:719275 version:2.5.3 Changes: -------- --- /work/SRC/openSUSE:Factory/xpra/xpra.changes 2019-06-14 20:42:40.906364222 +0200 +++ /work/SRC/openSUSE:Factory/.xpra.new.4126/xpra.changes 2019-07-28 10:22:57.444567488 +0200 @@ -1,0 +2,47 @@ +Sat Jul 27 13:08:50 UTC 2019 - Luigi Baldoni <[email protected]> + +- Update to version 2.5.3 + * fix HTML5 MSIE 11 detection + * fix HTML5 path of audio script for IE + * fix HTML5 CapsLock and NumLock state detection + * fix HTML5 desktop server screen size not resizing to match + window + * fix shadow servers display resizing not being propagated + * fix scroll encoding with multi monitor shadow servers + * fix handling of uncompressed window icon pixel data + * fix handling of unicode values for desktop names + * fix remote ssh failures with python3-only installations + * fix '_monitor' subcommand with python3 clients + * fix client ping latency calculations + * fix non-strict ssl host key not honoured with wss connections + * fix handling of websocket and ssl traffic with unix-domain + sockets + * fix ssl and websocket connection upgrades with python3 + servers + * fix handling of websocket ping packets + * fix unnecessary delay in initial connection handling + * fix incorrect disconnections with non-UI clients + * fix spurious socket warnings + * fix distro information shown for proxied connections + * fix invalid mdns records for rfb connections (desktop and + shadow servers) + * fix GTK3 signal handling before the main loop is running + * fix file descriptor leak when running child commands + * fix clipboard-direction setting not propagated to the client + * fix clipboard datatype shortcut not taken due to a typo + * fix clipboard bugs with python3 builds, invalid atoms + * fix overzealous cleanup code in X11 root property handler + * fix Xresources debug logging and error handler + * fix errors during cleanup: close display later + * fix uinput device mode with python3 servers + * fix errors if md5 is not available: use sha1 + * fix default build options for RedHat + * fix typos in man page and docstrings + * silence annoying atk warnings + * avoid running invalid lpinfo commands + * improve compatibility with 'xpra top' + * make it possible to skip opengl probing during server startup + * add missing modal-window entry in man page + * reduce weak RPM dependencies on gnome components + +------------------------------------------------------------------- Old: ---- xpra-2.5.2.tar.xz New: ---- xpra-2.5.3.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xpra.spec ++++++ --- /var/tmp/diff_new_pack.uCMNuS/_old 2019-07-28 10:22:58.760567459 +0200 +++ /var/tmp/diff_new_pack.uCMNuS/_new 2019-07-28 10:22:58.768567458 +0200 @@ -23,7 +23,7 @@ %endif %global __requires_exclude ^typelib\\(GtkosxApplication\\)|typelib\\(GdkGLExt\\)|typelib\\(GtkGLExt\\).*$ Name: xpra -Version: 2.5.2 +Version: 2.5.3 Release: 0 Summary: Remote display server for applications and desktops License: GPL-2.0-or-later AND BSD-3-Clause AND LGPL-3.0-or-later AND MIT ++++++ xpra-2.5.2.tar.xz -> xpra-2.5.3.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/NEWS new/xpra-2.5.3/NEWS --- old/xpra-2.5.2/NEWS 2019-06-07 13:50:31.000000000 +0200 +++ new/xpra-2.5.3/NEWS 2019-07-23 18:39:28.000000000 +0200 @@ -1,3 +1,45 @@ +v2.5.3 (2019-07-20) +====================== + -- fix HTML5 MSIE 11 detection + -- fix HTML5 path of audio script for IE + -- fix HTML5 CapsLock and NumLock state detection + -- fix HTML5 desktop server screen size not resizing to match window + -- fix shadow servers display resizing not being propagated + -- fix scroll encoding with multi monitor shadow servers + -- fix handling of uncompressed window icon pixel data + -- fix handling of unicode values for desktop names + -- fix remote ssh failures with python3-only installations + -- fix '_monitor' subcommand with python3 clients + -- fix client ping latency calculations + -- fix non-strict ssl host key not honoured with wss connections + -- fix handling of websocket and ssl traffic with unix-domain sockets + -- fix ssl and websocket connection upgrades with python3 servers + -- fix handling of websocket ping packets + -- fix unnecessary delay in initial connection handling + -- fix incorrect disconnections with non-UI clients + -- fix spurious socket warnings + -- fix distro information shown for proxied connections + -- fix invalid mdns records for rfb connections (desktop and shadow servers) + -- fix GTK3 signal handling before the main loop is running + -- fix file descriptor leak when running child commands + -- fix clipboard-direction setting not propagated to the client + -- fix clipboard datatype shortcut not taken due to a typo + -- fix clipboard bugs with python3 builds, invalid atoms + -- fix overzealous cleanup code in X11 root property handler + -- fix Xresources debug logging and error handler + -- fix errors during cleanup: close display later + -- fix uinput device mode with python3 servers + -- fix errors if md5 is not available: use sha1 + -- fix default build options for RedHat + -- fix typos in man page and docstrings + -- silence annoying atk warnings + -- avoid running invalid lpinfo commands + -- improve compatibility with 'xpra top' + -- make it possible to skip opengl probing during server startup + -- add missing modal-window entry in man page + -- reduce weak RPM dependencies on gnome components + + v2.5.2 (2019-06-07) ====================== -- fix mmap leak which can cause the client to stop painting diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/cups/xpraforwarder new/xpra-2.5.3/cups/xpraforwarder --- old/xpra-2.5.2/cups/xpraforwarder 2019-04-20 12:10:50.000000000 +0200 +++ new/xpra-2.5.3/cups/xpraforwarder 2019-07-16 19:42:47.000000000 +0200 @@ -42,7 +42,7 @@ from urllib.parse import urlparse, parse_qs -__version__ = "2.5.2" +__version__ = "2.5.3" #Writes a syslog entry (msg) at the default facility: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/html5/js/Client.js new/xpra-2.5.3/html5/js/Client.js --- old/xpra-2.5.2/html5/js/Client.js 2019-06-05 04:05:12.000000000 +0200 +++ new/xpra-2.5.3/html5/js/Client.js 2019-06-14 19:50:26.000000000 +0200 @@ -519,9 +519,7 @@ XpraClient.prototype.init_keyboard = function() { var me = this; // modifier keys: - this.caps_lock = null; - this.num_lock = true; - this.num_lock_mod = null; + this.num_lock_modifier = null; this.alt_modifier = null; this.control_modifier = "control"; this.meta_modifier = null; @@ -529,9 +527,7 @@ this.altgr_state = false; this.capture_keyboard = true; - // assign the keypress callbacks - // if we detect jQuery, use that to assign them instead - // to allow multiple clients on the same page + // assign the key callbacks document.addEventListener('keydown', function(e) { var r = me._keyb_onkeydown(e, me); if (!r) { @@ -544,12 +540,6 @@ e.preventDefault(); } }); - document.addEventListener('keypress', function (e) { - var r = me._keyb_onkeypress(e, me); - if (!r) { - e.preventDefault(); - } - }); } @@ -561,10 +551,6 @@ */ //convert generic modifiers "meta" and "alt" into their x11 name: var modifiers = get_event_modifiers(event); - if (this.caps_lock) - modifiers.push("lock"); - if (this.num_lock && this.num_lock_mod) - modifiers.push(this.num_lock_mod); return this.translate_modifiers(modifiers); } @@ -583,7 +569,20 @@ meta = this.control_modifier; control = this.meta_modifier; } - + index = modifiers.indexOf("numlock"); + if (index>=0) { + if (this.num_lock_modifier) { + new_modifiers[index] = this.num_lock_modifier; + } + else { + new_modifiers.splice(index, 1); + } + } + index = modifiers.indexOf("capslock"); + if (index>=0) { + new_modifiers[index] = "lock"; + } + var new_modifiers = modifiers.slice(); var index = modifiers.indexOf("meta"); if (index>=0 && meta) @@ -728,8 +727,10 @@ var group = 0; var shift = modifiers.includes("shift"); - if ((this.caps_lock && shift) || (!this.caps_lock && !shift)) + var capslock = modifiers.includes("capslock"); + if ((capslock && shift) || (!capslock && !shift)) { str = str.toLowerCase(); + } var ostr = str; if (this.swap_keys) { @@ -758,7 +759,8 @@ var me = this; setTimeout(function () { me.send(packet); - me.debug("keyboard", packet); + me.log("keyboard", packet); + me.log("keyboard", "modifiers", modifiers); if (pressed && me.swap_keys && raw_modifiers.includes("meta") && ostr!="meta") { //macos will swallow the key release event if the meta modifier is pressed, //so simulate one immediately: @@ -808,39 +810,6 @@ return ctx._keyb_process(false, event); }; -XpraClient.prototype._keyb_onkeypress = function(event, ctx) { - if (!ctx.capture_keyboard) { - return true; - } - /** - * This function is only used for figuring out the caps_lock state! - * onkeyup and onkeydown give us the raw keycode, - * whereas here we get the keycode in lowercase/uppercase depending - * on the caps_lock and shift state, which allows us to figure - * out caps_lock state since we have shift state. - */ - var keycode = 0; - if (event.which) - keycode = event.which; - else - keycode = event.keyCode; - var modifiers = ctx._keyb_get_modifiers(event); - - /* PITA: this only works for keypress event... */ - var shift = modifiers.includes("shift"); - if (keycode>=97 && keycode<=122 && shift) { - ctx.caps_lock = true; - } - else if (keycode>=65 && keycode<=90 && !shift) { - ctx.caps_lock = true; - } - else { - ctx.caps_lock = false; - } - //show("caps_lock="+caps_lock); - return false; -}; - XpraClient.prototype._get_keyboard_layout = function() { this.debug("keyboard", "_get_keyboard_layout() keyboard_layout=", this.keyboard_layout); if (this.keyboard_layout) @@ -1589,7 +1558,7 @@ for (var index in keys) { var key=keys[index]; if (key=="Num_Lock") { - ctx.num_lock_mod = modifier; + ctx.num_lock_modifier = modifier; } } } @@ -2503,7 +2472,13 @@ url = "https"; } url += "://"+this.host+":"+this.port+this.path; - url += "/audio.mp3?uuid="+this.uuid; + if (url.endsWith("index.html")) { + url = url.substring(0, url.lastIndexOf("index.html")); + } + if (!url.endsWith("/")) { + url += "/"; + } + url += "audio.mp3?uuid="+this.uuid; this.log("starting http stream from", url); this.audio.src = url; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/html5/js/Keycodes.js new/xpra-2.5.3/html5/js/Keycodes.js --- old/xpra-2.5.2/html5/js/Keycodes.js 2019-03-19 16:05:06.000000000 +0100 +++ new/xpra-2.5.3/html5/js/Keycodes.js 2019-06-14 19:50:26.000000000 +0200 @@ -1755,7 +1755,13 @@ modifiers.push("meta"); if (event.getModifierState("Shift")) modifiers.push("shift"); - //event.getModifierState("ScrollLock") || event.getModifierState("Scroll") + if (event.getModifierState("CapsLock")) + modifiers.push("capslock"); + if (event.getModifierState("NumLock")) + modifiers.push("numlock"); + //ScrollLock + //Fn + //AltGraph } else if (event.modifiers) { if (event.modifiers & Event.ALT_MASK) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/html5/js/Utilities.js new/xpra-2.5.3/html5/js/Utilities.js --- old/xpra-2.5.2/html5/js/Utilities.js 2019-04-20 12:10:50.000000000 +0200 +++ new/xpra-2.5.3/html5/js/Utilities.js 2019-07-16 19:42:48.000000000 +0200 @@ -10,7 +10,7 @@ 'use strict'; var Utilities = { - VERSION : "2.5.2", + VERSION : "2.5.3", exc : function() { console.error.apply(console, arguments); @@ -245,7 +245,7 @@ } }, isIE : function() { - return navigator.userAgent.includes("MSIE"); + return navigator.userAgent.includes("MSIE") || navigator.userAgent.includes("Trident/"); }, getSimpleUserAgentString : function() { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/html5/js/Window.js new/xpra-2.5.3/html5/js/Window.js --- old/xpra-2.5.2/html5/js/Window.js 2019-03-19 16:05:06.000000000 +0100 +++ new/xpra-2.5.3/html5/js/Window.js 2019-06-17 13:06:39.000000000 +0200 @@ -766,13 +766,13 @@ this.ensure_visible(); }; -XpraWindow.prototype.recenter = function() { +XpraWindow.prototype.recenter = function(force_update_geometry) { var x = this.x, y = this.y; this.debug("geometry", "recenter() x=", x, ", y=", y, ", desktop size: ", this.client.desktop_width, this.client.desktop_height); x = Math.round((this.client.desktop_width-this.w)/2); y = Math.round((this.client.desktop_height-this.h)/2); - if (this.x!=x || this.y!=y) { + if (this.x!=x || this.y!=y || force_update_geometry) { this.debug("geometry", "window re-centered to:", x, y); this.x = x; this.y = y; @@ -834,7 +834,9 @@ } this.log("best screen size:", neww, newh); } - this.recenter(); + this.w = neww; + this.h = newh; + this.recenter(true); }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/man/xpra.1 new/xpra-2.5.3/man/xpra.1 --- old/xpra-2.5.2/man/xpra.1 2019-03-28 13:13:12.000000000 +0100 +++ new/xpra-2.5.3/man/xpra.1 2019-07-16 19:42:48.000000000 +0200 @@ -1117,6 +1117,13 @@ .SS Options for attach .TP +\fB--modal-windows\fP=\fIyes\fP|\fIno\fP +Honour modal windows. +This may have undesirable side effects when multiple applications are +forwarded through the same xpra server: modal windows will be made modal +for all the applications forwarded by xpra rather than just the one +application which owns that window. +.TP \fB--password-file\fP=\fIFILENAME\fP Supply the password to be used for connecting to a server that uses authentication. See \fIauth\fP, \fItcp-auth\fP, \fIssl-auth\fP @@ -1184,7 +1191,7 @@ This option is only relevant when using a lossy encoding. .TP \fB--shortcut-modifiers\fP=\fIMODIFIERS\fP -Defines the default shorcut modifers required by the \fIkey-shortcuts\fP, +Defines the default shortcut modifiers required by the \fIkey-shortcuts\fP, these modifiers can then be referred to as \fI#\fP. The default value is 'auto' which evaluates to \fIMeta+Shift\fP on most platforms. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/setup.py new/xpra-2.5.3/setup.py --- old/xpra-2.5.2/setup.py 2019-06-07 13:50:31.000000000 +0200 +++ new/xpra-2.5.3/setup.py 2019-06-14 19:50:26.000000000 +0200 @@ -25,7 +25,7 @@ from xpra.os_util import ( get_status_output, getUbuntuVersion, PYTHON3, BITS, WIN32, OSX, LINUX, POSIX, NETBSD, FREEBSD, OPENBSD, - is_Ubuntu, is_Debian, is_Raspbian, is_Fedora, is_CentOS, + is_Ubuntu, is_Debian, is_Raspbian, is_Fedora, is_CentOS, is_RedHat, ) if sys.version<'2.7': @@ -655,7 +655,7 @@ #for distros that don't patch distutils, #we have to add the python cflags: - if not (is_Fedora() or is_Debian() or is_CentOS()): + if not (is_Fedora() or is_Debian() or is_CentOS() or is_RedHat()): import shlex import sysconfig for cflag in shlex.split(sysconfig.get_config_var('CFLAGS') or ''): @@ -1539,7 +1539,7 @@ if scripts_ENABLED: scripts += ["scripts/xpra_udev_product_version", "scripts/xpra_signal_listener"] libexec_scripts = [] - if is_Fedora() or is_CentOS(): + if is_Fedora() or is_CentOS() or is_RedHat(): libexec = "libexec" else: libexec = "lib" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/svn-info new/xpra-2.5.3/svn-info --- old/xpra-2.5.2/svn-info 2019-06-07 13:50:38.000000000 +0200 +++ new/xpra-2.5.3/svn-info 2019-07-23 18:39:33.000000000 +0200 @@ -4,10 +4,10 @@ Relative URL: ^/tags/v2.5.x/src Repository Root: file:///var/svn/repos/Xpra Repository UUID: 3bb7dfac-3a0b-4e04-842a-767bc560f471 -Revision: 22875 +Revision: 23290 Node Kind: directory Schedule: normal Last Changed Author: antoine -Last Changed Rev: 22874 -Last Changed Date: 2019-06-07 06:11:39 +0100 (Fri, 07 Jun 2019) +Last Changed Rev: 23290 +Last Changed Date: 2019-07-23 17:32:21 +0100 (Tue, 23 Jul 2019) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/svn-version new/xpra-2.5.3/svn-version --- old/xpra-2.5.2/svn-version 2019-06-07 13:50:38.000000000 +0200 +++ new/xpra-2.5.3/svn-version 2019-07-23 18:39:33.000000000 +0200 @@ -1 +1 @@ -22875 +23290 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/unittests/unit/net/HMAC_test.py new/xpra-2.5.3/unittests/unit/net/HMAC_test.py --- old/xpra-2.5.2/unittests/unit/net/HMAC_test.py 2019-03-19 16:05:09.000000000 +0100 +++ new/xpra-2.5.3/unittests/unit/net/HMAC_test.py 2019-06-14 19:50:26.000000000 +0200 @@ -13,9 +13,14 @@ def test_hardcoded(self): password = b"71051d81d27745b59c1c56c6e9046c19697e452453e04aa5abbd52c8edc8c232" salt = b"99ea464f-7117-4e38-95b3-d3aa80e7b806" - hmac_hash = hmac.HMAC(password, salt, digestmod=hashlib.md5) - hd = hmac_hash.hexdigest() - ed = "dc26a074c9378b1b5735a27563320a26" + try: + hmac_hash = hmac.HMAC(password, salt, digestmod=hashlib.md5) + hd = hmac_hash.hexdigest() + ed = "dc26a074c9378b1b5735a27563320a26" + except ValueError: + hmac_hash = hmac.HMAC(password, salt, digestmod=hashlib.sha1) + hd = hmac_hash.hexdigest() + ed = "5529d27aef1b7420fb9d696f1c04eaad5dcc1515" assert hd == ed, "expected digest %s but got %s" % (ed, hd) def main(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/win32/xpra.iss new/xpra-2.5.3/win32/xpra.iss --- old/xpra-2.5.2/win32/xpra.iss 2019-04-20 12:10:50.000000000 +0200 +++ new/xpra-2.5.3/win32/xpra.iss 2019-07-16 19:42:48.000000000 +0200 @@ -1,9 +1,9 @@ [Setup] AppName=Xpra AppId=Xpra_is1 -AppVersion=2.5.2 -AppVerName=Xpra 2.5.2 -UninstallDisplayName=Xpra 2.5.2 +AppVersion=2.5.3 +AppVerName=Xpra 2.5.3 +UninstallDisplayName=Xpra 2.5.3 AppPublisher=xpra.org AppPublisherURL=http:;xpra.org/ DefaultDirName={pf}\Xpra @@ -16,7 +16,7 @@ Compression=lzma2/max SolidCompression=yes AllowUNCPath=false -VersionInfoVersion=2.5.2 +VersionInfoVersion=2.5.3 VersionInfoCompany=xpra.org VersionInfoDescription=multi-platform screen and application forwarding system WizardImageFile=win32\xpra-logo.bmp diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/__init__.py new/xpra-2.5.3/xpra/__init__.py --- old/xpra-2.5.2/xpra/__init__.py 2019-06-07 13:50:41.000000000 +0200 +++ new/xpra-2.5.3/xpra/__init__.py 2019-07-23 18:39:36.000000000 +0200 @@ -4,4 +4,4 @@ # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. -__version__ = "2.5.2" +__version__ = "2.5.3" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/client/gobject_client_base.py new/xpra-2.5.3/xpra/client/gobject_client_base.py --- old/xpra-2.5.2/xpra/client/gobject_client_base.py 2019-03-19 16:05:09.000000000 +0100 +++ new/xpra-2.5.3/xpra/client/gobject_client_base.py 2019-07-16 19:42:48.000000000 +0200 @@ -341,7 +341,7 @@ log.info("waiting for server events") def _process_server_event(self, packet): - log.info(": ".join(packet[1:])) + log.info(": ".join(bytestostr(x) for x in packet[1:])) def init_packet_handlers(self): SendCommandConnectClient.init_packet_handlers(self) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/client/gtk3/client.py new/xpra-2.5.3/xpra/client/gtk3/client.py --- old/xpra-2.5.2/xpra/client/gtk3/client.py 2019-03-19 16:05:09.000000000 +0100 +++ new/xpra-2.5.3/xpra/client/gtk3/client.py 2019-07-16 19:42:48.000000000 +0200 @@ -32,7 +32,11 @@ def install_signal_handlers(self): - register_os_signals(self.handle_app_signal) + #only register the glib signal handler + #once the main loop is running, + #before that we just trigger a KeyboardInterrupt + from xpra.gtk_common.gobject_compat import import_glib + import_glib().idle_add(register_os_signals, self.handle_app_signal) def get_notifier_classes(self): ncs = GTKXpraClient.get_notifier_classes(self) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/client/gtk_base/client_launcher.py new/xpra-2.5.3/xpra/client/gtk_base/client_launcher.py --- old/xpra-2.5.2/xpra/client/gtk_base/client_launcher.py 2019-03-19 16:05:09.000000000 +0100 +++ new/xpra-2.5.3/xpra/client/gtk_base/client_launcher.py 2019-06-19 14:22:55.000000000 +0200 @@ -645,7 +645,7 @@ self.check_boxes_hbox.hide() self.proxy_password_hbox.hide() self.validate() - if mode=="ssl" or (mode=="ssh" and not WIN32): + if mode in ("ssl", "wss") or (mode=="ssh" and not WIN32): self.nostrict_host_check.show() else: self.nostrict_host_check.hide() @@ -820,7 +820,7 @@ params["local"] = is_local(self.config.host) params["port"] = int(self.config.port) params["display_name"] = "%s:%s:%s" % (self.config.mode, self.config.host, self.config.port) - if self.config.mode=="ssl" and self.nostrict_host_check.get_active(): + if self.config.mode in ("ssl", "wss") and self.nostrict_host_check.get_active(): params["strict-host-check"] = False #print("connect_to(%s)" % params) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/client/gtk_base/gtk_client_base.py new/xpra-2.5.3/xpra/client/gtk_base/gtk_client_base.py --- old/xpra-2.5.2/xpra/client/gtk_base/gtk_client_base.py 2019-05-06 09:26:30.000000000 +0200 +++ new/xpra-2.5.3/xpra/client/gtk_base/gtk_client_base.py 2019-06-14 19:50:26.000000000 +0200 @@ -309,7 +309,11 @@ color_str = color_str.replace(":off", "") if color_str in ("auto", ""): from hashlib import md5 - m = md5() + try: + m = md5() + except ValueError: + from hashlib import sha1 + m = sha1() for x in extra_args: m.update(strtobytes(x)) color_str = "#%s" % m.hexdigest()[:6] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/client/ui_client_base.py new/xpra-2.5.3/xpra/client/ui_client_base.py --- old/xpra-2.5.2/xpra/client/ui_client_base.py 2019-03-19 16:05:10.000000000 +0100 +++ new/xpra-2.5.3/xpra/client/ui_client_base.py 2019-07-16 19:42:48.000000000 +0200 @@ -426,7 +426,7 @@ proxy_release = c.strget("proxy.platform.release") proxy_version = c.strget("proxy.version") proxy_version = c.strget("proxy.build.version", proxy_version) - proxy_distro = c.strget("linux_distribution") + proxy_distro = c.strget("proxy.linux_distribution") msg = "via: %s proxy version %s" % ( platform_name(proxy_platform, proxy_distro or proxy_release), std(proxy_version or "unknown") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/client/window_backing_base.py new/xpra-2.5.3/xpra/client/window_backing_base.py --- old/xpra-2.5.2/xpra/client/window_backing_base.py 2019-03-19 16:05:10.000000000 +0100 +++ new/xpra-2.5.3/xpra/client/window_backing_base.py 2019-06-14 19:50:26.000000000 +0200 @@ -585,12 +585,18 @@ l = options.intget("z.len") if l: assert l==len(img_data), "compressed pixel data failed length integrity check: expected %i bytes but got %i" % (l, len(img_data)) - md5 = options.strget("z.md5") - if md5: - h = hashlib.md5(img_data) + try: + chksum = options.get("z.md5") + if chksum: + h = hashlib.md5(img_data) + except ValueError: + chksum = options.get("z.sha1") + if chksum: + h = hashlib.sha1(img_data) + if h: hd = h.hexdigest() - assert md5==hd, "pixel data failed compressed md5 integrity check: expected %s but got %s" % (md5, hd) - deltalog("passed compressed data integrity checks: len=%s, md5=%s (type=%s)", l, md5, type(img_data)) + assert chksum==hd, "pixel data failed compressed chksum integrity check: expected %s but got %s" % (chksum, hd) + deltalog("passed compressed data integrity checks: len=%s, chksum=%s (type=%s)", l, chksum, type(img_data)) if coding == "mmap": self.idle_add(self.paint_mmap, img_data, x, y, width, height, rowstride, options, callbacks) elif coding in ("rgb24", "rgb32"): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/clipboard/clipboard_base.py new/xpra-2.5.3/xpra/clipboard/clipboard_base.py --- old/xpra-2.5.2/xpra/clipboard/clipboard_base.py 2019-03-19 16:05:10.000000000 +0100 +++ new/xpra-2.5.3/xpra/clipboard/clipboard_base.py 2019-07-16 19:42:48.000000000 +0200 @@ -419,15 +419,17 @@ send_token(rsel) def _munge_raw_selection_to_wire(self, target, dtype, dformat, data): + dtype = bytestostr(dtype) + target = bytestostr(target) log("_munge_raw_selection_to_wire%s", (target, dtype, dformat, data)) # Some types just cannot be marshalled: - if type in ("WINDOW", "PIXMAP", "BITMAP", "DRAWABLE", + if dtype in ("WINDOW", "PIXMAP", "BITMAP", "DRAWABLE", "PIXEL", "COLORMAP"): log("skipping clipboard data of type: %s, format=%s, len(data)=%s", dtype, dformat, len(data or "")) return None, None - if target==b"TARGETS" and dtype==b"ATOM": + if target=="TARGETS" and dtype=="ATOM" and isinstance(data, (tuple,list)): #targets is special cased here - #because we get the values in wire format already (not atoms) + #because we can get the values in wire format already (not atoms) #thanks to the request_targets() function (required on win32) return "atoms", _filter_targets(data) return self._do_munge_raw_selection_to_wire(target, dtype, dformat, data) @@ -436,10 +438,12 @@ """ this method is overriden in xclipboard to parse X11 atoms """ # Other types need special handling, and all types need to be # converting into an endian-neutral format: + dtype = bytestostr(dtype) + target = bytestostr(target) log("_do_munge_raw_selection_to_wire(%s, %s, %s, %s:%s)", target, dtype, dformat, type(data), len(data or "")) if dformat == 32: #you should be using gdk_clipboard for atom support! - if dtype in (b"ATOM", b"ATOM_PAIR") and POSIX: + if dtype in ("ATOM", "ATOM_PAIR") and POSIX: #we cannot handle gdk atoms here (but gdk_clipboard does) return None, None #important note: on 64 bits, format=32 means 8 bytes, not 4 @@ -469,9 +473,10 @@ olen = len(data) data = data[:max_recv_datalen] log.info("Data copied out truncated because of clipboard policy %d to %d", olen, max_recv_datalen) - if encoding == b"bytes": + encoding = bytestostr(encoding) + if encoding == "bytes": return data - if encoding == b"integers": + if encoding == "integers": if not data: return "" if dformat == 32: @@ -521,7 +526,7 @@ def got_contents(dtype, dformat, data): log("got_contents(%s, %s, %s:%s) data=0x%s..", dtype, dformat, type(data), len(data or ""), hexstr((data or "")[:200])) - if dtype is None or data is None or (dformat==0 and data==b""): + if dtype is None or data is None or (dformat==0 and not data): no_contents() return log("perform clipboard limit checking - datasize - %d, %d", len(data), self.max_clipboard_send_size) @@ -843,11 +848,13 @@ data = result["data"] dformat = result["format"] dtype = result["type"] + if dtype: + dtype = bytestostr(dtype) log("do_selection_get(%s,%s,%s) calling selection_data.set(%s, %s, %s:%s)", selection_data, info, time, dtype, dformat, type(data), len(data or "")) boc = self._block_owner_change self._block_owner_change = True - if is_gtk3() and dtype in (b"UTF8_STRING", b"STRING") and dformat==8: + if is_gtk3() and dtype in ("UTF8_STRING", "STRING") and dformat==8: #GTK3 workaround: can only use set_text and only on the clipboard? s = bytestostr(data) self._clipboard.set_text(s, len(s)) @@ -962,10 +969,10 @@ return log("unpack: %s", selection_data) data = selectiondata_get_data(selection_data) - dtype = selectiondata_get_data_type(selection_data) + dtype = bytestostr(selectiondata_get_data_type(selection_data)) dformat = selectiondata_get_format(selection_data) log("unpack(..) type=%s, format=%s, data=%s:%s", dtype, dformat, type(data), len(data or "")) - isstring = dtype in (b"UTF8_STRING", b"STRING") and dformat==8 + isstring = dtype in ("UTF8_STRING", "STRING") and dformat==8 if isstring: if self._strip_nullbyte: #we may have to strip the nullbyte: @@ -975,7 +982,7 @@ if data and data==self._loop_uuid: log("not sending loop uuid value '%s', returning an empty string instead", data) data= "" - cb(str(dtype), dformat, data) + cb(dtype, dformat, data) #some applications (ie: firefox, thunderbird) can request invalid targets, #when that happens, translate it to something the application can handle (if any) translated_target = TRANSLATED_TARGETS.get(target) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/clipboard/gdk_clipboard.py new/xpra-2.5.3/xpra/clipboard/gdk_clipboard.py --- old/xpra-2.5.2/xpra/clipboard/gdk_clipboard.py 2019-03-19 16:05:10.000000000 +0100 +++ new/xpra-2.5.3/xpra/clipboard/gdk_clipboard.py 2019-07-16 19:42:48.000000000 +0200 @@ -7,6 +7,7 @@ import struct from xpra.util import envbool +from xpra.os_util import bytestostr from xpra.gtk_common.gobject_compat import is_gtk3 from xpra.clipboard.clipboard_base import ClipboardProtocolHelperBase, _filter_targets, log @@ -41,8 +42,9 @@ return "GDKClipboardProtocolHelper" - def _do_munge_raw_selection_to_wire(self, target, datatype, dataformat, data): - if dataformat==32 and datatype in (b"ATOM", b"ATOM_PAIR") and gdk_atoms: + def _do_munge_raw_selection_to_wire(self, target, dtype, dataformat, data): + datatype = bytestostr(dtype) + if dataformat==32 and datatype in ("ATOM", "ATOM_PAIR") and gdk_atoms: # Convert to strings and send that. Bizarrely, the atoms are # not actual X atoms, but an array of GdkAtom's reinterpreted # as a byte buffer. @@ -50,13 +52,13 @@ log("_do_munge_raw_selection_to_wire(%s, %s, %s, %s:%s) atoms=%s", target, datatype, dataformat, type(data), len(data), tuple(atoms)) atom_names = [str(atom) for atom in atoms] - if target==b"TARGETS": + if bytestostr(target)=="TARGETS": atom_names = _filter_targets(atom_names) return "atoms", atom_names return ClipboardProtocolHelperBase._do_munge_raw_selection_to_wire(self, target, datatype, dataformat, data) def _munge_wire_selection_to_raw(self, encoding, datatype, dataformat, data): - if encoding==b"atoms" and gdk_atoms: + if bytestostr(encoding)=="atoms" and gdk_atoms: atom_array = gdk_atoms.gdk_atom_array_from_atoms(data) bdata = struct.pack(b"@" + b"L" * len(atom_array), *atom_array) log("_munge_wire_selection_to_raw(%s, %s, %s, %s:%s)=%s=%s=%s", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/codecs/image_wrapper.py new/xpra-2.5.3/xpra/codecs/image_wrapper.py --- old/xpra-2.5.2/xpra/codecs/image_wrapper.py 2019-03-19 16:05:10.000000000 +0100 +++ new/xpra-2.5.3/xpra/codecs/image_wrapper.py 2019-06-20 10:22:36.000000000 +0200 @@ -221,8 +221,11 @@ for _ in range(h): lines.append(memoryview_to_bytes(pixels[pos:pos+newstride])) pos += oldstride - return ImageWrapper(self.x+x, self.y+y, w, h, b"".join(lines), self.pixel_format, self.depth, newstride, + image = ImageWrapper(self.x+x, self.y+y, w, h, b"".join(lines), self.pixel_format, self.depth, newstride, planes=self.planes, thread_safe=True, palette=self.palette) + image.set_target_x(self.target_x+x) + image.set_target_y(self.target_y+y) + return image def __del__(self): #print("ImageWrapper.__del__() calling %s" % self.free) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/gtk_common/gtk3/gdk_atoms.pyx new/xpra-2.5.3/xpra/gtk_common/gtk3/gdk_atoms.pyx --- old/xpra-2.5.2/xpra/gtk_common/gtk3/gdk_atoms.pyx 2019-03-19 16:05:11.000000000 +0100 +++ new/xpra-2.5.3/xpra/gtk_common/gtk3/gdk_atoms.pyx 2019-07-16 19:42:48.000000000 +0200 @@ -11,6 +11,7 @@ from gi.repository import Gdk +from xpra.os_util import bytestostr from libc.stdint cimport uintptr_t @@ -47,7 +48,8 @@ #inefficient but what other constructor is there? name = gdk_atom_name(atom) if name: - gdk_atom = Gdk.Atom.intern(name, False) + str_name = bytestostr(name) + gdk_atom = Gdk.Atom.intern(str_name, False) objects.append(gdk_atom) return objects diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/net/bytestreams.py new/xpra-2.5.3/xpra/net/bytestreams.py --- old/xpra-2.5.2/xpra/net/bytestreams.py 2019-05-06 09:26:30.000000000 +0200 +++ new/xpra-2.5.3/xpra/net/bytestreams.py 2019-06-14 19:50:26.000000000 +0200 @@ -310,7 +310,7 @@ self.do_set_nodelay(SOCKET_NODELAY) def set_nodelay(self, nodelay): - if SOCKET_NODELAY is None and self.socktype in TCP_SOCKTYPES and self.nodelay!=nodelay: + if SOCKET_NODELAY is None and self.socktype_wrapped in TCP_SOCKTYPES and self.nodelay!=nodelay: self.do_set_nodelay(nodelay) def do_set_nodelay(self, nodelay): @@ -319,7 +319,7 @@ log("changed %s socket to nodelay=%s", self.socktype, nodelay) def set_cork(self, cork): - if SOCKET_CORK and self.socktype in TCP_SOCKTYPES and self.cork!=cork: + if SOCKET_CORK and self.socktype_wrapped in TCP_SOCKTYPES and self.cork!=cork: self._socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_CORK, cork) self.cork = cork log("changed %s socket to cork=%s", self.socktype, cork) @@ -428,9 +428,9 @@ opts = { "SOCKET" : get_socket_options(s, socket.SOL_SOCKET, SOCKET_OPTIONS), } - if self.socktype in ("tcp", "udp", "ws", "wss", "ssl"): + if self.socktype_wrapped in ("tcp", "udp", "ws", "wss", "ssl"): opts["IP"] = get_socket_options(s, socket.SOL_IP, IP_OPTIONS) - if self.socktype in ("tcp", "ws", "wss", "ssl"): + if self.socktype_wrapped in ("tcp", "ws", "wss", "ssl"): opts["TCP"] = get_socket_options(s, socket.IPPROTO_TCP, TCP_OPTIONS) #ipv6: IPV6_ADDR_PREFERENCES, IPV6_CHECKSUM, IPV6_DONTFRAG, IPV6_DSTOPTS, IPV6_HOPOPTS, # IPV6_MULTICAST_HOPS, IPV6_MULTICAST_IF, IPV6_MULTICAST_LOOP, IPV6_NEXTHOP, IPV6_PATHMTU, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/net/mdns/__init__.py new/xpra-2.5.3/xpra/net/mdns/__init__.py --- old/xpra-2.5.2/xpra/net/mdns/__init__.py 2019-03-19 16:05:11.000000000 +0100 +++ new/xpra-2.5.3/xpra/net/mdns/__init__.py 2019-06-19 14:22:55.000000000 +0200 @@ -4,7 +4,7 @@ # later version. See the file COPYING for details. XPRA_MDNS_TYPE = "_xpra._tcp." -RFB_MDNS_TYPE = "_rfb._tcp" +RFB_MDNS_TYPE = "_rfb._tcp." from xpra.util import envbool diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/net/websockets/protocol.py new/xpra-2.5.3/xpra/net/websockets/protocol.py --- old/xpra-2.5.2/xpra/net/websockets/protocol.py 2019-03-19 16:05:11.000000000 +0100 +++ new/xpra-2.5.3/xpra/net/websockets/protocol.py 2019-06-17 06:21:47.000000000 +0200 @@ -166,7 +166,7 @@ def _process_ws_ping(self, payload): log("_process_ws_ping(%r)", payload) - item = encode_hybi_header(OPCODE_PONG, len(payload)) + payload + item = encode_hybi_header(OPCODE_PONG, len(payload)) + memoryview_to_bytes(payload) items = (item, ) with self._write_lock: self.raw_write(items) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/os_util.py new/xpra-2.5.3/xpra/os_util.py --- old/xpra-2.5.2/xpra/os_util.py 2019-03-19 16:05:11.000000000 +0100 +++ new/xpra-2.5.3/xpra/os_util.py 2019-07-23 15:10:29.000000000 +0200 @@ -216,7 +216,7 @@ def get_rand_chars(l=16, chars=b"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"): import random - return b"".join(chars[random.randint(0, len(chars)-1)] for _ in range(l)) + return b"".join(chars[random.randint(0, len(chars)-1):][:1] for _ in range(l)) def get_hex_uuid(): return uuid.uuid4().hex @@ -286,6 +286,8 @@ if not POSIX: return False try: + if b"RedHat"==variant and get_linux_distribution()[0].startswith(variant): + return True if get_linux_distribution()[0]==variant: return True except: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/platform/pycups_printing.py new/xpra-2.5.3/xpra/platform/pycups_printing.py --- old/xpra-2.5.2/xpra/platform/pycups_printing.py 2019-04-10 04:48:03.000000000 +0200 +++ new/xpra-2.5.3/xpra/platform/pycups_printing.py 2019-07-23 15:10:29.000000000 +0200 @@ -105,6 +105,9 @@ def get_lpinfo_drv(make_and_model): + if not LPINFO: + log.error("Error: lpinfo command is not defined") + return None command = shlex.split(LPINFO)+["--make-and-model", make_and_model, "-m"] def preexec(): os.setsid() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/platform/xposix/features.py new/xpra-2.5.3/xpra/platform/xposix/features.py --- old/xpra-2.5.2/xpra/platform/xposix/features.py 2019-03-19 16:05:11.000000000 +0100 +++ new/xpra-2.5.3/xpra/platform/xposix/features.py 2019-07-16 19:42:48.000000000 +0200 @@ -28,6 +28,8 @@ "GTK_OVERLAY_SCROLLING=0", "#some versions of GTK3 honour this option, sadly not all:", "GTK_CSD=0", + "#silence some AT-SPI and atk-bridge warnings:", + "NO_AT_BRIDGE=1", ] DEFAULT_SSH_CMD = "ssh" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/platform/xposix/gui.py new/xpra-2.5.3/xpra/platform/xposix/gui.py --- old/xpra-2.5.2/xpra/platform/xposix/gui.py 2019-06-05 04:05:12.000000000 +0200 +++ new/xpra-2.5.3/xpra/platform/xposix/gui.py 2019-07-16 19:42:48.000000000 +0200 @@ -418,7 +418,7 @@ from xpra.gtk_common.gtk_util import get_default_root_window root = get_default_root_window() value = prop_get(root, "RESOURCE_MANAGER", "latin1", ignore_errors=True) - log("RESOURCE_MANAGER=%s", v) + log("RESOURCE_MANAGER=%s", value) if value is None: return None #parse the resources into a dict: @@ -768,7 +768,7 @@ from xpra.x11.gtk_x11.gdk_bindings import init_x11_filter #@UnresolvedImport, @UnusedImport self.x11_filter = init_x11_filter() log("x11_filter=%s", self.x11_filter) - except Exception: + except Exception as e: log.error("Error: failed to initialize X11 GDK filter:") log.error(" %s", e) self.x11_filter = None diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/platform/xposix/paths.py new/xpra-2.5.3/xpra/platform/xposix/paths.py --- old/xpra-2.5.2/xpra/platform/xposix/paths.py 2019-03-19 16:05:11.000000000 +0100 +++ new/xpra-2.5.3/xpra/platform/xposix/paths.py 2019-06-14 19:50:26.000000000 +0200 @@ -70,8 +70,8 @@ return os.path.join(get_app_dir(), "icons") def do_get_libexec_dir(): - from xpra.os_util import is_Fedora, is_CentOS - if is_Fedora() or is_CentOS(): + from xpra.os_util import is_Fedora, is_CentOS, is_RedHat + if is_Fedora() or is_CentOS() or is_RedHat(): return "/usr/libexec/" return "/usr/lib" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/rectangle.pyx new/xpra-2.5.3/xpra/rectangle.pyx --- old/xpra-2.5.2/xpra/rectangle.pyx 2019-03-28 13:13:12.000000000 +0100 +++ new/xpra-2.5.3/xpra/rectangle.pyx 2019-06-14 19:50:26.000000000 +0200 @@ -100,7 +100,7 @@ def substract(self, const int x, const int y, const int w, const int h): """ returns the rectangle(s) remaining when - one substracts the given rectangle from it, or None if nothing remains + one subtracts the given rectangle from it, or None if nothing remains """ if w==0 or h==0 or self.width==0 or self.height==0: #no rectangle, no change: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/scripts/server.py new/xpra-2.5.3/xpra/scripts/server.py --- old/xpra-2.5.2/xpra/scripts/server.py 2019-06-05 04:05:12.000000000 +0200 +++ new/xpra-2.5.3/xpra/scripts/server.py 2019-07-16 19:42:48.000000000 +0200 @@ -1108,7 +1108,11 @@ return 1 assert starting or starting_desktop or upgrading or upgrading_desktop from xpra.x11.gtk_x11.gdk_display_source import init_gdk_display_source, close_gdk_display_source - init_gdk_display_source() + from xpra.os_util import OSEnvContext + with OSEnvContext(): + if os.environ.get("NO_AT_BRIDGE") is None: + os.environ["NO_AT_BRIDGE"] = "1" + init_gdk_display_source() insert_cleanup(close_gdk_display_source) #(now we can access the X11 server) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/server/mixins/child_command_server.py new/xpra-2.5.3/xpra/server/mixins/child_command_server.py --- old/xpra-2.5.2/xpra/server/mixins/child_command_server.py 2019-06-07 13:50:31.000000000 +0200 +++ new/xpra-2.5.3/xpra/server/mixins/child_command_server.py 2019-07-23 15:10:29.000000000 +0200 @@ -180,12 +180,12 @@ def start_command(self, name, child_cmd, ignore=False, callback=None, use_wrapper=True, shell=False, **kwargs): log("start_command%s exec_wrapper=%s", (name, child_cmd, ignore, callback, use_wrapper, shell, kwargs), self.exec_wrapper) - from subprocess import Popen, PIPE + from subprocess import Popen env = self.get_child_env() try: real_cmd = self.get_full_child_command(child_cmd, use_wrapper) log("full child command(%s, %s)=%s", child_cmd, use_wrapper, real_cmd) - proc = Popen(real_cmd, stdin=PIPE, env=env, shell=shell, cwd=self.exec_cwd, close_fds=True, **kwargs) + proc = Popen(real_cmd, env=env, shell=shell, cwd=self.exec_cwd, close_fds=True, **kwargs) procinfo = self.add_process(proc, name, real_cmd, ignore=ignore, callback=callback) log("pid(%s)=%s", real_cmd, proc.pid) if not ignore: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/server/mixins/display_manager.py new/xpra-2.5.3/xpra/server/mixins/display_manager.py --- old/xpra-2.5.2/xpra/server/mixins/display_manager.py 2019-03-19 16:05:12.000000000 +0100 +++ new/xpra-2.5.3/xpra/server/mixins/display_manager.py 2019-07-16 19:42:48.000000000 +0200 @@ -237,14 +237,18 @@ for ss in self._server_sources.values(): if ss.desktops and i<len(ss.desktop_names) and ss.desktop_names[i]: dn = ss.desktop_names[i] - #older clients send strings, - #newer clients send bytes... - try : - v = strtobytes(dn).decode("utf8") - except UnicodeDecodeError: - v = dn - if v!="0" or i!=0: - name = v + if isinstance(dn, str): + #newer clients send unicode + name = dn + else: + #older clients send byte strings: + try : + v = strtobytes(dn).decode("utf8") + except (UnicodeEncodeError, UnicodeDecodeError): + log.error("Error parsing '%s'", dn, exc_info=True) + else: + if v!="0" or i!=0: + name = v names.append(name) self.set_desktops(names) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/server/mixins/networkstate_server.py new/xpra-2.5.3/xpra/server/mixins/networkstate_server.py --- old/xpra-2.5.2/xpra/server/mixins/networkstate_server.py 2019-03-19 16:05:12.000000000 +0100 +++ new/xpra-2.5.3/xpra/server/mixins/networkstate_server.py 2019-07-16 19:42:48.000000000 +0200 @@ -60,6 +60,8 @@ "pings" : self.pings, "bandwidth-limit" : self.bandwidth_limit or 0, } + if POSIX: + info["load"] = tuple(int(x*1000) for x in os.getloadavg()) if self.mem_bytes: info["total-memory"] = self.mem_bytes return info diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/server/mixins/server_base_controlcommands.py new/xpra-2.5.3/xpra/server/mixins/server_base_controlcommands.py --- old/xpra-2.5.2/xpra/server/mixins/server_base_controlcommands.py 2019-03-19 16:05:12.000000000 +0100 +++ new/xpra-2.5.3/xpra/server/mixins/server_base_controlcommands.py 2019-06-19 14:22:55.000000000 +0200 @@ -453,7 +453,7 @@ ch.set_direction(can_send, can_receive) msg = "clipboard direction set to '%s'" % direction log(msg) - self.setting_changed("clipboard_direction", direction) + self.setting_changed("clipboard-direction", direction) return msg def control_command_clipboard_limits(self, max_send, max_recv, *_args): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/server/server_base.py new/xpra-2.5.3/xpra/server/server_base.py --- old/xpra-2.5.2/xpra/server/server_base.py 2019-06-05 04:05:12.000000000 +0200 +++ new/xpra-2.5.3/xpra/server/server_base.py 2019-07-16 19:42:48.000000000 +0200 @@ -222,7 +222,7 @@ if detach_request and p!=proto: self.disconnect_client(p, DETACH_REQUEST) disconnected += 1 - elif uuid and ss.uuid==uuid: + elif uuid and ss.uuid==uuid and ui_client and ss.ui_client: self.disconnect_client(p, NEW_CLIENT, "new connection from the same uuid") disconnected += 1 elif ui_client and ss.ui_client: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/server/server_core.py new/xpra-2.5.3/xpra/server/server_core.py --- old/xpra-2.5.2/xpra/server/server_core.py 2019-04-16 06:57:10.000000000 +0200 +++ new/xpra-2.5.3/xpra/server/server_core.py 2019-07-23 15:10:29.000000000 +0200 @@ -803,7 +803,8 @@ except ValueError: log("peek_connection(%s, %i) failed", conn, timeout, exc_info=True) break - sleep(timeout/4.0) + if not peek_data: + sleep(timeout/4.0) line1 = b"" netlog("socket %s peek: got %i bytes", conn, len(peek_data)) if peek_data: @@ -878,7 +879,7 @@ packet_type = None if peek_data[0] in ("P", ord("P")): packet_type = "xpra" - elif line1.find("HTTP/")>0: + elif line1.find(b"HTTP/")>0: packet_type = "HTTP" if packet_type: self.new_conn_err(conn, sock, socktype, socket_info, packet_type, @@ -894,16 +895,16 @@ http = True elif self.ssl_mode=="auto" or self.ssl_mode in TRUE_OPTIONS: #look for HTTPS request to handle: - if line1.find("HTTP/")>0 or peek_data.find("\x08http/1.1")>0: + if line1.find(b"HTTP/")>0 or peek_data.find(b"\x08http/1.1")>0: http = True else: ssl_conn.enable_peek() peek_data, line1 = self.peek_connection(ssl_conn, PEEK_TIMEOUT) - http = line1.find("HTTP/")>0 + http = line1.find(b"HTTP/")>0 if http and self._html: self.start_http_socket(socktype, ssl_conn, True, peek_data) else: - log_new_connection(conn, socket_info) + log_new_connection(ssl_conn, socket_info) self.make_protocol(socktype, ssl_conn) return @@ -1797,12 +1798,15 @@ return get_thread_info(proto) def get_minimal_server_info(self): + now = time() info = { "mode" : self.get_server_mode(), "session-type" : self.session_type, "type" : "Python", "python" : {"version" : python_platform.python_version()}, "start_time" : int(self.start_time), + "current_time" : int(now), + "elapsed_time" : int(now - self.start_time), "uuid" : self.uuid, } return info diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/server/server_util.py new/xpra-2.5.3/xpra/server/server_util.py --- old/xpra-2.5.2/xpra/server/server_util.py 2019-06-05 04:05:12.000000000 +0200 +++ new/xpra-2.5.3/xpra/server/server_util.py 2019-07-23 15:10:29.000000000 +0200 @@ -279,13 +279,13 @@ #this magic value was calculated using the C macros: l = fcntl.ioctl(fd, 2148554028, buf) if l>0 and l<16: - virt_dev_path = buf.raw[:l].rstrip("\0") + virt_dev_path = buf.raw[:l].rstrip(b"\0") log("UI_GET_SYSNAME(%s)=%s", fd, virt_dev_path) uevent_path = b"/sys/devices/virtual/input/%s" % virt_dev_path - event_dirs = [x for x in os.listdir(uevent_path) if x.startswith("event")] + event_dirs = [x for x in os.listdir(uevent_path) if x.startswith(b"event")] log("event dirs(%s)=%s", uevent_path, event_dirs) for d in event_dirs: - uevent_filename = os.path.join(uevent_path, d, "uevent") + uevent_filename = os.path.join(uevent_path, d, b"uevent") uevent_conf = open(uevent_filename, "rb").read() for line in uevent_conf.splitlines(): if line.find(b"=")>0: @@ -296,6 +296,7 @@ log("found device path: %s" % dev_path) return dev_path except Exception as e: + log("get_uinput_device_path(%s)", device, exc_info=True) log.error("Error: cannot query uinput device path:") log.error(" %s", e) return None diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/server/shadow/gtk_shadow_server_base.py new/xpra-2.5.3/xpra/server/shadow/gtk_shadow_server_base.py --- old/xpra-2.5.2/xpra/server/shadow/gtk_shadow_server_base.py 2019-04-10 04:48:03.000000000 +0200 +++ new/xpra-2.5.3/xpra/server/shadow/gtk_shadow_server_base.py 2019-06-19 14:22:55.000000000 +0200 @@ -48,6 +48,12 @@ if self.tray: self.setup_tray() + def do_run(self): + screen = self.root.get_screen() + screen.connect("monitors-changed", self.monitors_changed) + GTKServerBase.do_run(self) + + def cleanup(self): self.cleanup_tray() ShadowServerBase.cleanup(self) @@ -148,6 +154,18 @@ return models + def monitors_changed(self, screen): + screenlog("monitors_changed(%s)", screen) + screenlog.info("monitor geometry changed, re-initializing windows") + self.reinitialize_root_window_models() + return True + + def reinitialize_root_window_models(self): + for window in tuple(self._window_to_id.keys()): + self._remove_window(window) + self.load_existing_windows() + + def _adjust_pointer(self, proto, wid, opointer): window = self._id_to_window.get(wid) if not window: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/server/source/networkstate_mixin.py new/xpra-2.5.3/xpra/server/source/networkstate_mixin.py --- old/xpra-2.5.2/xpra/server/source/networkstate_mixin.py 2019-03-19 16:05:12.000000000 +0100 +++ new/xpra-2.5.3/xpra/server/source/networkstate_mixin.py 2019-07-16 19:42:48.000000000 +0200 @@ -43,8 +43,7 @@ #NOTE: all ping time/echo time/load avg values are in milliseconds now_ms = int(1000*monotonic_time()) log("sending ping to %s with time=%s", self.protocol, now_ms) - import time - self.send_async("ping", now_ms, int(time.time()*1000), will_have_more=False) + self.send_async("ping", now_ms, int(monotonic_time()*1000), will_have_more=False) timeout = PING_TIMEOUT self.check_ping_echo_timers[now_ms] = self.timeout_add(timeout*1000, self.check_ping_echo_timeout, now_ms, timeout) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/server/ssh.py new/xpra-2.5.3/xpra/server/ssh.py --- old/xpra-2.5.2/xpra/server/ssh.py 2019-04-10 04:48:03.000000000 +0200 +++ new/xpra-2.5.3/xpra/server/ssh.py 2019-06-14 19:50:26.000000000 +0200 @@ -11,7 +11,7 @@ import paramiko from xpra.net.ssh import SSHSocketConnection -from xpra.util import csv, envint +from xpra.util import csv, envint, first_time from xpra.os_util import osexpand, getuid, bytestostr, WIN32, POSIX, monotonic_time from xpra.platform.paths import get_ssh_conf_dirs from xpra.log import Logger @@ -20,6 +20,7 @@ SERVER_WAIT = envint("XPRA_SSH_SERVER_WAIT", 20) AUTHORIZED_KEYS = "~/.ssh/authorized_keys" +AUTHORIZED_KEYS_HASHES = os.environ.get("XPRA_AUTHORIZED_KEYS_HASHES", "md5,sha1,sha224,sha256,sha384,sha512").split(",") class SSHServer(paramiko.ServerInterface): @@ -93,10 +94,21 @@ log("ignoring line '%s': %s", line, e) continue import hashlib - fp_plain = hashlib.md5(key).hexdigest() - log("key(%s)=%s", line, fp_plain) - if fp_plain==hex_fingerprint: - return paramiko.OPEN_SUCCEEDED + for hash_algo in AUTHORIZED_KEYS_HASHES: + hash_instance = None + try: + hash_class = getattr(hashlib, hash_algo) #ie: hashlib.md5 + hash_instance = hash_class(key) #can raise ValueError (ie: on FIPS compliant systems) + except ValueError: + hash_instance = None + if not hash_instance: + if first_time("hash-%s-missing" % hash_algo): + log.warn("Warning: unsupported hash '%s'", hash_algo) + continue + fp_plain = hash_instance.hexdigest() + log("%s(%s)=%s", hash_algo, line, fp_plain) + if fp_plain==hex_fingerprint: + return paramiko.OPEN_SUCCEEDED count += 1 log("no match in %i keys from '%s'", count, authorized_keys_filename) return paramiko.AUTH_FAILED diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/server/window/window_source.py new/xpra-2.5.3/xpra/server/window/window_source.py --- old/xpra-2.5.2/xpra/server/window/window_source.py 2019-03-19 16:05:12.000000000 +0100 +++ new/xpra-2.5.3/xpra/server/window/window_source.py 2019-06-14 19:50:26.000000000 +0200 @@ -2329,10 +2329,10 @@ v = data.data except AttributeError: v = data - md5 = hashlib.md5(v).hexdigest() - client_options["z.md5"] = md5 + chksum = hashlib.sha1().hexdigest() + client_options["z.sha1"] = chksum client_options["z.len"] = len(data) - log("added len and hash of compressed data integrity %19s: %8i / %s", type(v), len(v), md5) + log("added len and hash of compressed data integrity %19s: %8i / %s", type(v), len(v), chksum) #actual network packet: if self.supports_flush and flush not in (None, 0): client_options["flush"] = flush diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/server/window/window_video_source.py new/xpra-2.5.3/xpra/server/window/window_video_source.py --- old/xpra-2.5.2/xpra/server/window/window_video_source.py 2019-05-06 09:26:30.000000000 +0200 +++ new/xpra-2.5.3/xpra/server/window/window_video_source.py 2019-06-20 10:22:36.000000000 +0200 @@ -1739,7 +1739,10 @@ #tells make_data_packet not to invalidate the scroll data: ww, wh = self.window_dimensions scrolllog("encode_scrolling(%s, %s) window-dimensions=%s", image, options, (ww, wh)) - x, y, w, h = image.get_geometry()[:4] + x = image.get_target_x() + y = image.get_target_y() + w = image.get_width() + h = image.get_height() raw_scroll, non_scroll = {}, {0 : h} if x+y>ww or y+h>wh: #window may have been resized @@ -1810,7 +1813,7 @@ # filename = "./scroll-%i-%i.png" % (self._sequence, len(non_scroll)-flush) # im.save(filename, "png") # log.info("saved scroll y=%i h=%i to %s", sy, sh, filename) - packet = self.make_draw_packet(sub.get_x(), sub.get_y(), outw, outh, coding, data, outstride, client_options, options) + packet = self.make_draw_packet(sub.get_target_x(), sub.get_target_y(), outw, outh, coding, data, outstride, client_options, options) self.queue_damage_packet(packet) psize = w*sh*4 csize = len(data) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/server/window/windowicon_source.py new/xpra-2.5.3/xpra/server/window/windowicon_source.py --- old/xpra-2.5.2/xpra/server/window/windowicon_source.py 2019-05-06 09:26:30.000000000 +0200 +++ new/xpra-2.5.3/xpra/server/window/windowicon_source.py 2019-07-16 19:42:48.000000000 +0200 @@ -244,7 +244,7 @@ else: if image: pixel_data = image.tobytes("raw", "RGBA") - wrapper = self.compressed_wrapper("premult_argb32", strtobytes(pixel_data)) + wrapper = self.compressed_wrapper("premult_argb32", memoryview_to_bytes(pixel_data)) packet = ("window-icon", self.wid, w, h, wrapper.datatype, wrapper) log("queuing window icon update: %s", packet) self.queue_packet(packet, wait_for_more=True) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/src_info.py new/xpra-2.5.3/xpra/src_info.py --- old/xpra-2.5.2/xpra/src_info.py 2019-06-07 13:50:38.000000000 +0200 +++ new/xpra-2.5.3/xpra/src_info.py 2019-07-23 18:39:33.000000000 +0200 @@ -1,2 +1,2 @@ LOCAL_MODIFICATIONS=0 -REVISION=22875 +REVISION=23290 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/x11/bindings/ximage.pyx new/xpra-2.5.3/xpra/x11/bindings/ximage.pyx --- old/xpra-2.5.2/xpra/x11/bindings/ximage.pyx 2019-03-19 16:05:12.000000000 +0100 +++ new/xpra-2.5.3/xpra/x11/bindings/ximage.pyx 2019-06-20 10:22:36.000000000 +0200 @@ -398,8 +398,11 @@ raise Exception("source image does not have pixels!") cdef unsigned char Bpp = BYTESPERPIXEL(self.depth) cdef uintptr_t sub_ptr = (<uintptr_t> src) + x*Bpp + y*self.rowstride - return XImageWrapper(self.x+x, self.y+y, w, h, sub_ptr, self.pixel_format, + image = XImageWrapper(self.x+x, self.y+y, w, h, sub_ptr, self.pixel_format, self.depth, self.rowstride, self.planes, self.bytesperpixel, True, True, self.palette) + image.set_target_x(self.target_x+x) + image.set_target_y(self.target_y+y) + return image cdef void *get_pixels_ptr(self): if self.pixels!=NULL: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/x11/desktop_server.py new/xpra-2.5.3/xpra/x11/desktop_server.py --- old/xpra-2.5.2/xpra/x11/desktop_server.py 2019-03-19 16:05:12.000000000 +0100 +++ new/xpra-2.5.3/xpra/x11/desktop_server.py 2019-07-16 19:42:48.000000000 +0200 @@ -168,7 +168,7 @@ icon = get_icon(icon_name) if not icon: return None - return icon.get_width(), icon.get_height(), "BGRA", icon.get_pixels() + return icon.get_width(), icon.get_height(), "RGBA", icon.get_pixels() def get_property(self, prop): @@ -319,8 +319,18 @@ X11ServerBase.do_cleanup(self) remove_catchall_receiver("xpra-motion-event", self) cleanup_x11_filter() - with xswallow: - cleanup_all_event_receivers() + #try a few times: + #errors happen because windows are being destroyed + #(even more so when we cleanup) + #and we don't really care too much about this + for l in (log, log, log, log, log.warn): + try: + with xsync: + cleanup_all_event_receivers() + #all went well, we're done + return + except Exception as e: + l("failed to remove event receivers: %s", e) def notify_dpi_warning(self, body): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/x11/server.py new/xpra-2.5.3/xpra/x11/server.py --- old/xpra-2.5.2/xpra/x11/server.py 2019-03-19 16:05:12.000000000 +0100 +++ new/xpra-2.5.3/xpra/x11/server.py 2019-07-16 19:42:48.000000000 +0200 @@ -288,7 +288,18 @@ self.cancel_all_configure_damage() X11ServerBase.do_cleanup(self) cleanup_x11_filter() - cleanup_all_event_receivers() + #try a few times: + #errors happen because windows are being destroyed + #(even more so when we cleanup) + #and we don't really care too much about this + for l in (log, log, log, log, log.warn): + try: + with xsync: + cleanup_all_event_receivers() + #all went well, we're done + return + except Exception as e: + l("failed to remove event receivers: %s", e) if self._wm: self._wm.cleanup() self._wm = None diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/x11/vfb_util.py new/xpra-2.5.3/xpra/x11/vfb_util.py --- old/xpra-2.5.2/xpra/x11/vfb_util.py 2019-03-19 16:05:12.000000000 +0100 +++ new/xpra-2.5.3/xpra/x11/vfb_util.py 2019-07-23 15:10:29.000000000 +0200 @@ -16,7 +16,7 @@ from xpra.os_util import ( setsid, shellsub, close_fds, setuidgid, getuid, getgid, - strtobytes, osexpand, monotonic_time, + strtobytes, bytestostr, osexpand, monotonic_time, POSIX, OSX, PYTHON3, ) from xpra.platform.displayfd import read_displayfd, parse_displayfd @@ -90,11 +90,11 @@ #create individual device files: def save_input_conf(xorg_conf_dir, i, dev_type, device_uuid, uid, gid): upper_dev_type = dev_type[:1].upper()+dev_type[1:] #ie: Pointer - product_name = "Xpra Virtual %s %s" % (upper_dev_type, device_uuid) + product_name = "Xpra Virtual %s %s" % (upper_dev_type, bytestostr(device_uuid)) identifier = "xpra-virtual-%s" % dev_type conf_file = os.path.join(xorg_conf_dir, "%02i-%s.conf" % (i, dev_type)) with open(conf_file, "wb") as f: - f.write(b"""Section "InputClass" + f.write(strtobytes("""Section "InputClass" Identifier "%s" MatchProduct "%s" MatchUSBID "ffff:ffff" @@ -103,7 +103,7 @@ Option "AccelProfile" "flat" Option "Ignore" "False" EndSection -""" % (identifier, product_name, upper_dev_type)) +""" % (identifier, product_name, upper_dev_type))) os.fchown(f.fileno(), uid, gid) #Option "AccelerationProfile" "-1" #Option "AccelerationScheme" "none" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/x11/x11_server_core.py new/xpra-2.5.3/xpra/x11/x11_server_core.py --- old/xpra-2.5.2/xpra/x11/x11_server_core.py 2019-03-19 16:05:12.000000000 +0100 +++ new/xpra-2.5.3/xpra/x11/x11_server_core.py 2019-07-16 19:42:48.000000000 +0200 @@ -105,6 +105,7 @@ init_x11_window_filters() def do_init(self, opts): + self.opengl = opts.opengl self.randr = opts.resize_display self.randr_exact_size = False self.fake_xinerama = False #only enabled in seamless server @@ -185,6 +186,9 @@ def query_opengl(self): self.opengl_props = {} + if self.opengl.lower()=="noprobe": + gllog("query_opengl() skipped: %s", self.opengl) + return blacklisted_kernel_modules = [] for mod in ("vboxguest", "vboxvideo"): if os.path.exists("/sys/module/%s" % mod): @@ -301,11 +305,11 @@ return env def do_cleanup(self): - GTKServerBase.do_cleanup(self) if self.fake_xinerama: cleanup_fakeXinerama() with xswallow: clean_keyboard_state() + GTKServerBase.do_cleanup(self) def get_uuid(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5.2/xpra/x11/xroot_props.py new/xpra-2.5.3/xpra/x11/xroot_props.py --- old/xpra-2.5.2/xpra/x11/xroot_props.py 2019-03-19 16:05:12.000000000 +0100 +++ new/xpra-2.5.3/xpra/x11/xroot_props.py 2019-07-16 19:42:48.000000000 +0200 @@ -7,7 +7,6 @@ from xpra.gtk_common.gobject_util import n_arg_signal, SIGNAL_RUN_LAST from xpra.x11.gtk_x11.gdk_bindings import ( add_event_receiver, remove_event_receiver, - cleanup_all_event_receivers, ) from xpra.gtk_common.gtk_util import PROPERTY_CHANGE_MASK from xpra.gtk_common.error import xsync @@ -36,18 +35,6 @@ #this must be called from the UI thread! remove_event_receiver(self._root, self) self._root.set_events(self._saved_event_mask) - #try a few times: - #errors happen because windows are being destroyed - #(even more so when we cleanup) - #and we don't really care too much about this - for l in (log, log, log, log, log.warn): - try: - with xsync: - cleanup_all_event_receivers() - #all went well, we're done - return - except Exception as e: - l("failed to remove event receivers: %s", e) def do_xpra_property_notify_event(self, event): log("XRootPropWatcher.do_xpra_property_notify_event(%s)", event)
