Hello community,

here is the log from the commit of package xpra for openSUSE:Factory checked in 
at 2019-02-01 11:48:21
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/xpra (Old)
 and      /work/SRC/openSUSE:Factory/.xpra.new.28833 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "xpra"

Fri Feb  1 11:48:21 2019 rev:3 rq:670340 version:2.4.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/xpra/xpra.changes        2018-12-06 
12:17:25.793512521 +0100
+++ /work/SRC/openSUSE:Factory/.xpra.new.28833/xpra.changes     2019-02-01 
11:48:42.164351786 +0100
@@ -1,0 +2,42 @@
+Thu Jan 31 12:22:06 UTC 2019 - Luigi Baldoni <[email protected]>
+
+- Update to version 2.4.3
+  * fix minor glib timer handle leak and unnecessary timer
+    scheduling
+  * fix keyboard backwards compatibility with older 1.0 servers
+  * fix error in keyboard debug logging
+  * fix h264 decoding in HTML5 client
+  * fix session info and bug report windows not getting
+    dismissed in HTML5 client
+  * fix precise wheel motion events with HTML5 client
+  * fix clipboard with MacOS GTK2 clients
+  * fix swap-keys menu entry wrongly disabled
+  * fix potential memory leaks and errors in codecs due to cast
+    error
+  * fix crashy codecs on MS Windows: disable x264, 32-bit vpx
+    with large sizes
+  * fix validation errors with some quality and speed control
+    commands
+  * fix buggy parsing of clipboard-contents packets
+  * fix jpeg encoder and decoder library version requirements
+    (ie: for CentOS 7.x)
+  * fix starting sessions via ssh on Ubuntu (workaround buggy
+    systemd-run)
+  * fix MS Windows clients handling system tray icons without an
+    alpha channel
+  * fix error in video exception message formating
+  * fix errors handling pointer events with extra relative
+    pointer data
+  * fix potential string substitution errors with python2
+  * fix connection to hosts that resolve to ipv6 only addresses
+  * fix dbus mixin attributes initialized twice (wrong values)
+  * fix race condition error with network congestion events
+  * fix compatibility with newer ArchLinux Xorg path
+  * fix exec-auth module timeout not being honoured
+  * fix exec-auth wrongly returning success on MacOS
+  * workaround SSH errors with Windows Services for Linux
+  * reduce impact of fullscreen and maxmimized attributes on
+    window refresh rate
+  * never lock the batch delay when mmap is enabled
+
+-------------------------------------------------------------------

Old:
----
  xpra-2.4.2.tar.xz

New:
----
  xpra-2.4.3.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ xpra.spec ++++++
--- /var/tmp/diff_new_pack.xM8teR/_old  2019-02-01 11:48:42.708351228 +0100
+++ /var/tmp/diff_new_pack.xM8teR/_new  2019-02-01 11:48:42.708351228 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package xpra
 #
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
 # Copyright (c) 2012-2013 Pascal Bleser <[email protected]>
 #
 # All modifications and additions to the file contributed by third parties
@@ -13,7 +13,7 @@
 # license that conforms to the Open Source Definition (Version 1.9)
 # published by the Open Source Initiative.
 
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
 
@@ -23,7 +23,7 @@
 %endif
 %global __requires_exclude ^typelib\\(GtkosxApplication\\).*$
 Name:           xpra
