Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package xpra for openSUSE:Factory checked in 
at 2021-04-19 21:06:13
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/xpra (Old)
 and      /work/SRC/openSUSE:Factory/.xpra.new.12324 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "xpra"

Mon Apr 19 21:06:13 2021 rev:33 rq:886603 version:4.1.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/xpra/xpra.changes        2021-03-30 
21:47:38.390773396 +0200
+++ /work/SRC/openSUSE:Factory/.xpra.new.12324/xpra.changes     2021-04-19 
21:06:36.348083923 +0200
@@ -1,0 +2,30 @@
+Tue Apr  6 14:18:51 UTC 2021 - Luigi Baldoni <aloi...@gmx.com>
+
+- Update to version 4.1.2
+  * fix unnecessary screen update delays
+  * fix screen refresh rate detection
+  * increase the default screen update refresh rate
+  * fix missing encodings with 'upgrade' and 'upgrade-desktop'
+    subcommands
+  * fix client failures due to missing socket directories
+  * more correct API usage of 'notify2' backend
+  * fix `run_scaled` script handling of multiple arguments
+  * fix ioctl error with nested SSH connections
+  * fix video region detection error
+  * fix sessions GUI not updating on process exit
+  * fix compatibility with newer versions of python-zeroconf
+  * fix directory listing with the builtin http server (still
+    disabled by default)
+  * fix the server's GetAll dbus property handler
+  * fix display-name validation check
+  * the 'exec-wrapper' option no longer needs to use an absolute
+    path
+  * ignore bell audio devices
+  * show the correct list of pressed keys, unkown modifiers
+  * prevent the splash screen process from consuming too much CPU
+  * better service configuration file location detection
+  * packaging script fixes, library and documentation updates
+- Update xpra-html5 to 4.1.2 and uglify-js to 3.13.3
+- Refresh xpra-paths.patch
+
+-------------------------------------------------------------------

Old:
----
  uglify-js-3.13.1.tgz
  xpra-4.1.1.tar.xz
  xpra-html5-4.0.6.tar.xz

New:
----
  uglify-js-3.13.3.tgz
  xpra-4.1.2.tar.xz
  xpra-html5-4.1.2.tar.xz

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

Other differences:
------------------
++++++ xpra.spec ++++++
--- /var/tmp/diff_new_pack.fZMllX/_old  2021-04-19 21:06:37.012084919 +0200
+++ /var/tmp/diff_new_pack.fZMllX/_new  2021-04-19 21:06:37.016084924 +0200
@@ -17,9 +17,9 @@
 #
 
 
-%define xpra_ver 4.1.1
-%define html5_ver 4.0.6
-%define uglifyjs_ver 3.13.1
+%define xpra_ver 4.1.2
+%define html5_ver 4.1.2
+%define uglifyjs_ver 3.13.3
 %global __requires_exclude 
^typelib\\(GtkosxApplication\\)|typelib\\(GdkGLExt\\)|typelib\\(GtkGLExt\\).*$
 Name:           xpra
 Version:        %{xpra_ver}
@@ -139,7 +139,7 @@
     -e 's|share/doc/xpra|share/doc/packages/xpra|' \
     -i setup.py
 
-sed -i '/install_html5/s/verbose=False/verbose=True/' 
%{name}-html5-%{html5_ver}/setup_html5.py
+sed -i '/install_html5/s/verbose=False/verbose=True/' 
%{name}-html5-%{html5_ver}/setup.py
 
 %build
 python3 setup.py clean
@@ -170,7 +170,7 @@
     --verbose
 
 pushd %{name}-html5-%{html5_ver}
-PATH=$PATH:../package/bin python3 setup_html5.py 
%{buildroot}%{_datadir}/%{name}/www
+PATH=$PATH:../package/bin python3 setup.py install 
%{buildroot}%{_datadir}/%{name}/www
 popd
 
 rm -rf %{buildroot}%{_datadir}/xpra/cuda

++++++ uglify-js-3.13.1.tgz -> uglify-js-3.13.3.tgz ++++++
++++ 2005 lines of diff (skipped)

++++++ xpra-4.1.1.tar.xz -> xpra-4.1.2.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/PKG-INFO new/xpra-4.1.2/PKG-INFO
--- old/xpra-4.1.1/PKG-INFO     2021-03-07 15:45:11.000000000 +0100
+++ new/xpra-4.1.2/PKG-INFO     2021-04-06 15:29:10.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: xpra
-Version: 4.1.1
+Version: 4.1.2
 Summary: multi-platform screen and application forwarding system
 Home-page: https://xpra.org/
 Author: Antoine Martin
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/docs/CHANGELOG.md 
new/xpra-4.1.2/docs/CHANGELOG.md
--- old/xpra-4.1.1/docs/CHANGELOG.md    2021-03-07 15:32:44.000000000 +0100
+++ new/xpra-4.1.2/docs/CHANGELOG.md    2021-04-06 10:09:44.000000000 +0200
@@ -1,5 +1,30 @@
 # Changelog
 
