Hello community,

here is the log from the commit of package python-python-xlib for 
openSUSE:Factory checked in at 2020-01-16 18:14:19
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-python-xlib (Old)
 and      /work/SRC/openSUSE:Factory/.python-python-xlib.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-python-xlib"

Thu Jan 16 18:14:19 2020 rev:5 rq:763806 version:0.26

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-python-xlib/python-python-xlib.changes    
2019-11-04 17:07:48.516351008 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-python-xlib.new.26092/python-python-xlib.changes
 2020-01-16 18:14:24.680743022 +0100
@@ -1,0 +2,11 @@
+Mon Jan 13 04:42:33 UTC 2020 - Dead Mozay <dead_mo...@opensuse.org>
+
+- version update to 0.26
+  * enrich XFixes extension with XFixesSelectionNotify events (by @acrisci)
+  * add example xfixes-selection-notify.py (by @acrisci)
+  * fix two issues in NV-CONTROL extension (by @leinardi)
+  * add method get_clock_info into NV-CONTROL extension (by @leinardi)
+  * add default client version into Composite extension (by @jakogut)
+  * add Damage extension with the example (by @mgarg1 and @jakogut)
+
+-------------------------------------------------------------------

Old:
----
  python-xlib-0.25.tar.bz2

New:
----
  python-xlib-0.26.tar.bz2

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

Other differences:
------------------
++++++ python-python-xlib.spec ++++++
--- /var/tmp/diff_new_pack.SQLXs1/_old  2020-01-16 18:14:25.824743669 +0100
+++ /var/tmp/diff_new_pack.SQLXs1/_new  2020-01-16 18:14:25.824743669 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-python-xlib
 #
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -19,24 +19,23 @@
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 %define         oldpython python
 Name:           python-python-xlib
-Version:        0.25
+Version:        0.26
 Release:        0
 Summary:        Python X11 interface
 License:        LGPL-2.1-or-later
 Group:          Development/Libraries/Python
 URL:            https://github.com/python-xlib/python-xlib
 Source:         
https://files.pythonhosted.org/packages/source/p/python-xlib/python-xlib-%{version}.tar.bz2
+
 BuildRequires:  %{python_module mock}
 BuildRequires:  %{python_module nose}
 BuildRequires:  %{python_module setuptools_scm}
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  %{python_module six >= 1.10.0}
-BuildRequires:  dos2unix
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
 BuildRequires:  xvfb-run
 Requires:       python-six >= 1.10.0
-Requires:       xorg-x11-server
 BuildArch:      noarch
 %ifpython2
 Provides:       %{oldpython}-xlib = %{version}
@@ -53,9 +52,7 @@
 library for Python programs.
 
 %prep