-Version:        2.4.2
+Version:        2.4.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.4.2.tar.xz -> xpra-2.4.3.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/NEWS new/xpra-2.4.3/NEWS
--- old/xpra-2.4.2/NEWS 2018-11-23 06:36:08.000000000 +0100
+++ new/xpra-2.4.3/NEWS 2019-01-13 06:10:42.000000000 +0100
@@ -1,3 +1,34 @@
+v2.4.3 (2019-01-12)
+======================
+       -- fix minor glib timer handle leak and unnecessary timer scheduling
+       -- fix keyboard backwards compatibility with older 1.0 servers
+       -- fix error in keyboard debug logging
+       -- fix h264 decoding in HTML5 client
+       -- fix session info and bug report windows not getting dismissed in 
HTML5 client
+       -- fix precise wheel motion events with HTML5 client
+       -- fix clipboard with MacOS GTK2 clients
+       -- fix swap-keys menu entry wrongly disabled
+       -- fix potential memory leaks and errors in codecs due to cast error
+       -- fix crashy codecs on MS Windows: disable x264, 32-bit vpx with large 
sizes
+       -- fix validation errors with some quality and speed control commands
+       -- fix buggy parsing of clipboard-contents packets
+       -- fix jpeg encoder and decoder library version requirements (ie: for 
CentOS 7.x)
+       -- fix starting sessions via ssh on Ubuntu (workaround buggy 
systemd-run)
+       -- fix MS Windows clients handling system tray icons without an alpha 
channel
+       -- fix error in video exception message formating
+       -- fix errors handling pointer events with extra relative pointer data
+       -- fix potential string substitution errors with python2
+       -- fix connection to hosts that resolve to ipv6 only addresses
+       -- fix dbus mixin attributes initialized twice (wrong values)
+       -- fix race condition error with network congestion events
+       -- fix compatibility with newer ArchLinux Xorg path
+       -- fix exec-auth module timeout not being honoured
+       -- fix exec-auth wrongly returning success on MacOS
+       -- workaround SSH errors with Windows Services for Linux
+       -- reduce impact of fullscreen and maxmimized attributes on window 
refresh rate
+       -- never lock the batch delay when mmap is enabled
+
+
 v2.4.2 (2018-11-23)
 ======================
        -- fix server crash with application setting invalid X11 atoms
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/html5/index.html 
new/xpra-2.4.3/html5/index.html
--- old/xpra-2.4.2/html5/index.html     2018-10-14 18:59:49.000000000 +0200
+++ new/xpra-2.4.3/html5/index.html     2018-12-20 00:11:04.000000000 +0100
@@ -220,8 +220,8 @@
                        function cleanup_dialogs() {
                                $('.menu-content').slideUp();
                                $('#about').hide();
-                               hide_sessioninfo(null);
-                               hide_bugreport(null);
+                               hide_sessioninfo();
+                               hide_bugreport();
                        }
                        function connection_established() {
                                //this may be a re-connection,
@@ -241,7 +241,7 @@
                        $("body").click(function() {
                                $('.menu-content').slideUp();
                                $('#about').hide();
-                               hide_sessioninfo(event);
+                               hide_sessioninfo();
                        });
 
                        $("#pasteboard").blur(function() {
@@ -255,7 +255,7 @@
                        function show_about(event) {
                                $('.menu-content').slideUp();
                                $('#about').show();
-                               hide_sessioninfo(event);
+                               hide_sessioninfo();
                                event.stopPropagation();
                        }
 
@@ -268,7 +268,7 @@
                                client.start_info_timer();
                                event.stopPropagation();
                        }
-                       function hide_sessioninfo(event) {
+                       function hide_sessioninfo() {
                                $('#sessioninfo').hide();
                                client.stop_info_timer();
                        }
@@ -315,7 +315,7 @@
                                $("#bugreport_submit").prop('disabled', false);
                                document.removeEventListener('info-response', 
enable_bugreport_submit);
                        }
-                       function hide_bugreport(event) {
+                       function hide_bugreport() {
                                $('#bugreport').hide();
                                //focus back on our capture widget:
                                $("#pasteboard").prop('autofocus');
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/html5/js/Client.js 
new/xpra-2.4.3/html5/js/Client.js
--- old/xpra-2.4.2/html5/js/Client.js   2018-10-14 18:59:49.000000000 +0200
+++ new/xpra-2.4.3/html5/js/Client.js   2018-12-20 00:11:04.000000000 +0100
@@ -1307,13 +1307,13 @@
                var btn_x = (px>=0) ? 6 : 7;
             var xdist = Math.round(px*1000/120);
             this.send(["wheel-motion", wid, btn_x, -xdist,
-               (x, y), modifiers, buttons]);
+               [x, y], modifiers, buttons]);
         }
         if (apy>0) {
                var btn_y = (py>=0) ? 5 : 4;
             var ydist = Math.round(py*1000/120);
             this.send(["wheel-motion", wid, btn_y, -ydist,
-                (x, y), modifiers, buttons]);
+                [x, y], modifiers, buttons]);
         }
         return;
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/html5/js/Utilities.js 
new/xpra-2.4.3/html5/js/Utilities.js
--- old/xpra-2.4.2/html5/js/Utilities.js        2018-11-13 14:51:47.000000000 
+0100
+++ new/xpra-2.4.3/html5/js/Utilities.js        2018-12-20 00:11:04.000000000 
+0100
@@ -10,7 +10,7 @@
 'use strict';
 
 var Utilities = {
-       VERSION : "2.4.2",
+       VERSION : "2.4.3",
 
        error : function() {
                console.error.apply(console, arguments);
@@ -445,7 +445,7 @@
                if(v===null) {
                        return default_value;
                }
-               return ["true", "on", "1", "yes", 
"enabled"].includes(String(v).toLowerCase());
+               return ["true", "on", "1", "yes", 
"enabled"].indexOf(String(v).toLowerCase())!==-1;
        },
 
        getConnectionInfo : function() {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/html5/js/Window.js 
new/xpra-2.4.3/html5/js/Window.js
--- old/xpra-2.4.2/html5/js/Window.js   2018-10-14 18:59:49.000000000 +0200
+++ new/xpra-2.4.3/html5/js/Window.js   2018-11-26 13:10:52.000000000 +0100
@@ -909,10 +909,10 @@
        img.data.set(buffer);
        var x = this.broadway_paint_location[0];
        var y = this.broadway_paint_location[1];
-       this.offscreen_canvas_ctx.putImageData(img, x, y);
+       this.offscreen_canvas_ctx.putImageData(img, x, y, 0, 0, enc_width, 
enc_height);
        if(enc_width!=width || enc_height!=height) {
                //scale it:
-               this.offscreen_canvas_ctx.drawImage(this.offscreen_canvas, x, 
y, p_width, p_height, x, y, width, height);
+               this.offscreen_canvas_ctx.drawImage(this.offscreen_canvas, x, 
y, enc_width, enc_height, x, y, width, height);
        }
 };
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/patches/centos7-oldturbojpeg.patch 
new/xpra-2.4.3/patches/centos7-oldturbojpeg.patch
--- old/xpra-2.4.2/patches/centos7-oldturbojpeg.patch   1970-01-01 
01:00:00.000000000 +0100
+++ new/xpra-2.4.3/patches/centos7-oldturbojpeg.patch   2018-12-20 
00:11:04.000000000 +0100
@@ -0,0 +1,80 @@
+Index: xpra/codecs/jpeg/decoder.pyx
+===================================================================
+--- a/xpra/codecs/jpeg/decoder.pyx     (revision 21176)
++++ b/xpra/codecs/jpeg/decoder.pyx     (working copy)
+@@ -31,7 +31,7 @@
+     TJSAMP  TJSAMP_420
+     TJSAMP  TJSAMP_GRAY
+     TJSAMP  TJSAMP_440
+-    TJSAMP  TJSAMP_411
++    #TJSAMP  TJSAMP_411
+ 
+     TJPF    TJPF_RGB
+     TJPF    TJPF_BGR
+@@ -44,7 +44,7 @@
+     TJPF    TJPF_BGRA
+     TJPF    TJPF_ABGR
+     TJPF    TJPF_ARGB
+-    TJPF    TJPF_CMYK
++    #TJPF    TJPF_CMYK
+ 
+     TJCS    TJCS_RGB
+     TJCS    TJCS_YCbCr
+@@ -84,7 +84,7 @@
+     TJSAMP_420  : "420",
+     TJSAMP_GRAY : "GRAY",
+     TJSAMP_440  : "440",
+-    TJSAMP_411  : "411",
++    #TJSAMP_411  : "411",
+     }
+ 
+ TJCS_STR = {
+@@ -107,7 +107,7 @@
+     TJPF_BGRA   : "BGRA",
+     TJPF_ABGR   : "ABGR",
+     TJPF_ARGB   : "ARGB",
+-    TJPF_CMYK   : "CMYK",
++    #TJPF_CMYK   : "CMYK",
+     }
+ TJPF_VAL = dict((v,k) for k,v in TJPF_STR.items())
+ 
+Index: xpra/codecs/jpeg/encoder.pyx
+===================================================================
+--- a/xpra/codecs/jpeg/encoder.pyx     (revision 21176)
++++ b/xpra/codecs/jpeg/encoder.pyx     (working copy)
+@@ -31,7 +31,7 @@
+     TJSAMP  TJSAMP_420
+     TJSAMP  TJSAMP_GRAY
+     TJSAMP  TJSAMP_440
+-    TJSAMP  TJSAMP_411
++    #TJSAMP  TJSAMP_411
+ 
+     TJPF    TJPF_RGB
+     TJPF    TJPF_BGR
+@@ -44,7 +44,7 @@
+     TJPF    TJPF_BGRA
+     TJPF    TJPF_ABGR
+     TJPF    TJPF_ARGB
+-    TJPF    TJPF_CMYK
++    #TJPF    TJPF_CMYK
+ 
+     int TJFLAG_BOTTOMUP
+     int TJFLAG_FASTUPSAMPLE
+@@ -73,7 +73,7 @@
+     "BGRA"  : TJPF_BGRA,
+     "ABGR"  : TJPF_ABGR,
+     "ARGB"  : TJPF_ARGB,
+-    "CMYK"  : TJPF_CMYK,
++    #"CMYK"  : TJPF_CMYK,
+     }
+ TJSAMP_STR = {
+     TJSAMP_444  : "444",
+@@ -81,7 +81,7 @@
+     TJSAMP_420  : "420",
+     TJSAMP_GRAY : "GRAY",
+     TJSAMP_440  : "440",
+-    TJSAMP_411  : "411",
++    #TJSAMP_411  : "411",
+     }
+ 
+ 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/scripts/xpra_Xdummy 
new/xpra-2.4.3/scripts/xpra_Xdummy
--- old/xpra-2.4.2/scripts/xpra_Xdummy  2018-10-14 18:59:50.000000000 +0200
+++ new/xpra-2.4.3/scripts/xpra_Xdummy  2019-01-10 04:00:31.000000000 +0100
@@ -54,6 +54,9 @@
 elif [ -x "/usr/lib/xorg-server/Xorg" ]; then
        #Arch Linux:
        exec "/usr/lib/xorg-server/Xorg" "$@"
+elif [ -x "/usr/lib/Xorg" ]; then
+       #Arch Linux (new 2019):
+       exec "/usr/lib/Xorg" "$@"
 elif [ -x "/usr/lib/xorg/Xorg" ]; then
        #Ubuntu 16.10:
        exec "/usr/lib/xorg/Xorg" "$@"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/setup.py new/xpra-2.4.3/setup.py
--- old/xpra-2.4.2/setup.py     2018-10-14 18:59:57.000000000 +0200
+++ new/xpra-2.4.3/setup.py     2018-12-20 00:11:04.000000000 +0100
@@ -186,10 +186,12 @@
 
 enc_proxy_ENABLED       = DEFAULT
 enc_x264_ENABLED        = DEFAULT and pkg_config_ok("--exists", "x264")
-enc_x265_ENABLED        = DEFAULT and pkg_config_ok("--exists", "x265")
+#crashes on 32-bit windows:
+enc_x265_ENABLED        = (not WIN32) and pkg_config_ok("--exists", "x265")
 pillow_ENABLED          = DEFAULT
 webp_ENABLED            = DEFAULT and pkg_config_version("0.5", "libwebp")
