Hello community,

here is the log from the commit of package impressive for openSUSE:Factory 
checked in at 2020-07-07 12:58:48
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/impressive (Old)
 and      /work/SRC/openSUSE:Factory/.impressive.new.3060 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "impressive"

Tue Jul  7 12:58:48 2020 rev:4 rq:819064 version:0.13.0~beta2

Changes:
--------
--- /work/SRC/openSUSE:Factory/impressive/impressive.changes    2020-05-12 
22:36:58.668451078 +0200
+++ /work/SRC/openSUSE:Factory/.impressive.new.3060/impressive.changes  
2020-07-07 12:59:21.677939726 +0200
@@ -1,0 +2,12 @@
+Mon Jul  6 18:38:59 UTC 2020 - Christophe Giboudeaux <[email protected]>
+
+- Update to 0.13.0-beta2
+  * added 'prev' and 'next' PageProps to change order of pages
+  * fixed many remaining Python 3 compatibility issues
+  * added "pseudo-binary" version (actually compressed bytecode) in the source
+    release archive (requires Python 3)
+  * circumvent blurry fonts on Windows due to high-DPI scaling
+  * fixed crash in overview page handling when presentations have very many 
pages
+  * fixed box-zoom mode display error in half-page mode
+
+-------------------------------------------------------------------

Old:
----
  Impressive-0.13.0-beta1.tar.gz

New:
----
  Impressive-0.13.0-beta2.tar.gz

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

Other differences:
------------------
++++++ impressive.spec ++++++
--- /var/tmp/diff_new_pack.crEeGt/_old  2020-07-07 12:59:26.241954618 +0200
+++ /var/tmp/diff_new_pack.crEeGt/_new  2020-07-07 12:59:26.245954632 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package impressive
 #
-# 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
@@ -17,9 +17,9 @@
 
 
 %define dist_name Impressive
-%define fileversion 0.13.0-beta1
+%define fileversion 0.13.0-beta2
 Name:           impressive
-Version:        0.13.0~beta1
+Version:        0.13.0~beta2
 Release:        0
 Summary:        PDF and image viewer optimized for presentations
 License:        GPL-2.0-only

