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)



Reply via email to