-jpeg_ENABLED            = DEFAULT and pkg_config_version("1.2", "libturbojpeg")
+jpeg_encoder_ENABLED    = DEFAULT and pkg_config_version("1.2", "libturbojpeg")
+jpeg_decoder_ENABLED    = DEFAULT and pkg_config_version("1.4", "libturbojpeg")
 vpx_ENABLED             = DEFAULT and pkg_config_version("1.4", "vpx")
 enc_ffmpeg_ENABLED      = pkg_config_version("58.18", "libavcodec")
 #opencv currently broken on 32-bit windows (crashes on load):
@@ -221,7 +223,7 @@
 #allow some of these flags to be modified on the command line:
 SWITCHES = ["enc_x264", "enc_x265", "enc_ffmpeg",
             "nvenc", "cuda_kernels", "cuda_rebuild", "nvfbc",
-            "vpx", "webp", "pillow", "jpeg",
+            "vpx", "webp", "pillow", "jpeg_encoder", "jpeg_decoder",
             "v4l2",
             "dec_avcodec2", "csc_swscale",
             "csc_libyuv",
@@ -2208,13 +2210,20 @@
                 ["xpra/codecs/webp/decode.pyx"],
                 **webp_pkgconfig))
 
-toggle_packages(jpeg_ENABLED, "xpra.codecs.jpeg")
-if jpeg_ENABLED:
-    jpeg_pkgconfig = pkgconfig("libturbojpeg")
-    cython_add(Extension("xpra.codecs.jpeg.encoder",
+jpeg = jpeg_decoder_ENABLED or jpeg_encoder_ENABLED
+toggle_packages(jpeg, "xpra.codecs.jpeg")
+if jpeg:
+    if jpeg_encoder_ENABLED:
+        jpeg_pkgconfig = pkgconfig("libturbojpeg")
+        if not pkg_config_version("1.4", "libturbojpeg"):
+            #older versions don't have const argument:
+            remove_from_keywords(jpeg_pkgconfig, 'extra_compile_args', 
"-Werror")
+        cython_add(Extension("xpra.codecs.jpeg.encoder",
                 ["xpra/codecs/jpeg/encoder.pyx"],
                 **jpeg_pkgconfig))
-    cython_add(Extension("xpra.codecs.jpeg.decoder",
+    if jpeg_decoder_ENABLED:
+        jpeg_pkgconfig = pkgconfig("libturbojpeg")
+        cython_add(Extension("xpra.codecs.jpeg.decoder",
                 ["xpra/codecs/jpeg/decoder.pyx"],
                 **jpeg_pkgconfig))
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/svn-info new/xpra-2.4.3/svn-info
--- old/xpra-2.4.2/svn-info     2018-11-23 13:38:17.000000000 +0100
+++ new/xpra-2.4.3/svn-info     2019-01-17 12:13:36.000000000 +0100
@@ -4,10 +4,10 @@
 Relative URL: ^/tags/v2.4.x/src
 Repository Root: file:///var/svn/repos/Xpra
 Repository UUID: 3bb7dfac-3a0b-4e04-842a-767bc560f471
-Revision: 21077
+Revision: 21350
 Node Kind: directory
 Schedule: normal
 Last Changed Author: antoine
-Last Changed Rev: 21077
-Last Changed Date: 2018-11-23 05:34:41 +0000 (Fri, 23 Nov 2018)
+Last Changed Rev: 21350
+Last Changed Date: 2019-01-12 11:01:02 +0000 (Sat, 12 Jan 2019)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/svn-version new/xpra-2.4.3/svn-version
--- old/xpra-2.4.2/svn-version  2018-11-23 13:38:17.000000000 +0100
+++ new/xpra-2.4.3/svn-version  2019-01-17 12:13:36.000000000 +0100
@@ -1 +1 @@
-21077
+21350
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/win32/xpra.iss 
new/xpra-2.4.3/win32/xpra.iss
--- old/xpra-2.4.2/win32/xpra.iss       2018-11-13 14:51:47.000000000 +0100
+++ new/xpra-2.4.3/win32/xpra.iss       2018-12-20 00:11:04.000000000 +0100
@@ -1,6 +1,6 @@
 [Setup]
 AppName=Xpra
-AppVerName=Xpra 2.4.2
+AppVerName=Xpra 2.4.3
 AppPublisher=xpra.org
 AppPublisherURL=http://xpra.org/
 DefaultDirName={pf}\Xpra
@@ -13,7 +13,7 @@
 Compression=lzma2/max
 SolidCompression=yes
 AllowUNCPath=false
-VersionInfoVersion=2.4.2
+VersionInfoVersion=2.4.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.4.2/xpra/__init__.py 
new/xpra-2.4.3/xpra/__init__.py
--- old/xpra-2.4.2/xpra/__init__.py     2018-11-23 13:38:18.000000000 +0100
+++ new/xpra-2.4.3/xpra/__init__.py     2019-01-17 12:13:37.000000000 +0100
@@ -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.4.2"
+__version__ = "2.4.3"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/client/mixins/clipboard.py 
new/xpra-2.4.3/xpra/client/mixins/clipboard.py
--- old/xpra-2.4.2/xpra/client/mixins/clipboard.py      2018-10-14 
18:59:53.000000000 +0200
+++ new/xpra-2.4.3/xpra/client/mixins/clipboard.py      2018-12-20 
00:11:04.000000000 +0100
@@ -62,6 +62,7 @@
                 #buggy osx and win32 clipboards:
                 "greedy"                    : CLIPBOARD_GREEDY,
                 "set_enabled"               : True,
+                "contents-slice-fix"        : True,
                 },
              })
         caps["clipboard"] = self.client_supports_clipboard
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/client/window_backing_base.py 
new/xpra-2.4.3/xpra/client/window_backing_base.py
--- old/xpra-2.4.2/xpra/client/window_backing_base.py   2018-10-14 
18:59:54.000000000 +0200
+++ new/xpra-2.4.3/xpra/client/window_backing_base.py   2019-01-10 
04:00:31.000000000 +0100
@@ -408,7 +408,7 @@
                 v = self.validate_csc_size(spec, src_width, src_height, 
dst_width, dst_height)
                 if v:
                     log.error("       "+v[0], *v[1:])
-        raise Exception("no csc module found for %s(%sx%s) to %s(%sx%s)" % 
(src_format, src_width, src_height, " or ".join(dst_format_options), dst_width, 
dst_height, CSC_OPTIONS))
+        raise Exception("no csc module found for %s(%sx%s) to %s(%sx%s) in %s" 
% (src_format, src_width, src_height, " or ".join(dst_format_options), 
dst_width, dst_height, CSC_OPTIONS))
 
     def validate_csc_size(self, spec, src_width, src_height, dst_width, 
dst_height):
         if not spec.can_scale and (src_width!=dst_width or 
src_height!=dst_height):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/clipboard/clipboard_base.py 
new/xpra-2.4.3/xpra/clipboard/clipboard_base.py
--- old/xpra-2.4.2/xpra/clipboard/clipboard_base.py     2018-10-14 
18:59:54.000000000 +0200
+++ new/xpra-2.4.3/xpra/clipboard/clipboard_base.py     2018-12-20 
00:11:04.000000000 +0100
@@ -21,7 +21,7 @@
 from xpra.gtk_common.gtk_util import GetClipboard, selection_owner_set, 
selection_add_target, selectiondata_get_selection, selectiondata_get_target, 
selectiondata_get_data, selectiondata_get_data_type, selectiondata_get_format, 
selectiondata_set, clipboard_request_contents, PROPERTY_CHANGE_MASK
 from xpra.gtk_common.nested_main import NestedMainLoop
 from xpra.net.compression import Compressible
-from xpra.os_util import WIN32, POSIX, monotonic_time, strtobytes, bytestostr, 
hexstr, get_hex_uuid, is_X11, is_Wayland
+from xpra.os_util import WIN32, OSX, POSIX, monotonic_time, strtobytes, 
bytestostr, hexstr, get_hex_uuid, is_X11, is_Wayland
 from xpra.util import csv, envint, envbool, repr_ellipsized, typedict, 
first_time
 from xpra.platform.features import CLIPBOARD_GREEDY
 
@@ -100,7 +100,7 @@
 
 
 def set_string(clipboard, thestring):
-    if is_gtk3():
+    if is_gtk3() or OSX:
         #no other way?
         clipboard.set_text(thestring, len(thestring))
         return
@@ -531,7 +531,7 @@
         return wire_data
 
     def _process_clipboard_contents(self, packet):
-        request_id, selection, dtype, dformat, wire_encoding, wire_data = 
packet[1:8]
+        request_id, selection, dtype, dformat, wire_encoding, wire_data = 
packet[1:7]
         log("process clipboard contents, selection=%s, type=%s, format=%s", 
selection, dtype, dformat)
         raw_data = self._munge_wire_selection_to_raw(wire_encoding, dtype, 
dformat, wire_data)
         log("clipboard wire -> raw: %r -> %r", (dtype, dformat, wire_encoding, 
wire_data), raw_data)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xpra-2.4.2/xpra/codecs/csc_libyuv/colorspace_converter.pyx 
new/xpra-2.4.3/xpra/codecs/csc_libyuv/colorspace_converter.pyx
--- old/xpra-2.4.2/xpra/codecs/csc_libyuv/colorspace_converter.pyx      
2018-10-14 18:59:54.000000000 +0200
+++ new/xpra-2.4.3/xpra/codecs/csc_libyuv/colorspace_converter.pyx      
2018-12-20 00:11:04.000000000 +0100
@@ -74,7 +74,7 @@
     return (n + m - 1) & ~(m - 1)
 
 cdef inline uintptr_t memalign_ptr(uintptr_t ptr):
-    return <uintptr_t> roundupl(<unsigned long> ptr, MEMALIGN_ALIGNMENT)
+    return <uintptr_t> roundupl(<uintptr_t> ptr, MEMALIGN_ALIGNMENT)
 
 
 def init_module():
@@ -123,7 +123,7 @@
         return "libyuv.YUVImageWrapper"
 
     def free(self):                             #@DuplicatedSignature
-        log("libyuv.YUVImageWrapper.free() cython_buffer=%#x", <unsigned long> 
self.cython_buffer)
+        log("libyuv.YUVImageWrapper.free() cython_buffer=%#x", <uintptr_t> 
self.cython_buffer)
         ImageWrapper.free(self)
         if self.cython_buffer>0:
             free(<void *> (<uintptr_t> self.cython_buffer))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/codecs/libav_common/av_log.pyx 
new/xpra-2.4.3/xpra/codecs/libav_common/av_log.pyx
--- old/xpra-2.4.2/xpra/codecs/libav_common/av_log.pyx  2018-10-14 
18:59:54.000000000 +0200
+++ new/xpra-2.4.3/xpra/codecs/libav_common/av_log.pyx  2018-12-20 
00:11:04.000000000 +0100
@@ -91,7 +91,7 @@
         if s.startswith("Warning: data is not aligned!"):
             #silence this crap, since there is nothing we can do about it
             l = log.debug
-        #l("log_callback_override(%#x, %i, %s, ..)", <unsigned long> avcl, 
level, fmt)
+        #l("log_callback_override(%#x, %i, %s, ..)", <uintptr_t> avcl, level, 
fmt)
         l("libav: %s", s)
     except Exception as e:
         log.error("Error in log callback at level %i", level)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/codecs/vpx/encoder.pyx 