++++++ Impressive-0.13.0-beta1.tar.gz -> Impressive-0.13.0-beta2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Impressive-0.13.0-beta1/changelog.txt 
new/Impressive-0.13.0-beta2/changelog.txt
--- old/Impressive-0.13.0-beta1/changelog.txt   2019-11-20 23:33:19.000000000 
+0100
+++ new/Impressive-0.13.0-beta2/changelog.txt   2020-05-31 21:44:02.000000000 
+0200
@@ -1,9 +1,24 @@
+0.13.0-beta2 [2020-05-31]
+- added 'prev' and 'next' PageProps to change order of pages
+- fixed many remaining Python 3 compatibility issues
+- added "pseudo-binary" version (actually compressed bytecode) in the source
+  release archive (requires Python 3)
+- circumvent blurry fonts on Windows due to high-DPI scaling
+- fixed crash in overview page handling when presentations have very many pages
+- fixed box-zoom mode display error in half-page mode
+- Win32 build back to 32 bits due to broader compatibility
+
+
+0.13.0-beta1a [2019-11-21]
+- hotfix for a segfault when using Impressive on Linux with PyGame installed
+  from pip (instead of the distribution's package manager)
+
+
 0.13.0-beta1 [2019-11-20]
 - Python 3 compatibility: should work with Python 2.7 and >= 3.6 now
 - Win32 build uses 64-bit Python 3
 - improved support for non-ASCII characters in page titles (as extracted
   with pdftk)
-- fixed box-zoom mode display error in half-page mode
 - added option to set last page of page progress bar (--progress-last)
 - added separate overview animation time option (--overtime)
 - can now have multiple progress bars at once
Binary files old/Impressive-0.13.0-beta1/demo.pdf and 
new/Impressive-0.13.0-beta2/demo.pdf differ
Binary files old/Impressive-0.13.0-beta1/impressive and 
new/Impressive-0.13.0-beta2/impressive differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Impressive-0.13.0-beta1/impressive.1 
new/Impressive-0.13.0-beta2/impressive.1
--- old/Impressive-0.13.0-beta1/impressive.1    2019-11-20 23:33:19.000000000 
+0100
+++ new/Impressive-0.13.0-beta2/impressive.1    2020-05-31 21:44:02.000000000 
+0200
@@ -1,5 +1,5 @@
 .\" generated by KeyJ's html2man.py version 0.1.2
-.TH IMPRESSIVE 1 2019-11-20 "Martin J. Fiedler" "Impressive Documentation">
+.TH IMPRESSIVE 1 2020-05-31 "Martin J. Fiedler" "Impressive Documentation">
 .SH "NAME"
 Impressive \- presentation tool with eye candy
 .SH "SYNOPSIS"
@@ -145,7 +145,7 @@
 .br
 \fB\-f\fR 
 .RS
-Sets the window/\:fullscreen mode Impressive shall start up with. This option 
can be specified multiple times; each times it is found, the next of the three 
options is selected, in the follwing order: (1.)True \fBfullscreen mode\fR, 
including setting the video mode. This is the default mode. (2.)\fBWindowed\fR 
mode, where Impressive runs in a standard window. (3.)"\fBFake\-fullscreen\fR" 
mode, where fullscreen is emulated by uding a window without border that fills 
the whole screen. Setting the display resolution is not possible in this mode. 
Each of these modes has a corresponding long option that enables it directly 
(\fB\-\-fullscreen\fR, \fB\-\-windowed\fR and \fB\-\-fake\-fullscreen\fR).
+Sets the window/\:fullscreen mode Impressive shall start up with. This option 
can be specified multiple times; each times it is found, the next of the three 
options is selected, in the following order: (1.)True \fBfullscreen mode\fR, 
including setting the video mode. This is the default mode. (2.)\fBWindowed\fR 
mode, where Impressive runs in a standard window. (3.)"\fBFake\-fullscreen\fR" 
mode, where fullscreen is emulated by using a window without border that fills 
the whole screen. Setting the display resolution is not possible in this mode. 
Each of these modes has a corresponding long option that enables it directly 
(\fB\-\-fullscreen\fR, \fB\-\-windowed\fR and \fB\-\-fake\-fullscreen\fR).
 .br
 .RE
 .PP
@@ -267,7 +267,7 @@
 .RS
 By default, Impressive uses a fragment shader to blur and desaturate the image 
when in highlight box or spotlight mode. This is usually the faster and 
nicer\-looking method; however, some very old hardware implementations can't 
deal with that shader and fall back to an unusably slow software 
implementation. Impressive tries to detect scenarios where this would happen 
and automatically falls back to a different implementation.
 .br
-There might be situations where this machanism fails and Impressive tries to 
use the non\-functional shader anyway. In these cases, the \fB\-\-noblur\fR 
option can be used to enforce the fallback implementation.
+There might be situations where this mechanism fails and Impressive tries to 
use the non\-functional shader anyway. In these cases, the \fB\-\-noblur\fR 
option can be used to enforce the fallback implementation.
 .RE
 .PP
 .br
@@ -413,7 +413,7 @@
 .RE
 .PP
 .br
-\fB\-t \fI<ms>\fR\fR or \fB\-\-transition \fI<trans1[,trans2...]>\fR\fR 
+\fB\-t \fI<trans1[,trans2...]>\fR\fR or \fB\-\-transition 
\fI<trans1[,trans2...]>\fR\fR 
 .RS
 Using this switch, the set of transitions Impressive will randomly draw at 
page changes can be specified. If only one transition class is specified, this 
class will be used for all pages that do not have another transition explicitly 
assigned in their page properties. Multiple transitions have to be separated by 
commas; they will be used in random order. The \fB\-l\fR option can be used to 
get a list of available transitions.
 .RE
@@ -1274,6 +1274,18 @@
 .RE
 .PP
 .br
+\fBnext\fR 
+.RS
+This property can be set to the number of the page that shall be shown after 
this page. This can be used to skip a lot of pages without setting the 
\fBskip\fR property on each of those, or to create a loop that can only be 
escaped by using the overview page or bookmarks.
+.RE
+.PP
+.br
+\fBprev\fR 
+.RS
+This property can be set to the number of the page that shall be shown when 
navigating from this page to the previous page (e.g. using the right mouse 
button or the \fBPage\-Up\fR key in the default mappings).
+.RE
+.PP
+.br
 \fBboxes\fR 
 .RS
 This property stores a list of highlight box coordinates. Normally, there is 
no need to edit this by hand, as Impressive handles this automatically if the 
\fBS\fR key is pressed.
@@ -1352,7 +1364,7 @@
 .RS
 These properties can contain a Python callable (i.e. a function reference or 
lambda expression) that is executed when the page is entered or left. The 
\fB~Once\fR variants will only be executed when the page is entered or left for 
the first time. The callable must not take any arguments. This feature can be 
used to associate arbitrary Python code with specific pages, for example to 
execute external programs.
 .br
-\fBWarning:\fR Lambda expressions cannot be properly processed by the Info 
Script save function (\fBS\fR key). If Impressive encounters lambda expressions 
when saving, it will remove them. In addition, it will not overwrite the 
original info script, but generate an extra file that needs to be merged withe 
the original script by hand.
+\fBWarning:\fR Lambda expressions cannot be properly processed by the Info 
Script save function (\fBS\fR key). If Impressive encounters lambda expressions 
when saving, it will remove them. In addition, it will not overwrite the 
original info script, but generate an extra file that needs to be merged with 
the original script by hand.
 .RE
 .PP
 .br
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Impressive-0.13.0-beta1/impressive.html 
new/Impressive-0.13.0-beta2/impressive.html
--- old/Impressive-0.13.0-beta1/impressive.html 2019-11-20 23:33:19.000000000 
+0100
+++ new/Impressive-0.13.0-beta2/impressive.html 2020-05-31 21:44:02.000000000 
+0200
@@ -13,12 +13,12 @@
 <!--VERSION-->
 <p style="text-indent:0;">
 <a 
href="http://impressive.sourceforge.net/";>http://impressive.sourceforge.net/</a><br
 />
-<b>Version:</b> 0.13.0-beta1<br />
+<b>Version:</b> 0.13.0<br />
 <b>Author:</b> <a href="mailto:[email protected]";>Martin J. 
Fiedler</a><br />
-<b>Last updated:</b> 2019-11-20</p>
+<b>Last updated:</b> 2020-05-31</p>
 <!--END-->
 <!--man
-.TH IMPRESSIVE 1 2019-11-20 "Martin J. Fiedler" "Impressive Documentation">
+.TH IMPRESSIVE 1 2020-05-31 "Martin J. Fiedler" "Impressive Documentation">
 .SH "NAME"
 Impressive \- presentation tool with eye candy
 .SH "SYNOPSIS"
@@ -68,13 +68,13 @@
 
 <h3>Using the source code release</h3>
 
-<p>Another way to get Impressive is downloading the platform-independent 
source code version. The most important file in this archive is 
<code>impressive.py</code>, which contains all the code of Impressive and can 
be run like any executable on Unix-like systems. However, the following 
external libraries and utilities have to be installed as well for Impressive to 
work:</p>
+<p>Another way to get Impressive is downloading the platform-independent 
source code version. The most important file in this archive is 
<code>impressive.py</code>, which contains all the code of Impressive, and 
<code>impressive</code> (without extension), which is the same in a compressed 
manner. The latter can be run like any executable on Unix-like systems, or 
installed system-wide using <code>sudo install -m 755 impressive 
/usr/local/bin/</code>. However, the following external libraries and utilities 
have to be installed as well for Impressive to work:</p>
 <ul>
-<li><strong>Python</strong> 2.7, 3.6 or newer &mdash; <a 
href="http://www.python.org/";>www.python.org</a> <em>(required)</em></li>
+<li><strong>Python</strong> 2.7, 3.6 or newer &mdash; <a 
href="http://www.python.org/";>www.python.org</a> <em>(required)</em>; in 
particular, for the &raquo;pseudo-binary&laquo; version 
(<code>impressive</code> without <code>.py</code>), Python 3.x is required</li>
 <li><strong>PyGame</strong> (the SDL binding for Python) &mdash; <a 
href="http://www.pygame.org/";>www.pygame.org</a> <em>(required)</em></li>
 <li><strong>PIL</strong>, the Python Imaging Library, or 
<strong>Pillow</strong>, a compatible fork of it &mdash; <a 
href="http://www.pythonware.com/products/pil/";>www.pythonware.com/products/pil</a>
 <em>(required)</em></li>
-<li><strong>pdftk</strong> 1.44 or higher for retrieving PDF metadata (page 
titles) &mdash; <a 
href="http://www.accesspdf.com/pdftk/";>www.accesspdf.com/pdftk</a> 
<em>(recommended; required if MuPDF is not available)</em></li>
-<li>the <strong>MuPDF utilities</strong> for PDF rendering and metadata 
retrieval (hyperlinks) &mdash; <a 
href="http://www.mupdf.com/";>www.mupdf.com</a> <em>(required)</em></li>
+<li><strong>pdftk</strong> 1.44 or higher (a.k.a. &raquo;PDFtk Server&laquo;) 
for retrieving PDF metadata (page titles) &mdash; <a 
href="http://www.accesspdf.com/pdftk/";>www.accesspdf.com/pdftk</a> 
<em>(recommended; required if MuPDF is not available)</em></li>
+<li>the <strong>MuPDF utilities</strong> for PDF rendering and metadata 
retrieval (hyperlinks) &mdash; <a 
href="http://www.mupdf.com/";>www.mupdf.com</a> <em>(<strong>highly</strong> 
recommended)</em></li>
 <li><strong>Xpdf</strong> or the <strong>Poppler utilities</strong> for 
alternate PDF rendering &mdash; <a 
href="http://www.foolabs.com/xpdf/";>www.foolabs.com/xpdf/</a> or <a 
href="http://poppler.freedesktop.org/";>http://poppler.freedesktop.org/</a> 
<em>(required if MuPDF is not available; not required otherwise)</em></li>
 <li><strong>GhostScript</strong> for alternate PDF rendering &mdash; <a 
href="http://www.cs.wisc.edu/~ghost/";>www.cs.wisc.edu/~ghost</a> <em>(required 
if neither MuPDF nor Xpdf/Poppler utilities are available; not required 
otherwise)</em></li>
 <li><strong>xdg-utils</strong> for starting web or e-mail hyperlinks from PDF 
documents &mdash; <a 
href="http://portland.freedesktop.org/";>portland.freedesktop.org</a> 
<em>(recommended; does not apply to Win32)</em></li>
@@ -86,16 +86,16 @@
 
 <p>On Unix-like systems, these dependencies are typically available in the 
major distributions' package repositories and can be installed easily with the 
package managers, e.g.:</p>
 <ul>
-<li><strong>Debian</strong>/<strong>Ubuntu</strong>: <code>aptitude install 
python-pygame python-imaging pdftk mupdf-tools xdg-utils mplayer 
ffmpeg</code></li>
-<li><strong>Fedora</strong>: <code>yum -i pygame python-pillow pdftk mupdf 
xdg-utils mplayer ffmpeg</code></li>
-<li><strong>Arch Linux</strong> with AUR: <code>pacman -S python2-pygame 
python2-pillow pdftk mupdf xdg-utils mplayer ffmpeg</code></li>
+<li><strong>Debian</strong>/<strong>Ubuntu</strong>: <code>aptitude install 
python3-pygame python3-pil pdftk mupdf-tools xdg-utils mplayer 
ffmpeg</code></li>
+<li><strong>Fedora</strong>: <code>yum -i python3-pygame python3-pillow pdftk 
mupdf xdg-utils mplayer ffmpeg</code></li>
+<li><strong>Arch Linux</strong> with AUR: <code>pacman -S python3-pygame 
python3-pillow pdftk mupdf xdg-utils mplayer ffmpeg</code></li>
 <li>Mac OS X with <strong>MacPorts</strong>: <code>port install py27-game 
py27-pil pdftk mupdf xdg-utils mplayer ffmpeg</code></li>
 </ul>
 
 <h3>Using the latest version from SVN</h3>
 
 <p>The source code of Impressive is maintained in a Subversion (SVN) 
repository. For users that want the newest version or want to help with 
debugging or developing Impressive, it is recommended to check out this 
repository:<br />
-<code class="pre">    svn co 
http://svn.emphy.de/impressive/trunk/impressive</code><br />
+<code class="pre">    svn co 
https://svn.emphy.de/impressive/trunk/impressive</code><br />
 Regarding external dependencies, the section above applies as well; in 
addition, Subversion (whose package is usually called <code>svn</code> or 
<code>subversion</code>) is obviously required too.</p>
 
 <p>After checking out the sources, the <code>impressive.py</code> program will 
still be missing. Instead, the main program is called 
<code>impressive_dev.py</code> and is functionally equivalent; it pulls the 
actual source files from the <code>src</code> subdirectory and runs them. To 
get a real stand-alone <code>impressive.py</code> file for installation or 
redistribution, it needs to be generated using either <code>make</code> (if GNU 
Make is installed) or <code>python compile.py</code>. On Linux systems, 
<code>sudo make install</code> can then be used to install Impressive at 
<code>/usr/local/bin/impressive</code> and its manpage at 
<code>/usr/local/man/man1/impressive.1</code>. These two installed files can be 
removed again with <code>sudo make uninstall</code>.</p>
@@ -190,10 +190,10 @@
 <dd>If this option is specified, Impressive will not start a normal 
presentation, but instead enter the so-called &raquo;Event Test Mode&laquo; 
after the display has been initialized. In this mode, Impressive will simply 
capture all keyboard and mouse events and display the name of the last event on 
the screen. In addition, events will be logged to standard output. This mode 
helps with determining the event names for each key when creating a custom 
control configuration (see the <a href="#controls">Control Configuration</a> 
section).</dd>
 
 <dt><code>-f</code></dt>
-<dd>Sets the window/fullscreen mode Impressive shall start up with. This 
option can be specified multiple times; each times it is found, the next of the 
three options is selected, in the follwing order:<ul style="margin-top:0; 
margin-bottom:0;">
+<dd>Sets the window/fullscreen mode Impressive shall start up with. This 
option can be specified multiple times; each times it is found, the next of the 
three options is selected, in the following order:<ul style="margin-top:0; 
margin-bottom:0;">
 <li><!--man (1.) -->True <strong>fullscreen mode</strong>, including setting 
the video mode. This is the default mode.</li>
 <li><!--man (2.) --><strong>Windowed</strong> mode, where Impressive runs in a 
standard window.</li>
-<li><!--man (3.) -->&raquo;<strong>Fake-fullscreen</strong>&laquo; mode, where 
fullscreen is emulated by uding a window without border that fills the whole 
screen. Setting the display resolution is not possible in this mode.</li>
+<li><!--man (3.) -->&raquo;<strong>Fake-fullscreen</strong>&laquo; mode, where 
fullscreen is emulated by using a window without border that fills the whole 
screen. Setting the display resolution is not possible in this mode.</li>
 </ul>Each of these modes has a corresponding long option that enables it 
directly (<code>--fullscreen</code>, <code>--windowed</code> and 
<code>--fake-fullscreen</code>).<br />
 <!--man:off-->
 <strong>Note:</strong> On Windows systems, toggling fullscreen mode while 
Impressive runs does <em>not</em> work. So, the command-line options are the 
only way to set whether fullscreen mode shall be used or not.
@@ -255,7 +255,7 @@
 
 <dt><code>--noblur</code></dt>
 <dd>By default, Impressive uses a fragment shader to blur and desaturate the 
image when in highlight box or spotlight mode. This is usually the faster and 
nicer-looking method; however, some very old hardware implementations can't 
deal with that shader and fall back to an unusably slow software 
implementation. Impressive tries to detect scenarios where this would happen 
and automatically falls back to a different implementation.<br />
-There might be situations where this machanism fails and Impressive tries to 
use the non-functional shader anyway. In these cases, the <code>--noblur</code> 
option can be used to enforce the fallback implementation.</dd>
+There might be situations where this mechanism fails and Impressive tries to 
use the non-functional shader anyway. In these cases, the <code>--noblur</code> 
option can be used to enforce the fallback implementation.</dd>
 
 <dt><code>-N</code> or <code>--nocursor</code></dt>
 <dd>This option disables any display of a mouse cursor, i.e. neither the 
system (&raquo;hardware&laquo;) not bitmap (&raquo;software&laquo;) cursor is 
shown at any time. This is mainly useful for automated presentations, where no 
mouse interaction is needed.</dd>
@@ -324,7 +324,7 @@
 <dt><code>--time-display</code></dt>
 <dd>This option enables display of the elapsed presentation time, as if the 
<strong>T</strong> key has been pressed immediately after startup. This implies 
time tracking mode (<code>--tracking</code> option).</dd>
 
-<dt><code>-t <em>&lt;ms&gt;</em></code> or <code>--transition 
<em>&lt;trans1[,trans2...]&gt;</em></code></dt>
+<dt><code>-t <em>&lt;trans1[,trans2...]&gt;</em></code> or <code>--transition 
<em>&lt;trans1[,trans2...]&gt;</em></code></dt>
 <dd>Using this switch, the set of transitions Impressive will randomly draw at 
page changes can be specified. If only one transition class is specified, this 
class will be used for all pages that do not have another transition explicitly 
assigned in their page properties. Multiple transitions have to be separated by 
commas; they will be used in random order. The <code>-l</code> option can be 
used to get a list of available transitions.</dd>
 
 <dt><code>-T <em>&lt;ms&gt;</em></code> or <code>--transtime 
<em>&lt;ms&gt;</em></code></dt>
@@ -372,7 +372,7 @@
 <dd>Specifies how much the non-selected parts of the screen shall become 
darker in box-zoom mode. The value is specified in percent, with 90 being the 
default. A value of zero would mean no darkening at all (parts outside of the 
zoom box would still be perfectly visible), and a value of 100 would make 
everything but the selected region black.</dd>
 
 <dt><code>-Z <em>&lt;ms&gt;</em></code> or <code>--zoomtime 
<em>&lt;ms&gt;</em></code></dt>
-<dd>Sets the duration (in milliseconds) of the zoom, box-zoom and overview 
page zoom-in/zoom-out effects, all at once. Default value: 250 ms.<br />
+<dd>Sets the duration (in milliseconds) of the zoom, box-zoom and overview 
page zoom-in/zoom-out effects, all at once. Default value: 250&nbsp;ms.<br />
 If separate animation time settings for overview zoom and zoom/box-zoom are 
desired, the <code>-Z</code>/<code>--zoomtime</code> option must be specified 
<em>before</em> the <code>--overtime</code> option.</dd>
 
 <dt><code>--cachefile <em>&lt;filename&gt;</em></code></dt>
@@ -800,6 +800,12 @@
 <dt><code>skip</code></dt>
 <dd>This boolean property can be set to 1/<code>True</code> if the page shall 
be skipped during the presentation.<br />Pages with <code>overview:True, 
skip:False</code> will be accessible both by cycling through the pages and 
using the overview page,<br />pages with <code>overview:True, skip:True</code> 
will be silently skipped in the normal page cycle, but remain accessible from 
the overview page,<br />pages with <code>overview:False, skip:False</code> will 
appear in the normal cycle, but not on the overview page<br />and pages with 
<code>overview:False, skip:True</code> will not be accessible at all.</dd>
 
+<dt><code>next</code></dt>
+<dd>This property can be set to the number of the page that shall be shown 
after this page. This can be used to skip a lot of pages without setting the 
<code>skip</code> property on each of those, or to create a loop that can only 
be escaped by using the overview page or bookmarks.</dd>
+
+<dt><code>prev</code></dt>
+<dd>This property can be set to the number of the page that shall be shown 
when navigating from this page to the previous page (e.g. using the right mouse 
button or the <strong>Page-Up</strong> key in the default mappings).</dd>
+
 <dt><code>boxes</code></dt>
 <dd>This property stores a list of highlight box coordinates. Normally, there 
is no need to edit this by hand, as Impressive handles this automatically if 
the <strong>S</strong> key is pressed.</dd>
 
@@ -839,7 +845,7 @@
 
 <dt><code>OnEnter</code>, <code>OnLeave</code>, <code>OnEnterOnce</code>, 
<code>OnLeaveOnce</code></dt>
 <dd>These properties can contain a Python callable (i.e. a function reference 
or lambda expression) that is executed when the page is entered or left. The 
<code>~Once</code> variants will only be executed when the page is entered or 
left for the first time. The callable must not take any arguments. This feature 
can be used to associate arbitrary Python code with specific pages, for example 
to execute external programs.<br />
-<strong>Warning:</strong> Lambda expressions cannot be properly processed by 
the Info Script save function (<strong>S</strong> key). If Impressive 
encounters lambda expressions when saving, it will remove them. In addition, it 
will not overwrite the original info script, but generate an extra file that 
needs to be merged withe the original script by hand.</dd>
+<strong>Warning:</strong> Lambda expressions cannot be properly processed by 
the Info Script save function (<strong>S</strong> key). If Impressive 
encounters lambda expressions when saving, it will remove them. In addition, it 
will not overwrite the original info script, but generate an extra file that 
needs to be merged with the original script by hand.</dd>
 
 <dt><code>keys</code></dt>
 <dd>This property can be assigned a dictionary that maps alphanumerical keys 
to Python functions. For example, <code>'keys': { 'x': SomeFunction }</code> 
will invoke <code>SomeFunction()</code> if the lowercase character 'x' is typed 
while the page is displayed. Regarding the functions, the same restrictions as 
for the <code>OnEnter</code>/<code>OnLeave</code> family apply: the function 
must not take any parameters and lambda functions can not be saved. Also note 
that it is not possible to overwrite Impressive's pre-defined key bindings with 
this method.</dd>
@@ -927,7 +933,7 @@
 <li>bug reports</li>
 <li>feature suggestions</li>
 <li>fan mail</li>
-<li>corrections regarding the web page (I'm not a native speaker &ndash; any 
grammatical, ortographical or stylistic corrections or suggestions are 
welcome!)</li>
+<li>corrections regarding the web page (I'm not a native speaker &ndash; any 
grammatical, orthographical or stylistic corrections or suggestions are 
welcome!)</li>
 <li>new silly quotations for the web page's title bar :)</li>
 </ul>
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/Impressive-0.13.0-beta1/impressive.py 
new/Impressive-0.13.0-beta2/impressive.py
--- old/Impressive-0.13.0-beta1/impressive.py   2019-11-20 23:33:19.000000000 
+0100
+++ new/Impressive-0.13.0-beta2/impressive.py   2020-05-31 21:44:02.000000000 
+0200
@@ -21,8 +21,8 @@
 from __future__ import print_function, division, unicode_literals
 
 __title__   = "Impressive"
-__version__ = "0.13.0-beta1"
-__rev__     = 280
+__version__ = "0.13.0-beta2"
+__rev__     = 298
 __author__  = "Martin J. Fiedler"
 __email__   = "[email protected]"
 __website__ = "http://impressive.sourceforge.net/";
@@ -177,6 +177,15 @@
     FontPath = []
     FontList = ["verdana.ttf", "arial.ttf"]
     Nice = []
+    try:
+        dpiOK = (WinDLL("shcore").SetProcessDpiAwareness(2) == 0)  # 
PROCESS_PER_MONITOR_DPI_AWARE
+    except:
+        dpiOK = False
+    if not dpiOK:
+        try:
+            WinDLL("user32").SetProcessDPIAware()
+        except:
+            pass
 else:
     def FindBinary(x): return x
     GhostScriptPlatformOptions = []
@@ -280,6 +289,7 @@
 ResZoomFactor = 1
 HighResZoomFailed = False
 TransitionRunning = False
+TransitionDone = False
 TransitionPhase = 0.0
 CurrentCaption = 0
 OverviewNeedUpdate = False
@@ -367,13 +377,35 @@
         pygame.key.set_repeat(500, 30)
 
     def LoadOpenGL(self):
+        sdl = None
+        
+        # PyGame installations done with pip may come with its own SDL library,
+        # in which case we must not use the default system-wide SDL;
+        # so we need to find out the local library's path
+        try:
+            pattern = 
re.compile(r'(lib)?SDL(?!_[a-zA-Z]+).*?\.(dll|so(\..*)?|dylib)$', re.I)
+            libs = []
+            for suffix in (".libs", ".dylibs"):
+                libdir = os.path.join(pygame.__path__[0], suffix)
+                if os.path.isdir(libdir):
+                    libs += [os.path.join(libdir, lib) for lib in 
sorted(os.listdir(libdir)) if pattern.match(lib)]
+            sdl = libs.pop(0)
+        except (IndexError, AttributeError, EnvironmentError):
+            pass
+
+        # generic case: load the system-wide SDL
+        sdl = sdl or ctypes.util.find_library("SDL") or 
ctypes.util.find_library("SDL-1.2") or "SDL"
+
+        # load the library
         try:
-            sdl = CDLL(ctypes.util.find_library("SDL") or 
ctypes.util.find_library("SDL-1.2") or "SDL", RTLD_GLOBAL)
+            sdl = CDLL(sdl, RTLD_GLOBAL)
             get_proc_address = CFUNCTYPE(c_void_p, 
c_char_p)(('SDL_GL_GetProcAddress', sdl))
         except OSError:
             raise ImportError("failed to load the SDL library")
         except AttributeError:
             raise ImportError("failed to load SDL_GL_GetProcAddress from the 
SDL library")
+
+        # load the symbols
         def loadsym(name, prototype):
             try:
                 addr = get_proc_address(name.encode())
@@ -1266,7 +1298,7 @@
         if not length: return ""
         buf = create_string_buffer(length + 1)
         self._GetShaderInfoLog(shader, length + 1, None, buf)
-        return buf.raw.split('\0', 1)[0]
+        return buf.raw.split(b'\0', 1)[0].decode()
 
     def GetProgrami(self, program, pname):
         res = (c_uint * 1)()
@@ -1278,7 +1310,7 @@
         if not length: return ""
         buf = create_string_buffer(length + 1)
         self._GetProgramInfoLog(program, length + 1, None, buf)
-        return buf.raw.split('\0', 1)[0]
+        return buf.raw.split(b'\0', 1)[0].decode()
 
     def Uniform(self, location, *values):
         if not values:
@@ -1388,7 +1420,9 @@
                 for line in log.split('\n'):
                     print('>', line.rstrip(), file=sys.stderr)
             if not status:
-                raise GLShaderCompileError("failure during %s %s" % 
(self.__class__.__name__, action))
+                if log:
+                    log = ":\n" + log
+                raise GLShaderCompileError("failure during %s %s" % 
(self.__class__.__name__, action) + log)
         def handle_shader(type_enum, type_name, src):
             if gl._is_desktop_gl:
                 src = src.replace("highp ", "")
@@ -3259,7 +3293,7 @@
             TempFileName
         ])
         digits = GetFileProp(filename, 'digits', 6)
