Hello community,

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

Package is "xpra"

Thu Nov 21 12:59:10 2019 rev:10 rq:749997 version:3.0.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/xpra/xpra.changes        2019-11-04 
17:15:21.632835085 +0100
+++ /work/SRC/openSUSE:Factory/.xpra.new.26869/xpra.changes     2019-11-21 
12:59:19.910515592 +0100
@@ -1,0 +2,35 @@
+Wed Nov 20 19:48:11 UTC 2019 - Luigi Baldoni <[email protected]>
+
+- Update to version 3.0.2
+  * fix clipboard synchronization issue with MS Windows clients
+    properly
+  * fix Pillow 6.x compatibility with MS Windows packaging
+  * fix null bytes in X11 error text properly
+  * fix Python 3 servers wrongly re-sending the 'screen'
+    attribute
+  * fix remote logging failures with some message formats
+  * fix lost screen updates
+  * fix GTK scaling causing window geometry issues
+  * fix HTML5 clipboard data sent from polling events
+  * fix CUDA device logging with multiple devices
+  * fix 32-bit build errors on xxhash
+  * fix RPM jpeg and libyuv dependencies
+  * fix OpenGL window not refreshing with Python 3
+  * fix OpenGL context held for too long
+  * fix SSH connection errors when 'port' is specified in the
+    ssh config
+  * fix faac and faad2 security issues in MS Windows and MacOS
+    builds
+  * fix window size hints misapplied with GTK3 on MS Windows and
+    Wayland
+  * disable OpenGL acceleration on old Intel chipsets
+  * disable OpenGL acceleration with GTK3 builds on MS Windows
+    (for now, pending bug)
+  * show python interpreter version on about dialog
+  * re-instante ancient popup window workaround (was disabled by
+    mistake)
+  * don't use av-synchronization for text and picture content
+    types
+  * workaround Fedora packaging causing gratuitious conflicts
+
+-------------------------------------------------------------------

Old:
----
  xpra-3.0.1.tar.xz

New:
----
  xpra-3.0.2.tar.xz

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

Other differences:
------------------
++++++ xpra.spec ++++++
--- /var/tmp/diff_new_pack.eQyBGG/_old  2019-11-21 12:59:20.642515367 +0100
+++ /var/tmp/diff_new_pack.eQyBGG/_new  2019-11-21 12:59:20.642515367 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package xpra
 #
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LLC.
 # Copyright (c) 2012-2013 Pascal Bleser <[email protected]>
 #
 # All modifications and additions to the file contributed by third parties
@@ -19,7 +19,7 @@
 
 %global __requires_exclude 
^typelib\\(GtkosxApplication\\)|typelib\\(GdkGLExt\\)|typelib\\(GtkGLExt\\).*$
 Name:           xpra
-Version:        3.0.1
+Version:        3.0.2
 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-3.0.1.tar.xz -> xpra-3.0.2.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/NEWS new/xpra-3.0.2/NEWS
--- old/xpra-3.0.1/NEWS 2019-10-22 14:15:46.000000000 +0200
+++ new/xpra-3.0.2/NEWS 2019-11-05 18:31:07.000000000 +0100
@@ -1,4 +1,30 @@
-v3.0.1 (2019-10-22)
+v3.0.2 (2019-11-05)
+======================
+       -- fix clipboard synchronization issue with MS Windows clients properly
+       -- fix Pillow 6.x compatibility with MS Windows packaging
+       -- fix null bytes in X11 error text properly
+       -- fix Python 3 servers wrongly re-sending the 'screen' attribute
+       -- fix remote logging failures with some message formats
+       -- fix lost screen updates
+       -- fix GTK scaling causing window geometry issues
+       -- fix HTML5 clipboard data sent from polling events
+       -- fix CUDA device logging with multiple devices
+       -- fix 32-bit build errors on xxhash
+       -- fix RPM jpeg and libyuv dependencies
+       -- fix OpenGL window not refreshing with Python 3
+       -- fix OpenGL context held for too long
+       -- fix SSH connection errors when 'port' is specified in the ssh config
+       -- fix faac and faad2 security issues in MS Windows and MacOS builds
+       -- fix window size hints misapplied with GTK3 on MS Windows and Wayland
+       -- disable OpenGL acceleration on old Intel chipsets
+       -- disable OpenGL acceleration with GTK3 builds on MS Windows (for now, 
pending bug)
+       -- show python interpreter version on about dialog
+       -- re-instante ancient popup window workaround (was disabled by mistake)
+       -- don't use av-synchronization for text and picture content types
+       -- workaround Fedora packaging causing gratuitious conflicts
+
+
+v3.0.1 (2019-10-23)
 ======================
        -- fix clipboard synchronization failures with MS Windows clients
        -- fix window cleanup errors preventing a clean exit
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/cups/xpraforwarder 
new/xpra-3.0.2/cups/xpraforwarder
--- old/xpra-3.0.1/cups/xpraforwarder   2019-10-20 14:13:41.000000000 +0200
+++ new/xpra-3.0.2/cups/xpraforwarder   2019-10-30 04:23:47.000000000 +0100
@@ -42,7 +42,7 @@
     from urllib.parse import urlparse, parse_qs
 
 
-__version__ = "3.0.1"
+__version__ = "3.0.2"
 
 
 #Writes a syslog entry (msg) at the default facility:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/etc/xpra/conf.d/40_client.conf.in 