new/xpra-2.4.3/xpra/codecs/vpx/encoder.pyx
--- old/xpra-2.4.2/xpra/codecs/vpx/encoder.pyx  2018-10-14 18:59:54.000000000 
+0200
+++ new/xpra-2.4.3/xpra/codecs/vpx/encoder.pyx  2018-12-20 00:11:04.000000000 
+0100
@@ -14,7 +14,7 @@
 log = Logger("encoder", "vpx")
 
 from xpra.codecs.codec_constants import video_spec
-from xpra.os_util import bytestostr, WIN32, OSX, POSIX
+from xpra.os_util import bytestostr, WIN32, OSX, POSIX, BITS
 from xpra.util import AtomicInteger, envint, envbool
 from xpra.buffers.membuf cimport object_as_buffer
 
@@ -362,6 +362,13 @@
         assert scaling==(1,1), "vpx does not handle scaling"
         assert encoding in get_encodings()
         assert src_format in get_input_colorspaces(encoding)
+        if BITS==32 and WIN32:
+            dmaxw, dmaxh = MAX_SIZE[encoding]
+            if width>dmaxw or height>dmaxh:
+                #this can crash on win32, don't even try it
+                #(the unit tests would otherwise crash)
+                raise Exception("invalid dimensions %ix%i - maximum is %ix%i" 
% (width, height, dmaxw, dmaxh))
+        
         self.src_format = bytestostr(src_format)
         #log("vpx_encoder.init_context%s", (width, height, src_format, 
dst_formats, encoding, quality, speed, scaling, options))
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/codecs/webp/decode.pyx 
new/xpra-2.4.3/xpra/codecs/webp/decode.pyx
--- old/xpra-2.4.2/xpra/codecs/webp/decode.pyx  2018-10-14 18:59:54.000000000 
+0200
+++ new/xpra-2.4.3/xpra/codecs/webp/decode.pyx  2018-12-20 00:11:04.000000000 
+0100
@@ -316,11 +316,12 @@
         return "webp.YUVImageWrapper"
 
     def free(self):                             #@DuplicatedSignature
-        log("webp.YUVImageWrapper.free() cython_buffer=%#x", <unsigned long> 
self.cython_buffer)
+        cdef uintptr_t buf = self.cython_buffer
+        self.cython_buffer = 0
+        log("webp.YUVImageWrapper.free() cython_buffer=%#x", buf)
         ImageWrapper.free(self)
-        if self.cython_buffer>0:
-            free(<void *> (<uintptr_t> self.cython_buffer))
-            self.cython_buffer = 0
+        if buf!=0:
+            free(<void *> buf)
 
 
 def selftest(full=False):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/net/ssh.py 
new/xpra-2.4.3/xpra/net/ssh.py
--- old/xpra-2.4.2/xpra/net/ssh.py      2018-10-31 17:47:17.000000000 +0100
+++ new/xpra-2.4.3/xpra/net/ssh.py      2019-01-10 04:00:31.000000000 +0100
@@ -17,7 +17,7 @@
 from xpra.platform.paths import get_xpra_command, get_ssh_known_hosts_files
 from xpra.net.bytestreams import SocketConnection, SOCKET_TIMEOUT, 
ConnectionClosedException
 from xpra.exit_codes import EXIT_SSH_KEY_FAILURE, EXIT_SSH_FAILURE
-from xpra.os_util import bytestostr, osexpand, monotonic_time, setsid, 
nomodule_context, umask_context, WIN32, OSX, POSIX
+from xpra.os_util import bytestostr, osexpand, monotonic_time, setsid, 
nomodule_context, umask_context, is_WSL, WIN32, OSX, POSIX
 from xpra.util import envint, envbool, nonl, engs
 
 INITENV_COMMAND = os.environ.get("XPRA_INITENV_COMMAND", "xpra initenv")
@@ -79,6 +79,9 @@
             env["XPRA_LOG_TO_FILE"] = "0"
             kwargs["env"] = env
         proc = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, **kwargs)
+        if is_WSL():
+            #WSL needs to wait before calling communicate?
+            proc.wait()
         stdout, stderr = proc.communicate()
         log("exec_dialog_subprocess(%s)", cmd)
         if stderr:
@@ -185,7 +188,7 @@
     dtype = display_desc["type"]
     host = display_desc["host"]
     port = display_desc.get("ssh-port", 22)
-    ipv6 = display_desc.get("ipv6", False)
+    ipv6 = display_desc.get("ipv6", None)
     from xpra.scripts.main import socket_connect
     sock = socket_connect(dtype, host, port, ipv6)
     #ssh and command attributes:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/os_util.py 