-        try_digits = range(6, 0, -1)
+        try_digits = list(range(6, 0, -1))
         try_digits.sort(key=lambda n: abs(n - digits))
         try_digits = [(n, TempFileName + ("-%%0%dd.ppm" % n) % page) for n in 
try_digits]
         for digits, imgfile in try_digits:
@@ -4265,19 +4299,22 @@
 
 # get next/previous page
 def GetNextPage(page, direction):
-    try_page = page
+    checked_pages = set()
     while True:
-        try_page += direction
-        if try_page == page:
-            return 0  # tried all pages, but none found
+        checked_pages.add(page)
+        page = GetPageProp(page,
+            ('prev' if (direction < 0) else 'next'),
+            page + direction)
+        if page in checked_pages:
+            return 0  # we looped around completely and found nothing
         if Wrap:
-            if try_page < 1: try_page = PageCount
-            if try_page > PageCount: try_page = 1
+            if page < 1: page = PageCount
+            if page > PageCount: page = 1
         else:
-            if try_page < 1 or try_page > PageCount:
+            if page < 1 or page > PageCount:
                 return 0  # start or end of presentation
-        if not GetPageProp(try_page, 'skip', False):
-            return try_page
+        if not GetPageProp(page, 'skip', False):
+            return page
 
 # pre-load the following page into Pnext/Tnext
 def PreloadNextPage(page):
