Hello community, here is the log from the commit of package xpra for openSUSE:Factory checked in at 2019-04-28 20:14:19 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/xpra (Old) and /work/SRC/openSUSE:Factory/.xpra.new.5536 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "xpra" Sun Apr 28 20:14:19 2019 rev:5 rq:698572 version:2.5.1 Changes: -------- --- /work/SRC/openSUSE:Factory/xpra/xpra.changes 2019-04-04 15:26:55.638886974 +0200 +++ /work/SRC/openSUSE:Factory/.xpra.new.5536/xpra.changes 2019-04-28 20:14:20.806385167 +0200 @@ -1,0 +2,45 @@ +Fri Apr 26 22:18:38 UTC 2019 - Luigi Baldoni <aloisio@gmx.com> + +- Update to version 2.5.1 + * fix sending of icons as premultipled ARGB + * fix compatibility with old versions of python-pillow + * fix scroll encoding code flow (should be impossible to hit) + * fix handling of info requests with Python3 servers + * fix missing option for lock argument in man page + * fix ssh errors handling authentication failures + * fix ssh server connections and support 'none' authentication + * fix start new command menu + * fix appindicator failures when we fail to locate the default + icon + * fix command line tools usage under cygwin and terminal + emulators + * fix pointer position on multi-monitor shadow servers + * fix system tray forwarding with python3 servers + * fix window icons forwarding (MS Windows and MacOS mostly) + * fix detection of splash window types + * fix server startup errors when X11 root properties are + invalid + * fix shadow server startup failures on MacOS + * fix system tray errors during shadow server startup on MacOS + * fix printing errors with python3 builds and rencode packet + encoder + * fix parsing of printer options + * fix dispatching of printer jobs to clients with python3 + servers + * fix parsing of key symbol definitions with python3 servers + * fix compatibility with older versions of GTK3 + * fix proxy video encoders initialization + * fix 'missing encodings' server error with python3 + * fix spurious clipboard warning when clipboard is disabled + * disable modal windows by default (was enabled by default + since v2.3) + * workaround buggy system trays + * try harder to prevent hash collisions in scroll encoding + * skip risky opengl probing when the initial check failed + * prevent file conflicts with older packages + * don't use appindicator with Fedora Gnome + * minor packaging fixes (dates) + * remove spurious ssh dnssec check logging + * bump version in cups backend + +------------------------------------------------------------------- Old: ---- xpra-2.5.tar.xz New: ---- xpra-2.5.1.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xpra.spec ++++++ --- /var/tmp/diff_new_pack.DIDoOt/_old 2019-04-28 20:14:21.430384780 +0200 +++ /var/tmp/diff_new_pack.DIDoOt/_new 2019-04-28 20:14:21.434384778 +0200 @@ -23,7 +23,7 @@ %endif %global __requires_exclude ^typelib\(GtkosxApplication\)|typelib\(GdkGLExt\)|typelib\(GtkGLExt\).*$ Name: xpra -Version: 2.5 +Version: 2.5.1 Release: 0 Summary: Remote display server for applications and desktops License: GPL-2.0-or-later AND BSD-3-Clause AND LGPL-3.0-or-later AND MIT ++++++ xpra-2.5.tar.xz -> xpra-2.5.1.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/NEWS new/xpra-2.5.1/NEWS --- old/xpra-2.5/NEWS 2019-03-20 05:43:43.000000000 +0100 +++ new/xpra-2.5.1/NEWS 2019-04-16 06:57:10.000000000 +0200 @@ -1,3 +1,43 @@ +v2.5.1 (2019-04-15) +====================== + -- fix sending of icons as premultipled ARGB + -- fix compatibility with old versions of python-pillow + -- fix scroll encoding code flow (should be impossible to hit) + -- fix handling of info requests with Python3 servers + -- fix missing option for lock argument in man page + -- fix ssh errors handling authentication failures + -- fix ssh server connections and support 'none' authentication + -- fix start new command menu + -- fix appindicator failures when we fail to locate the default icon + -- fix command line tools usage under cygwin and terminal emulators + -- fix pointer position on multi-monitor shadow servers + -- fix system tray forwarding with python3 servers + -- fix window icons forwarding (MS Windows and MacOS mostly) + -- fix detection of splash window types + -- fix server startup errors when X11 root properties are invalid + -- fix shadow server startup failures on MacOS + -- fix system tray errors during shadow server startup on MacOS + -- fix printing errors with python3 builds and rencode packet encoder + -- fix parsing of printer options + -- fix dispatching of printer jobs to clients with python3 servers + -- fix parsing of key symbol definitions with python3 servers + -- fix compatibility with older versions of GTK3 + -- fix proxy video encoders initialization + -- fix 'missing encodings' server error with python3 + -- fix spurious clipboard warning when clipboard is disabled + -- disable modal windows by default (was enabled by default since v2.3) + -- workaround buggy system trays + -- try harder to prevent hash collisions in scroll encoding + -- skip risky opengl probing when the initial check failed + -- prevent file conflicts with older packages + -- don't use appindicator with Fedora Gnome + -- minor packaging fixes (dates) + -- remove spurious ssh dnssec check logging + -- bump version in cups backend + -- DEB package still recommends the python2 builds + -- don't bundle openssh on MS Windows + + v2.5 (2019-03-19) ====================== -- Python 3 port mostly complete, including packaging for Debian diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/cups/xpraforwarder new/xpra-2.5.1/cups/xpraforwarder --- old/xpra-2.5/cups/xpraforwarder 2019-03-20 05:43:43.000000000 +0100 +++ new/xpra-2.5.1/cups/xpraforwarder 2019-04-10 04:48:02.000000000 +0200 @@ -42,7 +42,7 @@ from urllib.parse import urlparse, parse_qs -__version__ = "2.3" +__version__ = "2.5" #Writes a syslog entry (msg) at the default facility: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/html5/js/Utilities.js new/xpra-2.5.1/html5/js/Utilities.js --- old/xpra-2.5/html5/js/Utilities.js 2019-03-20 05:43:44.000000000 +0100 +++ new/xpra-2.5.1/html5/js/Utilities.js 2019-04-01 16:58:59.000000000 +0200 @@ -10,7 +10,7 @@ 'use strict'; var Utilities = { - VERSION : "2.5", + VERSION : "2.5.1", exc : function() { console.error.apply(console, arguments); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/man/xpra.1 new/xpra-2.5.1/man/xpra.1 --- old/xpra-2.5/man/xpra.1 2019-03-20 05:43:45.000000000 +0100 +++ new/xpra-2.5.1/man/xpra.1 2019-03-28 13:13:12.000000000 +0100 @@ -1276,7 +1276,7 @@ to decide if they are willing to share the session. When used client-side, the default value \fIauto\fP evaluates to \fIno\fP. .TP -\fB--lock\fP=\fIyes\fP|\fIno\fP|\fIno\fP +\fB--lock\fP=\fIyes\fP|\fIno\fP|\fIauto\fP Locking allows a client to refuse to hand over the session to a new client. The session may still be shared with multiple clients (see the \fIsharing\fP option), but otherwise the server will reject new clients. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/svn-info new/xpra-2.5.1/svn-info --- old/xpra-2.5/svn-info 2019-03-20 05:44:42.000000000 +0100 +++ new/xpra-2.5.1/svn-info 2019-04-16 06:57:14.000000000 +0200 @@ -1,13 +1,13 @@ Path: . -Working Copy Root Path: /opt/Downloads/Xpra -URL: svn+ssh://xpra.org/var/svn/repos/Xpra/tags/v2.5.x/src +Working Copy Root Path: /home/antoine/workspace-shifter/Xpra +URL: file:///var/svn/repos/Xpra/tags/v2.5.x/src Relative URL: ^/tags/v2.5.x/src -Repository Root: svn+ssh://xpra.org/var/svn/repos/Xpra +Repository Root: file:///var/svn/repos/Xpra Repository UUID: 3bb7dfac-3a0b-4e04-842a-767bc560f471 -Revision: 22144 +Revision: 22432 Node Kind: directory Schedule: normal Last Changed Author: antoine -Last Changed Rev: 22134 -Last Changed Date: 2019-03-19 22:04:52 +0700 (Tue, 19 Mar 2019) +Last Changed Rev: 22432 +Last Changed Date: 2019-04-16 05:13:59 +0100 (Tue, 16 Apr 2019) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/svn-version new/xpra-2.5.1/svn-version --- old/xpra-2.5/svn-version 2019-03-20 05:44:42.000000000 +0100 +++ new/xpra-2.5.1/svn-version 2019-04-16 06:57:14.000000000 +0200 @@ -1 +1 @@ -22144 +22432 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/win32/MINGW_BUILD.sh new/xpra-2.5.1/win32/MINGW_BUILD.sh --- old/xpra-2.5/win32/MINGW_BUILD.sh 2019-03-20 05:43:48.000000000 +0100 +++ new/xpra-2.5.1/win32/MINGW_BUILD.sh 2019-04-12 17:27:57.000000000 +0200 @@ -18,7 +18,7 @@ DO_MSI=${DO_MSI:-0} DO_SIGN=${DO_SIGN:-1} BUNDLE_PUTTY=${BUNDLE_PUTTY:-1} -BUNDLE_OPENSSH=${BUNDLE_OPENSSH:-1} +BUNDLE_OPENSSH=${BUNDLE_OPENSSH:-0} BUNDLE_OPENSSL=${BUNDLE_OPENSSL:-1} ZIP_MODULES=${ZIP_MODULES:-1} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/win32/xpra.iss new/xpra-2.5.1/win32/xpra.iss --- old/xpra-2.5/win32/xpra.iss 2019-03-20 05:43:49.000000000 +0100 +++ new/xpra-2.5.1/win32/xpra.iss 2019-04-16 06:57:10.000000000 +0200 @@ -1,22 +1,22 @@ [Setup] AppName=Xpra AppId=Xpra_is1 -AppVersion=2.5 -AppVerName=Xpra 2.5 -UninstallDisplayName=Xpra 2.5 +AppVersion=2.5.1 +AppVerName=Xpra 2.5.1 +UninstallDisplayName=Xpra 2.5.1 AppPublisher=xpra.org -AppPublisherURL=http://xpra.org/ +AppPublisherURL=http:;xpra.org/ DefaultDirName={pf}\Xpra DefaultGroupName=Xpra DisableProgramGroupPage=true OutputDir=dist OutputBaseFilename=Xpra_Setup -//Compression=none -//Compression=lzma2/fast +;Compression=none +;Compression=lzma2/fast Compression=lzma2/max SolidCompression=yes AllowUNCPath=false -VersionInfoVersion=2.5 +VersionInfoVersion=2.5.1 VersionInfoCompany=xpra.org VersionInfoDescription=multi-platform screen and application forwarding system WizardImageFile=win32\xpra-logo.bmp @@ -121,7 +121,7 @@ begin nMsgBoxResult := MsgBox('Xpra is already running, you must stop it to proceed.', mbInformation, MB_RETRYCANCEL); end; - // if Cancel is pressed + //if Cancel is pressed if nMsgBoxResult = IDCANCEL then begin Result := False; @@ -137,7 +137,7 @@ begin nMsgBoxResult := MsgBox('Xpra is still running, you must stop it to be able to uninstall everything.', mbInformation, MB_RETRYCANCEL); end; - // if Cancel is pressed + //if Cancel is pressed if nMsgBoxResult = IDCANCEL then begin Result := False; @@ -157,7 +157,7 @@ openssl := ExpandConstant('{app}\OpenSSL.exe'); Exec(openssl, args, '', SW_HIDE, ewWaitUntilTerminated, ResultCode); end; - // move old config file: + //move old config file: config := ExpandConstant('{app}\xpra.conf'); saved_config := ExpandConstant('{app}\etc\xpra.conf.bak'); if (FileExists(config)) then @@ -203,10 +203,10 @@ sUnInstallString: String; iResultCode: Integer; begin -// Return Values: -// 1 - uninstall string is empty -// 2 - error executing the UnInstallString -// 3 - successfully executed the UnInstallString + // Return Values: + // 1 - uninstall string is empty + // 2 - error executing the UnInstallString + // 3 - successfully executed the UnInstallString // default return value Result := 0; @@ -232,4 +232,4 @@ UnInstallOldVersion(); end; end; -end; \ No newline at end of file +end; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/__init__.py new/xpra-2.5.1/xpra/__init__.py --- old/xpra-2.5/xpra/__init__.py 2019-03-20 05:44:42.000000000 +0100 +++ new/xpra-2.5.1/xpra/__init__.py 2019-04-16 06:57:17.000000000 +0200 @@ -4,4 +4,4 @@ # Xpra is released under the terms of the GNU GPL v2, or, at your option, any # later version. See the file COPYING for details. -__version__ = "2.5" +__version__ = "2.5.1" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/client/client_tray.py new/xpra-2.5.1/xpra/client/client_tray.py --- old/xpra-2.5/xpra/client/client_tray.py 2019-03-20 05:43:49.000000000 +0100 +++ new/xpra-2.5.1/xpra/client/client_tray.py 2019-04-10 04:48:03.000000000 +0200 @@ -37,6 +37,8 @@ self._backing = None self.new_backing(w, h) self.idle_add(self.reconfigure) + #things may have settled by now + self.timeout_add(1000, self.send_configure) def set_alpha(self): #nothing to do, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/client/gtk_base/gtk_client_base.py new/xpra-2.5.1/xpra/client/gtk_base/gtk_client_base.py --- old/xpra-2.5/xpra/client/gtk_base/gtk_client_base.py 2019-03-20 05:43:49.000000000 +0100 +++ new/xpra-2.5.1/xpra/client/gtk_base/gtk_client_base.py 2019-03-28 13:13:12.000000000 +0100 @@ -968,8 +968,10 @@ parts = enable_opengl.split(":", 1) enable_option = parts[0] #ie: "on" opengllog("init_opengl: enable_option=%s", enable_option) - if enable_option=="probe-failed": - msg = "probe failed: %s" % csv(parts[1:]) + if enable_option in ("probe-failed", "probe-error"): + msg = enable_option.replace("-", " ") + if len(parts)>1: + msg += ": %s" % csv(parts[1:]) self.opengl_props["info"] = "disabled, %s" % msg self.opengl_setup_failure(body=msg) return diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/client/gtk_base/gtk_client_window_base.py new/xpra-2.5.1/xpra/client/gtk_base/gtk_client_window_base.py --- old/xpra-2.5/xpra/client/gtk_base/gtk_client_window_base.py 2019-03-20 05:43:49.000000000 +0100 +++ new/xpra-2.5.1/xpra/client/gtk_base/gtk_client_window_base.py 2019-04-10 04:48:03.000000000 +0200 @@ -138,7 +138,7 @@ #"DIALOG", #"MENU", #"TOOLBAR", - #"SPLASHSCREEN", + #"SPLASH", #"UTILITY", #"DOCK", #"DESKTOP", @@ -154,6 +154,7 @@ #"DIALOG", "MENU", #"TOOLBAR", + "SPLASH", "SPLASHSCREEN", "UTILITY", "DOCK", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/client/gtk_base/start_new_command.py new/xpra-2.5.1/xpra/client/gtk_base/start_new_command.py --- old/xpra-2.5/xpra/client/gtk_base/start_new_command.py 2019-03-20 05:43:49.000000000 +0100 +++ new/xpra-2.5.1/xpra/client/gtk_base/start_new_command.py 2019-04-10 04:48:03.000000000 +0200 @@ -122,7 +122,7 @@ def category_changed(self, *args): category = self.category_combo.get_active_text().encode("utf-8") log("category_changed(%s) category=%s", args, category) - entries = self.xdg_menu.get(category) + entries = self.xdg_menu.get(category, {}).get("Entries", {}) self.command_combo.get_model().clear() for name in entries.keys(): self.command_combo.append_text(name.decode("utf-8")) @@ -174,7 +174,7 @@ if self.xdg_menu: category = self.category_combo.get_active_text() log("category=%s", category) - entries = self.xdg_menu.get(category.encode("utf-8")) + entries = self.xdg_menu.get(category.encode("utf-8"), {}).get("Entries", {}) if entries: command_name = self.command_combo.get_active_text() command_props = entries.get(command_name.encode("utf-8")) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/codecs/argb/argb.pyx new/xpra-2.5.1/xpra/codecs/argb/argb.pyx --- old/xpra-2.5/xpra/codecs/argb/argb.pyx 2019-03-20 05:43:49.000000000 +0100 +++ new/xpra-2.5.1/xpra/codecs/argb/argb.pyx 2019-04-10 04:48:03.000000000 +0200 @@ -293,7 +293,7 @@ cdef unsigned int argb #@DuplicateSignature assert argb_len>0 and argb_len % 4 == 0, "invalid buffer size: %s is not a multiple of 4" % argb_len cdef MemBuf output_buf = getbuf(argb_len) - cdef unsigned char* argb_out = <unsigned char*> output_buf.get_mem() + cdef unsigned int* argb_out = <unsigned int*> output_buf.get_mem() cdef int i #@DuplicateSignature for 0 <= i < argb_len / 4: argb = buf[i] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/codecs/pillow/__init__.py new/xpra-2.5.1/xpra/codecs/pillow/__init__.py --- old/xpra-2.5/xpra/codecs/pillow/__init__.py 2019-03-20 05:43:50.000000000 +0100 +++ new/xpra-2.5.1/xpra/codecs/pillow/__init__.py 2019-03-20 14:37:17.000000000 +0100 @@ -26,7 +26,10 @@ import PIL #@UnresolvedImport from PIL import Image #@UnresolvedImport assert PIL is not None and Image is not None -PIL_VERSION = PIL.__version__ +try: + PIL_VERSION = PIL.__version__ +except AttributeError: + PIL_VERSION = PIL.PILLOW_VERSION if hasattr(Image, "DEBUG"): #for older versions (pre 3.0), use Image.DEBUG flag: Image.DEBUG = int(PIL_DEBUG) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/gtk_common/gtk_util.py new/xpra-2.5.1/xpra/gtk_common/gtk_util.py --- old/xpra-2.5/xpra/gtk_common/gtk_util.py 2019-03-20 05:43:50.000000000 +0100 +++ new/xpra-2.5.1/xpra/gtk_common/gtk_util.py 2019-04-12 17:27:57.000000000 +0200 @@ -108,6 +108,11 @@ def is_realized(widget): return widget.get_realized() + def x11_foreign_new(xid): + from gi.repository import GdkX11 + display = display_get_default() + return GdkX11.X11Window.foreign_new_for_display(display, xid) + def GDKWindow(parent=None, width=1, height=1, window_type=gdk.WindowType.TOPLEVEL, event_mask=0, wclass=gdk.WindowWindowClass.INPUT_OUTPUT, title=None, x=None, y=None, override_redirect=False, visual=None, **kwargs): @@ -365,12 +370,9 @@ widget.drag_get_data(context, atom, time) from gi.repository.Gtk import Clipboard #@UnresolvedImport - CLIPBOARD_SELECTION = {} - #gtk2: uses strings: - for x in ("PRIMARY", "SECONDARY", "CLIPBOARD"): - CLIPBOARD_SELECTION[x] = getattr(gdk, "SELECTION_%s" % bytestostr(x)) def GetClipboard(selection): - atom = CLIPBOARD_SELECTION.get(selection) or gdk.Atom.intern(bytestostr(selection), False) + sstr = bytestostr(selection) + atom = getattr(gdk, "SELECTION_%s" % sstr, None) or gdk.Atom.intern(sstr, False) return Clipboard.get(atom) def clipboard_request_contents(clipboard, target, unpack): target_atom = gdk.Atom.intern(bytestostr(target), False) @@ -450,6 +452,9 @@ def get_pixbuf_from_data(rgb_data, has_alpha, w, h, rowstride): return gdk.pixbuf_new_from_data(rgb_data, gdk.COLORSPACE_RGB, has_alpha, 8, w, h, rowstride) + def x11_foreign_new(xid): + return gdk.window_foreign_new_for_display(xid) + def GDKWindow(parent=None, width=1, height=1, window_type=gdk.WINDOW_TOPLEVEL, event_mask=0, wclass=gdk.INPUT_OUTPUT, title=None, x=-1, y=-1, **kwargs): return gdk.Window(parent, width, height, window_type, event_mask, wclass, title, x, y, **kwargs) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/net/file_transfer.py new/xpra-2.5.1/xpra/net/file_transfer.py --- old/xpra-2.5/xpra/net/file_transfer.py 2019-03-20 05:43:50.000000000 +0100 +++ new/xpra-2.5.1/xpra/net/file_transfer.py 2019-04-10 04:48:03.000000000 +0200 @@ -437,7 +437,7 @@ delfile() return try: - job_options = options.get("options") + job_options = options.dictget("options") job_options["copies"] = copies job = print_files(printer, [filename], title, job_options) except Exception as e: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/net/ssh.py new/xpra-2.5.1/xpra/net/ssh.py --- old/xpra-2.5/xpra/net/ssh.py 2019-03-20 05:43:51.000000000 +0100 +++ new/xpra-2.5.1/xpra/net/ssh.py 2019-04-10 04:48:03.000000000 +0200 @@ -371,7 +371,7 @@ log("verifyhostkeydns failed", exc_info=True) log.warn("Warning: cannot check SSHFP DNS records") log.warn(" %s", e) - log.info("dnscheck=%s", dnscheck) + log("dnscheck=%s", dnscheck) def adddnscheckinfo(q): if dnscheck is not True: if dnscheck: @@ -522,7 +522,7 @@ except SSHException as e: log("auth_password(..)", exc_info=True) log.info("SSH password authentication failed:") - log.info(" %s", e.message) + log.info(" %s", getattr(e, "message", e)) def auth_interactive(): log("trying interactive authentication") @@ -544,7 +544,7 @@ except SSHException as e: log("auth_interactive(..)", exc_info=True) log.info("SSH password authentication failed:") - log.info(" %s", e.message) + log.info(" %s", getattr(e, "message", e)) banner = transport.get_banner() if banner: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/platform/pycups_printing.py new/xpra-2.5.1/xpra/platform/pycups_printing.py --- old/xpra-2.5/xpra/platform/pycups_printing.py 2019-03-20 05:43:51.000000000 +0100 +++ new/xpra-2.5.1/xpra/platform/pycups_printing.py 2019-04-10 04:48:03.000000000 +0200 @@ -13,7 +13,7 @@ from threading import Lock import cups -from xpra.os_util import OSX, PYTHON3 +from xpra.os_util import OSX, PYTHON3, bytestostr from xpra.util import engs, envint, envbool, parse_simple_dict from xpra.log import Logger @@ -422,8 +422,9 @@ raise Exception("invalid printer: '%s'" % printer) log("pycups.print_files%s", (printer, filenames, title, options)) actual_options = DEFAULT_CUPS_OPTIONS.copy() - used_options = dict((str(k),str(v)) for k,v in options.items() if str(k) in CUPS_OPTIONS_WHITELIST) - unused_options = dict((str(k),str(v)) for k,v in options.items() if str(k) not in CUPS_OPTIONS_WHITELIST) + s = bytestostr + used_options = dict((s(k),s(v)) for k,v in options.items() if s(k) in CUPS_OPTIONS_WHITELIST) + unused_options = dict((s(k),s(v)) for k,v in options.items() if s(k) not in CUPS_OPTIONS_WHITELIST) log("used options=%s", used_options) log("unused options=%s", unused_options) actual_options.update(used_options) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/platform/win32/__init__.py new/xpra-2.5.1/xpra/platform/win32/__init__.py --- old/xpra-2.5/xpra/platform/win32/__init__.py 2019-03-20 05:43:51.000000000 +0100 +++ new/xpra-2.5.1/xpra/platform/win32/__init__.py 2019-04-10 04:48:03.000000000 +0200 @@ -262,8 +262,9 @@ #(which usually does not popup a new shell window) _wait_for_input = False return - if os.environ.get("MSYSCON") or os.environ.get("CYGWIN"): - #msys environment doesn't popup a new shell window + if os.environ.get("TERM", "")=="xterm": + #msys, cygwin and git bash environments don't popup a new shell window + #and they all set TERM=xterm _wait_for_input = False return try: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/platform/xposix/appindicator_tray.py new/xpra-2.5.1/xpra/platform/xposix/appindicator_tray.py --- old/xpra-2.5/xpra/platform/xposix/appindicator_tray.py 2019-03-20 05:43:51.000000000 +0100 +++ new/xpra-2.5.1/xpra/platform/xposix/appindicator_tray.py 2019-04-10 04:48:03.000000000 +0200 @@ -45,7 +45,7 @@ def __init__(self, *args, **kwargs): TrayBase.__init__(self, *args, **kwargs) - filename = get_icon_filename(self.default_icon_filename) + filename = get_icon_filename(self.default_icon_filename) or "xpra.png" self._has_icon = False self.tmp_filename = None self.tray_widget = Indicator(self.tooltip, filename, APPLICATION_STATUS) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/platform/xposix/gui.py new/xpra-2.5.1/xpra/platform/xposix/gui.py --- old/xpra-2.5/xpra/platform/xposix/gui.py 2019-03-20 05:43:51.000000000 +0100 +++ new/xpra-2.5.1/xpra/platform/xposix/gui.py 2019-04-10 04:48:03.000000000 +0200 @@ -11,7 +11,7 @@ from xpra.os_util import bytestostr, hexstr from xpra.util import iround, envbool, envint, csv from xpra.gtk_common.gtk_util import get_xwindow -from xpra.os_util import is_unity, is_gnome, is_kde, is_X11, is_Wayland +from xpra.os_util import is_unity, is_gnome, is_kde, is_Fedora, is_X11, is_Wayland from xpra.log import Logger log = Logger("posix") @@ -37,7 +37,7 @@ GTK_MENUS = envbool("XPRA_GTK_MENUS", False) RANDR_DPI = envbool("XPRA_RANDR_DPI", True) XSETTINGS_DPI = envbool("XPRA_XSETTINGS_DPI", True) -USE_NATIVE_TRAY = envbool("XPRA_USE_NATIVE_TRAY", is_unity() or is_gnome() or is_kde()) +USE_NATIVE_TRAY = envbool("XPRA_USE_NATIVE_TRAY", is_unity() or (is_gnome() and not is_Fedora()) or is_kde()) XINPUT_WHEEL_DIV = envint("XPRA_XINPUT_WHEEL_DIV", 15) DBUS_SCREENSAVER = envbool("XPRA_DBUS_SCREENSAVER", False) @@ -49,14 +49,7 @@ def get_native_system_tray_classes(): - c = [] - if USE_NATIVE_TRAY: - try: - from xpra.platform.xposix.appindicator_tray import AppindicatorTray - c.append(AppindicatorTray) - except (ImportError, ValueError): - traylog("cannot load appindicator tray: %s", exc_info=True) - return c + return [] def get_wm_name(): wm_name = os.environ.get("XDG_CURRENT_DESKTOP", "") @@ -78,14 +71,21 @@ def get_native_tray_classes(): #could restrict to only DEs that have a broken system tray like "GNOME Shell"? + c = [] + if USE_NATIVE_TRAY: + try: + from xpra.platform.xposix.appindicator_tray import AppindicatorTray + c.append(AppindicatorTray) + except (ImportError, ValueError): + traylog("cannot load appindicator tray", exc_info=True) if has_gtk_menu_support(): #and wm_name=="GNOME Shell": try: from xpra.platform.xposix.gtkmenu_tray import GTKMenuTray traylog("using GTKMenuTray for '%s' window manager", get_wm_name() or "unknown") - return [GTKMenuTray] + c.append(GTKMenuTray) except Exception as e: traylog("cannot load gtk menu tray: %s", e) - return get_native_system_tray_classes() + return c def get_native_notifier_classes(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/rectangle.pyx new/xpra-2.5.1/xpra/rectangle.pyx --- old/xpra-2.5/xpra/rectangle.pyx 2019-03-20 05:43:51.000000000 +0100 +++ new/xpra-2.5.1/xpra/rectangle.pyx 2019-03-28 13:13:12.000000000 +0100 @@ -33,7 +33,7 @@ self.y = y self.width = w self.height = h - self.hash = (self.x+self.y)<<16 + (self.width + self.height) + self.hash = (self.x&0xffff)<<48+(self.y&0xffff)<<32+(self.width&0xffff)<<16+(self.height&0xffff) def __hash__(self): return self.hash diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/scripts/config.py new/xpra-2.5.1/xpra/scripts/config.py --- old/xpra-2.5/xpra/scripts/config.py 2019-03-20 05:43:51.000000000 +0100 +++ new/xpra-2.5.1/xpra/scripts/config.py 2019-04-16 06:57:10.000000000 +0200 @@ -990,7 +990,7 @@ "desktop-fullscreen": False, "global-menus" : True, "forward-xdg-open" : True, - "modal-windows" : True, + "modal-windows" : False, "bandwidth-detection" : True, "ssh-upgrade" : True, "pulseaudio-configure-commands" : [" ".join(x) for x in DEFAULT_PULSEAUDIO_CONFIGURE_COMMANDS], diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/scripts/main.py new/xpra-2.5.1/xpra/scripts/main.py --- old/xpra-2.5/xpra/scripts/main.py 2019-03-20 05:43:51.000000000 +0100 +++ new/xpra-2.5.1/xpra/scripts/main.py 2019-03-28 13:13:12.000000000 +0100 @@ -1762,7 +1762,7 @@ 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) - if gl_client_window_module and opengl_props.get("safe", False): + 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) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/scripts/server.py new/xpra-2.5.1/xpra/scripts/server.py --- old/xpra-2.5/xpra/scripts/server.py 2019-03-20 05:43:51.000000000 +0100 +++ new/xpra-2.5.1/xpra/scripts/server.py 2019-04-10 04:48:03.000000000 +0200 @@ -70,7 +70,10 @@ def _root_prop_get(prop_name, ptype="u32"): from xpra.gtk_common.gtk_util import get_default_root_window from xpra.x11.gtk_x11.prop import prop_get - return prop_get(get_default_root_window(), prop_name, ptype) + try: + return prop_get(get_default_root_window(), prop_name, ptype) + except Exception: + return None def _save_int(prop_name, pid): _root_prop_set(prop_name, "u32", pid) @@ -1051,19 +1054,20 @@ display = None if not proxying: - no_gtk() - if POSIX and not OSX and (starting or starting_desktop or shadowing): - #check that we can access the X11 display: - from xpra.x11.vfb_util import verify_display_ready - if not verify_display_ready(xvfb, display_name, shadowing): - return 1 - if not PYTHON3: - from xpra.x11.gtk2.gdk_display_util import verify_gdk_display #@UnusedImport - else: - from xpra.x11.gtk3.gdk_display_util import verify_gdk_display #@Reimport - display = verify_gdk_display(display_name) - if not display: - return 1 + if POSIX and not OSX: + no_gtk() + if starting or starting_desktop or shadowing: + #check that we can access the X11 display: + from xpra.x11.vfb_util import verify_display_ready + if not verify_display_ready(xvfb, display_name, shadowing): + return 1 + if not PYTHON3: + from xpra.x11.gtk2.gdk_display_util import verify_gdk_display #@UnusedImport + else: + from xpra.x11.gtk3.gdk_display_util import verify_gdk_display #@Reimport + display = verify_gdk_display(display_name) + if not display: + return 1 #on win32, this ensures that we get the correct screen size to shadow: from xpra.platform.gui import init as gui_init gui_init() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/server/mixins/fileprint_server.py new/xpra-2.5.1/xpra/server/mixins/fileprint_server.py --- old/xpra-2.5/xpra/server/mixins/fileprint_server.py 2019-03-20 05:43:52.000000000 +0100 +++ new/xpra-2.5.1/xpra/server/mixins/fileprint_server.py 2019-04-10 04:48:03.000000000 +0200 @@ -138,7 +138,7 @@ if len(packet)>=4: mimetype = packet[3] if len(packet)>=5: - source_uuid = packet[4] + source_uuid = bytestostr(packet[4]) if len(packet)>=6: title = packet[5] if len(packet)>=7: @@ -152,7 +152,7 @@ printlog.error("Error: invalid mimetype in print packet:") printlog.error(" %s", repr_ellipsized(mimetype)) return - if isinstance(print_options, dict): + if not isinstance(print_options, dict): s = bytestostr(print_options) print_options = {} for x in s.split(" "): @@ -182,7 +182,7 @@ printlog("will try to send to %i clients: %s", len(sources), sources) for ss in sources: if source_uuid not in ("*", ss.uuid): - printlog("not sending to %s (wanted uuid=%s)", ss, source_uuid) + printlog("not sending to %s (uuid=%s, wanted uuid=%s)", ss, ss.uuid, source_uuid) continue if not ss.printing: if source_uuid!='*': @@ -197,7 +197,7 @@ if printer not in ss.printers: printlog.warn("Warning: client %s does not have a '%s' printer", ss.uuid, printer) continue - printlog("'%s' sent to %s for printing on '%s'", title or filename, ss, printer) + printlog("'%s' sent to %s for printing on '%s'", bytestostr(title or filename), ss, printer) if ss.send_file(filename, mimetype, file_data, len(file_data), True, True, options): sent += 1 #warn if not sent: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/server/proxy/proxy_instance_process.py new/xpra-2.5.1/xpra/server/proxy/proxy_instance_process.py --- old/xpra-2.5/xpra/server/proxy/proxy_instance_process.py 2019-03-20 05:43:52.000000000 +0100 +++ new/xpra-2.5.1/xpra/server/proxy/proxy_instance_process.py 2019-04-16 06:57:10.000000000 +0200 @@ -323,7 +323,7 @@ enclog("encoder types found: %s", tuple(encoder_types)) #remove duplicates and use preferred order: - order = PREFERRED_ENCODER_ORDER[:] + order = list(PREFERRED_ENCODER_ORDER) for x in tuple(encoder_types): if x not in order: order.append(x) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/server/server_base.py new/xpra-2.5.1/xpra/server/server_base.py --- old/xpra-2.5/xpra/server/server_base.py 2019-03-20 05:43:52.000000000 +0100 +++ new/xpra-2.5.1/xpra/server/server_base.py 2019-03-28 13:13:12.000000000 +0100 @@ -503,7 +503,7 @@ #if len(packet>=2): # uuid = packet[1] if len(packet)>=4: - categories = packet[3] + categories = tuple(bytestostr(x) for x in packet[3]) def info_callback(_proto, info): assert proto==_proto if categories: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/server/server_core.py new/xpra-2.5.1/xpra/server/server_core.py --- old/xpra-2.5/xpra/server/server_core.py 2019-03-20 05:43:52.000000000 +0100 +++ new/xpra-2.5.1/xpra/server/server_core.py 2019-04-16 06:57:10.000000000 +0200 @@ -963,6 +963,7 @@ def handle_ssh_connection(self, conn): from xpra.server.ssh import make_ssh_server_connection, log as sshlog socktype = conn.socktype_wrapped + none_auth = not self.auth_classes[socktype] sshlog("handle_ssh_connection(%s) socktype wrapped=%s", conn, socktype) def ssh_password_authenticate(username, password): if not POSIX or getuid()!=0: @@ -996,7 +997,7 @@ if not r: return False return True - return make_ssh_server_connection(conn, ssh_password_authenticate) + return make_ssh_server_connection(conn, none_auth=none_auth, password_auth=ssh_password_authenticate) def try_upgrade_to_rfb(self, proto): self.cancel_upgrade_to_rfb_timer(proto) @@ -1530,7 +1531,7 @@ #skip the authentication module we have "passed" already: remaining_authenticators = tuple(x for x in proto.authenticators if not x.passed) - client_expects_challenge = c.get("challenge") is not None + client_expects_challenge = c.strget("challenge") is not None challenge_response = c.strget("challenge_response") client_salt = c.strget("challenge_client_salt") if client_expects_challenge and not remaining_authenticators: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/server/shadow/gtk_shadow_server_base.py new/xpra-2.5.1/xpra/server/shadow/gtk_shadow_server_base.py --- old/xpra-2.5/xpra/server/shadow/gtk_shadow_server_base.py 2019-03-20 05:43:52.000000000 +0100 +++ new/xpra-2.5.1/xpra/server/shadow/gtk_shadow_server_base.py 2019-04-10 04:48:03.000000000 +0200 @@ -155,13 +155,17 @@ return None pointer = super(GTKShadowServerBase, self)._adjust_pointer(proto, wid, opointer) #the window may be at an offset (multi-window for multi-monitor): - wx, wy, ww, wh = window.geometry + wx, wy, ww, wh = window.get_geometry() #or maybe the pointer is off-screen: x, y = pointer[:2] if x<0 or x>=ww or y<0 or y>=wh: self.suspend_cursor(proto) return None self.restore_cursor(proto) + #note: with x11 shadow servers, + # X11ServerCore._get_pointer_abs_coordinates() will recalculate + # the absolute coordinates from the relative ones, + # and it should end up with the same values we calculated here ax = x+wx ay = y+wy return [ax, ay]+list(pointer[2:]) @@ -197,23 +201,24 @@ tw.cleanup() def setup_tray(self): + if OSX: + return try: from xpra.gtk_common.gobject_compat import import_gtk gtk = import_gtk() from xpra.gtk_common.gtk_util import popup_menu_workaround #menu: - if not OSX: - label = u"Xpra Shadow Server" - display = os.environ.get("DISPLAY") - if POSIX and display: - label = u"Xpra %s Shadow Server" % display - self.tray_menu = gtk.Menu() - self.tray_menu.set_title(label) - title_item = gtk.MenuItem() - title_item.set_label(label) - title_item.set_sensitive(False) - title_item.show() - self.tray_menu.append(title_item) + label = u"Xpra Shadow Server" + display = os.environ.get("DISPLAY") + if POSIX and display: + label = u"Xpra %s Shadow Server" % display + self.tray_menu = gtk.Menu() + self.tray_menu.set_title(label) + title_item = gtk.MenuItem() + title_item.set_label(label) + title_item.set_sensitive(False) + title_item.show() + self.tray_menu.append(title_item) from xpra.gtk_common.about import about self.tray_menu.append(self.traymenuitem("About Xpra", "information.png", None, about)) if server_features.windows: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/server/shadow/root_window_model.py new/xpra-2.5.1/xpra/server/shadow/root_window_model.py --- old/xpra-2.5/xpra/server/shadow/root_window_model.py 2019-03-20 05:43:52.000000000 +0100 +++ new/xpra-2.5.1/xpra/server/shadow/root_window_model.py 2019-04-10 04:48:03.000000000 +0200 @@ -87,8 +87,7 @@ return self.geometry[2:4] def get_geometry(self): - w, h = self.get_dimensions() - return (0, 0, w, h) + return self.geometry def get_property_names(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/server/source/clipboard_connection.py new/xpra-2.5.1/xpra/server/source/clipboard_connection.py --- old/xpra-2.5/xpra/server/source/clipboard_connection.py 2019-03-20 05:43:52.000000000 +0100 +++ new/xpra-2.5.1/xpra/server/source/clipboard_connection.py 2019-04-16 06:57:10.000000000 +0200 @@ -53,7 +53,7 @@ log("client clipboard: greedy=%s, want_targets=%s, client_selections=%s, contents_slice_fix=%s", self.clipboard_greedy, self.clipboard_want_targets, self.clipboard_client_selections, self.clipboard_contents_slice_fix) - if not self.clipboard_contents_slice_fix: + if self.clipboard_enabled and not self.clipboard_contents_slice_fix: log.info("client clipboard does not include contents slice fix") def get_info(self): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/server/ssh.py new/xpra-2.5.1/xpra/server/ssh.py --- old/xpra-2.5/xpra/server/ssh.py 2019-03-20 05:43:52.000000000 +0100 +++ new/xpra-2.5.1/xpra/server/ssh.py 2019-04-10 04:48:03.000000000 +0200 @@ -221,9 +221,9 @@ return False -def make_ssh_server_connection(conn, password_auth=None): - log("make_ssh_server_connection(%s)", conn) - ssh_server = SSHServer(password_auth=password_auth) +def make_ssh_server_connection(conn, none_auth=False, password_auth=None): + log("make_ssh_server_connection%s", (conn, none_auth, password_auth)) + ssh_server = SSHServer(none_auth=none_auth, password_auth=password_auth) DoGSSAPIKeyExchange = False t = None def close(): @@ -314,5 +314,6 @@ log.warn(" closing connection from %s", pretty_socket(conn.target)) close() return None - #log("client authenticated, channel=%s", chan) - return SSHSocketConnection(ssh_server.proxy_channel, conn._socket, target="ssh client") + log("client authenticated, channel=%s", chan) + sock = conn._socket + return SSHSocketConnection(ssh_server.proxy_channel, sock, conn.local, conn.endpoint, conn.target) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/server/window/window_video_source.py new/xpra-2.5.1/xpra/server/window/window_video_source.py --- old/xpra-2.5/xpra/server/window/window_video_source.py 2019-03-20 05:43:52.000000000 +0100 +++ new/xpra-2.5.1/xpra/server/window/window_video_source.py 2019-03-28 13:13:12.000000000 +0100 @@ -1816,11 +1816,11 @@ csize = len(data) compresslog("compress: %5.1fms for %4ix%-4i pixels at %4i,%-4i for wid=%-5i using %9s with ratio %5.1f%% (%5iKB to %5iKB), sequence %5i, client_options=%s", (monotonic_time()-substart)*1000.0, w, sh, x+0, y+sy, self.wid, coding, 100.0*csize/psize, psize/1024, csize/1024, self._damage_packet_sequence, client_options) - scrolllog("non-scroll encoding using %s (quality=%i, speed=%i) took %ims for %i rectangles", - encoding, self._current_quality, self._current_speed, (monotonic_time()-nsstart)*1000, len(non_scroll)) - else: - #we can't send the non-scroll areas, ouch! - flush = 0 + scrolllog("non-scroll encoding using %s (quality=%i, speed=%i) took %ims for %i rectangles", + encoding, self._current_quality, self._current_speed, (monotonic_time()-nsstart)*1000, len(non_scroll)) + else: + #we can't send the non-scroll areas, ouch! + flush = 0 assert flush==0 self.last_scroll_time = monotonic_time() scrolllog("scroll encoding total time: %ims", (self.last_scroll_time-start)*1000) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/server/window/windowicon_source.py new/xpra-2.5.1/xpra/server/window/windowicon_source.py --- old/xpra-2.5/xpra/server/window/windowicon_source.py 2019-03-20 05:43:52.000000000 +0100 +++ new/xpra-2.5.1/xpra/server/window/windowicon_source.py 2019-03-20 14:37:17.000000000 +0100 @@ -10,7 +10,7 @@ import threading from PIL import Image -from xpra.os_util import monotonic_time, load_binary_file, memoryview_to_bytes, BytesIOClass +from xpra.os_util import monotonic_time, load_binary_file, memoryview_to_bytes, strtobytes, BytesIOClass from xpra.net import compression from xpra.util import envbool, envint from xpra.log import Logger @@ -236,7 +236,7 @@ else: if image: pixel_data = image.tobytes("raw", "RGBA") - wrapper = self.compressed_wrapper("premult_argb32", str(pixel_data)) + wrapper = self.compressed_wrapper("premult_argb32", strtobytes(pixel_data)) packet = ("window-icon", self.wid, w, h, wrapper.datatype, wrapper) log("queuing window icon update: %s", packet) self.queue_packet(packet, wait_for_more=True) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/src_info.py new/xpra-2.5.1/xpra/src_info.py --- old/xpra-2.5/xpra/src_info.py 2019-03-20 05:44:42.000000000 +0100 +++ new/xpra-2.5.1/xpra/src_info.py 2019-04-16 06:57:14.000000000 +0200 @@ -1,2 +1,2 @@ LOCAL_MODIFICATIONS=0 -REVISION=22144 +REVISION=22432 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/x11/bindings/keyboard_bindings.pyx new/xpra-2.5.1/xpra/x11/bindings/keyboard_bindings.pyx --- old/xpra-2.5/xpra/x11/bindings/keyboard_bindings.pyx 2019-03-20 05:43:52.000000000 +0100 +++ new/xpra-2.5.1/xpra/x11/bindings/keyboard_bindings.pyx 2019-04-16 06:57:10.000000000 +0200 @@ -506,17 +506,20 @@ cdef KeySym _parse_keysym(self, symbol): cdef KeySym keysym - if symbol in ["NoSymbol", "VoidSymbol"]: - return NoSymbol s = strtobytes(symbol) + if s in [b"NoSymbol", b"VoidSymbol"]: + return NoSymbol keysym = XStringToKeysym(s) if keysym==NoSymbol: - if symbol.startswith("U+"): - symbol = "0x"+symbol[2:] - if symbol.lower().startswith("0x"): - return int(symbol, 16) - if len(symbol)>0 and symbol[0] in ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]: - return int(symbol) + if s.startswith(b"U+"): + s = b"0x"+s[2:] + if s.lower().startswith(b"0x"): + return int(s, 16) + if len(s)>0: + try: + return int(s) + except ValueError: + pass return NoSymbol return keysym diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/xpra-2.5/xpra/x11/gtk_x11/tray.py new/xpra-2.5.1/xpra/x11/gtk_x11/tray.py --- old/xpra-2.5/xpra/x11/gtk_x11/tray.py 2019-03-20 05:43:52.000000000 +0100 +++ new/xpra-2.5.1/xpra/x11/gtk_x11/tray.py 2019-04-10 04:48:03.000000000 +0200 @@ -8,7 +8,7 @@ from xpra.x11.gtk_x11.prop import prop_set, prop_get from xpra.gtk_common.gobject_compat import import_gdk, import_gobject, is_gtk3 from xpra.gtk_common.gtk_util import ( - display_get_default, get_default_root_window, get_xwindow, GDKWindow, + display_get_default, get_default_root_window, get_xwindow, GDKWindow, x11_foreign_new, STRUCTURE_MASK, EXPOSURE_MASK, PROPERTY_CHANGE_MASK, ) from xpra.x11.bindings.window_bindings import constants, X11WindowBindings #@UnresolvedImport @@ -218,7 +218,7 @@ def dock_tray(self, xid): log("dock_tray(%#x)", xid) root = get_default_root_window() - window = gdk.window_foreign_new(xid) + window = x11_foreign_new(xid) if window is None: log.warn("could not find gdk window for tray window %#x", xid) return