new/xpra-2.4.3/xpra/os_util.py
--- old/xpra-2.4.2/xpra/os_util.py      2018-10-23 19:32:46.000000000 +0200
+++ new/xpra-2.4.3/xpra/os_util.py      2019-01-10 04:00:31.000000000 +0100
@@ -356,6 +356,17 @@
 def is_unity():
     return os.environ.get("XDG_CURRENT_DESKTOP", 
"").lower().startswith("unity")
 
+def is_WSL():
+    if not POSIX:
+        return False
+    r = None
+    for f in ("/proc/sys/kernel/osrelease", "/proc/version"):
+        r = load_binary_file(f)
+        if r:
+            break
+    return r is not None and r.find(b"Microsoft")>=0
+
+
 def get_generic_os_name():
     for k,v in {
         "linux"     : "linux",
@@ -474,10 +485,8 @@
             from xpra.platform.xposix.paths import get_runtime_dir
             d["XDG_RUNTIME_DIR"] = os.environ.get("XDG_RUNTIME_DIR", 
get_runtime_dir())
     if actual_username:
-        d.update({
-            "USERNAME"  : actual_username,
-            "USER"      : actual_username,
-            })
+        d["USERNAME"] = actual_username
+        d["USER"] = actual_username
     #first, expand the substitutions themselves,
     #as they may contain references to other variables:
     ssub = OrderedDict()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/platform/darwin/osx_menu.py 
new/xpra-2.4.3/xpra/platform/darwin/osx_menu.py
--- old/xpra-2.4.2/xpra/platform/darwin/osx_menu.py     2018-10-14 
18:59:55.000000000 +0200
+++ new/xpra-2.4.3/xpra/platform/darwin/osx_menu.py     2018-12-20 
00:11:04.000000000 +0100
@@ -62,7 +62,6 @@
         log("OSXMenuHelper(%s)", client)
         self.menu_bar = None
         self.hidden_window = None
-        self.keyboard = None
         self.menus = {}             #all the "top-level" menu items we manage
         self.app_menus = {}         #the ones added to the app_menu via 
insert_app_menu_item (which cannot be removed!)
         self.full = False
@@ -71,8 +70,6 @@
 
     def set_client(self, client):
         self.client = client
-        if client and client.keyboard_helper:
-            self.keyboard = client.keyboard_helper.keyboard
         #if we call add_about before the main loop is ready,
         #things don't work...
         if client and SHOW_ABOUT_XPRA:
@@ -331,17 +328,24 @@
     def set_speedmenu(self, *args):
         pass
 
+    def _get_keyboard(self):
+        if not self.client or not self.client.keyboard_helper:
+            return None
+        return self.client.keyboard_helper.keyboard
+
     def make_swapkeysmenuitem(self):
         def swapkeys_toggled(*args):
             v = self.swapkeys_menuitem.get_active()
-            log("swapkeys_toggled(%s) swap keys enabled=%s", args, v)
-            if self.keyboard:
-                self.keyboard.swap_keys = v
+            keyboard = self._get_keyboard()
+            log("swapkeys_toggled(%s) keyboard=%s, swap keys enabled=%s", 
args, keyboard, v)
+            if keyboard:
+                keyboard.swap_keys = v
         self.swapkeys_menuitem = self.checkitem("Control/Command Key Swap", 
swapkeys_toggled)
         def set_swapkeys_menuitem(*args):
-            if self.keyboard:
-                log("set_swapkeys_menuitem(%s) swap_keys=%s", args, 
self.keyboard.swap_keys)
-                self.swapkeys_menuitem.set_active(self.keyboard.swap_keys)
+            keyboard = self._get_keyboard()
+            if keyboard:
+                log("set_swapkeys_menuitem(%s) keyboard=%s, swap_keys=%s", 
args, keyboard, keyboard.swap_keys)
+                self.swapkeys_menuitem.set_active(keyboard.swap_keys)
             else:
                 log("set_swapkeys_menuitem(%s) no keyboard!", args)
                 self.swapkeys_menuitem.set_sensitive(False)
@@ -365,15 +369,17 @@
     def make_numlockmenuitem(self):
         def numlock_toggled(*args):
             v = self.numlock_menuitem.get_active()
+            keyboard = self._get_keyboard()
             log("numlock_toggled(%s) menu active=%s", args, v)
-            if self.keyboard:
-                self.keyboard.num_lock_state = v
+            if keyboard:
+                keyboard.num_lock_state = v
         self.numlock_menuitem = self.checkitem("Num Lock", cb=numlock_toggled)
         self.numlock_menuitem.set_active(True)
         def set_numlock_menuitem(*args):
-            if self.keyboard:
-                log("set_numlock_menuitem(%s) num_lock_state=%s", args, 
self.keyboard.num_lock_state)
-                self.numlock_menuitem.set_active(self.keyboard.num_lock_state)
+            keyboard = self._get_keyboard()
+            if keyboard:
+                log("set_numlock_menuitem(%s) keyboard=%s, num_lock_state=%s", 
args, keyboard, keyboard.num_lock_state)
+                self.numlock_menuitem.set_active(keyboard.num_lock_state)
             else:
                 log("set_numlock_menuitem(%s) no keyboard!", args)
                 self.swapkeys_menuitem.set_sensitive(False)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/platform/keyboard_base.py 
new/xpra-2.4.3/xpra/platform/keyboard_base.py
--- old/xpra-2.4.2/xpra/platform/keyboard_base.py       2018-10-25 
19:25:43.000000000 +0200
+++ new/xpra-2.4.3/xpra/platform/keyboard_base.py       2018-12-20 
00:11:04.000000000 +0100
@@ -27,6 +27,35 @@
     def has_bell(self):
         return False
 
+    def _add_modifier_mapping(self, a, b, modifier):
+        #log.info("%s (%s), %s (%s)", keycode, type(keycode), keyname, 
type(keyname))
+        if isinstance(a, int) and isinstance(b, (bytes, str)):
+            self._do_add_modifier_mapping((b,), a, modifier)
+        elif isinstance(a, (str,bytes)) and isinstance(b, int):
+            #level = b
+            self._do_add_modifier_mapping((a,), 0, modifier)
+        elif isinstance(a, (bytes,str)) and isinstance(b, (bytes,str)):
+            self._do_add_modifier_mapping((a, b), 0, modifier)
+        elif isinstance(a, (tuple,list)) and isinstance(b, (bytes,str)):
+            #ie: a=(57, 'CapsLock'), b='CapsLock'
+            if len(a)==2:
+                self._add_modifier_mapping(a[0], a[1], modifier)
+            self._add_modifier_mapping((b,), 0, modifier)
+        elif isinstance(a, (tuple,list)) and isinstance(b, (int)):
+            #ie: a=('CapsLock'), b=0
+            self._do_add_modifier_mapping(a, 0, modifier)
+        else:
+            log.warn("Warning: unexpected key definition: %s, %s", type(a), 
type(b))
+            log.warn(" values: %s, %s", a, b)
+    
+    def _do_add_modifier_mapping(self, keynames, keycode, modifier):
+        for keyname in keynames:
+            self.modifier_keys[bytestostr(keyname)] = bytestostr(modifier)
+            if keycode:
+                keycodes = 
self.modifier_keycodes.setdefault(bytestostr(keyname), [])
+                if keycode not in keycodes:
+                    keycodes.append(keycode)
+
     def set_modifier_mappings(self, mappings):
         log("set_modifier_mappings(%s)", mappings)
         self.modifier_mappings = mappings
@@ -34,27 +63,7 @@
         self.modifier_keycodes = {}
         for modifier, keys in mappings.items():
             for a, b in keys:
-                #log.info("%s (%s), %s (%s)", keycode, type(keycode), keyname, 
type(keyname))
-                if isinstance(a, int) and isinstance(b, bytes):
-                    keycode = a
-                    keynames = (b,)
-                elif isinstance(a, bytes) and isinstance(b, int):
-                    keynames = (a,)
-                    #level = b
-                    keycode = 0
-                elif isinstance(a, (bytes,str)) and isinstance(b, (bytes,str)):
-                    keynames = (a, b)
-                    keycode = 0
-                else:
-                    log.warn("Warning: unexpected key definition: %s, %s", 
type(a), type(b))
-                    log.warn(" values: %s, %s", a, b)
-                    continue
-                for keyname in keynames:
-                    self.modifier_keys[bytestostr(keyname)] = 
bytestostr(modifier)
-                    if keycode:
-                        keycodes = 
self.modifier_keycodes.setdefault(bytestostr(keyname), [])
-                        if keycode not in keycodes:
-                            keycodes.append(keycode)
+                self._add_modifier_mapping(a, b, modifier)
         log("modifier_keys=%s", self.modifier_keys)
         log("modifier_keycodes=%s", self.modifier_keycodes)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/platform/win32/win32_NotifyIcon.py 
new/xpra-2.4.3/xpra/platform/win32/win32_NotifyIcon.py
--- old/xpra-2.4.2/xpra/platform/win32/win32_NotifyIcon.py      2018-10-14 
18:59:55.000000000 +0200
+++ new/xpra-2.4.3/xpra/platform/win32/win32_NotifyIcon.py      2018-12-20 
00:11:04.000000000 +0100
@@ -12,7 +12,7 @@
 from ctypes import POINTER, Structure, byref, WinDLL, c_void_p, sizeof, 
create_string_buffer
 from ctypes.wintypes import HWND, UINT, POINT, HICON, BOOL, WCHAR, DWORD
 
-from xpra.util import csv, nonl, XPRA_GUID1, XPRA_GUID2, XPRA_GUID3, XPRA_GUID4
+from xpra.util import csv, nonl, envbool, XPRA_GUID1, XPRA_GUID2, XPRA_GUID3, 
XPRA_GUID4
 from xpra.os_util import memoryview_to_bytes, bytestostr
 from xpra.platform.win32 import constants as win32con
 from xpra.platform.win32.common import (GUID, WNDCLASSEX, WNDPROC,
@@ -39,6 +39,9 @@
 sprintf = ctypes.cdll.msvcrt.sprintf
 
 
+TRAY_ALPHA = envbool("XPRA_TRAY_ALPHA", True)
+
+
 def GetProductInfo(dwOSMajorVersion=5, dwOSMinorVersion=0, dwSpMajorVersion=0, 
dwSpMinorVersion=0):
     product_type = DWORD(0)
     from xpra.platform.win32.common import GetProductInfo as k32GetProductInfo
@@ -145,14 +148,19 @@
 def image_to_ICONINFO(img):
     w, h = img.size
     from xpra.codecs.argb.argb import rgba_to_bgra       #@UnresolvedImport
-    bgra = memoryview_to_bytes(rgba_to_bgra(img.tobytes("raw", "BGRA")))
-    return make_ICONINFO(w, h, bgra)
+    if TRAY_ALPHA and img.mode.find("A")>=0:   #ie: RGBA
+        rgb_format = "BGRA"
+    else:
+        rgb_format = "BGR"
+    rgb_data = memoryview_to_bytes(rgba_to_bgra(img.tobytes("raw", 
rgb_format)))
+    return make_ICONINFO(w, h, rgb_data, rgb_format=rgb_format)
 
-def make_ICONINFO(w, h, bgra):
+def make_ICONINFO(w, h, rgb_data, rgb_format="BGRA"):
     bitmap = 0
     mask = 0
     try:
-        bitmap = rgba_to_bitmap(bgra, w, h)
+        bytes_per_pixel = len(rgb_format)
+        bitmap = rgb_to_bitmap(rgb_data, bytes_per_pixel, w, h)
         mask = CreateBitmap(w, h, 1, 1, None)
 
         iconinfo = ICONINFO()
@@ -173,14 +181,14 @@
         if bitmap:
             DeleteObject(bitmap)
 
-
-def rgba_to_bitmap(rgba, w, h):
+def rgb_to_bitmap(rgb_data, bytes_per_pixel, w, h):
+    assert bytes_per_pixel in (3, 4)        #only BGRA or BGR are supported
     header = BITMAPV5HEADER()
     header.bV5Size = sizeof(BITMAPV5HEADER)
     header.bV5Width = w
     header.bV5Height = -h
     header.bV5Planes = 1
-    header.bV5BitCount = 32
+    header.bV5BitCount = bytes_per_pixel*8
     header.bV5Compression = BI_RGB      #BI_BITFIELDS
     #header.bV5RedMask = 0x000000ff
     #header.bV5GreenMask = 0x0000ff00
@@ -196,8 +204,8 @@
         ReleaseDC(None, hdc)
     assert dataptr and bitmap, "failed to create DIB section"
     log("CreateDIBSection(..) got bitmap=%#x, dataptr=%s", int(bitmap), 
dataptr)
-    img_data = create_string_buffer(rgba)
-    ctypes.memmove(dataptr, byref(img_data), w*4*h)
+    img_data = create_string_buffer(rgb_data)
+    ctypes.memmove(dataptr, byref(img_data), w*h*bytes_per_pixel)
     return bitmap
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/scripts/main.py 
new/xpra-2.4.3/xpra/scripts/main.py
--- old/xpra-2.4.2/xpra/scripts/main.py 2018-10-14 18:59:55.000000000 +0200
+++ new/xpra-2.4.3/xpra/scripts/main.py 2019-01-10 04:00:31.000000000 +0100
@@ -20,7 +20,7 @@
 from xpra.platform.dotxpra import DotXpra
 from xpra.util import csv, envbool, envint, repr_ellipsized, DEFAULT_PORT
 from xpra.exit_codes import EXIT_SSL_FAILURE, EXIT_STR
-from xpra.os_util import get_util_logger, getuid, getgid, monotonic_time, 
setsid, bytestostr, WIN32, OSX, POSIX, PYTHON3
+from xpra.os_util import get_util_logger, getuid, getgid, monotonic_time, 
setsid, bytestostr, WIN32, OSX, POSIX, PYTHON3, is_Ubuntu, getUbuntuVersion
 from xpra.scripts.parsing import info, warn, error, \
     parse_vsock, parse_env, is_local, \
     fixup_defaults, validated_encodings, validate_encryption, 
do_parse_cmdline, show_sound_codec_help, \
@@ -252,9 +252,13 @@
     if mode in ("start", "start_desktop", "shadow") and not display_is_remote:
         systemd_run = parse_bool("systemd-run", options.systemd_run)
         if systemd_run is None:
-            #detect:
-            from xpra.os_util import is_systemd_pid1
-            systemd_run = is_systemd_pid1()
+            #detect if we should use it:
+            if is_Ubuntu() and getUbuntuVersion()>=(18,) and 
(os.environ.get("SSH_TTY") or os.environ.get("SSH_CLIENT")):
+                #would fail
+                systemd_run = False
+            else:
+                from xpra.os_util import is_systemd_pid1
+                systemd_run = is_systemd_pid1()
         if systemd_run:
             #check if we have wrapped it already (or if disabled via env var)
             if SYSTEMD_RUN:
@@ -869,29 +873,36 @@
 
 
 
-def socket_connect(dtype, host, port, ipv6=False):
-    from xpra.net.bytestreams import SOCKET_TIMEOUT
-    if ipv6:
+def socket_connect(dtype, host, port, ipv6=None):
+    if ipv6 is True:
         assert socket.has_ipv6, "no IPv6 support"
         family = socket.AF_INET6
-    else:
+    elif ipv6 is False:
         family = socket.AF_INET
+    else:
+        family = 0  #any
+    if dtype=="udp":
+        socktype = socket.SOCK_DGRAM
+    else:
+        socktype = socket.SOCK_STREAM
     info = {
         "host" : host,
         "port" : port,
         }
     try:
-        addrinfo = socket.getaddrinfo(host, port, family)
+        addrinfo = socket.getaddrinfo(host, port, family, socktype)
     except Exception as e:
-        raise InitException("cannot get %s address of %s: %s" % ({
-            socket.AF_INET6 : "IPv6",
-            socket.AF_INET  : "IPv4",
-            }.get(family, family), (host, port), e))
-    sockaddr = addrinfo[0][-1]
-    if dtype=="udp":
-        sock = socket.socket(family, socket.SOCK_DGRAM)
-    else:
-        sock = socket.socket(family, socket.SOCK_STREAM)
+        raise InitException("cannot get %s address of%s: %s" % ({
+            socket.AF_INET6 : " IPv6",
+            socket.AF_INET  : " IPv4",
+            }.get(family, ""), (host, port), e))
+    #default to the first one:
+    addr = addrinfo[0]
+    sockaddr = addr[-1]
+    family = family or addr[0]
+    sock = socket.socket(family, socktype)    
+    if dtype!="udp":
+        from xpra.net.bytestreams import SOCKET_TIMEOUT
         sock.settimeout(SOCKET_TIMEOUT)
     try:
         sock.connect(sockaddr)
@@ -966,7 +977,7 @@
         return SocketConnection(sock, "local", "host", (CID_TYPES.get(cid, 
cid), iport), dtype)
 
     elif dtype in ("tcp", "ssl", "ws", "wss", "udp"):
-        ipv6 = display_desc.get("ipv6", False)
+        ipv6 = display_desc.get("ipv6", None)
         host = display_desc["host"]
         port = display_desc["port"]
         sock = socket_connect(dtype, host, port, ipv6)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/server/auth/exec_auth.py 
new/xpra-2.4.3/xpra/server/auth/exec_auth.py
--- old/xpra-2.4.2/xpra/server/auth/exec_auth.py        2018-10-14 
18:59:55.000000000 +0200
+++ new/xpra-2.4.3/xpra/server/auth/exec_auth.py        2019-01-13 
06:10:42.000000000 +0100
@@ -1,5 +1,5 @@
 # This file is part of Xpra.
-# Copyright (C) 2017 Antoine Martin <[email protected]>
+# Copyright (C) 2017-2019 Antoine Martin <[email protected]>
 # Xpra is released under the terms of the GNU GPL v2, or, at your option, any
 # later version. See the file COPYING for details.
 
@@ -7,6 +7,7 @@
 from subprocess import Popen
 
 from xpra.util import envint
+from xpra.os_util import OSX
 from xpra.child_reaper import getChildReaper
 from xpra.server.auth.sys_auth_base import SysAuthenticator, init, log
 from xpra.platform.features import EXECUTABLE_EXTENSION
@@ -57,15 +58,20 @@
     def authenticate(self, _challenge_response=None, _client_salt=None):
         info = "Connection request from %s" % self.connection_str
         cmd = [self.command, info, str(self.timeout)]
-        self.proc = Popen(cmd, close_fds=True, shell=False)
-        log("authenticate(..) Popen(%s)=%s", cmd, self.proc)
+        proc = Popen(cmd, close_fds=True, shell=False)
+        self.proc = proc
+        log("authenticate(..) Popen(%s)=%s", cmd, proc)
         #if required, make sure we kill the command when it times out:
         if self.timeout>0:
             self.timer = glib.timeout_add(self.timeout*1000, 
self.command_timedout)
-            getChildReaper().add_process(self.proc, "exec auth", cmd, True, 
True, self.command_ended)
-        v = self.proc.wait()
+            if not OSX:
+                #python on macos may set a 0 returncode when we use poll()
+                #so we cannot use the ChildReaper on macos,
+                #and we can't cancel the timer
+                getChildReaper().add_process(proc, "exec auth", cmd, True, 
True, self.command_ended)
+        v = proc.wait()
         log("authenticate(..) returncode(%s)=%s", cmd, v)
-        if self.timeout and self.timeout_event:
+        if self.timeout_event:
             return False
         return v==0
 
@@ -77,9 +83,16 @@
             glib.source_remove(t)
 
     def command_timedout(self):
-        log("exec auth.command_timedout()")
+        proc = self.proc
+        log("exec auth.command_timedout() proc=%s", proc)
         self.timeout_event = True
         self.timer = None
+        if proc:
+            try:
+                proc.terminate()
+            except:
+                log("error trying to terminate exec auth process %s", proc, 
exc_info=True)
 
     def __repr__(self):
         return "exec"
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/server/mixins/clipboard_server.py 
new/xpra-2.4.3/xpra/server/mixins/clipboard_server.py
--- old/xpra-2.4.2/xpra/server/mixins/clipboard_server.py       2018-10-14 
18:59:56.000000000 +0200
+++ new/xpra-2.4.3/xpra/server/mixins/clipboard_server.py       2018-12-20 
00:11:04.000000000 +0100
@@ -69,6 +69,7 @@
             "clipboard" : {
                 ""                  : True,
                 "enable-selections" : True,
+                "contents-slice-fix": True,
                 },
             }
         if self._clipboard_helper:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/server/mixins/input_server.py 