@@ -4446,10 +4483,12 @@
         return None
 
 # perform a transition to a specified page
-def TransitionTo(page, allow_transition=True):
+def TransitionTo(page, allow_transition=True, notify_page_left=True):
     global Pcurrent, Pnext, Tcurrent, Tnext
     global PageCount, Marking, Tracing, Panning
     global TransitionRunning, TransitionPhase
+    global TransitionDone
+    TransitionDone = False
 
     # first, stop video and kill the auto-timer
     if VideoPlaying:
@@ -4470,7 +4509,10 @@
     LeaveZoomMode(allow_transition)
 
     # notify that the page has been left
-    PageLeft()
+    if notify_page_left:
+        PageLeft()
+    if TransitionDone:
+        return 1  # nested call to TransitionTo() detected -> abort here
 
     # box fade-out
     if GetPageProp(Pcurrent, 'boxes') or Tracing:
@@ -4543,8 +4585,11 @@
     # finally update the screen and preload the next page
     DrawCurrentPage()
     PageEntered()
+    if TransitionDone:
+        return 1
     if not PreloadNextPage(GetNextPage(Pcurrent, 1)):
         PreloadNextPage(GetNextPage(Pcurrent, -1))
+    TransitionDone = True
     return 1
 
 # zoom mode animation