+## [4.1.2] 2021-04-06
+* fix unnecessary screen update delays
+* fix screen refresh rate detection
+* increase the default screen update refresh rate
+* fix missing encodings with 'upgrade' and 'upgrade-desktop' subcommands
+* fix client failures due to missing socket directories
+* fix crashes when showing notifications (ie: MacOS Big Sur)
+* workaround for hidden library paths (MacOS Big Sur)
+* more correct API usage of 'notify2' backend
+* fix `run_scaled` script handling of multiple arguments
+* fix ioctl error with nested SSH connections
+* fix video region detection error
+* fix sessions GUI not updating on process exit
+* fix compatibility with newer versions of python-zeroconf
+* fix directory listing with the builtin http server (still disabled by 
default)
+* fix clipboard errors on MS Windows when we fail to acquire the lock
+* fix the server's GetAll dbus property handler
+* fix display-name validation check
+* the 'exec-wrapper' option no longer needs to use an absolute path
+* ignore bell audio devices
+* show the correct list of pressed keys, unkown modifiers
+* prevent the splash screen process from consuming too much CPU
+* better service configuration file location detection
+* packaging script fixes, library and documentation updates
+
 ## [4.1.1] 2021-03-07
 * ensure splash screen failures are not fatal, fix threading bug
 * avoid [vaapi crashes in ffmpeg 
encoder](https://github.com/Xpra-org/xpra/issues/3039)
@@ -8,7 +33,7 @@
        * laggy input handling and screen updates
        * long subcommand timeout
 * fix [plink ssh mode on MS 
Windows](https://github.com/Xpra-org/xpra/issues/3040)
-* fix connection errors with trailing slash in display name
+* fix connection errors with [trailing slash in display 
name](https://github.com/Xpra-org/xpra/issues/3040#issuecomment-791221370)
 * workaround [API breakage](https://github.com/Xpra-org/xpra/issues/3043) in 
newer versions of python-zeroconf
 * warn just once if expected GStreamer element properties are missing
 * map more applications to text mode ('code', 'jetbrains')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/docs/FAQ.md new/xpra-4.1.2/docs/FAQ.md
--- old/xpra-4.1.1/docs/FAQ.md  2021-03-07 15:32:42.000000000 +0100
+++ new/xpra-4.1.2/docs/FAQ.md  2021-04-06 10:03:41.000000000 +0200
@@ -13,7 +13,8 @@
 ### I get a GPG error: `KEYEXPIRED 1273837137`
 The key had expired. Try re-importing the [updated 
key](https://xpra.org/gpg.asc).\
 On Debian you may have to delete the key (`apt-key -d`) before adding it again.
-
+### On Debian, I get a *Origin changed*, *this must be accepted explicitly...* 
when updating
+Run `apt-get update --allow-releaseinfo-change`.
 
 ***
 
@@ -88,3 +89,7 @@
 These are harmless and unavoidable, see [Bug 1615700 - warning shows up after 
run "Xvfb :99 &"](https://bugzilla.redhat.com/show_bug.cgi?id=1615700#c1)
 * `gtk_window_add_accel_group: assertion 'GTK_IS_WINDOW (window)' failed` - 
harmless and unavoidable on MacOS
 * `gui.py: Warning: invalid cast from 'GtkMenuBar?' to 'GtkWindow?'` - 
harmless and unavoidable on MacOS
+### MacOS complains about "damaged application"
+```
+sudo xattr -rd com.apple.quarantine /Applications/Xpra.app
+```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/fs/bin/add_build_info.py 
new/xpra-4.1.2/fs/bin/add_build_info.py
--- old/xpra-4.1.1/fs/bin/add_build_info.py     2021-03-07 15:32:43.000000000 
+0100
+++ new/xpra-4.1.2/fs/bin/add_build_info.py     2021-04-06 10:04:54.000000000 
+0200
@@ -283,25 +283,24 @@
                 "REVISION" : "unknown",
                 "LOCAL_MODIFICATIONS" : "unknown"
             }
-    proc = subprocess.Popen("git branch --show-current", 
stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
-    out, _ = proc.communicate()
     branch = None
-    if proc.returncode==0:
-        branch = out.decode("utf-8").splitlines()[0]
-    else:
-        print("could not get branch information with 'git branch 
--show-current'")
-        print("trying 'git branch'")
-        proc = subprocess.Popen("git branch", stdout=subprocess.PIPE, 
stderr=subprocess.PIPE, shell=True)
+    for cmd in (
+        "git branch --show-current",
+        #when in detached state, the one above does not work, but this one 
does:
+        "git branch --remote --verbose --no-abbrev --contains | sed -rne 
's/^[^\/]*\/([^\ ]+).*$/\1/p'",
+        #if all else fails:
+        "git branch | grep '* '",
+    ):
+        proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
stderr=subprocess.PIPE, shell=True)
         out, _ = proc.communicate()
-        if proc.returncode!=0:
-            print(" also failed!")
-            print("branch is unknown")
-        else:
-            for line in out.decode("utf-8").splitlines():
-                if line.startswith("* "):
-                    branch = line.split(" ")[1]
-                    break
-    if branch:
+        if proc.returncode==0:
+            branch_out = out.decode("utf-8").splitlines()
+            if branch_out:
+                branch = branch_out[0]
+                break
+    if not branch:
+        print("Warning: could not get branch information")
+    else:
         props["BRANCH"] = branch
 
     #use the number of changes since the last tag:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/fs/bin/run_scaled 
new/xpra-4.1.2/fs/bin/run_scaled
--- old/xpra-4.1.1/fs/bin/run_scaled    2021-03-07 15:32:43.000000000 +0100
+++ new/xpra-4.1.2/fs/bin/run_scaled    2021-04-06 10:03:41.000000000 +0200
@@ -86,7 +86,7 @@
 xpra_argv = [
     xpra_cmd,
     "start",
-    "--start-child=\"%s\"" % join(command_argv),
+    "--start-child=%s" % join(command_argv),
     "--attach=yes",
     "--exit-with-children=yes",
     "--desktop-scaling=%s" % scale,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/fs/bin/set_source_version 
new/xpra-4.1.2/fs/bin/set_source_version
--- old/xpra-4.1.1/fs/bin/set_source_version    1970-01-01 01:00:00.000000000 
+0100
+++ new/xpra-4.1.2/fs/bin/set_source_version    2021-04-06 10:04:54.000000000 
+0200
@@ -0,0 +1,59 @@
+#!/bin/bash
+
+NEWV=$1
+AUTHOR=$2
+if [ -z "${NEWV}" ]; then
+       echo "usage: $0 NEW_VERSION"
+       exit 1
+fi
+if [ -z "${AUTHOR}" ]; then
+       AUTHOR="Antoine Martin <anto...@xpra.org>"
+fi
+
+
+for f in "fs/lib/cups/xpraforwarder" "xpra/__init__.py"; do
+       sed -i'' "s/__version__ = .*/__version__ = \"$NEWV\"/" $f
+done
+
+for k in "AppVersion" "VersionInfoVersion"; do
+       sed -i'' 's/$k=.*/$k=$NEWV/' "packaging/MSWindows/xpra.iss"
+done
+for k in "AppVerName" "UninstallDisplayName"; do
+       sed -i'' 's/$k=.*/$k=Xpra $NEWV/' "packaging/MSWindows/xpra.iss"
+done
+
+#RPM / DEB build scripts:
+for f in build_debs.sh build_rpms.sh; do
+       sed -i'' "s/^VERSION=.*/VERSION=$NEWV/" "packaging/buildah/$f"
+done
+
+#changelogs:
+head -n 2 "docs/CHANGELOG.md" > "docs/CHANGELOG.md.new"
+echo "## [$NEWV] `date +%Y-%m-%d`" >> "docs/CHANGELOG.md.new"
+echo "* TODO" >> "docs/CHANGELOG.md.new"
+echo "" >> "docs/CHANGELOG.md.new"
+tail -n +3 "docs/CHANGELOG.md" >> "docs/CHANGELOG.md.new"
+mv "docs/CHANGELOG.md.new" "docs/CHANGELOG.md"
+
+echo "xpra ($NEWV-1) UNRELEASED; urgency=low" > 
"./packaging/debian/changelog.new"
+echo "  * TODO" >> "./packaging/debian/changelog.new"
+echo "" >> "./packaging/debian/changelog.new"
+echo " -- Antoine Martin <anto...@nagafix.co.uk>  `date -R`" >> 
"./packaging/debian/changelog.new"
+echo "" >> "./packaging/debian/changelog.new"
+cat "./packaging/debian/changelog" >> "./packaging/debian/changelog.new"
+mv "./packaging/debian/changelog.new" "./packaging/debian/changelog"
+
+sed -i'' "s/%define version .*/%define version $NEWV/" 
"./packaging/rpm/xpra.spec"
+sed -i'' "/%changelog/a - TODO" "./packaging/rpm/xpra.spec"
+
+CHANGELOGDATE=`date '+%a %b %d %Y'`
+sed -i'' "/%changelog/a \* $CHANGELOGDATE $AUTHOR $NEWV-10" 
"./packaging/rpm/xpra.spec"
+
+git commit -m "bump version" \
+       xpra/__init__.py \
+       packaging/rpm/xpra.spec \
+       packaging/debian/changelog \
+       packaging/buildah/build_rpms.sh \
+       packaging/buildah/build_debs.sh \
+       fs/lib/cups/xpraforwarder \
+       docs/CHANGELOG.md
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/fs/etc/xpra/content-type/50_class.conf 
new/xpra-4.1.2/fs/etc/xpra/content-type/50_class.conf
--- old/xpra-4.1.1/fs/etc/xpra/content-type/50_class.conf       2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/fs/etc/xpra/content-type/50_class.conf       2021-04-06 
10:03:41.000000000 +0200
@@ -6,6 +6,7 @@
 class-instance:.*terminal.*=text
 
 class-instance:abiword=text
+class-instance:atom=text
 class-instance:avahi-discover=text
 class-instance:baobab=picture
 class-instance:bluetooth-sendto=text
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/fs/lib/cups/xpraforwarder 
new/xpra-4.1.2/fs/lib/cups/xpraforwarder
--- old/xpra-4.1.1/fs/lib/cups/xpraforwarder    2021-03-07 15:32:44.000000000 
+0100
+++ new/xpra-4.1.2/fs/lib/cups/xpraforwarder    2021-04-06 10:04:54.000000000 
+0200
@@ -38,7 +38,7 @@
 from urllib.parse import urlparse, parse_qs
 
 
-__version__ = "4.1.1"
+__version__ = "4.1.2"
 
 
 #Writes a syslog entry (msg) at the default facility:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/packaging/MSWindows/MINGW_SETUP.sh 
new/xpra-4.1.2/packaging/MSWindows/MINGW_SETUP.sh
--- old/xpra-4.1.1/packaging/MSWindows/MINGW_SETUP.sh   2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/packaging/MSWindows/MINGW_SETUP.sh   2021-04-06 
10:04:54.000000000 +0200
@@ -32,7 +32,7 @@
 #media libraries (more than we actually need):
 $PACMAN --noconfirm -S ${XPKG}ffmpeg ${XPKG}libyuv-git ${XPKG}gst-plugins-good 
${XPKG}gst-plugins-bad ${XPKG}gst-plugins-ugly
 #network layer libraries:
-$PACMAN --noconfirm -S ${XPKG}lz4 ${XPKG}lzo2 heimdal-libs openssh sshpass 
libsodium qrencode
+$PACMAN --noconfirm -S ${XPKG}lz4 ${XPKG}lzo2 heimdal-libs openssh sshpass 
${XPKG}libsodium ${XPKG}qrencode
 #python GStreamer bindings:
 $PACMAN --noconfirm -S ${XPKG}gst-python
 #development tools and libs for building extra packages:
@@ -42,23 +42,21 @@
 done
 $PACMAN --noconfirm -S ${XPKG}cython
 
-#cx_Freeze gets very confused about sqlite DLL location
-#don't fight it and just symlink it where it will be found:
-mkdir /mingw64/DLLs
-pushd /mingw64/DLLs
-ln -sf /mingw64/lib/sqlite3*/sqlite3*.dll sqlite3.dll
-popd
-
 #this needs to be converted to a PKGBUILD:
-pip3 install yuicompressor browser-cookie3 qrencode
-
+$PACMAN --noconfirm -S ${XPKG}python-pip ${XPKG}gcc
+for x in browser-cookie3 qrencode; do
+       pip3 install $x
+done
 #for webcam support:
 #$PACMAN --noconfirm -S ${XPKG}opencv ${XPKG}hdf5 ${XPKG}tesseract-ocr
 
 echo "for printing support, install libpdfium"
 echo "by downloading the plain x64 pdfium binary from"
 echo "https://github.com/bblanchon/pdfium-binaries";
-echo "and place the `pdfium.dll` in '$MINGW_PREFIX/bin'"
+echo "and place the 'pdfium.dll' in '$MINGW_PREFIX/bin'"
+echo
+echo "for minifying the html5 client,"
+echo "install yuicompressor"
 echo
 echo "for generating the documentation, install pandoc"
 echo "https://github.com/jgm/pandoc/releases/latest";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xpra-4.1.1/packaging/MacOS/jhbuild/modulesets-stable/gtk-osx-network.modules
 
new/xpra-4.1.2/packaging/MacOS/jhbuild/modulesets-stable/gtk-osx-network.modules
--- 
old/xpra-4.1.1/packaging/MacOS/jhbuild/modulesets-stable/gtk-osx-network.modules
    2021-03-07 15:32:43.000000000 +0100
+++ 
new/xpra-4.1.2/packaging/MacOS/jhbuild/modulesets-stable/gtk-osx-network.modules
    2021-04-06 10:03:41.000000000 +0200
@@ -39,8 +39,8 @@
   <autotools id="openssl" autogen-sh="Configure" autogenargs="shared "
              autogen-template="%(srcdir)s/%(autogen-sh)s --prefix=%(prefix)s 
--openssldir=%(prefix)s/etc/ssl %(autogenargs)s"
              makeinstallargs="install_sw" supports-non-srcdir-builds="no">
-    <branch module="openssl-1.1.1j.tar.gz" version="1.1.1j" repo="openssl"
-            
hash="sha256:aaf2fcb575cdf6491b98ab4829abf78a3dec8402b8b81efc8f23c00d443981bf"/>
+    <branch module="openssl-1.1.1k.tar.gz" version="1.1.1k" repo="openssl"
+            
hash="sha256:892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5"/>
   </autotools>
 
   <!-- Rudely demands TeX to build documentation -->
@@ -124,9 +124,9 @@
   </meson>
 
   <autotools id="libwebp" autogen-sh="configure"  
autogenargs="--enable-libwebpmux --enable-libwebpdecoder" 
supports-non-srcdir-builds="no">
-     <branch module="/releases/webp/libwebp-1.1.0.tar.gz"
-                        version="1.1.0"
-                        
hash="sha256:98a052268cc4d5ece27f76572a7f50293f439c17a98e67c4ea0c7ed6f50ef043"
+     <branch module="/releases/webp/libwebp-1.2.0.tar.gz"
+                        version="1.2.0"
+                        
hash="sha256:2fc8bbde9f97f2ab403c0224fb9ca62b2e6852cbc519e91ceaa7c153ffd88a0c"
                         repo="webm"/>
         <dependencies>
                 <dep package="libjpeg"/>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xpra-4.1.1/packaging/MacOS/jhbuild/xpra-python3.modules 
new/xpra-4.1.2/packaging/MacOS/jhbuild/xpra-python3.modules
--- old/xpra-4.1.1/packaging/MacOS/jhbuild/xpra-python3.modules 2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/packaging/MacOS/jhbuild/xpra-python3.modules 2021-04-06 
10:03:41.000000000 +0200
@@ -220,9 +220,9 @@
 
        <distutils id="python3-pillow" python3="1">
                <branch repo="files.pythonhosted.org"
-                       
module="/packages/60/f0/dd2eb7911f948bf529f58f0c7931f6f6466f711bd6f1d81a69dc4edd4e2a/Pillow-8.1.2.tar.gz"
-                       
hash="sha256:b07c660e014852d98a00a91adfbe25033898a9d90a8f39beb2437d22a203fc44"
-                       version="8.1.2"/>
+                       
module="/packages/21/23/af6bac2a601be6670064a817273d4190b79df6f74d8012926a39bc7aa77f/Pillow-8.2.0.tar.gz"
+                       
hash="sha256:a787ab10d7bb5494e5f76536ac460741788f1fbce851068d73a87ca7c35fc3e1"
+                       version="8.2.0"/>
                <dependencies>
                        <dep package="python3"/>
                        <dep package="libwebp"/>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/packaging/MacOS/make-app.sh 
new/xpra-4.1.2/packaging/MacOS/make-app.sh
--- old/xpra-4.1.1/packaging/MacOS/make-app.sh  2021-03-07 15:32:44.000000000 
+0100
+++ new/xpra-4.1.2/packaging/MacOS/make-app.sh  2021-04-06 10:03:41.000000000 
+0200
@@ -25,6 +25,7 @@
        if [ ! -d "html5" ]; then
                echo "html5 client not found"
                echo " perhaps run: 'git clone 
https://github.com/Xpra-org/xpra-html5'"
+               echo " then: ln -sf xpra-html5 html5"
                exit 1
        fi
 fi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/packaging/buildah/build_all.sh 
new/xpra-4.1.2/packaging/buildah/build_all.sh
--- old/xpra-4.1.1/packaging/buildah/build_all.sh       2021-03-07 
15:32:44.000000000 +0100
+++ new/xpra-4.1.2/packaging/buildah/build_all.sh       2021-04-06 
10:04:54.000000000 +0200
@@ -7,8 +7,9 @@
 
 #go make a snapshot:
 pushd ../..
+rm -f dist/xpra-*.tar.xz
 python3 ./setup.py sdist --formats=xztar
-mv dist/xpra-4.1.1.tar.xz ./packaging/buildah/pkgs/
+mv dist/xpra-*.tar.xz ./packaging/buildah/pkgs/
 popd
 
 DO_DOWNLOAD="${DO_DOWNLOAD:-1}"
@@ -32,6 +33,7 @@
 
        #use a temp image:
        TEMP_IMAGE="$IMAGE_NAME-temp"
+       buildah rm "${TEMP_IMAGE}" >& /dev/null
        buildah rmi "${TEMP_IMAGE}" >& /dev/null
        buildah from --pull-never --name  $TEMP_IMAGE $IMAGE_NAME
        if [ "$?" != "0" ]; then
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/packaging/buildah/build_debs.sh 
new/xpra-4.1.2/packaging/buildah/build_debs.sh
--- old/xpra-4.1.1/packaging/buildah/build_debs.sh      2021-03-07 
15:32:44.000000000 +0100
+++ new/xpra-4.1.2/packaging/buildah/build_debs.sh      2021-04-06 
10:04:54.000000000 +0200
@@ -15,7 +15,7 @@
 mkdir -p $REPO_ARCH_PATH
 rm xpra-build-deps*
 
-VERSION=4.1.1
+VERSION=4.1.2
 tar -Jxf pkgs/xpra-$VERSION.tar.xz
 pushd xpra-$VERSION
 ln -sf packaging/debian .
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/packaging/buildah/build_rpms.sh 
new/xpra-4.1.2/packaging/buildah/build_rpms.sh
--- old/xpra-4.1.1/packaging/buildah/build_rpms.sh      2021-03-07 
15:32:44.000000000 +0100
+++ new/xpra-4.1.2/packaging/buildah/build_rpms.sh      2021-04-06 
10:04:54.000000000 +0200
@@ -10,20 +10,19 @@
 
 ARCH=`arch`
 for dir in "./repo/SRPMS" "./repo/$ARCH"; do
-       if [ ! -d "$dir/repodata" ]; then
-               echo "* creating repodata in $dir"
-               mkdir $dir
-               createrepo $dir > /dev/null
-       fi
+       echo "* (re)creating repodata in $dir"
+       mkdir $dir 2> /dev/null
+       rm -fr $dir/repodata
+       createrepo $dir > /dev/null
 done
 
 #if we are going to build xpra,
 #make sure we expose the revision number
 #so the spec file can generate the expected file names
 #(ie: xpra-4.1-0.r29000)
-XPRA_VERSION=4.1.1
-tar -Jxf pkgs/xpra-$XPRA_VERSION.tar.xz xpra-$XPRA_VERSION/xpra/src_info.py
-XPRA_REVISION=`grep "REVISION=" "xpra-$XPRA_VERSION/xpra/src_info.py" | awk 
-F= '{print $2}'`
+VERSION=4.1.2
+tar -Jxf pkgs/xpra-$VERSION.tar.xz xpra-$VERSION/xpra/src_info.py
+XPRA_REVISION=`grep "REVISION=" "xpra-$VERSION/xpra/src_info.py" | awk -F= 
'{print $2}'`
 export XPRA_REVISION
 
 #read the name of the spec files we may want to build:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xpra-4.1.1/packaging/buildah/setup_build_containers.sh 
new/xpra-4.1.2/packaging/buildah/setup_build_containers.sh
--- old/xpra-4.1.1/packaging/buildah/setup_build_containers.sh  2021-03-07 
15:32:44.000000000 +0100
+++ new/xpra-4.1.2/packaging/buildah/setup_build_containers.sh  2021-04-06 
10:04:54.000000000 +0200
@@ -14,7 +14,7 @@
 BUILDAH_DIR=`dirname $(readlink -f $0)`
 pushd ${BUILDAH_DIR}
 
-RPM_DISTROS=${RPM_DISTROS:-Fedora:32 Fedora:33 CentOS:8}
+RPM_DISTROS=${RPM_DISTROS:-Fedora:32 Fedora:33 Fedora:34 CentOS:8}
 for DISTRO in $RPM_DISTROS; do
        DISTRO_LOWER="${DISTRO,,}"
        if [[ "$DISTRO_LOWER" == "xx"* ]];then
@@ -38,7 +38,7 @@
        buildah run $IMAGE_NAME dnf update -y
        buildah run $IMAGE_NAME dnf install -y 'dnf-command(builddep)'
        buildah run $IMAGE_NAME dnf install -y redhat-rpm-config rpm-build 
rpmdevtools createrepo_c rsync
-       if [ "${MINIMAL}" != "0" ]; then
+       if [ "${MINIMAL}" == "0" ]; then
                buildah run $IMAGE_NAME dnf install -y gcc gcc-c++ make cmake
        fi
        echo $DISTRO | egrep -i "fedora" >& /dev/null
@@ -46,12 +46,20 @@
                RNUM=`echo $DISTRO | awk -F: '{print $2}'`
                dnf -y makecache --releasever=$RNUM 
--setopt=cachedir=/var/cache/dnf/$RNUM
                buildah run $IMAGE_NAME dnf install -y rpmspectool
+               if [ "${MINIMAL}" == "0" ]; then
+                       #these are required by the xpra-html5 build:
+                       buildah run $IMAGE_NAME dnf install -y brotli js-jquery 
desktop-backgrounds-compat
+               fi
        else
                #some of the packages we need for building are in the 
"PowerTools" repository:
                buildah run $IMAGE_NAME dnf config-manager --set-enabled 
powertools
                #no "rpmspectool" package on CentOS 8, use setuptools to 
install it:
                buildah run $IMAGE_NAME dnf install -y python3-setuptools
-               buildah run $IMAGE_NAME easy_install rpmspec
+               buildah run $IMAGE_NAME easy_install-3.6 python-rpm-spec
+               if [ "${MINIMAL}" == "0" ]; then
+                       #these are required by the xpra-html5 build:
+                       buildah run $IMAGE_NAME dnf install -y brotli 
centos-backgrounds centos-logos
+               fi
        fi
        buildah run $IMAGE_NAME rpmdev-setuptree
        #buildah run dnf clean all
@@ -99,9 +107,11 @@
        #so add as many dependencies already:
        #buildah run $IMAGE_NAME apt-get install -y gcc g++ debhelper devscripts
        buildah run $IMAGE_NAME apt-get install -y devscripts equivs 
lsb-release perl findutils
-       if [ "${MINIMAL}" != "0" ]; then
+       if [ "${MINIMAL}" == "0" ]; then
                buildah copy $IMAGE_NAME "../debian/control" "/src/control"
                buildah run $IMAGE_NAME mk-build-deps --install --tool='apt-get 
-o Debug::pkgProblemResolver=yes --no-install-recommends --yes' /src/control
+               #used by the html5 client:
+               buildah run $IMAGE_NAME apt-get install -y uglifyjs brotli 
brotli libjs-jquery libjs-jquery-ui gnome-backgrounds
        fi
        buildah run $IMAGE_NAME apt-get autoremove -y
        #or we could do this explicitly:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/packaging/buildah/update_all.sh 
new/xpra-4.1.2/packaging/buildah/update_all.sh
--- old/xpra-4.1.1/packaging/buildah/update_all.sh      2021-03-07 
15:32:44.000000000 +0100
+++ new/xpra-4.1.2/packaging/buildah/update_all.sh      2021-04-06 
10:04:54.000000000 +0200
@@ -28,6 +28,9 @@
        echo $DISTRO | egrep -iv "fedora|centos" >& /dev/null
        RPM="$?"
        if [ "${RPM}" == "1" ]; then
+               buildah run $TEMP_IMAGE rm -fr "/src/repo/.repodata" 
"/src/repo/repodata" "/src/repo/x86_64"
+               buildah run $TEMP_IMAGE mkdir "/src/repo/x86_64"
+               buildah run $TEMP_IMAGE createrepo "/src/repo/x86_64/"
                buildah run $TEMP_IMAGE dnf update 
--disablerepo=xpra-local-build -y
        else
                buildah config --env DEBIAN_FRONTEND=noninteractive $IMAGE_NAME
@@ -40,5 +43,5 @@
                buildah run $TEMP_IMAGE apt-get autoremove -y
        fi
        buildah commit $IMAGE_NAME $TEMP_IMAGE
-       buildah rm "${TEMP_IMAGE}"
+       buildah rmi "${TEMP_IMAGE}"
 done
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/packaging/debian/changelog 
new/xpra-4.1.2/packaging/debian/changelog
--- old/xpra-4.1.1/packaging/debian/changelog   2021-03-07 15:32:44.000000000 
+0100
+++ new/xpra-4.1.2/packaging/debian/changelog   2021-04-06 10:10:18.000000000 
+0200
@@ -1,3 +1,30 @@
+xpra (4.1.2-1) UNRELEASED; urgency=low
+  * fix unnecessary screen update delays
+  * fix screen refresh rate detection
+  * increase the default screen update refresh rate
+  * fix missing encodings with 'upgrade' and 'upgrade-desktop' subcommands
+  * fix client failures due to missing socket directories
+  * fix crashes when showing notifications (ie: MacOS Big Sur)
+  * workaround for hidden library paths (MacOS Big Sur)
+  * more correct API usage of 'notify2' backend
+  * fix `run_scaled` script handling of multiple arguments
+  * fix ioctl error with nested SSH connections
+  * fix video region detection error
+  * fix sessions GUI not updating on process exit
+  * fix compatibility with newer versions of python-zeroconf
+  * fix directory listing with the builtin http server (still disabled by 
default)
+  * fix clipboard errors on MS Windows when we fail to acquire the lock
+  * fix the server's GetAll dbus property handler
+  * fix display-name validation check
+  * the 'exec-wrapper' option no longer needs to use an absolute path
+  * ignore bell audio devices
+  * show the correct list of pressed keys, unkown modifiers
+  * prevent the splash screen process from consuming too much CPU
+  * better service configuration file location detection
+  * packaging script fixes, library and documentation updates
+
+ -- Antoine Martin <anto...@nagafix.co.uk>  Tue, 06 Apr 2021 15:10:12 +0700
+
 xpra (4.1.1-1) UNRELEASED; urgency=low
   * ensure splash screen failures are not fatal, fix threading bug
   * avoid vaapi crashes in ffmpeg encoder (#3039)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/packaging/debian/control 
new/xpra-4.1.2/packaging/debian/control
--- old/xpra-4.1.1/packaging/debian/control     2021-03-07 15:32:43.000000000 
+0100
+++ new/xpra-4.1.2/packaging/debian/control     2021-04-06 10:04:54.000000000 
+0200
@@ -25,8 +25,8 @@
               ,pandoc
 Standards-Version: 3.9.3
 Homepage: https://xpra.org/
-Vcs-Svn: https://xpra.org/svn/Xpra/
-Vcs-Browser: https://xpra.org/trac/browser/
+Vcs-Git: https://github.com/Xpra-org/xpra
+Vcs-Browser: https://github.com/Xpra-org/xpra
 
 
 Package: xpra
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/packaging/rpm/python3-pytools.spec 
new/xpra-4.1.2/packaging/rpm/python3-pytools.spec
--- old/xpra-4.1.1/packaging/rpm/python3-pytools.spec   2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/packaging/rpm/python3-pytools.spec   2021-04-06 
10:03:41.000000000 +0200
@@ -1,13 +1,13 @@
 %define _disable_source_fetch 0
 
 Name:           python3-pytools
-Version:        2020.4.4
-Release:        2%{?dist}
+Version:        2021.2.1
+Release:        1%{?dist}
 Summary:        A collection of tools for python
 Group:          Development/Languages
 License:        MIT
 URL:            http://pypi.python.org/pypi/pytools
-Source0:        
https://files.pythonhosted.org/packages/16/ed/f4b298876b9b624150cc01830075f7cb0b9e09c1abfc46daef14811f3eed/pytools-%{version}.tar.gz
+Source0:        
https://files.pythonhosted.org/packages/3c/fb/a059825fa8c2c79894eca8aadcb798a1e5c66c0e66999a2374f313766823/pytools-%{version}.tar.gz
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 Provides:              python3-pytools = %{version}-%{release}
 BuildArch:      noarch
@@ -60,6 +60,9 @@
 
 
 %changelog
+* Sun Mar 28 2021 Antoine Martin <anto...@xpra.org> - 2021.2.1-1
+- new upstream release
+
 * Wed Feb 17 2021 Antoine Martin <anto...@xpra.org> - 2020.4.4-2
 - verify source checksum
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/packaging/rpm/x264-xpra.spec 
new/xpra-4.1.2/packaging/rpm/x264-xpra.spec
--- old/xpra-4.1.1/packaging/rpm/x264-xpra.spec 2021-03-07 15:32:44.000000000 
+0100
+++ new/xpra-4.1.2/packaging/rpm/x264-xpra.spec 2021-04-06 10:04:54.000000000 
+0200
@@ -13,6 +13,9 @@
 AutoProv:    0
 
 BuildRequires: nasm
+BuildRequires: gcc
+BuildRequires: make
+BuildRequires: perl-Digest-MD5
 
 
 %if 0%{?fedora}%{?el8}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/packaging/rpm/xpra.spec 
new/xpra-4.1.2/packaging/rpm/xpra.spec
--- old/xpra-4.1.1/packaging/rpm/xpra.spec      2021-03-07 15:32:44.000000000 
+0100
+++ new/xpra-4.1.2/packaging/rpm/xpra.spec      2021-04-06 10:10:02.000000000 
+0200
@@ -4,7 +4,7 @@
 # later version. See the file COPYING for details.
 
 %define _disable_source_fetch 0
-%define version 4.1.1
+%define version 4.1.2
 
 %{!?__python3: %define __python3 python3}
 %{!?python3_sitearch: %global python3_sitearch %(%{__python3} -c "from 
distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
@@ -604,6 +604,31 @@
 
 
 %changelog
+* Tue Apr 06 2021 Antoine Martin <anto...@xpra.org> 4.1.2-10
+- fix unnecessary screen update delays
+- fix screen refresh rate detection
+- increase the default screen update refresh rate
+- fix missing encodings with 'upgrade' and 'upgrade-desktop' subcommands
+- fix client failures due to missing socket directories
+- fix crashes when showing notifications (ie: MacOS Big Sur)
+- workaround for hidden library paths (MacOS Big Sur)
+- more correct API usage of 'notify2' backend
+- fix `run_scaled` script handling of multiple arguments
+- fix ioctl error with nested SSH connections
+- fix video region detection error
+- fix sessions GUI not updating on process exit
+- fix compatibility with newer versions of python-zeroconf
+- fix directory listing with the builtin http server (still disabled by 
default)
+- fix clipboard errors on MS Windows when we fail to acquire the lock
+- fix the server's GetAll dbus property handler
+- fix display-name validation check
+- the 'exec-wrapper' option no longer needs to use an absolute path
+- ignore bell audio devices
+- show the correct list of pressed keys, unkown modifiers
+- prevent the splash screen process from consuming too much CPU
+- better service configuration file location detection
+- packaging script fixes, library and documentation updates
+
 * Sun Mar 07 2021 Antoine Martin <anto...@xpra.org> 4.1.1-1
 - ensure splash screen failures are not fatal, fix threading bug
 - avoid vaapi crashes in ffmpeg encoder (#3039)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/setup.py new/xpra-4.1.2/setup.py
--- old/xpra-4.1.1/setup.py     2021-03-07 15:32:43.000000000 +0100
+++ new/xpra-4.1.2/setup.py     2021-04-06 10:04:54.000000000 +0200
@@ -982,10 +982,10 @@
                    "build/etc/xpra/xpra.conf"] + 
glob.glob("build/etc/xpra/conf.d/*.conf")
     if cuda_rebuild_ENABLED:
         CLEAN_FILES += [
-            "xpra/codecs/cuda_common/ARGB_to_NV12.fatbin",
-            "xpra/codecs/cuda_common/ARGB_to_YUV444.fatbin",
-            "xpra/codecs/cuda_common/BGRA_to_NV12.fatbin",
-            "xpra/codecs/cuda_common/BGRA_to_YUV444.fatbin",
+            "fs/share/xpra/cuda/ARGB_to_NV12.fatbin",
+            "fs/share/xpra/cuda/ARGB_to_YUV444.fatbin",
+            "fs/share/xpra/cuda/BGRA_to_NV12.fatbin",
+            "fs/share/xpra/cuda/BGRA_to_YUV444.fatbin",
             ]
     for x in CLEAN_FILES:
         p, ext = os.path.splitext(x)
@@ -1621,11 +1621,18 @@
             if service_ENABLED:
                 #Linux init service:
                 subs = {}
-                if os.path.exists("/etc/sysconfig"):
-                    copytodir("fs/etc/sysconfig/xpra", "/etc/sysconfig")
-                elif os.path.exists("/etc/default"):
-                    copytodir("fs/etc/sysconfig/xpra", "/etc/default")
-                    subs[b"/etc/sysconfig"] = b"/etc/default"
+                if is_RedHat() or is_CentOS() or is_Fedora():
+                    cdir = "/etc/sysconfig"
+                elif is_Debian() or is_Ubuntu():
+                    cdir = "/etc/default"
+                elif os.path.exists("/etc/sysconfig"):
+                    cdir = "/etc/sysconfig"
+                else:
+                    cdir = "/etc/default"
+                copytodir("fs/etc/sysconfig/xpra", cdir)
+                if cdir!="/etc/sysconfig":
+                    #also replace the reference to it in the service file below
+                    subs[b"/etc/sysconfig"] = cdir.encode()
                 if os.path.exists("/bin/systemctl"):
                     if sd_listen_ENABLED:
                         copytodir("fs/lib/systemd/system/xpra.service", 
systemd_dir,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/__init__.py 
new/xpra-4.1.2/xpra/__init__.py
--- old/xpra-4.1.1/xpra/__init__.py     2021-03-07 15:32:44.000000000 +0100
+++ new/xpra-4.1.2/xpra/__init__.py     2021-04-06 10:04:54.000000000 +0200
@@ -4,4 +4,4 @@
 # Xpra is released under the terms of the GNU GPL v2, or, at your option, any
 # later version. See the file COPYING for details.
 
-__version__ = "4.1.1"
+__version__ = "4.1.2"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/build_info.py 
new/xpra-4.1.2/xpra/build_info.py
--- old/xpra-4.1.1/xpra/build_info.py   2021-03-07 15:45:11.000000000 +0100
+++ new/xpra-4.1.2/xpra/build_info.py   2021-04-06 15:29:09.000000000 +0200
@@ -1,19 +1,19 @@
 BUILD_BIT='64bit'
 BUILD_CPU='x86_64'
-BUILD_DATE='2021-03-07'
+BUILD_DATE='2021-04-06'
 BUILD_MACHINE='x86_64'
 BUILD_OS='Linux Fedora 33 ThirtyThree'
-BUILD_TIME='21:45'
+BUILD_TIME='20:29'
 BUILT_BY='antoine'
-BUILT_ON='fedora'
+BUILT_ON='localhost.localdomain'
 COMPILER_VERSION='gcc (GCC) 10.2.1 20201125 (Red Hat 10.2.1-9)'
 CYTHON_VERSION='0.29.21'
 LINKER_VERSION='GNU ld version 2.35-18.fc33'
 PYTHON_VERSION='3.9.2'
 RELEASE_BUILD=True
 lib_gobject_introspection='1.66.1'
-lib_gtk='3.24.26'
-lib_gtk_x11='3.24.26'
+lib_gtk='3.24.28'
+lib_gtk_x11='3.24.28'
 lib_nvenc='10'
 lib_nvfbc='6.0'
 lib_py3cairo='1.18.2'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/client/gtk3/gtk3_notifier.py 
new/xpra-4.1.2/xpra/client/gtk3/gtk3_notifier.py
--- old/xpra-4.1.1/xpra/client/gtk3/gtk3_notifier.py    2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/client/gtk3/gtk3_notifier.py    2021-04-06 
10:03:41.000000000 +0200
@@ -1,5 +1,5 @@
 # This file is part of Xpra.
-# Copyright (C) 2011-2019 Antoine Martin <anto...@xpra.org>
+# Copyright (C) 2011-2021 Antoine Martin <anto...@xpra.org>
 # Xpra is released under the terms of the GNU GPL v2, or, at your option, any
 # later version. See the file COPYING for details.
 
@@ -30,3 +30,7 @@
 
     def close_notify(self, nid):
         self.clean_notification(nid)
+
+    def cleanup(self):
+        Notify.uninit()
+        super().cleanup()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/client/gtk3/splash_screen.py 
new/xpra-4.1.2/xpra/client/gtk3/splash_screen.py
--- old/xpra-4.1.1/xpra/client/gtk3/splash_screen.py    2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/client/gtk3/splash_screen.py    2021-04-06 
10:03:41.000000000 +0200
@@ -11,7 +11,7 @@
 from xpra import __version__
 from xpra.util import envint
 from xpra.os_util import SIGNAMES, OSX
-from xpra.exit_codes import EXIT_TIMEOUT
+from xpra.exit_codes import EXIT_TIMEOUT, EXIT_CONNECTION_LOST
 from xpra.common import SPLASH_EXIT_DELAY
 from xpra.gtk_common.gtk_util import add_close_accel, get_icon_pixbuf
 from xpra.gtk_common.gobject_compat import install_signal_handlers
@@ -132,7 +132,11 @@
         log("read_stdin()")
         while self.exit_code is None:
             line = sys.stdin.readline()
-            GLib.idle_add(self.handle_stdin_line, line)
+            if not line:
+                self.exit()
+            else:
+                self.exit_code = EXIT_CONNECTION_LOST
+                GLib.idle_add(self.handle_stdin_line, line)
 
     def handle_stdin_line(self, line):
         parts = line.rstrip("\n\r").split(":", 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/client/gtk_base/gtk_client_base.py 
new/xpra-4.1.2/xpra/client/gtk_base/gtk_client_base.py
--- old/xpra-4.1.1/xpra/client/gtk_base/gtk_client_base.py      2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/client/gtk_base/gtk_client_base.py      2021-04-06 
10:04:54.000000000 +0200
@@ -224,6 +224,22 @@
         self.UI_watcher.add_fail_callback(UI_failed)
 
 
+    def get_vrefresh(self):
+        #try via GTK:
+        rates = {}
+        display = Gdk.Display.get_default()
+        for m in range(display.get_n_monitors()):
+            monitor = display.get_monitor(m)
+            log("monitor %i (%s) refresh-rate=%i", m, monitor.get_model(), 
monitor.get_refresh_rate())
+            rates[m] = monitor.get_refresh_rate()
+        rate = -1
+        if rates:
+            rate = iround(min(rates.values())/1000)
+        if rate<30 or rate>250:
+            rate = super().get_vrefresh()
+        return rate
+
+
     def get_notifier_classes(self):
         #subclasses may add their toolkit specific variants
         #by overriding this method
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xpra-4.1.1/xpra/client/gtk_base/gtk_client_window_base.py 
new/xpra-4.1.2/xpra/client/gtk_base/gtk_client_window_base.py
--- old/xpra-4.1.1/xpra/client/gtk_base/gtk_client_window_base.py       
2021-03-07 15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/client/gtk_base/gtk_client_window_base.py       
2021-04-06 10:04:54.000000000 +0200
@@ -237,6 +237,7 @@
         self._current_frame_extents = None
         self._screen = -1
         self._frozen = False
+        self._focus_latest = None
         self.window_state_timer = None
         self.send_iconify_timer = None
         self.remove_pointer_overlay_timer = None
@@ -432,7 +433,6 @@
                 log.warn("Warning: missing gdk bindings:")
                 log.warn(" %s", e)
             else:
-                self._focus_latest = None
                 grablog("adding event receiver so we can get FocusIn and 
FocusOut events whilst grabbing the keyboard")
                 add_event_receiver(self.get_window(), self)
         #other platforms should bet getting regular focus events instead:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/client/gtk_base/sessions_gui.py 
new/xpra-4.1.2/xpra/client/gtk_base/sessions_gui.py
--- old/xpra-4.1.1/xpra/client/gtk_base/sessions_gui.py 2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/client/gtk_base/sessions_gui.py 2021-04-06 
10:04:54.000000000 +0200
@@ -370,8 +370,8 @@
                 self.clients_disconnecting.remove(key)
             elif c not in (0, None):
                 self.warning.set_text(EXIT_STR.get(c, "exit code %s" % 
c).replace("_", " "))
-            proc = self.clients.pop(key, None)
-            if proc:
+            client_proc = self.clients.pop(key, None)
+            if client_proc:
                 def update():
                     self.update()
                     self.populate()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/client/mixins/network_listener.py 
new/xpra-4.1.2/xpra/client/mixins/network_listener.py
--- old/xpra-4.1.1/xpra/client/mixins/network_listener.py       2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/client/mixins/network_listener.py       2021-04-06 
10:03:41.000000000 +0200
@@ -16,7 +16,7 @@
 from xpra.net.protocol import Protocol
 from xpra.exit_codes import EXIT_OK, EXIT_FAILURE
 from xpra.client.mixins.stub_client_mixin import StubClientMixin
-from xpra.scripts.config import InitException
+from xpra.scripts.config import InitException, InitExit
 from xpra.log import Logger
 
 log = Logger("network")
@@ -50,11 +50,18 @@
         opts.bind_udp = ()
         self.sockets = create_sockets(opts, err)
         if opts.bind:
-            local_sockets = setup_local_sockets(opts.bind,
+            try:
+                local_sockets = setup_local_sockets(opts.bind,
                                                 None, opts.client_socket_dirs,
                                                 str(os.getpid()), True,
                                                 opts.mmap_group, 
opts.socket_permissions)
-            self.sockets.update(local_sockets)
+            except (OSError, InitExit) as e:
+                log("setup_local_sockets bind=%s, client_socket_dirs=%s",
+                    opts.bind, opts.client_socket_dirs, exc_info=True)
+                log.warn("Warning: failed to create the client sockets:")
+                log.warn(" '%s'", e)
+            else:
+                self.sockets.update(local_sockets)
 
     def run(self):
         self.start_listen_sockets()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/client/mixins/notifications.py 
new/xpra-4.1.2/xpra/client/mixins/notifications.py
--- old/xpra-4.1.1/xpra/client/mixins/notifications.py  2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/client/mixins/notifications.py  2021-04-06 
10:04:54.000000000 +0200
@@ -111,17 +111,19 @@
                 for x in body.splitlines():
                     log.info(" %s", x)
             return
-        try:
-            from xpra.notifications.common import parse_image_path
-            icon_filename = get_icon_filename(icon_name)
-            icon = parse_image_path(icon_filename)
-            n.show_notify("", self.tray, nid, "Xpra", nid, "",
-                          summary, body, actions, hints or {}, expire_timeout, 
icon)
-        except Exception as e:
-            log("failed to show notification", exc_info=True)
-            log.error("Error: cannot show notification")
-            log.error(" '%s'", summary)
-            log.error(" %s", e)
+        def show_notification():
+            try:
+                from xpra.notifications.common import parse_image_path
+                icon_filename = get_icon_filename(icon_name)
+                icon = parse_image_path(icon_filename)
+                n.show_notify("", self.tray, nid, "Xpra", nid, "",
+                              summary, body, actions, hints or {}, 
expire_timeout, icon)
+            except Exception as e:
+                log("failed to show notification", exc_info=True)
+                log.error("Error: cannot show notification")
+                log.error(" '%s'", summary)
+                log.error(" %s", e)
+        self.idle_add(show_notification)
 
     def _process_notify_show(self, packet):
         if not self.notifications_enabled:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/client/mixins/window_manager.py 
new/xpra-4.1.2/xpra/client/mixins/window_manager.py
--- old/xpra-4.1.1/xpra/client/mixins/window_manager.py 2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/client/mixins/window_manager.py 2021-04-06 
10:04:54.000000000 +0200
@@ -309,7 +309,7 @@
             "double_click.distance"     : get_double_click_distance(),
             #features:
             "bell"                      : self.client_supports_bell,
-            "vrefresh"                  : get_vrefresh(),
+            "vrefresh"                  : self.get_vrefresh(),
             "windows"                   : self.windows_enabled,
             "auto_refresh_delay"        : int(self.auto_refresh_delay*1000),
             #system tray forwarding:
@@ -322,6 +322,9 @@
             })
         return caps
 
+    def get_vrefresh(self):
+        return get_vrefresh()
+
     def get_window_caps(self) -> dict:
         return {
             #implemented in the gtk client:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/client/ui_client_base.py 
new/xpra-4.1.2/xpra/client/ui_client_base.py
--- old/xpra-4.1.1/xpra/client/ui_client_base.py        2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/client/ui_client_base.py        2021-04-06 
10:04:54.000000000 +0200
@@ -219,8 +219,7 @@
 
         if MOUSE_DELAY_AUTO:
             try:
-                from xpra.platform.gui import get_vrefresh
-                v = get_vrefresh()
+                v = self.get_vrefresh()
                 if v<=0:
                     #some platforms don't detect the vrefresh correctly
                     #(ie: macos in virtualbox?), so use a sane default:
@@ -230,6 +229,11 @@
             except Exception:
                 log("failed to calculate automatic delay", exc_info=True)
 
+    def get_vrefresh(self):
+        #this method is overriden in the GTK client
+        from xpra.platform.gui import get_vrefresh
+        return get_vrefresh()
+
 
     def run(self):
         if self.client_extras:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/net/bytestreams.py 
new/xpra-4.1.2/xpra/net/bytestreams.py
--- old/xpra-4.1.1/xpra/net/bytestreams.py      2021-03-07 15:32:43.000000000 
+0100
+++ new/xpra-4.1.2/xpra/net/bytestreams.py      2021-04-06 10:03:41.000000000 
+0200
@@ -90,7 +90,7 @@
         if isinstance(s, str):
             return s
         if len(s)==2:
-            if s[0].find(":")>=0:
+            if str(s[0]).find(":")>=0:
                 #IPv6
                 return "[%s]:%s" % (s[0], s[1])
             return "%s:%s" % (s[0], s[1])
@@ -282,7 +282,8 @@
                     kmax = 5
                     if WIN32:
                         sock = self.get_raw_socket()
-                        sock.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 
idletime*1000, interval*1000))  #@UndefinedVariable pylint: disable=no-member
+                        if sock:
+                            sock.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 
idletime*1000, interval*1000))  #@UndefinedVariable pylint: disable=no-member
                     elif OSX:
                         TCP_KEEPALIVE = 0x10
                         self._setsockopt(socket.IPPROTO_TCP, TCP_KEEPALIVE, 
interval)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/net/mdns/zeroconf_listener.py 
new/xpra-4.1.2/xpra/net/mdns/zeroconf_listener.py
--- old/xpra-4.1.1/xpra/net/mdns/zeroconf_listener.py   2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/net/mdns/zeroconf_listener.py   2021-04-06 
10:04:54.000000000 +0200
@@ -28,6 +28,9 @@
     def __repr__(self):
         return "ZeroconfListener(%s)" % self.service_type
 
+    def update_service(self, zeroconf, stype, name):
+        log("update_service%s", (zeroconf, stype, name))
+
     def remove_service(self, zeroconf, stype, name):
         log("remove_service%s", (zeroconf, stype, name))
         if self.mdns_remove:
@@ -45,10 +48,15 @@
             stype = info.type
             domain = "local"
             server = info.server
-            address = socket.inet_ntoa(info.address)
+            try:
+                addresses = info.addresses
+            except AttributeError:
+                addresses = [info.address]
             port = info.port
             props = info.properties
-            self.mdns_add(interface, protocol, name, stype, domain, server, 
address, port, props)
+            for address in addresses:
+                saddress = socket.inet_ntoa(address)
+                self.mdns_add(interface, protocol, name, stype, domain, 
server, saddress, port, props)
 
     def start(self):
         self.browser = ServiceBrowser(self.zeroconf, self.service_type, 
listener=self)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/net/mdns/zeroconf_publisher.py 
new/xpra-4.1.2/xpra/net/mdns/zeroconf_publisher.py
--- old/xpra-4.1.1/xpra/net/mdns/zeroconf_publisher.py  2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/net/mdns/zeroconf_publisher.py  2021-04-06 
10:03:41.000000000 +0200
@@ -168,13 +168,17 @@
         return new_dict
 
     def update_txt(self, txt):
+        if not hasattr(self.zeroconf, "update_service"):
+            log("no update_service with zeroconf version %s", zeroconf_version)
+            return
         props = self.txt_rec(txt)
         if self.args:
             args = list(self.args)
             args[6] = props
             self.args = tuple(args)
-        self.kwargs["properties"] = props
-        si = ServiceInfo(**self.kwargs)
+        else:
+            self.kwargs["properties"] = props
+        si = ServiceInfo(*self.args, **self.kwargs)
         try:
             self.zeroconf.update_service(si)
             self.service = si
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/notifications/dbus_notifier.py 
new/xpra-4.1.2/xpra/notifications/dbus_notifier.py
--- old/xpra-4.1.1/xpra/notifications/dbus_notifier.py  2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/notifications/dbus_notifier.py  2021-04-06 
10:03:41.000000000 +0200
@@ -11,7 +11,8 @@
 from xpra.notifications.notifier_base import NotifierBase, log
 try:
     #new recommended way of using the glib main loop:
-    from dbus.mainloop.glib import DBusGMainLoop
+    from dbus.mainloop.glib import DBusGMainLoop, threads_init
+    threads_init()
     DBusGMainLoop(set_as_default=True)
 except ImportError:
     #beware: this import has side-effects:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/notifications/pynotify_notifier.py 
new/xpra-4.1.2/xpra/notifications/pynotify_notifier.py
--- old/xpra-4.1.1/xpra/notifications/pynotify_notifier.py      2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/notifications/pynotify_notifier.py      2021-04-06 
10:03:41.000000000 +0200
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 # This file is part of Xpra.
-# Copyright (C) 2011-2020 Antoine Martin <anto...@xpra.org>
+# Copyright (C) 2011-2021 Antoine Martin <anto...@xpra.org>
 # Xpra is released under the terms of the GNU GPL v2, or, at your option, any
 # later version. See the file COPYING for details.
 
@@ -18,7 +18,8 @@
         if not self.dbus_check(dbus_id):
             return
         icon_string = self.get_icon_string(nid, app_icon, icon)
-        notify2.init(app_name or "Xpra")
+        if not notify2.is_initted():
+            notify2.init(app_name or "Xpra", "glib")
         n = notify2.Notification(summary, body, icon_string)
         n.set_urgency(notify2.URGENCY_LOW)
         n.set_timeout(timeout)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/platform/darwin/__init__.py 
new/xpra-4.1.2/xpra/platform/darwin/__init__.py
--- old/xpra-4.1.1/xpra/platform/darwin/__init__.py     2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/platform/darwin/__init__.py     2021-04-06 
10:03:41.000000000 +0200
@@ -1,5 +1,5 @@
 # This file is part of Xpra.
-# Copyright (C) 2011-2020 Antoine Martin <anto...@xpra.org>
+# Copyright (C) 2011-2021 Antoine Martin <anto...@xpra.org>
 # Xpra is released under the terms of the GNU GPL v2, or, at your option, any
 # later version. See the file COPYING for details.
 
@@ -45,3 +45,18 @@
         macapp = GtkosxApplication.Application()
         macapp.connect("NSApplicationWillTerminate", quit_handler)
     return macapp
+
+
+#workaround for Big Sur dylib cache mess:
+#https://stackoverflow.com/a/65599706/428751
+def patch_find_library():
+    from ctypes import util  #pylint: disable=import-outside-toplevel
+    orig_util_find_library = util.find_library
+    def new_util_find_library(name):
+        res = orig_util_find_library(name)
+        if res:
+            return res
+        return '/System/Library/Frameworks/'+name+'.framework/'+name
+    util.find_library = new_util_find_library
+if os.environ.get("XPRA_OSX_PATCH_FIND_LIBRARY", "1")=="1":
+    patch_find_library()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/platform/dotxpra.py 
new/xpra-4.1.2/xpra/platform/dotxpra.py
--- old/xpra-4.1.1/xpra/platform/dotxpra.py     2021-03-07 15:32:43.000000000 
+0100
+++ new/xpra-4.1.2/xpra/platform/dotxpra.py     2021-04-06 10:03:41.000000000 
+0200
@@ -62,6 +62,9 @@
                 uid = self.uid
             if gid is None:
                 gid = self.gid
+            parent = os.path.dirname(d)
+            if parent and parent!="/" and not os.path.exists(parent):
+                self.mksockdir(parent, mode, uid, gid)
             with umask_context(0):
                 os.mkdir(d, mode)
             if uid!=os.getuid() or gid!=os.getgid():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/platform/win32/clipboard.py 
new/xpra-4.1.2/xpra/platform/win32/clipboard.py
--- old/xpra-4.1.1/xpra/platform/win32/clipboard.py     2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/platform/win32/clipboard.py     2021-04-06 
10:04:54.000000000 +0200
@@ -318,7 +318,7 @@
         super().__init__(selection)
 
     def with_clipboard_lock(self, success_callback, failure_callback, 
retries=RETRY, delay=DELAY):
-        with_clipboard_lock(self.window, success_callback, failure_callback, 
retries=RETRY, delay=DELAY)
+        with_clipboard_lock(self.window, success_callback, failure_callback, 
retries=retries, delay=delay)
 
     def clear(self):
         self.with_clipboard_lock(self.empty_clipboard, self.clear_error)
@@ -361,8 +361,9 @@
             log("do_emit_token() formats=%s", format_names(fmts))
             send_token(fmts)
             return True
-        def errback(_errmsg=None):
-            send_token()
+        def errback(errmsg=None):
+            #nothing we can do!
+            log("not sending the token since we failed to get the clipboard 
lock: %s", errmsg)
         self.with_clipboard_lock(got_clipboard_lock, errback)
 
     def get_contents(self, target, got_contents):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/scripts/config.py 
new/xpra-4.1.2/xpra/scripts/config.py
--- old/xpra-4.1.1/xpra/scripts/config.py       2021-03-07 15:32:43.000000000 
+0100
+++ new/xpra-4.1.2/xpra/scripts/config.py       2021-04-06 10:04:54.000000000 
+0200
@@ -12,6 +12,7 @@
     WIN32, OSX, POSIX,
     osexpand, getuid, getgid, get_username_for_uid,
     is_Debian, is_Ubuntu, is_arm,
+    which,
     )
 
 def warn(msg):
@@ -1335,11 +1336,14 @@
     options.proxy_video_encoders = getlist(pvestr, "proxy video encoders", 
"HARDWARE_ENCODER_OPTIONS")
 
 def fixup_socketdirs(options):
-    if isinstance(options.socket_dirs, str):
-        options.socket_dirs = options.socket_dirs.split(os.path.pathsep)
-    else:
-        assert isinstance(options.socket_dirs, (list, tuple))
-        options.socket_dirs = [v for x in options.socket_dirs for v in 
x.split(os.path.pathsep)]
+    for option_name in ("socket_dirs", "client_socket_dirs"):
+        value = getattr(options, option_name)
+        if isinstance(value, str):
+            value = value.split(os.path.pathsep)
+        else:
+            assert isinstance(options.socket_dirs, (list, tuple))
+            value = [v for x in value for v in x.split(os.path.pathsep)]
+        setattr(options, option_name, value)
 
 def fixup_pings(options):
     #pings used to be a boolean, True mapped to "5"
@@ -1437,6 +1441,11 @@
         options.clipboard_direction = "disabled"
 
 def abs_paths(options):
+    ew = options.exec_wrapper
+    if ew and not os.path.isabs(ew):
+        ew = which(ew)
+        if ew:
+            options.exec_wrapper = ew
     #convert to absolute paths before we daemonize
     for k in ("clipboard-filter-file",
               "tcp-encryption-keyfile", "encryption-keyfile",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/scripts/main.py 
new/xpra-4.1.2/xpra/scripts/main.py
--- old/xpra-4.1.1/xpra/scripts/main.py 2021-03-07 15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/scripts/main.py 2021-04-06 10:04:54.000000000 +0200
@@ -393,6 +393,7 @@
     if mode in (
         "start", "start-desktop",
         "shadow", "attach", "listen",
+        "upgrade", "upgrade-desktop",
         "request-start", "request-start-desktop", "request-shadow",
         ):
         options.encodings = validated_encodings(options.encodings)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/scripts/parsing.py 
new/xpra-4.1.2/xpra/scripts/parsing.py
--- old/xpra-4.1.1/xpra/scripts/parsing.py      2021-03-07 15:32:43.000000000 
+0100
+++ new/xpra-4.1.2/xpra/scripts/parsing.py      2021-04-06 10:03:41.000000000 
+0200
@@ -1296,6 +1296,7 @@
                 break
 
     NEED_ENCODING_MODES = ("attach", "start", "start-desktop", "shadow",
+                           "upgrade", "upgrade-desktop",
                            "listen", "launcher",
                            "bug-report", "encoding", "gui-info")
     fixup_options(options, skip_encodings=len(args)==0 or args[0] not in 
NEED_ENCODING_MODES)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/scripts/server.py 
new/xpra-4.1.2/xpra/scripts/server.py
--- old/xpra-4.1.1/xpra/scripts/server.py       2021-03-07 15:32:43.000000000 
+0100
+++ new/xpra-4.1.2/xpra/scripts/server.py       2021-04-06 10:04:54.000000000 
+0200
@@ -126,6 +126,9 @@
     n = display_name[1:].split(".")[0]    #ie: ":0.0" -> "0"
     try:
         dno = int(n)
+    except (ValueError, TypeError):
+        raise InitException("invalid display number %r" % n) from None
+    else:
         if 0<=dno<10:
             warn("WARNING: low display number: %s" % dno)
             warn(" You are attempting to run the xpra server")
@@ -133,8 +136,6 @@
             warn(" This is generally not what you want.")
             warn(" You should probably use a higher display number")
             warn(" just to avoid any confusion and this warning message.")
-    except IOError:
-        pass
 
 
 def print_DE_warnings():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/server/dbus/dbus_server_base.py 
new/xpra-4.1.2/xpra/server/dbus/dbus_server_base.py
--- old/xpra-4.1.1/xpra/server/dbus/dbus_server_base.py 2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/server/dbus/dbus_server_base.py 2021-04-06 
10:03:41.000000000 +0200
@@ -54,7 +54,7 @@
     @dbus.service.method(dbus.PROPERTIES_IFACE, in_signature='', 
out_signature='a{sv}')
     def GetAll(self, interface_name):
         if interface_name==dbus.PROPERTIES_IFACE:
-            v = dict((x, self.Get(x)) for x in self._properties.keys())
+            v = dict((x, self.Get(interface_name, x)) for x in 
self._properties.keys())
         else:
             v = {}
         self.log(".GetAll(%s)=%s", interface_name, v)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/server/http_handler.py 
new/xpra-4.1.2/xpra/server/http_handler.py
--- old/xpra-4.1.1/xpra/server/http_handler.py  2021-03-07 15:32:43.000000000 
+0100
+++ new/xpra-4.1.2/xpra/server/http_handler.py  2021-04-06 10:04:54.000000000 
+0200
@@ -8,7 +8,7 @@
 import posixpath
 import mimetypes
 from urllib.parse import unquote
-from http.server import BaseHTTPRequestHandler
+from http.server import BaseHTTPRequestHandler, SimpleHTTPRequestHandler
 
 from xpra.util import envbool, std, csv, AdHocStruct, repr_ellipsized
 from xpra.platform.paths import get_desktop_background_paths
@@ -230,7 +230,7 @@
                 if not self.directory_listing:
                     self.send_error(403, "Directory listing forbidden")
                     return None
-                return self.list_directory(path).read()
+                return SimpleHTTPRequestHandler.list_directory(self, 
path).read()
         ext = os.path.splitext(path)[1]
         f = None
         try:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xpra-4.1.1/xpra/server/mixins/child_command_server.py 
new/xpra-4.1.2/xpra/server/mixins/child_command_server.py
--- old/xpra-4.1.1/xpra/server/mixins/child_command_server.py   2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/server/mixins/child_command_server.py   2021-04-06 
10:04:54.000000000 +0200
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 # This file is part of Xpra.
-# Copyright (C) 2010-2020 Antoine Martin <anto...@xpra.org>
+# Copyright (C) 2010-2021 Antoine Martin <anto...@xpra.org>
 # Copyright (C) 2008 Nathaniel Smith <n...@pobox.com>
 # Xpra is released under the terms of the GNU GPL v2, or, at your option, any
 # later version. See the file COPYING for details.
@@ -327,6 +327,7 @@
         env = self.get_child_env()
         log("start_command%s exec_wrapper=%s, exec_cwd=%s",
             (name, child_cmd, ignore, callback, use_wrapper, shell, kwargs), 
self.exec_wrapper, self.exec_cwd)
+        real_cmd = []
         try:
             real_cmd = self.get_full_child_command(child_cmd, use_wrapper)
             log("full child command(%s, %s)=%s", child_cmd, use_wrapper, 
real_cmd)
@@ -341,6 +342,9 @@
         except (OSError, ValueError) as e:
             log("start_command%s", (name, child_cmd, ignore, callback, 
use_wrapper, shell, kwargs), exc_info=True)
             log.error("Error spawning child '%s':" % (child_cmd, ))
+            if len(real_cmd)>1:
+                log.error(" using command:")
+                log.error(" %s", " ".join("'%s'" % x for x in real_cmd))
             log.error(" %s" % (e,))
             return None
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/server/source/encodings_mixin.py 
new/xpra-4.1.2/xpra/server/source/encodings_mixin.py
--- old/xpra-4.1.1/xpra/server/source/encodings_mixin.py        2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/server/source/encodings_mixin.py        2021-04-06 
10:04:54.000000000 +0200
@@ -253,7 +253,7 @@
         self.vrefresh = c.intget("vrefresh", -1)
 
         #assume 50Hz:
-        ms_per_frame = 1000//50
+        ms_per_frame = 1000//100
         if 30<=self.vrefresh<=500:
             #looks like a valid vrefresh value, use it:
             ms_per_frame = 1000//self.vrefresh
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/server/window/video_subregion.py 
new/xpra-4.1.2/xpra/server/window/video_subregion.py
--- old/xpra-4.1.1/xpra/server/window/video_subregion.py        2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/server/window/video_subregion.py        2021-04-06 
10:03:41.000000000 +0200
@@ -426,6 +426,7 @@
                 score = 0
             incount, outcount = inoutcount(region, ignore_size)
             total = incount+outcount
+            children_boost = 0
             if total==0:
                 ipct = opct = score = 0
             else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/server/window/window_source.py 
new/xpra-4.1.2/xpra/server/window/window_source.py
--- old/xpra-4.1.1/xpra/server/window/window_source.py  2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/server/window/window_source.py  2021-04-06 
10:04:54.000000000 +0200
@@ -1385,10 +1385,8 @@
         delay = min(delay, options.get("max_delay", 
self.batch_config.max_delay))
         delay = int(delay)
         elapsed = int(1000*(now-self.batch_config.last_event))
-        if elapsed>delay:
-            #batch delay has already elapsed since we last processed a screen 
update,
-            #so we don't need to wait much longer:
-            delay = self.batch_config.min_delay
+        #discount the elapsed time since the last event:
+        delay = max(0, delay-elapsed)
         if not self.must_batch(delay):
             #send without batching:
             damagelog("do_damage%-24s wid=%s, sending now with sequence %s",
@@ -1423,7 +1421,7 @@
         lad = (now, delay)
         self.batch_config.last_delays.append(lad)
         self.batch_config.last_delay = lad
-        expire_delay = max(self.batch_config.min_delay, 
min(self.batch_config.expire_delay, delay))
+        expire_delay = min(self.batch_config.expire_delay, delay)
         #weighted average with the last delays:
         #(so when we end up delaying a lot for some reason,
         # then we don't expire the next one quickly after)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/sound/gstreamer_util.py 
new/xpra-4.1.2/xpra/sound/gstreamer_util.py
--- old/xpra-4.1.1/xpra/sound/gstreamer_util.py 2021-03-07 15:32:43.000000000 
+0100
+++ new/xpra-4.1.2/xpra/sound/gstreamer_util.py 2021-04-06 10:09:07.000000000 
+0200
@@ -47,7 +47,7 @@
 ALLOW_SOUND_LOOP = envbool("XPRA_ALLOW_SOUND_LOOP", False)
 USE_DEFAULT_DEVICE = envbool("XPRA_USE_DEFAULT_DEVICE", True)
 IGNORED_INPUT_DEVICES = os.environ.get("XPRA_SOUND_IGNORED_INPUT_DEVICES", 
"bell.ogg,bell.wav").split(",")
-IGNORED_OUTPUT_DEVICES = os.environ.get("XPRA_SOUND_IGNORED_OUTPUT_DEVICES", 
"").split(",")
+IGNORED_OUTPUT_DEVICES = os.environ.get("XPRA_SOUND_IGNORED_OUTPUT_DEVICES", 
"bell-window-system").split(",")
 def force_enabled(codec_name):
     return os.environ.get("XPRA_SOUND_CODEC_ENABLE_%s" % 
codec_name.upper().replace("+", "_"), "0")=="1"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/src_info.py 
new/xpra-4.1.2/xpra/src_info.py
--- old/xpra-4.1.1/xpra/src_info.py     2021-03-07 15:45:11.000000000 +0100
+++ new/xpra-4.1.2/xpra/src_info.py     2021-04-06 15:29:09.000000000 +0200
@@ -1,3 +1,4 @@
 BRANCH='v4.1.x'
-LOCAL_MODIFICATIONS='unknown'
-REVISION='unknown'
+COMMIT='gb75b0f2c9'
+LOCAL_MODIFICATIONS=0
+REVISION=78
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/x11/bindings/keyboard_bindings.pyx 
new/xpra-4.1.2/xpra/x11/bindings/keyboard_bindings.pyx
--- old/xpra-4.1.1/xpra/x11/bindings/keyboard_bindings.pyx      2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/x11/bindings/keyboard_bindings.pyx      2021-04-06 
10:04:54.000000000 +0200
@@ -947,7 +947,7 @@
             keysyms = []
             for group in (0, 1):
                 for level in (0, 1):
-                    keysym = XkbKeycodeToKeysym(self.display, keycode, 0, 0)
+                    keysym = XkbKeycodeToKeysym(self.display, keycode, group, 
level)
                     if keysym==NoSymbol:
                         continue
                     key = XKeysymToString(keysym)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/x11/bindings/randr_bindings.pyx 
new/xpra-4.1.2/xpra/x11/bindings/randr_bindings.pyx
--- old/xpra-4.1.1/xpra/x11/bindings/randr_bindings.pyx 2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/x11/bindings/randr_bindings.pyx 2021-04-06 
10:04:54.000000000 +0200
@@ -51,12 +51,15 @@
 ###################################
 cdef extern from "X11/extensions/randr.h":
     cdef unsigned int RR_Rotate_0
+    ctypedef unsigned long XRRModeFlags
+    ctypedef unsigned short Connection
+    ctypedef unsigned short SubpixelOrder
+    ctypedef unsigned short Rotation
 
 cdef extern from "X11/extensions/Xrandr.h":
     ctypedef XID RRMode
     ctypedef XID RROutput
     ctypedef XID RRCrtc
-    ctypedef unsigned long XRRModeFlags
 
     Bool XRRQueryExtension(Display *, int *, int *)
     Status XRRQueryVersion(Display *, int * major, int * minor)
@@ -90,6 +93,35 @@
         int         nmode
         XRRModeInfo *modes
 
+    ctypedef struct XRROutputInfo:
+        Time            timestamp
+        RRCrtc          crtc
+        char            *name
+        int             nameLen
+        unsigned long   mm_width
+        unsigned long   mm_height
+        Connection      connection
+        SubpixelOrder   subpixel_order
+        int             ncrtc
+        RRCrtc          *crtcs
+        int             nclone
+        RROutput        *clones
+        int             nmode
+        int             npreferred
+        RRMode          *modes
+
+    ctypedef struct XRRCrtcInfo:
+        Time            timestamp
+        int             x, y
+        unsigned int    width, height
+        RRMode          mode
+        Rotation        rotation
+        int             noutput
+        RROutput        *outputs
+        Rotation        rotations
+        int             npossible
+        RROutput        *possible
+
     ctypedef unsigned short SizeID
     ctypedef struct XRRScreenConfiguration:
         pass
@@ -106,6 +138,12 @@
     XRRScreenResources *XRRGetScreenResourcesCurrent(Display *dpy, Window 
window)
     void XRRFreeScreenResources(XRRScreenResources *resources)
 
+    XRROutputInfo *XRRGetOutputInfo(Display *dpy, XRRScreenResources 
*resources, RROutput output)
+    void XRRFreeOutputInfo (XRROutputInfo *outputInfo)
+
+    XRRCrtcInfo *XRRGetCrtcInfo(Display *dpy, XRRScreenResources *resources, 
RRCrtc crtc)
+    void XRRFreeCrtcInfo(XRRCrtcInfo *crtcInfo)
+
     XRRModeInfo *XRRAllocModeInfo(char *name, int nameLength)
     RRMode XRRCreateMode(Display *dpy, Window window, XRRModeInfo *modeInfo)
     void XRRDestroyMode (Display *dpy, RRMode mode)
@@ -321,9 +359,14 @@
                 XRRFreeScreenConfigInfo(config)
 
     def get_vrefresh(self):
-        cdef Window window                              #@DuplicatedSignature
-        window = XDefaultRootWindow(self.display)
-        cdef XRRScreenConfiguration *config             #@DuplicatedSignature
+        voutputs = self.get_vrefresh_outputs()
+        if voutputs:
+            return min(voutputs.values())
+        return self.get_vrefresh_display()
+
+    def get_vrefresh_display(self):
+        cdef Window window = XDefaultRootWindow(self.display)
+        cdef XRRScreenConfiguration *config = NULL
         try:
             config = XRRGetScreenInfo(self.display, window)
             if config==NULL:
@@ -334,6 +377,38 @@
             if config!=NULL:
                 XRRFreeScreenConfigInfo(config)
 
+    def get_vrefresh_outputs(self):
+        cdef Window window = XDefaultRootWindow(self.display)
+        cdef XRROutputInfo *output_info = NULL
+        cdef XRRCrtcInfo *crtc_info = NULL
+        cdef XRRModeInfo *mode_info = NULL
+        rates = {}
+        cdef XRRScreenResources *rsc = 
XRRGetScreenResourcesCurrent(self.display, window)
+        assert rsc!=NULL
+        try:
+            for crtc in range(rsc.ncrtc):
+                crtc_info = XRRGetCrtcInfo(self.display, rsc, rsc.crtcs[crtc])
+                #find the mode info:
+                for i in range(rsc.nmode):
+                    mode_info = &rsc.modes[i]
+                    if mode_info.id==crtc_info.mode:
+                        if mode_info.hTotal and mode_info.vTotal:
+                            rate = iround(mode_info.dotClock / 
(mode_info.hTotal * mode_info.vTotal))
+                            #outputs affected:
+                            output_names = []
+                            for o in range(crtc_info.noutput):
+                                output_info = XRRGetOutputInfo(self.display, 
rsc, crtc_info.outputs[o])
+                                if output_info!=NULL:
+                                    
output_names.append(output_info.name.decode("utf8"))
+                                    XRRFreeOutputInfo(output_info)
+                            log("%s : %s", csv(output_names), rate)
+                            rates[crtc] = rate
+                        break
+        finally:
+            XRRFreeScreenResources(rsc)
+        return rates
+
+
     def set_screen_size(self, width, height):
         return self._set_screen_size(width, height)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-4.1.1/xpra/x11/server_keyboard_config.py 
new/xpra-4.1.2/xpra/x11/server_keyboard_config.py
--- old/xpra-4.1.1/xpra/x11/server_keyboard_config.py   2021-03-07 
15:32:43.000000000 +0100
+++ new/xpra-4.1.2/xpra/x11/server_keyboard_config.py   2021-04-06 
10:04:54.000000000 +0200
@@ -613,11 +613,14 @@
             failed = []
             for modifier in modifiers:
                 modifier = bytestostr(modifier)
-                keynames = self.keynames_for_mod.get(modifier)
-                if not keynames:
+                keynames = self.keynames_for_mod.get(modifier, None)
+                if keynames is None:
                     log.error("Error: unknown modifier '%s'", modifier)
                     log.error(" known modifiers: %s", 
csv(self.keynames_for_mod.keys()))
                     continue
+                if not keynames:
+                    log.warn("Warning: found no keynames for '%s'", modifier)
+                    continue
                 #find the keycodes that match the keynames for this modifier
                 keycodes = []
                 #log.info("keynames(%s)=%s", modifier, keynames)

++++++ xpra-html5-4.0.6.tar.xz -> xpra-html5-4.1.2.tar.xz ++++++
++++ 3738 lines of diff (skipped)


++++++ xpra-paths.patch ++++++
--- /var/tmp/diff_new_pack.fZMllX/_old  2021-04-19 21:06:38.048086472 +0200
+++ /var/tmp/diff_new_pack.fZMllX/_new  2021-04-19 21:06:38.048086472 +0200
@@ -1,7 +1,7 @@
-Index: xpra-4.1/setup.py
+Index: xpra-4.1.2/setup.py
 ===================================================================
---- xpra-4.1.orig/setup.py
-+++ xpra-4.1/setup.py
+--- xpra-4.1.2.orig/setup.py
++++ xpra-4.1.2/setup.py
 @@ -1531,7 +1531,7 @@ else:
          add_data_files("%s/man1" % man_path,  man_pages)
          add_data_files("share/applications",  
glob.glob("fs/share/applications/*.desktop"))
@@ -11,7 +11,7 @@
          add_data_files("share/metainfo",      
["fs/share/metainfo/xpra.appdata.xml"])
  
      #here, we override build and install so we can
-@@ -1617,16 +1617,18 @@ else:
+@@ -1617,7 +1617,7 @@ else:
              if pam_ENABLED:
                  copytodir("fs/etc/pam.d/xpra", "/etc/pam.d")
  
@@ -20,20 +20,28 @@
              if service_ENABLED:
                  #Linux init service:
                  subs = {}
-                 if os.path.exists("/etc/sysconfig"):
--                    copytodir("fs/etc/sysconfig/xpra", "/etc/sysconfig")
-+                    shutil.copy("fs/etc/sysconfig/xpra", 
"fs/etc/sysconfig/sysconfig.xpra")
-+                    os.chmod("fs/etc/sysconfig/sysconfig.xpra", 0o644)
-+                    copytodir("fs/etc/sysconfig/sysconfig.xpra", 
"__FILLUPDIR__")
-                 elif os.path.exists("/etc/default"):
-                     copytodir("fs/etc/sysconfig/xpra", "/etc/default")
-                     subs[b"/etc/sysconfig"] = b"/etc/default"
+@@ -1625,15 +1625,15 @@ else:
+                     cdir = "/etc/sysconfig"
+                 elif is_Debian() or is_Ubuntu():
+                     cdir = "/etc/default"
+-                elif os.path.exists("/etc/sysconfig"):
+-                    cdir = "/etc/sysconfig"
+                 else:
+-                    cdir = "/etc/default"
+-                copytodir("fs/etc/sysconfig/xpra", cdir)
++                    cdir = "__FILLUPDIR__"
++                shutil.copy("fs/etc/sysconfig/xpra", 
"fs/etc/sysconfig/sysconfig.xpra")
++                os.chmod("fs/etc/sysconfig/sysconfig.xpra", 0o644)
++                copytodir("fs/etc/sysconfig/sysconfig.xpra", cdir)
+                 if cdir!="/etc/sysconfig":
+                     #also replace the reference to it in the service file 
below
+                     subs[b"/etc/sysconfig"] = cdir.encode()
 -                if os.path.exists("/bin/systemctl"):
 +                if os.path.exists("/usr/bin/systemctl"):
                      if sd_listen_ENABLED:
                          copytodir("fs/lib/systemd/system/xpra.service", 
systemd_dir,
                                    subs=subs)
-@@ -1754,7 +1756,6 @@ if scripts_ENABLED:
+@@ -1761,7 +1761,6 @@ if scripts_ENABLED:
  toggle_modules(WIN32, "xpra/scripts/win32_service")
  
  if data_ENABLED:

Reply via email to