new/xpra-2.4.3/xpra/server/mixins/input_server.py
--- old/xpra-2.4.2/xpra/server/mixins/input_server.py   2018-10-14 
18:59:56.000000000 +0200
+++ new/xpra-2.4.3/xpra/server/mixins/input_server.py   2019-01-10 
04:00:31.000000000 +0100
@@ -343,7 +343,7 @@
                             px, py = pointer[:2]
                             ax, ay = px+dx, py+dy
                             mouselog("client %2i: server window position: 
%12s, client window position: %24s, pointer=%s, adjusted: %s", ss.counter, pos, 
mapped_at, pointer, (ax, ay))
-                            return ax, ay
+                            return [ax, ay]+list(pointer[2:])
         return pointer
 
     def _process_mouse_common(self, proto, wid, opointer, *args):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xpra-2.4.2/xpra/server/mixins/server_base_controlcommands.py 
new/xpra-2.4.3/xpra/server/mixins/server_base_controlcommands.py
--- old/xpra-2.4.2/xpra/server/mixins/server_base_controlcommands.py    
2018-10-14 18:59:56.000000000 +0200
+++ new/xpra-2.4.3/xpra/server/mixins/server_base_controlcommands.py    
2018-12-20 00:11:04.000000000 +0100
@@ -106,7 +106,7 @@
         #encoding bits:
         for name in ("quality", "min-quality", "speed", "min-speed"):
             fn = getattr(self, "control_command_%s" % name.replace("-", "_"))
-            self.control_commands[name] = ArgsControlCommand(name, "set 
encoding %s (from 0 to 100)" % name, run=fn, min_args=1, max_args=1, 
validation=[from0to100])
+            self.control_commands[name] = ArgsControlCommand(name, "set 
encoding %s (from 0 to 100)" % name, run=fn, min_args=1, 
validation=[from0to100])
 
 
     #########################################
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xpra-2.4.2/xpra/server/shadow/gtk_shadow_server_base.py 
new/xpra-2.4.3/xpra/server/shadow/gtk_shadow_server_base.py
--- old/xpra-2.4.2/xpra/server/shadow/gtk_shadow_server_base.py 2018-10-14 
18:59:56.000000000 +0200
+++ new/xpra-2.4.3/xpra/server/shadow/gtk_shadow_server_base.py 2019-01-10 
04:00:31.000000000 +0100
@@ -159,14 +159,14 @@
         #the window may be at an offset (multi-window for multi-monitor):
         wx, wy, ww, wh = window.geometry
         #or maybe the pointer is off-screen:
-        x, y = pointer
+        x, y = pointer[:2]
         if x<0 or x>=ww or y<0 or y>=wh:
             self.suspend_cursor(proto)
             return None
         self.restore_cursor(proto)
         ax = x+wx
         ay = y+wy
-        return ax, ay
+        return [ax, ay]+list(pointer[2:])
 
     def get_pointer_position(self):
         return self.root.get_pointer()[-3:-1]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/server/source/dbus_mixin.py 
new/xpra-2.4.3/xpra/server/source/dbus_mixin.py
--- old/xpra-2.4.2/xpra/server/source/dbus_mixin.py     2018-10-14 
18:59:56.000000000 +0200
+++ new/xpra-2.4.3/xpra/server/source/dbus_mixin.py     2019-01-10 
04:00:31.000000000 +0100
@@ -1,14 +1,11 @@
 # -*- coding: utf-8 -*-
 # This file is part of Xpra.