new/xpra-3.0.2/etc/xpra/conf.d/40_client.conf.in
--- old/xpra-3.0.1/etc/xpra/conf.d/40_client.conf.in    2019-09-24 
15:53:53.000000000 +0200
+++ new/xpra-3.0.2/etc/xpra/conf.d/40_client.conf.in    2019-11-05 
18:31:07.000000000 +0100
@@ -6,7 +6,7 @@
 #opengl = no
 #opengl = gtk, native
 #opengl = auto
-opengl = probe
+opengl = %(opengl)s
 
 # How we handle server authentication requests:
 #challenge-handlers=none
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/html5/js/Client.js 
new/xpra-3.0.2/html5/js/Client.js
--- old/xpra-3.0.1/html5/js/Client.js   2019-09-24 15:53:54.000000000 +0200
+++ new/xpra-3.0.2/html5/js/Client.js   2019-11-05 18:31:07.000000000 +0100
@@ -1420,7 +1420,7 @@
                        if (clipboard_buffer!=client.clipboard_buffer) {
                                client.debug("clipboard", "clipboard contents 
have changed");
                                client.clipboard_buffer = clipboard_buffer;
-                               client.send_clipboard_token();
+                               client.send_clipboard_token(clipboard_buffer);
                        }
                }, function(err) {
                        client.debug("clipboard", "paste event failed:", err);
@@ -1444,7 +1444,7 @@
                if (clipboard_buffer!=this.clipboard_buffer) {
                        this.debug("clipboard", "clipboard contents have 
changed");
                        this.clipboard_buffer = clipboard_buffer;
-                       this.send_clipboard_token();
+                       this.send_clipboard_token(clipboard_buffer);
                }
        }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/html5/js/Utilities.js 
new/xpra-3.0.2/html5/js/Utilities.js
--- old/xpra-3.0.1/html5/js/Utilities.js        2019-10-20 14:13:41.000000000 
+0200
+++ new/xpra-3.0.2/html5/js/Utilities.js        2019-10-30 04:23:47.000000000 
+0100
@@ -10,7 +10,7 @@
 'use strict';
 
 var Utilities = {
-       VERSION : "3.0.1",
+       VERSION : "3.0.2",
 
        exc : function() {
                console.error.apply(console, arguments);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/setup.py new/xpra-3.0.2/setup.py
--- old/xpra-3.0.1/setup.py     2019-10-20 14:13:42.000000000 +0200
+++ new/xpra-3.0.2/setup.py     2019-11-05 18:31:07.000000000 +0100
@@ -366,7 +366,7 @@
                     #Tcl/Tk
                     "Tkconstants", "Tkinter", "tcl",
                     #PIL bits that import TK:
-                    "_imagingtk", "PIL._imagingtk", "ImageTk", "PIL.ImageTk", 
"FixTk",
+                    "PIL._tkinter_finder", "_imagingtk", "PIL._imagingtk", 
"ImageTk", "PIL.ImageTk", "FixTk",
                     #formats we don't use:
                     "GimpGradientFile", "GimpPaletteFile", "BmpImagePlugin", 
"TiffImagePlugin",
                     #not used:
@@ -859,6 +859,7 @@
             'printing'              : bstr(printing_ENABLED),
             'dbus_control'          : bstr(dbus_ENABLED),
             'mmap'                  : bstr(True),
+            'opengl'                : "no" if WIN32 else "probe",
             }
     def convert_templates(subdirs):
         dirname = os.path.join(*(["etc", "xpra"] + subdirs))
@@ -1736,6 +1737,9 @@
 if modules_ENABLED:
     add_packages("xpra.buffers")
     buffers_pkgconfig = pkgconfig(optimize=3)
+    if BITS==32:
+        #this may well be sub-optimal:
+        add_to_keywords(buffers_pkgconfig, "extra_compile_args", 
"-mfpmath=387")
     if cython_ENABLED:
         cython_add(Extension("xpra.buffers.membuf",
                     ["xpra/buffers/membuf.pyx"]+membuffers_c, 
**buffers_pkgconfig))
@@ -1839,7 +1843,7 @@
 
 toggle_packages(gtk_x11_ENABLED, "xpra.x11.gtk_x11")
 toggle_packages(server_ENABLED and gtk_x11_ENABLED, "xpra.x11.models")
-gtk2_deprecated = WIN32 or (is_Fedora() and 
int(get_distribution_version_id())>=31) or getUbuntuVersion()>=(19, 10)
+gtk2_deprecated = True #WIN32 or (is_Fedora() and 
int(get_distribution_version_id())>=31) or getUbuntuVersion()>=(19, 10)
 if gtk_x11_ENABLED:
     toggle_packages(PYTHON3, "xpra.x11.gtk3")
     toggle_packages(not PYTHON3, "xpra.x11.gtk2")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/svn-info new/xpra-3.0.2/svn-info
--- old/xpra-3.0.1/svn-info     2019-10-22 21:39:21.000000000 +0200
+++ new/xpra-3.0.2/svn-info     2019-11-05 18:31:10.000000000 +0100
@@ -4,10 +4,10 @@
 Relative URL: ^/tags/v3.0.x/src
 Repository Root: file:///var/svn/repos/Xpra
 Repository UUID: 3bb7dfac-3a0b-4e04-842a-767bc560f471
-Revision: 24241
+Revision: 24387
 Node Kind: directory
 Schedule: normal
 Last Changed Author: antoine
-Last Changed Rev: 24239
-Last Changed Date: 2019-10-22 12:55:00 +0100 (Tue, 22 Oct 2019)
+Last Changed Rev: 24387
+Last Changed Date: 2019-11-05 12:01:27 +0000 (Tue, 05 Nov 2019)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/svn-version new/xpra-3.0.2/svn-version
--- old/xpra-3.0.1/svn-version  2019-10-22 21:39:21.000000000 +0200
+++ new/xpra-3.0.2/svn-version  2019-11-05 18:31:10.000000000 +0100
@@ -1 +1 @@
-24241
+24387
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xpra-3.0.1/tests/xpra/test_apps/test_window_xterm_size_hints.py 
new/xpra-3.0.2/tests/xpra/test_apps/test_window_xterm_size_hints.py
--- old/xpra-3.0.1/tests/xpra/test_apps/test_window_xterm_size_hints.py 
1970-01-01 01:00:00.000000000 +0100
+++ new/xpra-3.0.2/tests/xpra/test_apps/test_window_xterm_size_hints.py 
2019-11-05 18:31:07.000000000 +0100
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+
+import sys
+
+width = 400
+height = 200
+
+def main():
+    PY2 = sys.version_info[0]==2
+    if PY2:
+        import gtk
+        w = gtk.Window(gtk.WINDOW_TOPLEVEL)
+        w.set_default_size(499, 316)
+        w.set_title("xterm size hints")
+        w.connect("delete_event", gtk.main_quit)
+        da = gtk.DrawingArea()
+        w.add(da)
+        hints = {
+            "min_width" : 25,
+            "min_height" : 17,
+            "base_width" : 19,
+            "base_height" : 4,
+            "width_inc" : 6,
+            "height_inc" : 13,
+                }
+        w.set_geometry_hints(None, **hints)
+    else:
+        import gi
+        gi.require_version('Gdk', '3.0')
+        gi.require_version('Gtk', '3.0')
+        from gi.repository import Gtk, Gdk
+        w = Gtk.Window(type=Gtk.WindowType.TOPLEVEL)
+        w.set_default_size(499, 316)
+        w.set_title("xterm size hints")
+        w.connect("delete_event", Gtk.main_quit)
+        da = gtk.DrawingArea()
+        w.add(da)
+        geom = Gdk.Geometry()
+        wh = Gdk.WindowHints
+        geom.min_width = 25
+        geom.min_height = 17
+        geom.base_width = 19
+        geom.base_height = 4
+        geom.width_inc = 6
+        geom.height_inc = 13
+        mask = wh.MIN_SIZE | wh.BASE_SIZE | wh.RESIZE_INC
+        if sys.platform.startswith("linux"):
+            geom.max_width = 32767
+            geom.max_height = 32764
+            mask |= wh.MAX_SIZE
+        gdk_hints = Gdk.WindowHints(mask)
+        w.set_geometry_hints(None, geom, gdk_hints)
+        gtk = Gtk
+    def configure_event(w, event):
+        #print("configure_event(%s, %s)" % (w, event))
+        print("event geometry:        %s" % ((event.x, event.y, event.width, 
event.height),))
+        if PY2:
+            gdkwindow = w.get_window()
+            x, y = gdkwindow.get_origin()
+        else:
+            gdkwindow = da.get_window()
+            x, y = gdkwindow.get_origin()[1:]
+        w, h = w.get_size()
+        print("drawing area geometry: %s" % ((x, y, w, h),))
+    w.connect("configure_event", configure_event)
+    w.show_all()
+    gtk.main()
+
+
+if __name__ == "__main__":
+    main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/win32/xpra.iss 
new/xpra-3.0.2/win32/xpra.iss
--- old/xpra-3.0.1/win32/xpra.iss       2019-10-20 14:13:42.000000000 +0200
+++ new/xpra-3.0.2/win32/xpra.iss       2019-10-30 04:23:47.000000000 +0100
@@ -1,9 +1,9 @@
 [Setup]
 AppName=Xpra
 AppId=Xpra_is1
-AppVersion=3.0.1
-AppVerName=Xpra 3.0.1
-UninstallDisplayName=Xpra 3.0.1
+AppVersion=3.0.2
+AppVerName=Xpra 3.0.2
+UninstallDisplayName=Xpra 3.0.2
 AppPublisher=xpra.org
 AppPublisherURL=http:;xpra.org/
 DefaultDirName={pf}\Xpra
@@ -16,7 +16,7 @@
 Compression=lzma2/max
 SolidCompression=yes
 AllowUNCPath=false
-VersionInfoVersion=3.0.1
+VersionInfoVersion=3.0.2
 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-3.0.1/xpra/__init__.py 
new/xpra-3.0.2/xpra/__init__.py
--- old/xpra-3.0.1/xpra/__init__.py     2019-10-22 21:39:24.000000000 +0200
+++ new/xpra-3.0.2/xpra/__init__.py     2019-11-05 18:31:19.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__ = "3.0.1"
+__version__ = "3.0.2"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/client/gl/gl_drivers.py 
new/xpra-3.0.2/xpra/client/gl/gl_drivers.py
--- old/xpra-3.0.1/xpra/client/gl/gl_drivers.py 2019-09-24 15:53:58.000000000 
+0200
+++ new/xpra-3.0.2/xpra/client/gl/gl_drivers.py 2019-11-05 18:31:07.000000000 
+0100
@@ -27,7 +27,8 @@
     "renderer" :
         [
             "Software Rasterizer",
-            #"Mesa DRI Intel(R) Ivybridge Desktop"
+            "Mesa DRI Intel(R) Ivybridge Desktop",
+            "Mesa DRI Intel(R) Haswell Mobile",
         ],
     "vendor"    : [
         #"VMware, Inc.",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/client/gl/gl_window_backing_base.py 
new/xpra-3.0.2/xpra/client/gl/gl_window_backing_base.py
--- old/xpra-3.0.1/xpra/client/gl/gl_window_backing_base.py     2019-10-22 
14:15:46.000000000 +0200
+++ new/xpra-3.0.2/xpra/client/gl/gl_window_backing_base.py     2019-11-05 
18:31:07.000000000 +0100
@@ -53,7 +53,7 @@
 
 from xpra.os_util import (
     monotonic_time, strtobytes, hexstr,
-    POSIX, PYTHON2, OSX,
+    POSIX, PYTHON2, PYTHON3, OSX,
     DummyContextManager,
     )
 from xpra.util import envint, envbool, repr_ellipsized
@@ -76,7 +76,7 @@
 JPEG_YUV = envbool("XPRA_JPEG_YUV", True)
 WEBP_YUV = envbool("XPRA_WEBP_YUV", True)
 FORCE_CLONE = envbool("XPRA_OPENGL_FORCE_CLONE", False)
-DRAW_REFRESH = envbool("XPRA_OPENGL_DRAW_REFRESH", False)
+DRAW_REFRESH = envbool("XPRA_OPENGL_DRAW_REFRESH", PYTHON3)
 FBO_RESIZE = envbool("XPRA_OPENGL_FBO_RESIZE", True)
 FBO_RESIZE_DELAY = envint("XPRA_OPENGL_FBO_RESIZE_DELAY", 50)
 CONTEXT_REINIT = envbool("XPRA_OPENGL_CONTEXT_REINIT", OSX)
@@ -1067,10 +1067,10 @@
                 glBindTexture(target, 0)
                 glDisable(target)
                 self.paint_box(options.strget("encoding"), 
options.intget("delta", -1)>=0, x, y, width, height)
-                fire_paint_callbacks(callbacks)
                 # Present update to screen
                 self.present_fbo(x, y, width, height, options.intget("flush", 
0))
                 # present_fbo has reset state already
+            fire_paint_callbacks(callbacks)
             return
         except GLError as e:
             message = "OpenGL %s paint failed: %r" % (rgb_format, e)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/client/gl/gtk3/gl_client_window.py 
new/xpra-3.0.2/xpra/client/gl/gtk3/gl_client_window.py
--- old/xpra-3.0.1/xpra/client/gl/gtk3/gl_client_window.py      2019-09-24 
15:53:58.000000000 +0200
+++ new/xpra-3.0.2/xpra/client/gl/gtk3/gl_client_window.py      2019-11-05 
18:31:07.000000000 +0100
@@ -34,3 +34,5 @@
         self.init_widget_events(widget)
         self.add(widget)
         self.drawing_area = widget
+        #maybe redundant?:
+        self.apply_geometry_hints(self.geometry_hints)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/client/gl/window_backend.py 
new/xpra-3.0.2/xpra/client/gl/window_backend.py
--- old/xpra-3.0.1/xpra/client/gl/window_backend.py     2019-09-24 
15:53:58.000000000 +0200
+++ new/xpra-3.0.2/xpra/client/gl/window_backend.py     2019-11-05 
18:31:07.000000000 +0100
@@ -6,7 +6,7 @@
 
 import sys
 
-from xpra.util import typedict, AdHocStruct
+from xpra.util import typedict, envint, AdHocStruct, AtomicInteger
 from xpra.os_util import PYTHON3, WIN32
 from xpra.log import Logger
 
@@ -47,47 +47,71 @@
     log("get_gl_client_window_module(%s, %s) no match found", backends, 
force_enable)
     return {}, None
 
-def test_gl_client_window(gl_client_window_class, max_window_size=(1024, 
1024), pixel_depth=24):
+def noop(*_args):
+    pass
+def no_scaling(*args):
+    return args
+def get_None(*_args):
+    return None
+def no_idle_add(fn, *args, **kwargs):
+    fn(*args, **kwargs)
+def no_timeout_add(*_args, **_kwargs):
+    raise Exception("timeout_add should not have been called")
+def no_source_remove(*_args, **_kwargs):
+    raise Exception("source_remove should not have been called")
+
+class FakeClient(AdHocStruct):
+    def __init__(self):
+        self.sp = self.sx = self.sy = self.srect = no_scaling
+        self.cx = self.cy = no_scaling
+        self.xscale = self.yscale = 1
+        self.server_window_decorations = True
+        self.mmap_enabled = False
+        self.mmap = None
+        self.readonly = False
+        self.encoding_defaults = {}
+        self.get_window_frame_sizes = get_None
+        self._focused = None
+        self.request_frame_extents = noop
+        self.server_window_states = ()
+        self.server_window_frame_extents = False
+        self.server_readonly = False
+        self.server_pointer = False
+        self.window_configure_pointer = True
+        self.update_focus = noop
+        self.handle_key_action = noop
+        self.idle_add = no_idle_add
+        self.timeout_add = no_timeout_add
+        self.source_remove = no_source_remove
+
+    def send(self, *args):
+        log("send%s", args)
+    def get_current_modifiers(self):
+        return ()
+    def get_mouse_position(self):
+        return 0, 0
+    def server_ok(self):
+        return True
+    def mask_to_names(self, *_args):
+        return ()
+
+def test_gl_client_window(gl_client_window_class, max_window_size=(1024, 
1024), pixel_depth=24, show=False):
     #try to render using a temporary window:
     draw_result = {}
     window = None
     try:
-        w, h = 50, 50
+        x, y = -100, -100
+        if show:
+            x, y = 100, 100
+        w, h = 250, 250
         from xpra.client.window_border import WindowBorder
         border = WindowBorder()
         default_cursor_data = None
-        noclient = AdHocStruct()
-        def no_idle_add(fn, *args, **kwargs):
-            fn(*args, **kwargs)
-        def no_timeout_add(*_args, **_kwargs):
-            raise Exception("timeout_add should not have been called")
-        def no_source_remove(*_args, **_kwargs):
-            raise Exception("source_remove should not have been called")
-        def no_scaling(*args):
-            return args
-        def get_None(*_args):
-            return None
-        def noop(*_args):
-            pass
-        #we have to suspend idle_add to make this synchronous
-        #we can do this because this method must be running in the UI thread 
already:
-        noclient.idle_add = no_idle_add
-        noclient.timeout_add = no_timeout_add
-        noclient.source_remove = no_source_remove
-        noclient.sp = noclient.sx = noclient.sy = noclient.srect = no_scaling
-        noclient.xscale = noclient.yscale = 1
-        noclient.server_window_decorations = True
-        noclient.mmap_enabled = False
-        noclient.mmap = None
-        noclient.readonly = False
-        noclient.encoding_defaults = {}
-        noclient.get_window_frame_sizes = get_None
-        noclient._focused = None
-        noclient.request_frame_extents = noop
+        noclient = FakeClient()
         #test with alpha, but not on win32
         #because we can't do alpha on win32 with opengl
         metadata = typedict({b"has-alpha" : not WIN32})
-        window = gl_client_window_class(noclient, None, None, 2**32-1, -100, 
-100, w, h, w, h,
+        window = gl_client_window_class(noclient, None, None, 2**32-1, x, y, 
w, h, w, h,
                                         metadata, False, typedict({}),
                                         border, max_window_size, 
default_cursor_data, pixel_depth)
         window_backing = window._backing
@@ -100,7 +124,6 @@
         bpp = len(pixel_format)
         options = typedict({"pixel_format" : pixel_format})
         stride = bpp*w
-        img_data = b"\0"*stride*h
         coding = "rgb32"
         widget = window_backing._backing
         widget.realize()
@@ -111,9 +134,30 @@
                 "message"   : message,
                 })
         log("OpenGL: testing draw on %s widget %s with %s : %s", window, 
widget, coding, pixel_format)
-        window.draw_region(0, 0, w, h, coding, img_data, stride, 1, options, 
[paint_callback])
+        pix = AtomicInteger(0x7f)
+        REPAINT_DELAY = envint("XPRA_REPAINT_DELAY", 0)
+        def draw():
+            if PYTHON3:
+                img_data = bytes([pix.increase() % 256]*stride*h)
+            else:
+                img_data = chr(pix.increase() % 256)*stride*h
+            window.draw_region(0, 0, w, h, coding, img_data, stride, 1, 
options, [paint_callback])
+            return REPAINT_DELAY>0
         #the paint code is actually synchronous here,
         #so we can check the present_fbo() result:
+        if show:
+            widget.show()
+            window.show()
+            from xpra.gtk_common.gobject_compat import import_gtk, import_glib
+            gtk = import_gtk()
+            glib = import_glib()
+            def window_close_event(*_args):
+                gtk.main_quit()
+            noclient.window_close_event = window_close_event
+            glib.timeout_add(REPAINT_DELAY, draw)
+            gtk.main()
+        else:
+            draw()
         if window_backing.last_present_fbo_error:
             return {
                 "success" : False,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/client/gtk3/gtk3_client_window.py 
new/xpra-3.0.2/xpra/client/gtk3/gtk3_client_window.py
--- old/xpra-3.0.1/xpra/client/gtk3/gtk3_client_window.py       2019-09-24 
15:53:58.000000000 +0200
+++ new/xpra-3.0.2/xpra/client/gtk3/gtk3_client_window.py       2019-11-05 
18:31:07.000000000 +0100
@@ -132,7 +132,7 @@
                 mask |= int(name_to_hint.get(k, 0))
         gdk_hints = Gdk.WindowHints(mask)
         metalog("apply_geometry_hints(%s) geometry=%s, hints=%s", hints, geom, 
gdk_hints)
-        self.set_geometry_hints(None, geom, gdk_hints)
+        self.set_geometry_hints(self.drawing_area, geom, gdk_hints)
 
     def queue_draw_area(self, x, y, width, height):
         window = self.get_window()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/client/mixins/remote_logging.py 
new/xpra-3.0.2/xpra/client/mixins/remote_logging.py
--- old/xpra-3.0.1/xpra/client/mixins/remote_logging.py 2019-09-24 
15:53:59.000000000 +0200
+++ new/xpra-3.0.2/xpra/client/mixins/remote_logging.py 2019-10-28 
16:04:05.000000000 +0100
@@ -69,7 +69,11 @@
                 return strtobytes(x)
         try:
             dtime = int(1000*(monotonic_time() - self.monotonic_start_time))
-            data = self.compressed_wrapper("text", enc(msg % args), level=1)
+            if args:
+                s = msg % args
+            else:
+                s = msg
+            data = self.compressed_wrapper("text", enc(s), level=1)
             self.send("logging", level, data, dtime)
             exc_info = kwargs.get("exc_info")
             if exc_info is True:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/client/mixins/window_manager.py 
new/xpra-3.0.2/xpra/client/mixins/window_manager.py
--- old/xpra-3.0.1/xpra/client/mixins/window_manager.py 2019-09-30 
06:28:40.000000000 +0200
+++ new/xpra-3.0.2/xpra/client/mixins/window_manager.py 2019-10-28 
16:04:05.000000000 +0100
@@ -742,7 +742,7 @@
         #if possible, choosing the currently focused window (if there is one..)
         pid = metadata.intget("pid", 0)
         watcher_pid = self.assign_signal_watcher_pid(wid, pid)
-        if override_redirect and pid>0 and metadata.intget("transient-for", 
0)>0 is None and metadata.get("role")=="popup":
+        if override_redirect and pid>0 and metadata.intget("transient-for", 
0)>0 and metadata.strget("role")=="popup":
             tfor = None
             for twid, twin in self._id_to_window.items():
                 if not twin._override_redirect and 
twin._metadata.intget("pid", -1)==pid:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/codecs/cuda_common/cuda_context.py 
new/xpra-3.0.2/xpra/codecs/cuda_common/cuda_context.py
--- old/xpra-3.0.1/xpra/codecs/cuda_common/cuda_context.py      2019-09-24 
15:53:59.000000000 +0200
+++ new/xpra-3.0.2/xpra/codecs/cuda_common/cuda_context.py      2019-11-05 
18:31:07.000000000 +0100
@@ -307,7 +307,7 @@
             l = log
             if len(devices)>1:
                 l = log.info
-            l("selected device %s: %s", device_id, device_info(device))
+            l("selected device %s: %s", selected_device_id, 
device_info(selected_device))
             return selected_device_id, selected_device
     return -1, None
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/net/ssh.py 
new/xpra-3.0.2/xpra/net/ssh.py
--- old/xpra-3.0.1/xpra/net/ssh.py      2019-10-20 14:13:42.000000000 +0200
+++ new/xpra-3.0.2/xpra/net/ssh.py      2019-11-05 18:31:07.000000000 +0100
@@ -260,6 +260,10 @@
                 host = host_config.get("hostname", host)
                 username = host_config.get("username", username)
                 port = host_config.get("port", port)
+                try:
+                    port = int(port)
+                except ValueError:
+                    raise InitException("invalid port specified: '%s'" % port)
                 proxycommand = host_config.get("proxycommand")
                 keyfiles = host_config.get("identityfile")
                 if proxycommand:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/platform/win32/clipboard.py 
new/xpra-3.0.2/xpra/platform/win32/clipboard.py
--- old/xpra-3.0.1/xpra/platform/win32/clipboard.py     2019-09-27 
16:50:06.000000000 +0200
+++ new/xpra-3.0.2/xpra/platform/win32/clipboard.py     2019-10-28 
16:04:05.000000000 +0100
@@ -195,7 +195,7 @@
             return
         def got_text(text):
             log("got_text(%s)", repr_ellipsized(bytestostr(text)))
-            got_contents("text/plain", 8, text)
+            got_contents(target, 8, text)
         def errback(error_text=""):
             log.error("Error: failed to get clipboard data")
             if error_text:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/platform/win32/gl_context.py 
new/xpra-3.0.2/xpra/platform/win32/gl_context.py
--- old/xpra-3.0.1/xpra/platform/win32/gl_context.py    2019-09-24 
15:54:00.000000000 +0200
+++ new/xpra-3.0.2/xpra/platform/win32/gl_context.py    2019-10-30 
04:23:47.000000000 +0100
@@ -139,6 +139,7 @@
         self.hwnd = hwnd
         self.pixel_format_props = {}
         self.hdc = GetDC(hwnd)
+        log("create_wgl_context(%#x) hdc=%#x", hwnd, self.hdc)
         flags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DEPTH_DONTCARE
         if self.alpha:
             flags |= PFD_SUPPORT_COMPOSITION
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/scripts/config.py 
new/xpra-3.0.2/xpra/scripts/config.py
--- old/xpra-3.0.1/xpra/scripts/config.py       2019-09-24 15:54:00.000000000 
+0200
+++ new/xpra-3.0.2/xpra/scripts/config.py       2019-11-05 18:31:07.000000000 
+0100
@@ -223,9 +223,11 @@
             BUILD_DATE, BUILD_TIME, BUILD_BIT,
             CYTHON_VERSION, COMPILER_VERSION,
             )
+        info.insert(0, "")
+        einfo = "Python %i.%i" % sys.version_info[:2]
         if BUILD_BIT:
-            info.insert(0, "")
-            info.insert(0, BUILD_BIT)
+            einfo += ", "+BUILD_BIT
+        info.insert(0, einfo)
         try:
             from xpra.build_info import BUILT_BY, BUILT_ON
             info.append("built on %s by %s" % (BUILT_ON, BUILT_BY))
@@ -1005,7 +1007,7 @@
                     "av-sync"           : True,
                     "exit-ssh"          : True,
                     "dbus-control"      : not WIN32 and not OSX,
-                    "opengl"            : "probe",
+                    "opengl"            : "no" if (WIN32 and not PYTHON2) else 
"probe",
                     "mdns"              : not WIN32,
                     "swap-keys"         : OSX,  #only used on osx
                     "desktop-fullscreen": False,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/scripts/main.py 
new/xpra-3.0.2/xpra/scripts/main.py
--- old/xpra-3.0.1/xpra/scripts/main.py 2019-10-22 14:15:47.000000000 +0200
+++ new/xpra-3.0.2/xpra/scripts/main.py 2019-11-05 18:31:07.000000000 +0100
@@ -18,7 +18,7 @@
 import traceback
 
 from xpra.platform.dotxpra import DotXpra
-from xpra.util import csv, envbool, envint, repr_ellipsized, nonl, pver, 
DEFAULT_PORT, DEFAULT_PORTS
+from xpra.util import csv, envbool, envint, unsetenv, repr_ellipsized, nonl, 
pver, DEFAULT_PORT, DEFAULT_PORTS
 from xpra.exit_codes import EXIT_SSL_FAILURE, EXIT_STR, EXIT_UNSUPPORTED
 from xpra.os_util import (
     get_util_logger, getuid, getgid,
@@ -83,6 +83,9 @@
     if "XPRA_ALT_PYTHON_RETRY" in os.environ:
         del os.environ["XPRA_ALT_PYTHON_RETRY"]
 
+    #some environment variables cause us problems if set:
+    unsetenv("GDK_SCALE")
+
     if envbool("XPRA_NOMD5", False):
         import hashlib
         def nomd5(*_args):
@@ -149,7 +152,8 @@
     if mode in (
         "showconfig", "info", "id", "attach", "listen", "launcher", "stop", 
"print",
         "control", "list", "list-mdns", "sessions", "mdns-gui", "bug-report",
-        "opengl", "opengl-probe", "test-connect",
+        "opengl", "opengl-probe", "opengl-test",
+        "test-connect",
         "encoding", "webcam", "clipboard-test",
         "keyboard", "keyboard-test", "keymap", "gui-info", "network-info", 
"path-info",
         "printing-info", "version-info", "gtk-info",
@@ -478,6 +482,8 @@
             return run_glcheck(options)
         elif mode=="opengl-probe":
             return run_glprobe(options)
+        elif mode=="opengl-test":
+            return run_glprobe(options, True)
         elif mode=="encoding":
             from xpra.codecs import loader
             return loader.main()
@@ -2002,18 +2008,19 @@
     raise Exception("the gtk module is already loaded: %s" % gtk)
 
 
-def run_glprobe(opts):
-    props = do_run_glcheck(opts)
+def run_glprobe(opts, show=False):
+    props = do_run_glcheck(opts, show)
     if not props.get("success", False):
         return 3
     if not props.get("safe", False):
         return 2
     return 0
 
-def do_run_glcheck(opts):
+def do_run_glcheck(opts, show=False):
     #suspend all logging:
     saved_level = None
     log = Logger("opengl")
+    log("do_run_glcheck(.., %s)" % show)
     if not is_debug_enabled("opengl") or not use_tty():
         saved_level = logging.root.getEffectiveLevel()
         logging.root.setLevel(logging.WARN)
@@ -2028,19 +2035,19 @@
         backends = get_opengl_backends(opengl_str)
         log("run_glprobe() backends=%s", backends)
         opengl_props, gl_client_window_module = 
get_gl_client_window_module(backends, force_enable)
-        log("run_glprobe() opengl_props=%s, gl_client_window_module=%s", 
opengl_props, gl_client_window_module)
+        log("do_run_glcheck() opengl_props=%s, gl_client_window_module=%s", 
opengl_props, gl_client_window_module)
         if gl_client_window_module and (opengl_props.get("safe", False) or 
force_enable):
             gl_client_window_class = gl_client_window_module.GLClientWindow
             pixel_depth = int(opts.pixel_depth)
-            log("run_glprobe() gl_client_window_class=%s, pixel_depth=%s", 
gl_client_window_class, pixel_depth)
+            log("do_run_glcheck() gl_client_window_class=%s, pixel_depth=%s", 
gl_client_window_class, pixel_depth)
             if pixel_depth not in (0, 16, 24, 30) and pixel_depth<32:
                 pixel_depth = 0
-            draw_result = test_gl_client_window(gl_client_window_class, 
pixel_depth=pixel_depth)
+            draw_result = test_gl_client_window(gl_client_window_class, 
pixel_depth=pixel_depth, show=show)
             opengl_props.update(draw_result)
         return opengl_props
     except Exception as e:
         if is_debug_enabled("opengl"):
-            log("run_glprobe(..)", exc_info=True)
+            log("do_run_glcheck(..)", exc_info=True)
         if use_tty():
             sys.stderr.write("error:\n")
             sys.stderr.write("%s\n" % e)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/scripts/server.py 
new/xpra-3.0.2/xpra/scripts/server.py
--- old/xpra-3.0.1/xpra/scripts/server.py       2019-09-24 15:54:00.000000000 
+0200
+++ new/xpra-3.0.2/xpra/scripts/server.py       2019-10-28 16:04:05.000000000 
+0100
@@ -23,7 +23,7 @@
     get_username_for_uid, get_home_for_uid, get_shell_for_uid, getuid, 
setuidgid,
     get_hex_uuid, get_status_output, strtobytes, bytestostr, get_util_logger, 
osexpand,
     )
-from xpra.util import envbool
+from xpra.util import envbool, unsetenv
 from xpra.platform.dotxpra import DotXpra
 
 
@@ -148,12 +148,6 @@
 
 
 def sanitize_env():
-    def unsetenv(*varnames):
-        for x in varnames:
-            try:
-                del os.environ[x]
-            except KeyError:
-                pass
     #we don't want client apps to think these mean anything:
     #(if set, they belong to the desktop the server was started from)
     #TODO: simply whitelisting the env would be safer/better
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/server/window/window_source.py 
new/xpra-3.0.2/xpra/server/window/window_source.py
--- old/xpra-3.0.1/xpra/server/window/window_source.py  2019-10-20 
14:13:42.000000000 +0200
+++ new/xpra-3.0.2/xpra/server/window/window_source.py  2019-10-28 
16:04:05.000000000 +0100
@@ -669,6 +669,8 @@
         for k in ("workspace", "screen"):
             if k in properties:
                 del properties[k]
+            elif strtobytes(k) in properties:
+                del properties[strtobytes(k)]
         if properties:
             self.do_set_client_properties(properties)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/server/window/window_video_source.py 
new/xpra-3.0.2/xpra/server/window/window_video_source.py
--- old/xpra-3.0.1/xpra/server/window/window_video_source.py    2019-09-24 
15:54:01.000000000 +0200
+++ new/xpra-3.0.2/xpra/server/window/window_video_source.py    2019-10-28 
16:04:05.000000000 +0100
@@ -911,7 +911,9 @@
         if FORCE_AV_DELAY>0:
             return FORCE_AV_DELAY
         if options.get("av-sync", False):
-            return -1
+            return 0
+        if self.content_type in ("text", "picture"):
+            return 0
         l = len(self.encode_queue)
         if l>=self.encode_queue_max_size:
             #we must free some space!
@@ -920,6 +922,7 @@
 
     def cancel_encode_from_queue(self):
         #free all items in the encode queue:
+        self.encode_from_queue_due = 0
         eqt = self.encode_from_queue_timer
         avsynclog("cancel_encode_from_queue() timer=%s for wid=%i", eqt, 
self.wid)
         if eqt:
@@ -942,10 +945,10 @@
         #must be called from the UI thread for synchronization
         #we ensure that the timer will fire no later than av_delay
         #re-scheduling it if it was due later than that
-        due = monotonic_time()+av_delay
+        due = monotonic_time()+av_delay/1000.0
         if self.encode_from_queue_due==0 or due<self.encode_from_queue_due:
-            self.encode_from_queue_due = due
             self.cancel_encode_from_queue()
+            self.encode_from_queue_due = due
             self.encode_from_queue_timer = self.timeout_add(av_delay, 
self.timer_encode_from_queue)
 
     def timer_encode_from_queue(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/src_info.py 
new/xpra-3.0.2/xpra/src_info.py
--- old/xpra-3.0.1/xpra/src_info.py     2019-10-22 21:39:21.000000000 +0200
+++ new/xpra-3.0.2/xpra/src_info.py     2019-11-05 18:31:10.000000000 +0100
@@ -1,2 +1,2 @@
 LOCAL_MODIFICATIONS=0
-REVISION=24241
+REVISION=24387
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/util.py new/xpra-3.0.2/xpra/util.py
--- old/xpra-3.0.1/xpra/util.py 2019-10-20 14:13:42.000000000 +0200
+++ new/xpra-3.0.2/xpra/util.py 2019-10-30 04:23:47.000000000 +0100
@@ -875,6 +875,14 @@
     except Exception:
         return str(v)
 
+
+def unsetenv(*varnames):
+    for x in varnames:
+        try:
+            del os.environ[x]
+        except KeyError:
+            pass
+
 def envint(name, d=0):
     try:
         return int(os.environ.get(name, d))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/x11/bindings/core_bindings.pyx 
new/xpra-3.0.2/xpra/x11/bindings/core_bindings.pyx
--- old/xpra-3.0.1/xpra/x11/bindings/core_bindings.pyx  2019-10-20 
14:13:42.000000000 +0200
+++ new/xpra-3.0.2/xpra/x11/bindings/core_bindings.pyx  2019-10-28 
16:04:05.000000000 +0100
@@ -13,7 +13,7 @@
 from libc.stdint cimport uintptr_t
 
 from xpra.util import dump_exc, envbool
-from xpra.os_util import strtobytes, is_X11, PYTHON2
+from xpra.os_util import strtobytes, is_X11, PYTHON2, bytestostr
 from xpra.log import Logger
 log = Logger("x11", "bindings", "core")
 
@@ -149,7 +149,7 @@
             return code
         cdef char[128] buffer
         XGetErrorText(self.display, code, buffer, 128)
-        return str(buffer[:128]).split("\0")[0]
+        return bytestostr(bytes(buffer[:128]).split(b"\0")[0])
 
     def UngrabKeyboard(self, time=CurrentTime):
         assert self.display!=NULL, "display is closed"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xpra-3.0.1/xpra/x11/gtk_x11/clipboard.py 
new/xpra-3.0.2/xpra/x11/gtk_x11/clipboard.py
--- old/xpra-3.0.1/xpra/x11/gtk_x11/clipboard.py        2019-10-22 
14:15:47.000000000 +0200
+++ new/xpra-3.0.2/xpra/x11/gtk_x11/clipboard.py        2019-10-28 
16:04:05.000000000 +0100
@@ -412,7 +412,7 @@
         with xsync:
             xid = get_xwindow(requestor)
             if data is not None:
-                X11Window.XChangeProperty(xid, prop, target, dformat, data)
+                X11Window.XChangeProperty(xid, prop, dtype, dformat, data)
             else:
                 #maybe even delete the property?
                 #X11Window.XDeleteProperty(xid, prop)



Reply via email to