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)]),