-# Copyright (C) 2010-2018 Antoine Martin <[email protected]>
+# Copyright (C) 2010-2019 Antoine Martin <[email protected]>
 # Xpra is released under the terms of the GNU GPL v2, or, at your option, any
 # later version. See the file COPYING for details.
 
 import os
 
-from xpra.log import Logger
-log = Logger("dbus")
-
 from xpra.server.source.stub_source_mixin import StubSourceMixin
 
 
@@ -18,25 +15,23 @@
 class DBUS_Mixin(StubSourceMixin):
 
     def __init__(self):
-        self.init_state()
+        self.dbus_control = False
+        self.dbus_server = None
 
     def init_from(self, _protocol, server):
         self.dbus_control = server.dbus_control
 
     def init_state(self):
-        self.dbus_control = False
-        self.dbus_server = None
-
-    def cleanup(self):
-        ds = self.dbus_server
-        if ds:
-            self.dbus_server = None
-            self.idle_add(ds.cleanup)
-        
-    def parse_client_caps(self, _c):
         if self.dbus_control:
             from xpra.server.dbus.dbus_common import dbus_exception_wrap
             def make_dbus_server():
                 from xpra.server.dbus.dbus_source import DBUS_Source
                 return DBUS_Source(self, os.environ.get("DISPLAY", 
"").lstrip(":"))
             self.dbus_server = dbus_exception_wrap(make_dbus_server, "setting 
up client dbus instance")
+
+    def cleanup(self):
+        ds = self.dbus_server
+        if ds:
+            self.dbus_server = None
+            self.idle_add(ds.cleanup)
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/server/source/source_stats.py 
new/xpra-2.4.3/xpra/server/source/source_stats.py
--- old/xpra-2.4.2/xpra/server/source/source_stats.py   2018-10-14 
18:59:56.000000000 +0200
+++ new/xpra-2.4.3/xpra/server/source/source_stats.py   2019-01-10 
04:00:31.000000000 +0100
@@ -115,7 +115,7 @@
         #set to 0 if we have less than 2 events in the last 60 seconds:
         now = monotonic_time()
         min_time = now-60
-        css = tuple(x for x in self.congestion_send_speed if x[0]>min_time)
+        css = tuple(x for x in tuple(self.congestion_send_speed) if 
x[0]>min_time)
         acss = 0
         if len(css)>=2:
             #weighted average of the send speed over the last minute:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xpra-2.4.2/xpra/server/window/batch_delay_calculator.py 
new/xpra-2.4.3/xpra/server/window/batch_delay_calculator.py
--- old/xpra-2.4.2/xpra/server/window/batch_delay_calculator.py 2018-11-23 
06:36:08.000000000 +0100
+++ new/xpra-2.4.3/xpra/server/window/batch_delay_calculator.py 2018-11-28 
06:23:59.000000000 +0100
@@ -46,8 +46,8 @@
     factors.append(("focus", {"has_focus" : has_focus}, int(not has_focus), 
int(has_focus)))
     factors.append(("override-redirect", {"is_OR" : is_OR}, int(not is_OR), 
int(is_OR)))
     #if another window is fullscreen or maximized, slow us down:
-    factors.append(("fullscreen", {"other_is_fullscreen" : 
other_is_fullscreen}, 4*int(other_is_fullscreen), int(other_is_fullscreen)))
-    factors.append(("maximized", {"other_is_maximized" : other_is_maximized}, 
4*int(other_is_maximized), int(other_is_maximized)))
+    factors.append(("fullscreen", {"other_is_fullscreen" : 
other_is_fullscreen}, 2*int(other_is_fullscreen), int(other_is_fullscreen)/2.0))
+    factors.append(("maximized", {"other_is_maximized" : other_is_maximized}, 
2*int(other_is_maximized), int(other_is_maximized)/2.0))
     #soft expired regions is a strong indicator of problems:
     #(0 for none, up to max_soft_expired which is 5)
     factors.append(("soft-expired", {"count" : soft_expired}, soft_expired, 
int(bool(soft_expired))))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/server/window/window_source.py 
new/xpra-2.4.3/xpra/server/window/window_source.py
--- old/xpra-2.4.2/xpra/server/window/window_source.py  2018-11-23 
06:36:08.000000000 +0100
+++ new/xpra-2.4.3/xpra/server/window/window_source.py  2018-11-28 
06:23:59.000000000 +0100
@@ -951,7 +951,7 @@
                 nbytes = sum(v[1] for v in since_last)
                 #less than 16KB/s since last time? (or <=64KB)
                 max_bytes = max(4, int(elapsed))*16*1024
-                if nbytes<=max_bytes:
+                if nbytes<=max_bytes and not self._mmap_size>0:
                     statslog("calculate_batch_delay for wid=%i, skipping - 
only %i bytes sent since the last update", self.wid, nbytes)
                     return
                 statslog("calculate_batch_delay for wid=%i, %i bytes sent 
since the last update", self.wid, nbytes)
@@ -1296,8 +1296,9 @@
             #NOTE: this should never happen...
             #the region should now get sent when we eventually receive the 
pending ACKs
             #but if somehow they go missing... clean it up from a timeout:
-            delayed_region_time = delayed[0]
-            self.timeout_timer = 
self.timeout_add(self.batch_config.timeout_delay, self.delayed_region_timeout, 
delayed_region_time)
+            if not self.timeout_timer:
+                delayed_region_time = delayed[0]
+                self.timeout_timer = 
self.timeout_add(self.batch_config.timeout_delay, self.delayed_region_timeout, 
delayed_region_time)
         return False
 
     def delayed_region_soft_timeout(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/src_info.py 
new/xpra-2.4.3/xpra/src_info.py
--- old/xpra-2.4.2/xpra/src_info.py     2018-11-23 13:38:17.000000000 +0100
+++ new/xpra-2.4.3/xpra/src_info.py     2019-01-17 12:13:36.000000000 +0100
@@ -1,2 +1,2 @@
 LOCAL_MODIFICATIONS=0
-REVISION=21077
+REVISION=21350
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/x11/desktop_server.py 
new/xpra-2.4.3/xpra/x11/desktop_server.py
--- old/xpra-2.4.2/xpra/x11/desktop_server.py   2018-10-14 18:59:57.000000000 
+0200
+++ new/xpra-2.4.3/xpra/x11/desktop_server.py   2019-01-10 04:00:31.000000000 
+0100
@@ -556,7 +556,7 @@
         pointer = super(XpraDesktopServer, self)._adjust_pointer(proto, wid, 
pointer)
         #maybe the pointer is off-screen:
         ww, wh = window.get_dimensions()
-        x, y = pointer
+        x, y = pointer[:2]
         if x<0 or x>=ww or y<0 or y>=wh:
             self.suspend_cursor(proto)
             return None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-2.4.2/xpra/x11/xkbhelper.py 
new/xpra-2.4.3/xpra/x11/xkbhelper.py
--- old/xpra-2.4.2/xpra/x11/xkbhelper.py        2018-10-14 18:59:57.000000000 
+0200
+++ new/xpra-2.4.3/xpra/x11/xkbhelper.py        2018-12-20 00:11:04.000000000 
+0100
@@ -149,7 +149,7 @@
         keycodes = indexed_mappings(xkbmap_x11_keycodes)
     else:
         keycodes = gtk_keycodes_to_mappings(xkbmap_keycodes)
-    log("set_keycode_translation(%s, %s) keycodes=%s", xkbmap_x11_keycodes, 
xkbmap_keycodes)
+    log("set_keycode_translation(%s, %s)", xkbmap_x11_keycodes, 
xkbmap_keycodes)
     log(" keycodes=%s", keycodes)
     #keycodes = {
     #     9: set([('', 1), ('Escape', 4), ('', 3), ('Escape', 0), ('Escape', 
2)]),



Reply via email to