@@ -5594,7 +5639,7 @@
         if z <= 1:
             return DrawCurrentPage()
         if HalfScreen:
-            tx = MarkLR[0]
+            tx = max(MarkLR[0], MarkUL[0])
         else:
             tx = (MarkUL[0] + MarkLR[0]) * 0.5
         ty = (MarkUL[1] + MarkLR[1]) * 0.5
@@ -6275,14 +6320,19 @@
         border = max(OverviewLogoBorder, 2 * OverviewBorder)
         maxsize = (OverviewCellX - border, OverviewCellY - border)
         if (dummy.size[0] > maxsize[0]) or (dummy.size[1] > maxsize[1]):
-            dummy.thumbnail(ZoomToFit(dummy.size, maxsize, force_int=True), 
Image.ANTIALIAS)
-        margX = (OverviewCellX - dummy.size[0]) // 2
-        margY = (OverviewCellY - dummy.size[1]) // 2
-        dummy = dummy.convert(mode='RGB')
-        for page in range(OverviewPageCount):
-            pos = OverviewPos(page)
-            OverviewImage.paste(dummy, (pos[0] + margX, pos[1] + margY))
-        del dummy
+            size = ZoomToFit(dummy.size, maxsize, force_int=True)
+            if min(size) > 0:
+                dummy.thumbnail(size, Image.ANTIALIAS)
+            else:
+                dummy = None
+        if dummy:
+            margX = (OverviewCellX - dummy.size[0]) // 2
+            margY = (OverviewCellY - dummy.size[1]) // 2
+            dummy = dummy.convert(mode='RGB')
+            for page in range(OverviewPageCount):
+                pos = OverviewPos(page)
+                OverviewImage.paste(dummy, (pos[0] + margX, pos[1] + margY))
+            del dummy
 
     # compute auto-advance timeout, if applicable
     if EstimatedDuration and AutoAutoAdvance:


Reply via email to