-%setup -q -n python-xlib-%{version}
-rm Xlib/ChangeLog
-dos2unix CHANGELOG.md README.rst TODO examples/*.py
+%autosetup -n python-xlib-%{version} -p1
 
 %build
 %python_build
@@ -69,7 +66,7 @@
 
 %files %{python_files}
 %license LICENSE
-%doc CHANGELOG.md README.rst TODO examples/
+%doc CHANGELOG.md README.rst TODO
 %{python_sitelib}/Xlib/
 %{python_sitelib}/python_xlib-*
 

++++++ python-xlib-0.25.tar.bz2 -> python-xlib-0.26.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/.travis.yml 
new/python-xlib-0.26/.travis.yml
--- old/python-xlib-0.25/.travis.yml    2019-02-03 22:05:24.000000000 +0100
+++ new/python-xlib-0.26/.travis.yml    2019-12-08 12:17:04.000000000 +0100
@@ -2,10 +2,11 @@
 
 python:
   - "2.7"
-  - "3.3"
   - "3.4"
   - "3.5"
   - "3.6"
+  - "3.7"
+  - "3.8"
 
 # command to install dependencies
 install:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/CHANGELOG.md 
new/python-xlib-0.26/CHANGELOG.md
--- old/python-xlib-0.25/CHANGELOG.md   2019-02-03 22:05:24.000000000 +0100
+++ new/python-xlib-0.26/CHANGELOG.md   2019-12-08 13:01:55.000000000 +0100
@@ -1,5 +1,24 @@
 NEWS for Python X Library
 
+Version 0.26
+============
+
+Bug Fixes
+---------
+
+- support legacy X servers like RealVNC's one (by @Gerardwx)
+
+Extensions
+--------------------
+
+- enrich XFixes extension with XFixesSelectionNotify events (by @acrisci)
+- add example xfixes-selection-notify.py (by @acrisci)
+- fix two issues in NV-CONTROL extension (by @leinardi)
+- add method get_clock_info into NV-CONTROL extension (by @leinardi)
+- add default client version into Composite extension (by @jakogut)
+- add Damage extension with the example (by @mgarg1 and @jakogut)
+
+---
 Version 0.25
 ============
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/PKG-INFO 
new/python-xlib-0.26/PKG-INFO
--- old/python-xlib-0.25/PKG-INFO       2019-02-03 22:09:27.000000000 +0100
+++ new/python-xlib-0.26/PKG-INFO       2019-12-08 13:05:43.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: python-xlib
-Version: 0.25
+Version: 0.26
 Summary: Python X Library
 Home-page: https://github.com/python-xlib/python-xlib
 Author: Peter Liljenberg
@@ -143,6 +143,8 @@
 Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
 Classifier: Topic :: Software Development :: Libraries
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/Xlib/__init__.py 
new/python-xlib-0.26/Xlib/__init__.py
--- old/python-xlib-0.25/Xlib/__init__.py       2019-02-03 22:05:24.000000000 
+0100
+++ new/python-xlib-0.26/Xlib/__init__.py       2019-12-08 13:01:55.000000000 
+0100
@@ -19,7 +19,7 @@
 #    Suite 330,
 #    Boston, MA 02111-1307 USA
 
-__version__ = (0, 25)
+__version__ = (0, 26)
 
 __version_extra__ = ''
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/Xlib/ext/__init__.py 
new/python-xlib-0.26/Xlib/ext/__init__.py
--- old/python-xlib-0.25/Xlib/ext/__init__.py   2019-02-03 22:05:24.000000000 
+0100
+++ new/python-xlib-0.26/Xlib/ext/__init__.py   2019-12-08 12:17:04.000000000 
+0100
@@ -37,6 +37,7 @@
     ('SECURITY', 'security'),
     ('XInputExtension', 'xinput'),
     ('NV-CONTROL', 'nvcontrol'),
+    ('DAMAGE', 'damage'),
     ]
 
 __all__ = map(lambda x: x[1], __extensions__)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/Xlib/ext/composite.py 
new/python-xlib-0.26/Xlib/ext/composite.py
--- old/python-xlib-0.25/Xlib/ext/composite.py  2019-02-03 22:05:24.000000000 
+0100
+++ new/python-xlib-0.26/Xlib/ext/composite.py  2019-12-08 12:17:04.000000000 
+0100
@@ -65,6 +65,8 @@
     return QueryVersion(
         display = self.display,
         opcode = self.display.get_extension_major(extname),
+        major_version=0,
+        minor_version=4
         )
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/Xlib/ext/damage.py 
new/python-xlib-0.26/Xlib/ext/damage.py
--- old/python-xlib-0.25/Xlib/ext/damage.py     1970-01-01 01:00:00.000000000 
+0100
+++ new/python-xlib-0.26/Xlib/ext/damage.py     2019-12-08 12:17:04.000000000 
+0100
@@ -0,0 +1,182 @@
+# Xlib.ext.damage -- DAMAGE extension module
+#
+#    Copyright (C) 2018 Joseph Kogut <joseph.ko...@gmail.com>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation; either version 2.1
+# of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the
+#    Free Software Foundation, Inc.,
+#    59 Temple Place,
+#    Suite 330,
+#    Boston, MA 02111-1307 USA
+
+
+from Xlib import X
+from Xlib.protocol import rq, structs
+from Xlib.xobject import resource
+from Xlib.error import XError
+
+extname = 'DAMAGE'
+
+# Event codes #
+DamageNotifyCode = 0
+
+# Error codes #
+BadDamageCode = 0
+
+class BadDamageError(XError):
+    pass
+
+# DamageReportLevel options
+DamageReportRawRectangles = 0
+DamageReportDeltaRectangles = 1
+DamageReportBoundingBox = 2
+DamageReportNonEmpty = 3
+
+DamageReportLevel = (
+    DamageReportRawRectangles,
+    DamageReportDeltaRectangles,
+    DamageReportBoundingBox,
+    DamageReportNonEmpty,
+)
+
+DAMAGE = rq.Card32
+
+# Methods
+
+class QueryVersion(rq.ReplyRequest):
+    _request = rq.Struct(rq.Card8('opcode'),
+                         rq.Opcode(0),
+                         rq.RequestLength(),
+                         rq.Card32('major_version'),
+                         rq.Card32('minor_version'),
+                         )
+
+    _reply = rq.Struct(rq.ReplyCode(),
+                       rq.Pad(1),
+                       rq.Card16('sequence_number'),
+                       rq.ReplyLength(),
+                       rq.Card32('major_version'),
+                       rq.Card32('minor_version'),
+                       rq.Pad(16),
+                       )
+
+def query_version(self):
+    return QueryVersion(display=self.display,
+                        opcode=self.display.get_extension_major(extname),
+                        major_version=1,
+                        minor_version=1)
+
+class DamageCreate(rq.Request):
+    _request = rq.Struct(rq.Card8('opcode'),
+                         rq.Opcode(1),
+                         rq.RequestLength(),
+                         DAMAGE('damage'),
+                         rq.Drawable('drawable'),
+                         rq.Set('level', 1, DamageReportLevel),
+                         rq.Pad(3),
+                         )
+
+def damage_create(self, level):
+    did = self.display.allocate_resource_id()
+    DamageCreate(display=self.display,
+                 opcode=self.display.get_extension_major(extname),
+                 damage=did,
+                 drawable=self.id,
+                 level=level,
+                 )
+    return did
+
+class DamageDestroy(rq.Request):
+    _request = rq.Struct(rq.Card8('opcode'),
+                         rq.Opcode(2),
+                         rq.RequestLength(),
+                         DAMAGE('damage')
+                         )
+
+def damage_destroy(self, damage):
+    DamageDestroy(display=self.display,
+                  opcode=self.display.get_extension_major(extname),
+                  damage=damage,
+                  )
+
+    self.display.free_resource_id(damage)
+
+class DamageSubtract(rq.Request):
+    _request = rq.Struct(rq.Card8('opcode'),
+                         rq.Opcode(3),
+                         rq.RequestLength(),
+                         DAMAGE('damage'),
+                         rq.Card32('repair'),
+                         rq.Card32('parts')
+                         )
+
+def damage_subtract(self, damage, repair=X.NONE, parts=X.NONE):
+    DamageSubtract(display=self.display,
+                   opcode=self.display.get_extension_major(extname),
+                   damage=damage,
+                   repair=repair,
+                   parts=parts)
+
+class DamageAdd(rq.Request):
+    _request = rq.Struct(rq.Card8('opcode'),
+                         rq.Opcode(4),
+                         rq.RequestLength(),
+                         rq.Card32('repair'),
+                         rq.Card32('parts'),
+                         )
+
+def damage_add(self, repair, parts):
+    DamageAdd(display=self.display,
+              opcode=self.display.get_extension_major(extname),
+              repair=repair,
+              parts=parts)
+
+# Events #
+
+class DamageNotify(rq.Event):
+    _code = None
+    _fields = rq.Struct(
+        rq.Card8('type'),
+        rq.Card8('level'),
+        rq.Card16('sequence_number'),
+        rq.Drawable('drawable'),
+        DAMAGE('damage'),
+        rq.Card32('timestamp'),
+        rq.Object('area', structs.Rectangle),
+        rq.Object('drawable_geometry', structs.Rectangle)
+        )
+
+def init(disp, info):
+    disp.extension_add_method('display',
+                              'damage_query_version',
+                              query_version)
+
+    disp.extension_add_method('drawable',
+                              'damage_create',
+                              damage_create)
+
+    disp.extension_add_method('display',
+                              'damage_destroy',
+                              damage_destroy)
+
+    disp.extension_add_method('display',
+                              'damage_subtract',
+                              damage_subtract)
+
+    disp.extension_add_method('drawable',
+                              'damage_add',
+                              damage_add)
+
+    disp.extension_add_event(info.first_event + DamageNotifyCode, DamageNotify)
+
+    disp.add_extension_error(code=BadDamageCode, err=BadDamageError)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/Xlib/ext/nvcontrol.py 
new/python-xlib-0.26/Xlib/ext/nvcontrol.py
--- old/python-xlib-0.25/Xlib/ext/nvcontrol.py  2019-02-03 22:05:24.000000000 
+0100
+++ new/python-xlib-0.26/Xlib/ext/nvcontrol.py  2019-12-08 12:17:04.000000000 
+0100
@@ -139,7 +139,7 @@
     return query_string_attribute(self, target, 0, NV_CTRL_STRING_GPU_UUID)
 
 
-def get_gpu_utilization(self, target):
+def get_utilization_rates(self, target):
     string = query_string_attribute(self, target, 0, 
NV_CTRL_STRING_GPU_UTILIZATION)
     result = {}
     if string is not None and string != '':
@@ -162,6 +162,16 @@
     return result
 
 
+def get_clock_info(self, target):
+    string = query_string_attribute(self, target, 0, 
NV_CTRL_STRING_GPU_CURRENT_CLOCK_FREQS)
+    result = {}
+    if string is not None and string != '':
+        for line in string.split(','):
+            [key, value] = line.split('=')[:2]
+            result[key.strip()] = int(value) if value.isdigit() else value
+    return result
+
+
 def get_vram(self, target):
     return query_int_attribute(self, target, 0, NV_CTRL_VIDEO_RAM)
 
@@ -231,23 +241,23 @@
     return query_int_attribute(self, target, 0, 
NV_CTRL_USED_DEDICATED_GPU_MEMORY)
 
 
-def get_pcie_current_link_width(self, target):
+def get_curr_pcie_link_width(self, target):
     return query_int_attribute(self, target, 0, 
NV_CTRL_GPU_PCIE_CURRENT_LINK_WIDTH)
 
 
-def get_pcie_max_link_width(self, target):
+def get_max_pcie_link_width(self, target):
     return query_int_attribute(self, target, 0, 
NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH)
 
 
-def get_pcie_generation(self, target):
+def get_curr_pcie_link_generation(self, target):
     return query_int_attribute(self, target, 0, NV_CTRL_GPU_PCIE_GENERATION)
 
 
-def get_video_encoder_utilization(self, target):
+def get_encoder_utilization(self, target):
     return query_int_attribute(self, target, 0, 
NV_CTRL_VIDEO_ENCODER_UTILIZATION)
 
 
-def get_video_decoder_utilization(self, target):
+def get_decoder_utilization(self, target):
     return query_int_attribute(self, target, 0, 
NV_CTRL_VIDEO_DECODER_UTILIZATION)
 
 
@@ -263,8 +273,8 @@
     return set_int_attribute(self, target, perf_level, 
NV_CTRL_GPU_NVCLOCK_OFFSET, offset)
 
 
-def get_gpu_nvclock_offset_range(self, target):
-    return query_valid_attr_values(self, target, 0, NV_CTRL_GPU_NVCLOCK_OFFSET)
+def get_gpu_nvclock_offset_range(self, target, perf_level):
+    return query_valid_attr_values(self, target, perf_level, 
NV_CTRL_GPU_NVCLOCK_OFFSET)
 
 
 def get_mem_transfer_rate_offset(self, target, perf_level):
@@ -275,12 +285,12 @@
     return set_int_attribute(self, target, perf_level, 
NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET, offset)
 
 
-def get_mem_transfer_rate_offset_range(self, target):
-    return query_valid_attr_values(self, target, 0, 
NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET)
+def get_mem_transfer_rate_offset_range(self, target, perf_level):
+    return query_valid_attr_values(self, target, perf_level, 
NV_CTRL_GPU_MEM_TRANSFER_RATE_OFFSET)
 
 
 def get_cooler_manual_control_enabled(self, target):
-    return query_int_attribute(self, target, 0, 
NV_CTRL_GPU_COOLER_MANUAL_CONTROL) == 1
+    return query_int_attribute(self, target, 0, 
NV_CTRL_GPU_COOLER_MANUAL_CONTROL)
 
 
 def set_cooler_manual_control_enabled(self, target, enabled):
@@ -354,11 +364,11 @@
     disp.extension_add_method('display', 'nvcontrol_get_memory_bus_width', 
get_memory_bus_width)
     disp.extension_add_method('display', 
'nvcontrol_get_total_dedicated_gpu_memory', get_total_dedicated_gpu_memory)
     disp.extension_add_method('display', 
'nvcontrol_get_used_dedicated_gpu_memory', get_used_dedicated_gpu_memory)
-    disp.extension_add_method('display', 
'nvcontrol_get_pcie_current_link_width', get_pcie_current_link_width)
-    disp.extension_add_method('display', 'nvcontrol_get_pcie_max_link_width', 
get_pcie_max_link_width)
-    disp.extension_add_method('display', 'nvcontrol_get_pcie_generation', 
get_pcie_generation)
-    disp.extension_add_method('display', 
'nvcontrol_get_video_encoder_utilization', get_video_encoder_utilization)
-    disp.extension_add_method('display', 
'nvcontrol_get_video_decoder_utilization', get_video_decoder_utilization)
+    disp.extension_add_method('display', 'nvcontrol_get_curr_pcie_link_width', 
get_curr_pcie_link_width)
+    disp.extension_add_method('display', 'nvcontrol_get_max_pcie_link_width', 
get_max_pcie_link_width)
+    disp.extension_add_method('display', 
'nvcontrol_get_curr_pcie_link_generation', get_curr_pcie_link_generation)
+    disp.extension_add_method('display', 'nvcontrol_get_encoder_utilization', 
get_encoder_utilization)
+    disp.extension_add_method('display', 'nvcontrol_get_decoder_utilization', 
get_decoder_utilization)
     disp.extension_add_method('display', 
'nvcontrol_get_current_performance_level', get_current_performance_level)
     disp.extension_add_method('display', 'nvcontrol_get_gpu_nvclock_offset', 
get_gpu_nvclock_offset)
     disp.extension_add_method('display', 'nvcontrol_set_gpu_nvclock_offset', 
set_gpu_nvclock_offset)
@@ -375,8 +385,9 @@
     disp.extension_add_method('display', 'nvcontrol_get_driver_version', 
get_driver_version)
     disp.extension_add_method('display', 'nvcontrol_get_vbios_version', 
get_vbios_version)
     disp.extension_add_method('display', 'nvcontrol_get_gpu_uuid', 
get_gpu_uuid)
-    disp.extension_add_method('display', 'nvcontrol_get_gpu_utilization', 
get_gpu_utilization)
+    disp.extension_add_method('display', 'nvcontrol_get_utilization_rates', 
get_utilization_rates)
     disp.extension_add_method('display', 'nvcontrol_get_performance_modes', 
get_performance_modes)
+    disp.extension_add_method('display', 'nvcontrol_get_clock_info', 
get_clock_info)
     disp.extension_add_method('display', 
'nvcontrol_set_cooler_manual_control_enabled',
                               set_cooler_manual_control_enabled)
     disp.extension_add_method('display', 
'nvcontrol_get_gpu_nvclock_offset_range',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/Xlib/ext/xfixes.py 
new/python-xlib-0.26/Xlib/ext/xfixes.py
--- old/python-xlib-0.25/Xlib/ext/xfixes.py     2016-08-13 10:06:02.000000000 
+0200
+++ new/python-xlib-0.26/Xlib/ext/xfixes.py     2019-12-08 12:17:04.000000000 
+0100
@@ -22,13 +22,22 @@
 
 '''
 A partial implementation of the XFIXES extension.  Only the HideCursor and
-ShowCursor requests are provided.
+ShowCursor requests and SelectionNotify events are provided.
 '''
 
 from Xlib.protocol import rq
 
 extname = 'XFIXES'
 
+XFixesSelectionNotify                   = 0
+
+XFixesSetSelectionOwnerNotifyMask       = (1 << 0)
+XFixesSelectionWindowDestroyNotifyMask  = (1 << 1)
+XFixesSelectionClientCloseNotifyMask    = (1 << 2)
+
+XFixesSetSelectionOwnerNotify           = 0
+XFixesSelectionWindowDestroyNotify      = 1
+XFixesSelectionClientCloseNotify        = 2
 
 class QueryVersion(rq.ReplyRequest):
     _request = rq.Struct(rq.Card8('opcode'),
@@ -80,8 +89,54 @@
                opcode=self.display.get_extension_major(extname),
                window=self)
 
+class SelectSelectionInput(rq.Request):
+    _request = rq.Struct(rq.Card8('opcode'),
+                         rq.Opcode(2),
+                         rq.RequestLength(),
+                         rq.Window('window'),
+                         rq.Card32('selection'),
+                         rq.Card32('mask')
+                         )
+
+def select_selection_input(self, window, selection, mask):
+    return 
SelectSelectionInput(opcode=self.display.get_extension_major(extname),
+                                display=self.display,
+                                window=window,
+                                selection=selection,
+                                mask=mask)
+
+
+class SelectionNotify(rq.Event):
+    _code = None
+    _fields = rq.Struct(rq.Card8('type'),
+                        rq.Card8('sub_code'),
+                        rq.Card16('sequence_number'),
+                        rq.Window('window'),
+                        rq.Window('owner'),
+                        rq.Card32('selection'),
+                        rq.Card32('timestamp'),
+                        rq.Card32('selection_timestamp'),
+                        rq.Pad(8))
+
+
+class SetSelectionOwnerNotify(SelectionNotify):
+    pass
+
+
+class SelectionWindowDestroyNotify(SelectionNotify):
+    pass
+
+
+class SelectionClientCloseNotify(SelectionNotify):
+    pass
+
 
 def init(disp, info):
+    disp.extension_add_method('display', 'xfixes_select_selection_input', 
select_selection_input)
     disp.extension_add_method('display', 'xfixes_query_version', query_version)
     disp.extension_add_method('window', 'xfixes_hide_cursor', hide_cursor)
     disp.extension_add_method('window', 'xfixes_show_cursor', show_cursor)
+
+    disp.extension_add_subevent(info.first_event + XFixesSelectionNotify, 
XFixesSetSelectionOwnerNotify, SetSelectionOwnerNotify)
+    disp.extension_add_subevent(info.first_event + XFixesSelectionNotify, 
XFixesSelectionWindowDestroyNotify, SelectionWindowDestroyNotify)
+    disp.extension_add_subevent(info.first_event + XFixesSelectionNotify, 
XFixesSelectionClientCloseNotify, SelectionClientCloseNotify)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/Xlib/ext/xinput.py 
new/python-xlib-0.26/Xlib/ext/xinput.py
--- old/python-xlib-0.25/Xlib/ext/xinput.py     2016-08-13 10:06:10.000000000 
+0200
+++ new/python-xlib-0.26/Xlib/ext/xinput.py     2019-12-08 12:17:04.000000000 
+0100
@@ -647,8 +647,8 @@
     disp.extension_add_method('display', 'xinput_ungrab_device', ungrab_device)
     disp.extension_add_method('window', 'xinput_grab_keycode', grab_keycode)
     disp.extension_add_method('window', 'xinput_ungrab_keycode', 
ungrab_keycode)
-
-    for device_event in (ButtonPress, ButtonRelease, KeyPress, KeyRelease, 
Motion):
-        disp.ge_add_event_data(info.major_opcode, device_event, 
DeviceEventData)
-    disp.ge_add_event_data(info.major_opcode, DeviceChanged, DeviceEventData)
-    disp.ge_add_event_data(info.major_opcode, HierarchyChanged, 
HierarchyEventData)
+    if hasattr(disp,"ge_add_event_data"):
+        for device_event in (ButtonPress, ButtonRelease, KeyPress, KeyRelease, 
Motion):
+            disp.ge_add_event_data(info.major_opcode, device_event, 
DeviceEventData)
+        disp.ge_add_event_data(info.major_opcode, DeviceChanged, 
DeviceEventData)
+        disp.ge_add_event_data(info.major_opcode, HierarchyChanged, 
HierarchyEventData)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/examples/nvcontrol.py 
new/python-xlib-0.26/examples/nvcontrol.py
--- old/python-xlib-0.25/examples/nvcontrol.py  2019-02-03 22:05:24.000000000 
+0100
+++ new/python-xlib-0.26/examples/nvcontrol.py  2019-12-08 12:17:04.000000000 
+0100
@@ -66,11 +66,11 @@
         'get_memory_bus_width': display.nvcontrol_get_memory_bus_width(gpu),
         'get_total_dedicated_gpu_memory': 
display.nvcontrol_get_total_dedicated_gpu_memory(gpu),
         'get_used_dedicated_gpu_memory': 
display.nvcontrol_get_used_dedicated_gpu_memory(gpu),
-        'get_pcie_current_link_width': 
display.nvcontrol_get_pcie_current_link_width(gpu),
-        'get_pcie_max_link_width': 
display.nvcontrol_get_pcie_max_link_width(gpu),
-        'get_pcie_generation': display.nvcontrol_get_pcie_generation(gpu),
-        'get_video_encoder_utilization': 
display.nvcontrol_get_video_encoder_utilization(gpu),
-        'get_video_decoder_utilization': 
display.nvcontrol_get_video_decoder_utilization(gpu),
+        'get_curr_pcie_link_width': 
display.nvcontrol_get_curr_pcie_link_width(gpu),
+        'get_max_pcie_link_width': 
display.nvcontrol_get_max_pcie_link_width(gpu),
+        'get_curr_pcie_link_generation': 
display.nvcontrol_get_curr_pcie_link_generation(gpu),
+        'get_encoder_utilization': 
display.nvcontrol_get_encoder_utilization(gpu),
+        'get_decoder_utilization': 
display.nvcontrol_get_decoder_utilization(gpu),
         'get_current_performance_level': 
display.nvcontrol_get_current_performance_level(gpu),
         'get_gpu_nvclock_offset': 
display.nvcontrol_get_gpu_nvclock_offset(gpu, perf_level),
         'get_mem_transfer_rate_offset': 
display.nvcontrol_get_mem_transfer_rate_offset(gpu, perf_level),
@@ -83,10 +83,11 @@
         'get_driver_version': display.nvcontrol_get_driver_version(gpu),
         'get_vbios_version': display.nvcontrol_get_vbios_version(gpu),
         'get_gpu_uuid': display.nvcontrol_get_gpu_uuid(gpu),
-        'get_gpu_utilization': display.nvcontrol_get_gpu_utilization(gpu),
+        'get_utilization_rates': display.nvcontrol_get_utilization_rates(gpu),
         'get_performance_modes': display.nvcontrol_get_performance_modes(gpu),
-        'get_gpu_nvclock_offset_range': 
display.nvcontrol_get_gpu_nvclock_offset_range(gpu),
-        'get_mem_transfer_rate_offset_range': 
display.nvcontrol_get_mem_transfer_rate_offset_range(gpu)
+        'get_gpu_nvclock_offset_range': 
display.nvcontrol_get_gpu_nvclock_offset_range(gpu, perf_level),
+        'get_mem_transfer_rate_offset_range': 
display.nvcontrol_get_mem_transfer_rate_offset_range(gpu, perf_level),
+        'get_clock_info': display.nvcontrol_get_clock_info(gpu)
     }
 
     pprint(dic)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/examples/xdamage.py 
new/python-xlib-0.26/examples/xdamage.py
--- old/python-xlib-0.25/examples/xdamage.py    1970-01-01 01:00:00.000000000 
+0100
+++ new/python-xlib-0.26/examples/xdamage.py    2019-12-08 12:17:04.000000000 
+0100
@@ -0,0 +1,139 @@
+#!/usr/bin/python
+#
+# examples/xdamage.py -- demonstrate damage extension
+#
+#    Copyright (C) 2019 Mohit Garg <mrmohitgarg1...@gmail.com>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation; either version 2.1
+# of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the
+#    Free Software Foundation, Inc.,
+#    59 Temple Place,
+#    Suite 330,
+#    Boston, MA 02111-1307 USA
+
+
+# Python 2/3 compatibility.
+from __future__ import print_function
+
+import sys
+import os
+
+# Change path so we find Xlib
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from Xlib import display, X, threaded,Xutil
+import time
+
+try:
+    import thread
+except ModuleNotFoundError:
+    import _thread as thread
+
+from Xlib.ext import damage
+from PIL import Image, ImageTk
+import traceback
+
+def redraw(win, gc):
+    # win.clear_area()
+    win.fill_rectangle(gc, 0, 0, 60, 60)
+
+def blink(display, win, gc, cols):
+    while 1:
+        time.sleep(2)
+        print('Changing color', cols[0])
+        gc.change(foreground = cols[0])
+        cols = (cols[1], cols[0])
+        redraw(win, gc)
+        display.flush()
+
+def get_image_from_win(win, pt_w, pt_h, pt_x=0, pt_y=0):
+    try:
+        raw = win.get_image(pt_x, pt_y, pt_w, pt_h, X.ZPixmap, 0xffffffff)
+        image = Image.frombytes("RGB", (pt_w, pt_h), raw.data, "raw", "BGRX")
+        return image
+
+    except Exception:
+        traceback.print_exc()
+
+def check_ext(disp):
+    # Check for extension
+    if not disp.has_extension('DAMAGE'):
+        sys.stderr.write('server does not have the DAMAGE extension\n')
+        sys.stderr.write("\n".join(disp.list_extensions()))
+        
+        if disp.query_extension('DAMAGE') is None:
+            sys.exit(1)
+    else:
+        r = disp.damage_query_version()
+        print('DAMAGE version {}.{}'.format(r.major_version, r.minor_version))
+    
+def main():
+    d = display.Display()
+    root = d.screen().root
+
+    check_ext(d)
+    colormap = d.screen().default_colormap
+
+    red = colormap.alloc_named_color("red").pixel
+    blue = colormap.alloc_named_color("blue").pixel
+    background = colormap.alloc_named_color("white").pixel
+
+    window1 = root.create_window(100, 100, 250, 100, 1,
+                                X.CopyFromParent, X.InputOutput,
+                                X.CopyFromParent,
+                                background_pixel = background,
+                                event_mask = X.StructureNotifyMask | 
X.ExposureMask)
+    window1.set_wm_name('Changing Window')
+    window1.map()
+    gc = window1.create_gc(foreground = red)
+    
+    thread.start_new_thread(blink, (d, window1, gc, (blue, red)))
+    
+    window1.damage_create(damage.DamageReportRawRectangles)
+    window1.set_wm_normal_hints(
+            flags=(Xutil.PPosition | Xutil.PSize | Xutil.PMinSize),
+            min_width=50,
+            min_height=50
+            )
+
+    window2 = root.create_window(100, 250, 250, 100, 1,
+                                X.CopyFromParent, X.InputOutput,
+                                X.CopyFromParent,
+                                background_pixel = background,
+                                event_mask = X.StructureNotifyMask | 
X.ExposureMask)
+    window2.set_wm_normal_hints(
+            flags=(Xutil.PPosition | Xutil.PSize | Xutil.PMinSize),
+            min_width=50,
+            min_height=50
+            )
+
+    window2.set_wm_name('Tracking Window')
+    window2.map()
+
+    while 1:
+        event = d.next_event()
+        if event.type == X.Expose:
+            if event.count == 0:
+                redraw(window1, gc)
+        elif event.type == d.extension_event.DamageNotify:
+            image = get_image_from_win(window1, event.area.width, 
event.area.height, event.area.x, event.area.y)
+            bgpm = window2.create_pixmap(image.width, image.height, 
d.screen().root_depth)
+            bggc = window2.create_gc(foreground=0, background=0)
+            bgpm.put_pil_image(bggc, 0, 0, image)
+            window2.copy_area(bggc, bgpm, 0, 0, image.width, image.height, 0, 
0)
+            # bggc.free()
+        elif event.type == X.DestroyNotify:
+            sys.exit(0)
+
+if __name__ == "__main__":
+    main()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/examples/xfixes-selection-notify.py 
new/python-xlib-0.26/examples/xfixes-selection-notify.py
--- old/python-xlib-0.25/examples/xfixes-selection-notify.py    1970-01-01 
01:00:00.000000000 +0100
+++ new/python-xlib-0.26/examples/xfixes-selection-notify.py    2019-12-08 
12:17:04.000000000 +0100
@@ -0,0 +1,82 @@
+#!/usr/bin/python3
+#
+# examples/xfixes-selection-notify.py -- demonstrate the XFIXES extension
+# SelectionNotify event.
+#
+#    Copyright (C) 2019
+#      Tony Crisci <t...@dubstepdish.com>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public License
+# as published by the Free Software Foundation; either version 2.1
+# of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the
+#    Free Software Foundation, Inc.,
+#    59 Temple Place,
+#    Suite 330,
+#    Boston, MA 02111-1307 USA
+
+# Python 2/3 compatibility.
+from __future__ import print_function
+
+import sys
+import os
+import time
+
+# Change path so we find Xlib
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from Xlib.display import Display
+from Xlib.ext import xfixes
+
+def main(argv):
+    if len(sys.argv) != 2:
+        sys.exit('usage: {0} SELECTION\n\n'
+                 'SELECTION is typically PRIMARY, SECONDARY or CLIPBOARD.\n'
+                 .format(sys.argv[0]))
+
+    display = Display()
+
+    sel_name = sys.argv[1]
+    sel_atom = display.get_atom(sel_name)
+
+    if not display.has_extension('XFIXES'):
+        if display.query_extension('XFIXES') is None:
+            print('XFIXES extension not supported', file=sys.stderr)
+            return 1
+
+    xfixes_version = display.xfixes_query_version()
+    print('Found XFIXES version %s.%s' % (
+      xfixes_version.major_version,
+      xfixes_version.minor_version,
+    ), file=sys.stderr)
+
+    screen = display.screen()
+
+    mask = xfixes.XFixesSetSelectionOwnerNotifyMask | \
+           xfixes.XFixesSelectionWindowDestroyNotifyMask | \
+           xfixes.XFixesSelectionClientCloseNotifyMask
+
+    display.xfixes_select_selection_input(screen.root, sel_atom, mask)
+
+    while True:
+        e = display.next_event()
+        print(e)
+
+        if (e.type, e.sub_code) == 
display.extension_event.SetSelectionOwnerNotify:
+            print('SetSelectionOwner: owner=0x{0:08x}'.format(e.owner.id))
+        elif (e.type, e.sub_code) == 
display.extension_event.SelectionWindowDestroyNotify:
+            print('SelectionWindowDestroy: owner=0x{0:08x}'.format(e.owner.id))
+        elif (e.type, e.sub_code) == 
display.extension_event.SelectionClientCloseNotify:
+            print('SelectionClientClose: owner=0x{0:08x}'.format(e.owner.id))
+
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/python_xlib.egg-info/PKG-INFO 
new/python-xlib-0.26/python_xlib.egg-info/PKG-INFO
--- old/python-xlib-0.25/python_xlib.egg-info/PKG-INFO  2019-02-03 
22:09:27.000000000 +0100
+++ new/python-xlib-0.26/python_xlib.egg-info/PKG-INFO  2019-12-08 
13:05:42.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: python-xlib
-Version: 0.25
+Version: 0.26
 Summary: Python X Library
 Home-page: https://github.com/python-xlib/python-xlib
 Author: Peter Liljenberg
@@ -143,6 +143,8 @@
 Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.5
 Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
 Classifier: Topic :: Software Development :: Libraries
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/python_xlib.egg-info/SOURCES.txt 
new/python-xlib-0.26/python_xlib.egg-info/SOURCES.txt
--- old/python-xlib-0.25/python_xlib.egg-info/SOURCES.txt       2019-02-03 
22:09:27.000000000 +0100
+++ new/python-xlib-0.26/python_xlib.egg-info/SOURCES.txt       2019-12-08 
13:05:42.000000000 +0100
@@ -27,6 +27,7 @@
 Xlib/xauth.py
 Xlib/ext/__init__.py
 Xlib/ext/composite.py
+Xlib/ext/damage.py
 Xlib/ext/ge.py
 Xlib/ext/nvcontrol.py
 Xlib/ext/randr.py
@@ -109,6 +110,8 @@
 examples/security.py
 examples/shapewin.py
 examples/threadtest.py
+examples/xdamage.py
+examples/xfixes-selection-notify.py
 examples/xfixes.py
 examples/xinerama.py
 examples/xinput.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/python-xlib-0.25/setup.cfg 
new/python-xlib-0.26/setup.cfg
--- old/python-xlib-0.25/setup.cfg      2019-02-03 22:09:27.000000000 +0100
+++ new/python-xlib-0.26/setup.cfg      2019-12-08 13:05:43.000000000 +0100
@@ -26,6 +26,8 @@
        Programming Language :: Python :: 3.5
        Programming Language :: Python :: 3.5
        Programming Language :: Python :: 3.6
+       Programming Language :: Python :: 3.7
+       Programming Language :: Python :: 3.8
        Programming Language :: Python :: Implementation :: CPython
        Topic :: Software Development :: Libraries :: Python Modules
        Topic :: Software Development :: Libraries


Reply via email to