Provided by: pympress_1.8.5-1_all bug

NAME

       pympress - pympress documentation

CONTENTS

   What is Pympress?
       Pympress  is a PDF presentation tool designed for dual-screen setups such as presentations
       and public talks.  Highly configurable, fully-featured, and portable

       It comes with many great features (more below):

       • supports embedded gifs (out of the box), videos,  and  audios  (with  VLC  or  Gstreamer
         integration)

       • text annotations displayed in the presenter window

       • natively supports beamer's notes on second screen, as well as Libreoffice notes pages!

       Pympress is a free software, distributed under the terms of the GPL license (version 2 or,
       at your option, any later version).

       Pympress was originally created and maintained by Schnouki  <https://github.com/Schnouki>,
       on his repo <https://github.com/Schnouki/pympress>.

   Installing
       • Ubuntu  20.04  focal  or  newer,  Debian  11  Bullseye or newer (maintained by @mans0954
         <https://github.com/mans0954>)

            apt-get install pympress libgtk-3-0 libpoppler-glib8 libcairo2 python3-gi python3-gi-cairo gobject-introspection libgirepository-1.0-1 gir1.2-gtk-3.0 gir1.2-poppler-0.18

       • RPM-based Linux (Fedora, CentOS, Mageia, OpenSuse, RHEL)

         You can get pympress from the pympress COPR repo of your system.

         With yum or dnf, simply do:

            dnf copr enable cimbali/pympress
            dnf install python3-pympress

         With zypper, fetch the link of the .repo in the table at the bottom of the COPR page and
         add it as a source.

            zypper addrepo https://copr.fedorainfracloud.org/coprs/cimbali/pympress/repo/opensuse-tumbleweed/cimbali-pympress-opensuse-tumbleweed.repo
            zypper install python3-pympress

       • Arch Linux from AUR (maintained by @Jose1711 <https://github.com/jose1711>)

            git clone https://aur.archlinux.org/python-pympress.git
            cd python-pympress
            makepkg -si

         Or using any other tool to manage AUR packages (yay, pacaur, etc.):

            yay -S python-pympress

       • macOS using Homebrew <https://brew.sh/>

            brew install pympress

       • Windows    with    Chocolatey   <https://chocolatey.org/>   (maintained   by   @ComFreek
         <https://github.com/ComFreek>)

            choco install pympress

         Or using the Windows Package Manager (winget)

            winget install pympress

         Or   download   the    latest    installer    from    the    latest    Github    release
         <https://github.com/Cimbali/pympress/releases/latest>.

         • If  you  get  an  error  message along the lines of "MSVCP100.dll is missing", get the
           Visual    C++    2010    redistributables    from    Microsoft    (x86    (32     bit)
           <https://www.microsoft.com/en-in/download/details.aspx?id=5555>   or   x64  (64  bits)
           <https://www.microsoft.com/en-us/download/details.aspx?id=14632>).   Those   libraries
           really should already be installed on your system.

       • Other  systems,  directly from PyPI  − requires python, gtk+3, poppler, and their python
         bindings:

            python3 -m pip install "pympress"

         • Make sure you have all  the  dependencies.  (These  are  already  included  in  binary
           packages or their dependencies.)

         • Using  pip,  you may want to install with the --user option, or install from github or
           downloaded    sources.     See    the    python    documentation     on     installing
           <https://docs.python.org/3.7/installing/index.html>.

         • If your python environment lacks the Gobject Introspections module, try

           1. using         --system-site-packages         for        virtual        environments
              <https://docs.python.org/3.7/library/venv.html>,

           2. installing pygobject from pip (pip install pygobject, which  requires  the  correct
              development/header  packages.   See the PyPI installation instructions of PyGObject
              for your system <https://pygobject.readthedocs.io/en/latest/getting_started.html>).

   Notes
       To support playing embedded videos in the PDFs, your system must have VLC installed  (with
       the  same bitness as pympress).  VLC is not distributed with pympress, but it is certainly
       available    in    your    system’s    package    manager    and    on    their    website
       <https://www.videolan.org/vlc/>.

   Usage
   Opening a file
       Simply  start Pympress and it will ask you what file you want to open.  You can also start
       pympress from the command line with a file to open like so: pympress slides.pdf or python3
       -m pympress slides.pdf

   Functionalities
       All  functionalities are available from the menus of the window with slide previews. Don't
       be afraid to experiment with them!

       Keyboard shortcuts are also listed in these menus. Some more  usual  shortcuts  are  often
       available, for example Ctrl+L, and F11 also toggle fullscreen, though the main shortcut is
       just F.

       A few of the fancier functionalities are listed here:

       • Two-screen display: See on your laptop or tablet display the  current  slide,  the  next
         slide,  the  talk  time  and  wall-clock  time, and annotations (either PDF annotations,
         beamer notes on second slide, or Libreoffice notes pages).  The position of  the  beamer
         or  Libreoffice notes in the slide is detected automatically and can be overridden via a
         menu option.

         If you do not want to use second-slide beamer notes but prefer to have  notes  on  their
         own pages, you can enable auto-detection of these notes.  Use the following snippet that
         prefixes the page labels with notes: on notes pages:

            \addtobeamertemplate{note page}{}{\thispdfpagelabel{notes:\insertframenumber}}

       • Media support: supports playing video, audio, and gif files embedded in (or linked from)
         the PDF file, with optional start/end times and looping.

       • Highlight mode: Allows one to draw freehand on the slide currently on screen.

       • Go To Slide: To jump to a selected slide without flashing through the whole presentation
         on the projector, press G or click the "current  slide" box.  Using J  or  clicking  the
         slide label will allow you to navigate slide labels instead of page numbers, useful e.g.
         for multi-page slides from beamer \pause.

         A spin box will appear, and you will be able to navigate  through  your  slides  in  the
         presenter  window only by scrolling your mouse, with the Home/Up/Down/End keys, with the
         + and - buttons of the spin box, or simply by typing in the number of the  slide.  Press
         Enter to validate going to the new slide or Esc to cancel.

       • Deck  Overview: Pressing D will open an overview of your whole slide deck, and any slide
         can be opened from can simply clicking it.

       • Software pointer: Clicking on the slide (in either window) while holding ctrl down  will
         display  a  software laser pointer on the slide. Or press L to permanently switch on the
         laser pointer.

       • Talk time breakdown: The Presentation > Timing Breakdown menu item displays a  breakdown
         of  how  much  time  was  spent  on  each  slide,  with  a  hierarchical  breakdown  per
         chapters/sections/etc. if available in the PDF.

       • Automatic file reloading: If the file is modified, pympress will reload it (and preserve
         the current slide, current time, etc.)

       • Big button mode: Add big buttons (duh) for touch displays.

       • Swap screens: If Pympress mixed up which screen is the projector and which is not, press
         SAutomatic full screen: pympress will automatically put the content window fullscreen  on
         your non-primay screen when:

         • connecting a second screen,

         • extending your desktop to a second screen that was mirroring your main screen,

         • when  starting  pympress  on  a two-screen display.  To disable this behaviour, untick
           “Content fullscreen” under the “Starting configuration” menu.

       • Estimated talk time: Click the Time estimation box and set your planned  talk  duration.
         The color will allow you to see at a glance how much time you have left.

       • Adjust screen centering: If your slides' form factor doesn't fit the projectors' and you
         don't want the slide centered in the window, use  the  "Screen  Center"  option  in  the
         "Presentation" menu.

       • Resize  Current/Next  slide:  You  can drag the bar between both slides on the Presenter
         window to adjust their relative sizes to your liking.

       • Caching: For efficiency, Pympress caches rendered pages (up to 200 by default). If  this
         is too memory consuming for you, you can change this number in the configuration file.

       • Configurability:  Your  preferences  are saved in a configuration file, and many options
         are accessible there directly. These include:

         • Customisable key bindings (or shortcuts),

         • Configurable layout of the presenter window, with 1 to 16 next slides preview

         • and many more.

         See the configuration file documentation for more details,

       • Editable PDF annotations: Annotations  can  be  added,  removed,  or  changed,  and  the
         modified PDF files can be saved

       • Automatic next slide and looping

   Command line arguments-h, --help: Shows a list of all command line arguments.

       • -t  mm[:ss],  --talk-time=mm[:ss]:  The  estimated  (intended)  talk time in minutes and
         optionally seconds.

       • -n position, --notes=position: Set the position of notes on the pdf  page  (none,  left,
         right, top, or bottom). Overrides the detection from the file.

       • --log=level: Set level of verbosity in log file (DEBUG, INFO, WARNING, ERROR).

   Media and autoplay
       To enable media playback, you need to have either:

       • Gstreamer  installed  (enabled  by  default),  with  its gtk plugin (libgstgtk) which is
         sometimes packaged separately (e.g. as gst-plugin-gtk or gstreamer1.0-gtk3), and plugins
         gstreamer-good/-bad/-ugly based on which codecs you need, or

       • VLC  installed (and the python-vlc module), with enabled = on under the [vlc] section of
         your config file.

       On  macOS,  issues  with  the  gstreamer  brew  formula   may   require   users   to   set
       GST_PLUGIN_SYSTEM_PATH  manually.  For default homebrew configurations the value should be
       /opt/homebrew/lib/gstreamer-1.0/. Make sure to set this environmental  variable  globally,
       or pympress might not pick it up.

       To  produce  PDFs  with  media  inclusion,  the ideal method is to use beamer’s multimedia
       package, always with \movie:

          \documentclass{beamer}
          \usepackage{multimedia}

          \begin{frame}{Just a mp4 here}
              \centering
              \movie[width=0.3\textwidth]{\includegraphics[width=0.9\textwidth]{frame1.png}}{movie.mp4}

              \movie[width=0.3\textwidth]{}{animation.gif}

              \movie[width=0.3\textwidth]{}{ding.ogg}
          \end{frame}

       If you desire autoplay, ensure you have pympress ≥ 1.7.0 and poppler ≥ 21.04, and use  the
       movie15 package as follows:

          \documentclass{beamer}
          \usepackage{movie15}
          \begin{document}

          \begin{frame}
            \begin{center}
              \includemovie[attach=false,autoplay,text={%
                  \includegraphics{files/mailto.png}%
                }]{0.4\linewidth}{0.3\linewidth}{files/random.mpg}
            \end{center}
          \end{frame}

          \end{document}

   Dependencies
       Pympress relies on:

       • Python  (version ≥ 3.4, python 2.7 is supported only until pympress 1.5.1, and 3.x < 3.4
         until v1.6.4).

       • Poppler <http://poppler.freedesktop.org/>, the PDF rendering library.

       • Gtk+ 3 <http://www.gtk.org/>, a toolkit for creating graphical user interfaces, and  its
         dependencies <https://www.gtk.org/overview.php>, specifically:

         • Cairo  <https://www.cairographics.org/>  (and python bindings for cairo), the graphics
           library which is used to pre-render and draw over PDF pages.

         • Gdk, a lower-level graphics library to handle icons.

       • PyGi, the python bindings for Gtk+3 <https://wiki.gnome.org/Projects/PyGObject>. PyGi is
         also known as pygobject3, just pygobject or python3-gi.

         • Introspection bindings for poppler may be shipped separately, ensure you have those as
           well (typelib-1_0-Poppler-0_18 on OpenSUSE, gir1.2-poppler-0.18 on Ubuntu)

       • optionally VLC <https://www.videolan.org/vlc/>, to play videos (with the same bitness as
         Python) and the python-vlc <https://pypi.org/project/python-vlc/> bindings.

       • optionally Gstreamer to play videos (which is a Gtk library)

   On linux platforms
       The  dependencies are often installed by default, or easily available through your package
       or software manager.  For example, on ubuntu, you can run the following as  root  to  make
       sure you have all the prerequisites assuming you use python3:

          apt-get install python3 python3-pip libgtk-3-0 libpoppler-glib8 libcairo2 python3-gi python3-cairo python3-gi-cairo gobject-introspection libgirepository-1.0-1 libgirepository1.0-dev gir1.2-gtk-3.0 gir1.2-poppler-0.18

       Different  distributions  might have different package naming conventions, for example the
       equivalent on OpenSUSE would be:

          zypper install python3 python3-pip libgtk-3-0 libpoppler-glib8 libcairo2 python3-gobject python3-gobject-Gdk python3-cairo python3-gobject-cairo typelib-1_0-GdkPixbuf-2_0 typelib-1_0-Gtk-3_0 typelib-1_0-Poppler-0_18

       On CentOS/RHEL/Fedora the dependencies would be:

          yum install python36 python3-pip gtk3 poppler-glib cairo gdk-pixbuf2 python3-gobject python3-cairo

       And on Arch Linux:

          pacman -S --needed python python-pip gtk3 poppler cairo gobject-introspection poppler-glib python-gobject gst-plugin-gtk

   On macOS
       Dependencies can be installed using Homebrew <https://brew.sh/>:

          brew install --only-dependencies pympress

   On windows
       The binary installer for windows comes with pympress and all its dependencies packaged.

       Alternately, in order to install from pypi or from source on windows, there are  two  ways
       to get the dependencies:

       1. using MSYS2 (replace x86_64 with i686 if you're using a 32 bit machine).

          Warning: this can take a substantial amount of disk size as it requires a full software
          distribution and building platform.

             pacman -S --needed mingw-w64-x86_64-gtk3 mingw-w64-x86_64-cairo mingw-w64-x86_64-poppler mingw-w64-x86_64-python3 mingw-w64-x86_64-vlc python3-pip mingw-w64-x86_64-python3-pip mingw-w64-x86_64-python3-gobject mingw-w64-x86_64-python3-cairo

          This   is   also   the   strategy    used    to    automate    builds    on    appveyor
          <https://github.com/Cimbali/pympress/tree/master/scripts/build_msi_mingw.sh>.

       2. Using  PyGobjectWin32. Be sure to check the supported Python versions (up to 3.4 at the
          time of writing), they appear in the FEATURES list in the linked page.

       • Install native python for windows <https://www.python.org/downloads/windows/>

       • Get  GTK+3,  Poppler  and  their  python  bindings  by  executing  the  PyGi   installer
         <https://sourceforge.net/projects/pygobjectwin32/>.   Be  sure to tick all the necessary
         dependencies in the installer (Poppler, Cairo, Gdk-Pixbuf).

       Alternately, you can build your Gtk+3 stack from source using MSVC,  see  the  Gnome  wiki
       <https://wiki.gnome.org/Projects/GTK+/Win32/MSVCCompilationOfGTKStack>   and  this  python
       script that compiles the whole Gtk+3  stack  <https://github.com/wingtk/gvsbuild/>.   This
       strategy  has  not  been  used successfully yet, due to problems building Poppler with its
       introspection        bidings        (i.e.        typelib)        −        see         #109
       <https://github.com/Cimbali/pympress/issues/109>.

   Contributing
       Feel  free  to  clone  this  repo  and  use it, modify it, redistribute it, etc, under the
       GPLv2+.                A               number               of                contributors
       <https://github.com/Cimbali/pympress/graphs/contributors>   have   taken   part   in   the
       development of pympress and submitted pull requests to improve it.

       Be  respectful  of  everyone  and   keep   this   community   friendly,   welcoming,   and
       harrasment-free.  Abusive behaviour will not be tolerated, and can be reported by email at
       me@cimba.li  wrongdoers may be permanently banned.

       Pympress   has   inline   sphinx   documentation   (Google    style    <http://www.sphinx-
       doc.org/en/latest/ext/example_google.html>,  contains  rst syntax), and the docs generated
       from it are hosted on the github pages of this repo <https://pympress.github.io/>.

   Translations
       • Chinese (simplified)

       • Chinese (traditional)

       • Czech

       • Hindi

       • Italian

       • Japanese

       • Polish

       • French

       • German

       • Spanish

       We thank the many contributors of translations: Agnieszka, atsuyaw, Cherrywoods, Dongwang,
       Estel-f,  Fabio  Pagnotta,  Ferdinand  Fichtner, Frederik. blome, FriedrichFröbel, GM, He.
       yifan. xs, Jaroslav Svoboda, Jeertmans, Kristýna,  lazycat,  Leonvincenterd,  LogCreative,
       Lorenzo.  pacchiardi,  Luis  Sibaja, Marcin Dohnalik, marquitul, Morfit, Mzn, Nico, Ogawa,
       Paul, Pierre BERTHOU,  polaksta,  Saulpierotti,  Shebangmed,  Stanisław  Polak,  susobaco,
       Tapia, Tejas, Timo Zhang, Tkoyama010, Toton95, Vojta Netrh, Vulpeculus, and  Cimbali.

       If  you  also want to add or contribute to a translation, check pympress’ page on POEditor
       <https://poeditor.com/join/project/nKfRxeN8pS>.  Note that old strings are kept and tagged
       removed, to give context and keep continuity between translations of succcessive versions.
       This means removed strings are unused and do not need translating.

   Packages
       Official  releases  are  made  to  PyPI  <https://pypi.org/>  and  with  github   releases
       <https://github.com/Cimbali/pympress/releases>.  The community maintains a number of other
       packages or recipes to install pympress (see Install section). Any additions welcome.

   Configuration file
       Pympress has a number of options available from its configuration file.

       This file is usually located in:

       • ~/.config/pympress on Linux,

       • %APPDATA%/pympress.ini on Windows,

       • ~/Library/Preferences/pympress on macOS,

       • in the top-level of the pympress install directory for portable installations.

       The path to the currently used configuration file can be  checked  in  the  Help  >  About
       information window.

   Shortcuts
       The  shortcuts  are  parsed  using  Gtk.accelerator_parse()  <https://lazka.github.io/pgi-
       docs/#Gtk-3.0/functions.html#Gtk.accelerator_parse>:
          The format looks like “<Control>a” or “<Shift><Alt>F1” or “<Release>z” (the last one is
          for key release).

          The  parser  is  fairly  liberal and allows lower or upper case, and also abbreviations
          such as “<Ctl>”  and  “<Ctrl>”.  Key  names  are  parsed  using  Gdk.keyval_from_name()
          <https://lazka.github.io/pgi-docs/#Gdk-3.0/functions.html#Gdk.keyval_from_name>.    For
          character keys the name is not the symbol, but the lowercase name, e.g. one  would  use
          “<Ctrl>minus” instead of “<Ctrl>-”.

       This  means  that  any  value  in this list of key constants <https://lazka.github.io/pgi-
       docs/#Gdk-3.0/constants.html#Gdk.KEY_0> is valid (removing the initial Gdk.KEY_ part). You
       can  verify  that  this  value  is  parsed correctly from the Help > Shortcuts information
       window.

   Layouts
       The panes (current  slide,  next  slide,  notes,  annotations,  etc.)  can  be  rearranged
       arbitrarily  by setting the entries of the layout section in the configuration file.  Here
       are a couple examples of layouts, with Cu the current slide, No  the  notes  half  of  the
       slide, Nx the next slide:

       • All-horizontal layout:

            +----+----+----+
            | Cu | No | Nx |
            +----+----+----+

         Setting:

            notes = {"children": ["current", "notes", "next"], "proportions": [0.33, 0.33, 0.33], "orientation": "horizontal", "resizeable": true}

       • All-vertical layout:

            +----+
            | Cu |
            +----+
            | No |
            +----+
            | Nx |
            +----+

         Setting:

            notes = {"children": ["current", "notes", "next"], "proportions": [0.33, 0.33, 0.33], "orientation": "vertical", "resizeable": true}

       • Vertical layout with horizontally divided top pane:

            +----+----+
            | Cu | No |
            +----+----+
            |    Nx   |
            +---------+

         Setting:

            notes = {"children": [
                           {"children": ["current", "notes"], "proportions": [0.5, 0.5], "orientation": "horizontal", "resizeable": true},
                           "next"
                      ], "proportions": [0.5, 0.5], "orientation": "vertical", "resizeable": true}

       • Horizontal layout with horizontally divided right pane:

            +----+----+
            |    | Nx |
            + Cu +----+
            |    | No |
            +---------+

         Setting:

            notes = {"children": [
                           "current",
                           {"children": ["next", "notes"], "proportions": [0.5, 0.5], "orientation": "vertical", "resizeable": true}
                      ], "proportions": [0.5, 0.5], "orientation": "horizontal", "resizeable": true}

       And so on. You can play with the items, their nesting, their order, and the orientation in
       which a set of widgets appears.

       For each entry  the  widgets  (strings  that  are  leaves  of  "children"  nodes  in  this
       representation) must be:

       • for notes: "current", "notes", "next"

       • for  plain:  "current", "next" and "annotations" (the annotations widget is toggled with
         the A key by default)

       • for highlight: same as plain with "highlight" instead of "current"

       A few further remarks:

       • If you set "resizeable" to false, the panes  won’t  be  resizeable  dynamically  with  a
         handle in the middle

       • "proportions"  are  normalized,  and  saved  on  exit  if  you  resize  panes during the
         execution. If you set them to 4 and 1, the panes will be 4 / (4 + 1) = 20% and 1 / (4  +
         1) = 100%, so the ini will contain something like 0.2 and 0.8 after executing pympress.

   Themes on Windows
       Pympress  uses the default Gtk theme of your system, which makes it easy to change on many
       OSs    either    globally    via    your    Gtk    preferences    or    per    application
       <https://www.linuxuprising.com/2019/10/how-to-use-different-gtk-3-theme-for.html>.  Here’s
       the way to do it on windows:

       1. Install a theme

          There are 2 locations, either install  the  theme  for  all  your  gtk  apps,  e.g.  in
          C:\Users\%USERNAME%\AppData\Local\themes,    or    just    for    pympress,    so    in
          %INSTALLDIR%\share\themes                (for                 me                 that’s
          C:\Users\%USERNAME%\AppData\Local\Programs\pympress\share\themes)

          Basically  pick  a  theme  e.g.  from  this  list  of  dark  themes <https://www.gnome-
          look.org/browse/cat/135/ord/rating/?tag=dark>  and  make  sure  to  unpack  it  in  the
          selected    directory,    it    needs    at   least   %THEMENAME%\gtk-3.0\gtk.css   and
          %THEMENAME%\index.theme, where THEMENAME is the name of the theme.

          There are 2 pitfalls to be aware of, to properly install a theme:

          • themes that are not self-contained (relying on re-using css from default linux themes
            that you might not have), and

          • linux links (files under gtk-3.0/ that point to a directory above and that need to be
            replaced by a directory containing the contents of the target directory that has  the
            same name as the link file).

       2. Set the theme as default

          Create  a  settings.ini  file,  either  under C:\Users\%USERNAME%\AppData\Local\gtk-3.0
          (global setting) or %INSTALLDIR%\etc\gtk-3.0 (just pympress) and set the contents:

             [Settings]
             gtk-theme-name=THEMENAME

       In testing this  found these 2 stackoverflow questions useful:

       • Change  GTK+3  look  on  Windows  <https://stackoverflow.com/a/39041558/1387346>   which
         contains a list of all interesting directories

       • How   to   get   native   windows   decorations   on   GTK3  on  Windows  7+  and  MSYS2
         <https://stackoverflow.com/a/37060369/1387346> which details the process

   Pympress package
       This page contains the inline documentation, generated from the code using sphinx.

       The    code    is    documented    in    the    source    using    the    Google     style
       <https://google.github.io/styleguide/pyguide.html>  for  docstrings. Sphinx has gathered a
       set of examples <http://www.sphinx-doc.org/en/latest/ext/example_google.html> which serves
       as a better crash course than the full style reference.

       Retructured text (rst) can be used inside the comments and docstrings.

   Modules
   pympress.__main__ -- The entry point of pympress
       pympress.__main__.main(argv=['/usr/lib/python3/dist-packages/sphinx/__main__.py',    '-N',
       '-bman', 'docs/', 'build/man'])
              Entry point of pympress. Parse command line  arguments,  instantiate  the  UI,  and
              start the main loop.

       pympress.__main__.uncaught_handler(*exc_info)
              Exception handler, to log uncaught exceptions to our log file.

   pympress.app -- The Gtk.Application managing the lifetime and CLI
       class pympress.app.Pympress
              Bases: Application

              Class representing the single pympress Gtk application.

              action_startup_queue = []
                     list  of  actions  to  be passsed to the GUI that were queued before GUI was
                     created

              activate_action(name, parameter=None)
                     Parse an action name and activate it, with parameter wrapped in a Variant if
                     it is not None.

                     Parametersname (str) -- the name of the stateful action

                            • parameter  --  an  object  or  None  to  pass as a parameter to the
                              action, wrapped in a GLib.Variant

              auto_log_level = True
                     bool to automatically upgrade log level (DEBUG / INFO at init, then  ERROR),
                     False if user set log level

              config = None
                     The Config object that holds pympress conferences

              do_activate(timestamp=1715161371.4645379)
                     Activate: show UI windows.

                     Build them if they do not exist, otherwise bring to front.

              do_handle_local_options(opts_variant_dict)
                     Parse command line options, returned as a VariantDict

                     Returns
                            estimated talk time, log level, notes positions.

                     Return type
                            tuple

              do_open(files, n_files, hint)
                     Handle opening files. In practice we only open once, the last one.

                     Parametersfiles (list of File) -- representing an array of files to open

                            • n_files (int) -- the number of files passed.

                            • hint (str) -- a hint, such as view, edit, etc. Should always be the
                              empty string.

              do_shutdown()
                     Perform various cleanups and save preferences.

              do_startup()
                     Common start-up tasks for primary and remote instances.

                     NB. super(self) causes segfaults, Gtk.Application needs to be used as base.

              get_action_state(name)
                     Parse an action name and return its unwrapped state from the Variant.

                     Parameters
                            name (str) -- the name of the stateful action

                     Returns
                            the value contained in the action

                     Return type
                            str, int, bool or float

              gui = None
                     The UI object that is the interface of pympress

              option_descriptions = {'blank': ('Blank/unblank content  screen',  None),  'first':
              ('First  slide',  None),  'last':  ('Last  slide',  None),  'log':  ('Set  level of
              verbosity in log file: DEBUG,  INFO,  WARNING,  ERROR,  or  CRITICAL',  '<level>'),
              'next':  ('Next slide', None), 'notes': ('Set the position of notes on the pdf page
              (none, left, right, top, bottom, after, odd, or prefix).  Overrides  the  detection
              from  the  file.',  '<position>'),  'pause':  ('Toggle pause of talk timer', None),
              'prev': ('Previous slide', None), 'quit': ('Close opened pympress instance', None),
              'reset':  ('Reset  talk timer', None), 'talk-time': ('The estimated (intended) talk
              time in minutes (and optionally seconds)', 'mm[:ss]'), 'version':  ('Print  version
              and exit', None)}

              options   =   {'blank':   (98,   <flags   0   of   type   GLib.OptionFlags>,  <enum
              G_OPTION_ARG_NONE of  type  GLib.OptionArg>),  'first':  (102,  <flags  0  of  type
              GLib.OptionFlags>,  <enum G_OPTION_ARG_NONE of type GLib.OptionArg>), 'last': (108,
              <flags   0   of   type   GLib.OptionFlags>,   <enum   G_OPTION_ARG_NONE   of   type
              GLib.OptionArg>),   'log':   (0,   <flags   0   of  type  GLib.OptionFlags>,  <enum
              G_OPTION_ARG_STRING of type  GLib.OptionArg>),  'next':  (110,  <flags  0  of  type
              GLib.OptionFlags>,  <enum G_OPTION_ARG_NONE of type GLib.OptionArg>), 'notes': (78,
              <flags  0  of   type   GLib.OptionFlags>,   <enum   G_OPTION_ARG_STRING   of   type
              GLib.OptionArg>),   'pause':   (80,  <flags  0  of  type  GLib.OptionFlags>,  <enum
              G_OPTION_ARG_NONE  of  type  GLib.OptionArg>),  'prev':  (112,  <flags  0  of  type
              GLib.OptionFlags>,  <enum G_OPTION_ARG_NONE of type GLib.OptionArg>), 'quit': (113,
              <flags   0   of   type   GLib.OptionFlags>,   <enum   G_OPTION_ARG_NONE   of   type
              GLib.OptionArg>),   'reset':  (114,  <flags  0  of  type  GLib.OptionFlags>,  <enum
              G_OPTION_ARG_NONE of type GLib.OptionArg>), 'talk-time': (116,  <flags  0  of  type
              GLib.OptionFlags>,  <enum  G_OPTION_ARG_STRING of type GLib.OptionArg>), 'version':
              (118,  <flags  0  of  type  GLib.OptionFlags>,  <enum  G_OPTION_ARG_NONE  of   type
              GLib.OptionArg>)}

              quit(*args)
                     Quit and ignore other arguments e.g. sent by signals.

              set_action_enabled(name, value)
                     Parse an action name and set its enabled state to True or False.

                     Parametersname (str) -- the name of the stateful action

                            • value (bool) -- wheether the action should be enabled or disabled

              set_action_state(name, value)
                     Parse an action name and set its state wrapped in a Variant.

                     Parametersname (str) -- the name of the stateful action

                            • value (str, int, bool or float) -- the value to set.

              set_log_level(action, param)
                     Action  that  sets  the  logging  level  (on  the  root logger of the active
                     instance)

                     Parametersaction (Action) -- The action activatd

                            • ( (param) -- class:~`GLib.Variant`): The desired level  as  an  int
                              wrapped in a GLib.Variant

              version_string  =  'Pympress:  1.8.5 ; Python: 3.12.3 ; OS: Linux 5.4.0-177-generic
              #197-Ubuntu SMP Thu Mar 28 22:45:47 UTC 2024 ; Gtk 3.24.41 ; GLib 2.80.1 ;  Poppler
              24.02.0 cairo ; Cairo 1.18.0 , pycairo 1.26.0'

   pympress.ui -- GUI management
       This  module contains the whole graphical user interface of pympress, which is made of two
       separate windows: the Content window, which displays only the current page in  full  size,
       and  the Presenter window, which displays both the current and the next page, as well as a
       time counter and a clock.

       Both windows are managed by the UI class.

       class pympress.ui.UI(app, config)
              Bases: Builder

              Pympress GUI management.

              accel_group = None
                     A AccelGroup to store the shortcuts

              adjust_bottom_bar_font()
                     Scale baseline font size of bottom bar, clipped to 6px..13px. Fonts are then
                     scaled by CSS em indications.

              adjust_frame_position(*args)
                     Select how to align the frame on screen.

              annotations = None
                     Class Annotations managing the display of annotations

              app = None
                     The Pympress instance

              autoplay = None
                     AutoPlay popup to configure automatic playing

              blanked = False
                     track whether we blank the screen

              c_da = None
                     DrawingArea for the Content window.

              c_frame = None
                     AspectFrame for the Content window.

              c_win = None
                     Content window, as a Window instance.

              cache = None
                     SurfaceCache instance.

              cancel_current_input(gaction, param=None)
                     Handle the action cancelling the input, if applicable.

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              change_notes_pos(gaction, target, force=False)
                     Switch the position of the nodes in the slide.

                     Returns
                            the  action  triggering the call target (Variant): the notes position
                            as a string variant force (bool): Whether to force the  notes  switch
                            even if it’s already enabled

                     Return type
                            gaction (Action)

                     Returns
                            whether the notes position has been toggled

                     Return type
                            bool

              chosen_notes_mode = 4
                     Current choice of mode to toggle notes

              cleanup(*args)
                     Save configuration and exit the main loop.

              clear_zoom_cache()
                     Callback to clear the cache of zoomed widgets.

              click_link(widget, event)
                     Check whether a link was clicked and follow it.

                     Handles a click on a slide.

                     Parameterswidget (Widget) -- the widget in which the event occurred

                            • event (Event) -- the event that occurred

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              close_file(*args)
                     Remove the current document.

              close_shortcuts(*args)
                     Destroy the shortcuts window once it is hidden.

              compute_frame_grid(grid_ar, n_frames)
                     Determine  the  arragement  of frames in a grid to maximise their size given
                     respective aspect ratios

                     Parametersgrid_ar (float) -- aspect ratio of grid containing the slides

                            • n_frames (int) -- the number of frames

              config = None
                     Config to remember preferences

              current_page = -1
                     number of page currently displayed in Content window's miniatures

              deck = None
                     Class Overview displaying a view of all slides

              do_page_change(unpause=True, autoplay=False)
                     Switch to another page and display it.

                     This is a kind of event which  is  supposed  to  be  called  only  from  the
                     Document class.

                     Parametersis_preview  (bool) -- True if the page change should not update the
                              content

                            • unpause (bool) -- True if the page change should unpause the timer,
                              False otherwise

                            • autoplay   (bool)   --   True  if  the  page  change  is  triggered
                              automatically, otherwise cancel auto play

              doc = <pympress.document.EmptyDocument object>
                     Current Document instance.

              doc_goto_end(gaction=None, param=None)
                     Handle going to the end of the document

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              doc_goto_home(gaction=None, param=None)
                     Handle going to the start of the document

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              doc_goto_next(gaction=None, param=None)
                     Handle going to the previous page.

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              doc_goto_prev(gaction=None, param=None)
                     Handle going to the next page.

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              doc_hist_next(gaction=None, param=None)
                     Handle going to the next page in the history of visited pages

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              doc_hist_prev(gaction=None, param=None)
                     Handle going to the previous page in the history of visited pages

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              doc_label_next(gaction=None, param=None)
                     Handle going to the next page with a different label.

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              doc_label_prev(gaction=None, param=None)
                     Handle going to the previous page with a different label.

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              error_opening_file(uri)
                     Remove the current document.

                     Parameters
                            uri (str) -- the URI of the document

              est_time = None
                     EstimatedTalkTime to set estimated/remaining talk time

              file_watcher = None
                     A FileWatcher object to reload modified files

              get_notes_mode()
                     Simple getter.

                     Returns
                            Truthy when we split slides in content + notes

                     Return type
                            PdfPage

              goto_page(page, autoplay=False)
                     Handle going to the page passed as argument

                     Parameterspage (int) -- the page to which to go. Will be clipped to  document
                              pages.

                            • autoplay   (bool)   --  whether  this  page  change  was  triggered
                              automatically

              grid_next = None
                     Grid for the next slide(s) in the Presenter window.

              highlight_button = None
                     ToolButton big button for touch screens, go to scribble on screen

              hover_link(widget, event)
                     Manage events related to hyperlinks, setting the cursor to a pointer if  the
                     hovered region is clickable.

                     Parameterswidget (Widget) -- the widget in which the event occurred

                            • event (Event) -- the event that occurred

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              inhibit_cookie = None
                     int or None, may keep track of the Gtk.Application inhibit request

              laser = None
                     Software-implemented laser pointer, Pointer

              laser_button = None
                     ToolButton big button for touch screens, go toggle the pointer

              layout_editor = None
                     LayoutEditor popup to configure the layouts of the presenter window

              layout_name(notes_mode)
                     Return the layout made for the selected notes_mode

                     Parameters
                            notes_mode (PdfPage) -- the mode/positioning of notes

                     Returns
                            a string representing the appropriate layout

                     Return type
                            str

              load_icons()
                     Set the icon list for both windows.

              load_layout(new)
                     Replace the current layout

                     Parameters
                            new  (str)  --  the  name  of the layout to load, None to use current
                            layout automatically

              make_cwin()
                     Initializes the content window.

              make_pwin()
                     Initializes the presenter window.

              medias = None
                     Class Media managing keeping track of and callbacks on media overlays

              menu_about(*args)
                     Display the "About pympress" dialog.

                     Handles clicks on the "about" menu.

              move_window(win, from_bounds, to_bounds)
                     Move window from monitor number from_monitor to monitor to_monitor.

              next_button = None
                     ToolButton big button for touch screens, go to next slide

              next_frames_count = 16
                     int the number of next slides currently on  display  in  the  “Next  slides”
                     pane, initialized to the maximal number

              notes_mode = 0
                     Whether to use notes mode or not

              on_configure_da(widget, event)
                     Manage "configure" events for all drawing areas, e.g. resizes.

                     We tell the local SurfaceCache cache about it, so that it can invalidate its
                     internal cache for the specified widget  and  pre-render  next  pages  at  a
                     correct size.

                     Warning:  Some  not-explicitly sent signals contain wrong values! Just don't
                     resize in that case, since these always  seem  to  happen  after  a  correct
                     signal that was sent explicitly.

                     Parameterswidget (Widget) -- the widget which has been resized

                            • event  (Event)  -- the GTK event, which contains the new dimensions
                              of the widget

              on_configure_win(widget, event)
                     Manage "configure" events for both window widgets.

                     Parameterswidget (Widget) -- the window which has been moved or resized

                            • event (Event) -- the GTK event, which contains the  new  dimensions
                              of the widget

              on_drag_drop(widget, drag_context, x, y, data, info, time)
                     Receive the drag-drops (as text only). If a file is dropped, open it.

                     Parameterswidget (Widget) -- The widget on which the dragged item was dropped

                            • drag_context (DragContext) -- Context object of the dragging

                            • x (float) -- position of the drop

                            • y (float) -- position of the drop

                            • data (SelectionData) -- container for the dropped data

                            • info (int) -- info on the target

                            • time (int) -- time of the drop

              on_draw(widget, cairo_context)
                     Manage draw events for both windows.

                     This  callback may be called either directly on a page change or as an event
                     handler by GTK. In both cases,  it  determines  which  widget  needs  to  be
                     updated, and updates it, using the SurfaceCache if possible.

                     Parameterswidget (Widget) -- the widget to update

                            • cairo_context  (Context)  --  the  Cairo context (or None if called
                              directly)

              on_key_input(widget, event)
                     Handle key strokes at top level, only  for  when  editing  needs  to  bypass
                     action accelerators

                     Parameterswidget (Widget) -- the widget which has received the key stroke

                            • event  (Event)  --  the  GTK  event,  which contains the key stroke
                              details

              on_page_change(widget, event=None)
                     Signal handler for current page editing.

                     Parameterswidget (Widget) -- the  editable  widget  which  has  received  the
                              event.

                            • event (Event) -- the GTK event.

              on_pane_event(widget, evt)
                     Signal handler for gtk.paned events.

                     This function allows one to delay drawing events when resizing, and to speed
                     up redrawing when moving the middle pane is done (which happens at  the  end
                     of a mouse resize)

                     Parameterswidget (Widget) -- the widget in which the event occurred (ignored)

                            • evt (Event) -- the event that occurred

              on_scroll(widget, event)
                     Manage scroll events.

                     Parameterswidget (Widget) -- the widget in which the event occurred (ignored)

                            • event (Event) -- the event that occurred

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              open_file(gaction, target)
                     Open a document.

                     Parametersgaction (Action) -- the action triggering the call

                            • target (Variant) -- the file to open as a string variant

              p_central = None
                     Box for the Presenter window.

              p_da_cur = None
                     DrawingArea for the current slide copy in the Presenter window.

              p_da_notes = None
                     DrawingArea for the current slide in the Presenter window.

              p_das_next = None
                     DrawingArea for the next slide in the Presenter window.

              p_frame_annot = None
                     Frame for the annotations in the Presenter window.

              p_frame_cur = None
                     list of AspectFrame for the current slide copy in the Presenter window.

              p_frame_notes = None
                     AspectFrame for the current slide in the Presenter window.

              p_frames_next = None
                     list of AspectFrame for the next slide in the Presenter window.

              p_win = None
                     Presenter window, as a Window instance.

              page_number = None
                     PageNumber displaying and setting current page numbers

              pane_handle_pos = {}
                     Map of Paned to the relative position (float between 0 and 1) of its handle

              pick_file(*args)
                     Ask the user which file he means to open.

              placeable_widgets = {}
                     Dictionary  of  Widget  from  the  presenter  window that can be dynamically
                     rearranged

              populate_recent_menu(gaction, is_opening=None)
                     Callback for the recent document menu.

                     Gets the URI and requests the document swap.

                     Parametersgaction (Action) -- the action triggering the call

                            • is_opening (Variant) -- a wrapped boolean  indicating  whether  the
                              menu is opening or closing.

              prev_button = None
                     ToolButton big button for touch screens, go to previous slide

              preview_page = -1
                     number of page currently displayed in Presenter window's miniatures

              recent_menu = None
                     A Menu to display the recent files to open

              reconfigure_next_frames(gaction, param)
                     Callback  to  set the number of next frames to preview the the “next slides”
                     panel

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the number of slides as a GVariant

              redraw_current_slide()
                     Callback to queue a redraw of the current slides (in both winows).

              redraw_panes()
                     Handler for Paned's resizing signal.

                     Used for delayed drawing events of drawing areas inside the panes.

                     This is very useful on windows where resizing gets sluggish  if  we  try  to
                     redraw while resizing.

              redraw_timeout = 0
                     Tracks  return  values  of  GLib.timeout_add  to  cancel  gtk.paned's redraw
                     callbacks

              reflow_next_frames(n_frames=None)
                     Set the number of next frames to preview the the “next slides” panel

                     Parameters
                            n_frames (int) -- the number of frames

              reload_document()
                     Reload the current document.

              resize_panes = False
                     Indicates whether we should delay redraws on some drawing areas to  fluidify
                     resizing gtk.paned

              save_file(*args)
                     Remove the current document.

              save_file_as(*args)
                     Remove the current document.

              screens_changed(screen)
                     Handle ::monitors-changed events

                     Parameters
                            screen (Screen) -- the screen

              scribbler = None
                     Class Scribble managing drawing by the user on top of the current slide.

              set_screensaver(disabled)
                     Disable or re-enable the screensaver.

                     Parameters
                            disabled  (bool)  --  True  iff  the  screensaver should be disabled,
                            otherwise enabled.

              setup_screens(screen, event_name='')
                     If multiple monitors, fullscreen windows on monitors according to config.

                     Parametersscreen (Screen) -- the screen

                            • event_name (str) -- a description of what caused the  screen  setup
                              event, for debugging

              shortcuts_window = None
                     A ShortcutsWindow to show the shortcuts

              show_annotations = True
                     Whether to display annotations or not

              show_bigbuttons = True
                     Whether to display big buttons or not

              show_shortcuts(*args)
                     Display the shortcuts window.

              swap_document(doc_uri, page=0, reloading=False)
                     Replace the currently open document with a new one.

                     The  new  document  is  possibly  and EmptyDocument if doc_uri is None.  The
                     state of the ui and cache are updated accordingly.

                     Parametersdoc_uri (str) -- the URI to the new document

                            • page (int) -- the page at which to start the presentation

                            • reloading (bool) -- whether we are  reloading  or  detecting  stuff
                              from the document

              swap_screens(*args)
                     Swap the monitors on which each window is displayed (if there are 2 monitors
                     at least).

              switch_annotations(gaction, target)
                     Switch the display to show annotations or to hide them.

                     Returns
                            the action triggering the call target (Variant): the parameter  as  a
                            variant, or None

                     Return type
                            gaction (Action)

                     Returns
                            whether the mode has been toggled.

                     Return type
                            bool

              switch_bigbuttons(*args)
                     Toggle the display of big buttons (nice for touch screens).

              switch_blanked(gaction, param)
                     Switch the blanked mode of the content screen.

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

                     Returns
                            whether the notes blanking has been toggled.

                     Return type
                            bool

              switch_fullscreen(gaction, target)
                     Switch  the  Content  window  to fullscreen (if in normal mode) or to normal
                     mode (if fullscreen).

                     Screensaver will be disabled when entering fullscreen mode, and enabled when
                     leaving fullscreen mode.

                     Parameters
                            widget (Widget) -- the widget in which the event occurred

                     Returns
                            whether some window's full screen status got toggled

                     Return type
                            bool

              switch_mode(gaction, target_mode=None, force=False)
                     Switch the display mode to "Notes mode" or "Normal mode" (without notes).

                     Returns
                            the  action  triggering  the  call target_mode (PdfPage): the mode to
                            which we should switch force (bool): Whether to force the mode switch
                            even if it’s already enabled

                     Return type
                            gaction (Action)

                     Returns
                            whether the notes mode has been toggled

                     Return type
                            bool

              talk_time = None
                     TimeCounter clock tracking talk time (elapsed, and remaining)

              timing = None
                     TimingReport popup to show how much time was spent on which part

              track_clicks(widget, event)
                     Track mouse press and release events.

                     Handles clicks on the slides.

                     Parameterswidget (Widget) -- the widget that received the click

                            • event (Event) -- the GTK event containing the click position

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              track_motions(widget, event)
                     Track mouse motion events.

                     Handles mouse motions on the "about" menu.

                     Parameterswidget (Widget) -- the widget that received the mouse motion

                            • event (Event) -- the GTK event containing the mouse position

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              unsaved_changes(reload=False)
                     Prompt  the  user  about  what  to  do  with  changes in the document: save,
                     discard, or cancel action

                     Parameters
                            reload (bool) -- The unsaved changes is  prompted  by  reloading  the
                            file

                     Returns
                            True iff we need to cancel the current action

                     Return type
                            bool

              update_frame_position(widget, user_data)
                     Callback to preview the frame alignment, called from the Gtk.SpinButton.

                     Parameterswidget  (SpinButton)  -- The button updating the slide alignment in
                              the drawing area widget

                            • user_data (str) -- The property  being  set,  either  the  x  or  y
                              alignment (resp. xalign and yalign).

              validate_current_input(gaction, param=None)
                     Handle the action validating the input, if applicable.

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              zoom = None
                     Class Zoom managing the zoom level of the current slide.

   pympress.document -- document handling
       This  module  contains  several  classes  that  are  used for managing documents (only PDF
       documents are supported at the moment, but other formats may be added in the future).

       An important point is that this module is  completely  independent  from  the  GUI:  there
       should  not  be  any  GUI-related code here, except for page rendering (and only rendering
       itself: the preparation of the target surface must be done elsewhere).

       class pympress.document.Document(builder, pop_doc, uri)
              Bases: object

              This is the main document handling class.

              The page numbering starts as 0 and is aware of notes  (i.e.  number  of  pages  may
              change  to  account  for note pages).  The document page numbers are the same as in
              Poppler, and also start at 0 but do not depend on notes.

              Parametersbuilder (pympress.builder.Builder) -- A builder to load callbacks

                     • pop_doc (Document) -- Instance of the Poppler  document  that  this  class
                       will wrap

                     • uri (str) -- URI of the PDF file to open

                     • page (int) -- page number to which the file should be opened

              changes = False
                     bool indicating whether there were modifications to the document

              cleanup_media_files()
                     Removes all files that were extracted from the pdf into the filesystem.

              static create(builder, uri)
                     Initializes a Document by passing it a Document.

                     Parametersbuilder (pympress.builder.Builder) -- A builder to load callbacks

                            • uri (str) -- URI to the PDF file to open

                            • page (int) -- page number to which the file should be opened

                     Returns
                            The initialized document

                     Return type
                            Document

              doc = None
                     Current PDF document (Document instance)

              doc_page_labels = []
                     list of all the page labels, indexed on document page numbers

              get_full_path(filename)
                     Returns  full path, extrapolated from a path relative to this document or to
                     the current directory.

                     Parameters
                            filename (Path or str) -- Name of the file or relative path to it

                     Returns
                            the full path to the file or None if it doesn't exist

                     Return type
                            Path

              get_last_label_pages()
                     Return the last page number for each consecutively distinct page label

                     In other words, squash together consecutive same labels

              get_structure(index_iter=None)
                     Gets the structure of the document from its index.

                     Recursive, pass the iterator.

                     Parameters
                            index_iter (IndexIter or None) -- the iterator for the child index to
                            explore.

                     Returns
                            A list of tuples (depth, page number, title)

                     Return type
                            list

              get_uri()
                     Gives access to the URI, rather than the path, of this document.

                     Returns
                            the URI to the file currently opened.

                     Return type
                            str

              goto(number)
                     Switch  to another page. Validates the number and returns one in the correct
                     range. Also updates history.

                     Parameters
                            number (int) -- number of the destination page

              guess_notes(horizontal, vertical, current_page=0)
                     Get our best guess for the document mode.

                     Parametershorizontal (str)  --  A  string  representing  the  preference  for
                              horizontal slides

                            • vertical (str) -- A string representing the preference for vertical
                              slides

                     Returns
                            the notes mode

                     Return type
                            PdfPage

              has_changes()
                     Return whether that some changes were made (e.g. annotations edited)

              has_labels()
                     Return whether this document has useful labels.

                     Returns
                            False iff there are no labels or they are just the page numbers

                     Return type
                            bool

              hist_next(*args)
                     Switch to the page we viewed next.

              hist_pos = -1
                     Our position in the history

              hist_prev(*args)
                     Switch to the page we viewed before.

              history = []
                     History of pages we have visited, using note-aware page numbers

              label_after(page)
                     Switch to the next page with different label.

                     If we're within a set of pages with the same label we want to go to the last
                     one.

              label_before(page)
                     Switch to the previous page with different label.

                     If  we're within a set of pages with the same label we want to go before the
                     first one.

              lookup_label(label, prefix_unique=True)
                     Find a page from its label.

                     Parameterslabel (str) -- the label we are searching for

                            • prefix_unique (bool) -- whether a prefix match  should  be  unique,
                              e.g. when the user is still typing

                     Returns
                            the page

                     Return type
                            int

              made_changes()
                     Notify the document that some changes were made (e.g. annotations edited)

              navigate()
                     callback, to be connected to goto_page()

              nb_pages = -1
                     Number of pages in the document

              notes_mapping = None
                     list  of (slide's document page number, notes' document page number) tuples,
                     or None if there are no notes

              notes_page(number)
                     Get the specified page.

                     Parameters
                            number (int) -- number of the page to return

                     Returns
                            the wanted page, or None if it does not exist

                     Return type
                            Page

              page(number)
                     Get the specified page.

                     Parameters
                            number (int) -- number of the page to return

                     Returns
                            the wanted page, or None if it does not exist

                     Return type
                            Page

              page_labels = []
                     list of slide page labels, indexed on note-aware page numbers

              pages_cache = {}
                     Pages cache (dict of Page). This makes navigation in the document faster  by
                     avoiding calls to Poppler when loading a page that has already been loaded.

              pages_number()
                     Get the number of pages in the document.

                     Returns
                            the number of pages in the document

                     Return type
                            int

              path = None
                     URI

                     Type   Path to pdf if uri is a file

              play_media()
                     callback, to be connected to play()

              remove_on_exit(filename)
                     Remember a temporary file to delete later.

                     Parameters
                            filename (Path) -- The path to the file to delete

              save_changes(dest_uri=None)
                     Save the changes

                     Parameters
                            dest_uri  (str or None) -- The URI where to save the file, or None to
                            save in-place

              set_notes_pos(notes_direction)
                     Set whether where the notes pages are relative to normal pages

                     Valid values are returned by direction()  -  page  number  (aka  Libreoffice
                     notes  mode)  -  page parity (can not be detected automatically, where every
                     other page contains notes) - page mapping (where labels of notes  pages  are
                     corresponding slide labels prefixed with “notes:”)

                     Parameters
                            notes_direction (str) -- Where the notes pages are

              start_editing_page_number()
                     callback, to be connected to start_editing()

              temp_files = {}
                     set of Path representing the temporary files which need to be removed

              uri = None
                     str full path to pdf

       class pympress.document.EmptyDocument
              Bases: Document

              A dummy document, placeholder for when no document is open.

              notes_page(number)
                     Retrieve a page from the document.

                     Parameters
                            number (int) -- page number to be retrieved

                     Returns
                            -1 returns the empty page so we can display something.

                     Return type
                            EmptyPage or None

              page(number)
                     Retrieve a page from the document.

                     Parameters
                            number (int) -- page number to be retrieved

                     Returns
                            -1 returns the empty page so we can display something.

                     Return type
                            EmptyPage or None

       class pympress.document.EmptyPage(parent)
              Bases: Page

              A dummy page, placeholder for when there are no valid pages around.

              This  page is a non-notes page with an aspect ratio of 1.3 and nothing else inside.
              Also, it has no "rendering" capability, and is  made  harmless  by  overriding  its
              render function.

              can_render()
                     Informs that rendering is not necessary (avoids checking the type).

                     Returns
                            False, no rendering

                     Return type
                            bool

              render_cairo(cr, ww, wh, dtype=PdfPage.FULL)
                     Overriding  this  purely for safety: make sure we do not accidentally try to
                     render.

                     Parameterscr (CairoContext) -- target surface

                            • ww (int) -- target width in pixels

                            • wh (int) -- target height in pixels

                            • dtype (PdfPage) -- the type of document that should be rendered

       class pympress.document.Link(x1, y1, x2, y2, action)
              Bases: object

              This class encapsulates one hyperlink of the document.

              Parametersx1 (float) -- first x coordinate of the link rectangle

                     • y1 (float) -- first y coordinate of the link rectangle

                     • x2 (float) -- second x coordinate of the link rectangle

                     • y2 (float) -- second y coordinate of the link rectangle

                     • action (function) -- action to perform when the link is clicked

              static build_closure(fun, *args, **kwargs)
                     Return a lambda that calls fun(*args, **kwargs), with the current  value  of
                     args and kwargs.

                     By creating the lambda in a new scope, we bind the arguments.

                     Parametersfun (function) -- The function to be called

                            • args (tuple) -- non-keyworded variable-length argument list to pass
                              to fun()

                            • kwargs (dict) -- keyworded variable-length argument dict to pass to
                              fun()

              follow(**kwargs)
                     function, action to be perform to follow this link

              is_over(x, y)
                     Tell if the input coordinates are on the link rectangle.

                     Parametersx (float) -- input x coordinate

                            • y (float) -- input y coordinate

                     Returns
                            True  if  the  input coordinates are within the link rectangle, False
                            otherwise

                     Return type
                            bool

              x1 = None
                     float, first x coordinate of the link rectangle

              x2 = None
                     float, second x coordinate of the link rectangle

              y1 = None
                     float, first y coordinate of the link rectangle

              y2 = None
                     float, second y coordinate of the link rectangle

       class  pympress.document.Media(relative_margins,  filename,  autoplay,   repeat,   poster,
       show_controls, type, start_pos, duration)
              Bases: tuple

              A class that holds all the properties for media files

              autoplay
                     Alias for field number 2

              duration
                     Alias for field number 8

              filename
                     Alias for field number 1

              poster Alias for field number 4

              relative_margins
                     Alias for field number 0

              repeat Alias for field number 3

              show_controls
                     Alias for field number 5

              start_pos
                     Alias for field number 7

              type   Alias for field number 6

       class pympress.document.Page(page, number, parent)
              Bases: object

              Class representing a single page.

              It  provides  several  methods used by the GUI for preparing windows for displaying
              pages, managing hyperlinks, etc.

              Parametersdoc (Page) -- the poppler object around the page

                     • number (int) -- number of the page to fetch in the document

                     • parent (Document) -- the parent Document class

              annotations = []
                     All text annotations

              can_render()
                     Informs that rendering is necessary (avoids checking the type).

                     Returns
                            True, do rendering

                     Return type
                            bool

              get_annot_action(link_type, action, rect)
                     Get the function to be called when the link is followed.

                     Parameterslink_type (ActionType) -- The link type

                            • action (Action) -- The action to be  performed  when  the  link  is
                              clicked

                            • rect (Rectangle) -- The region of the page where the link is

                     Returns
                            The function to be called to follow the link

                     Return type
                            function

              get_annotations()
                     Get the list of text annotations on this page.

                     Returns
                            annotations on this page

                     Return type
                            list of str

              get_aspect_ratio(dtype=PdfPage.FULL)
                     Get the page aspect ratio.

                     Parameters
                            dtype (PdfPage) -- the type of document to consider

                     Returns
                            page aspect ratio

                     Return type
                            float

              get_link_action(link_type, action)
                     Get the function to be called when the link is followed.

                     Parameterslink_type (ActionType) -- The type of action to be performed

                            • action (Action) -- The atcion to be performed

                     Returns
                            The function to be called to follow the link

                     Return type
                            function

              get_link_at(x, y, dtype=PdfPage.FULL)
                     Get the Link corresponding to the given position.

                     Returns None if there is no link at this position.

                     Parametersx (float) -- horizontal coordinate

                            • y (float) -- vertical coordinate

                            • dtype (PdfPage) -- the type of document to consider

                     Returns
                            the link at the given coordinates if one exists, None otherwise

                     Return type
                            Link

              get_media()
                     Get the list of medias this page might want to play.

                     Returns
                            medias in this page

                     Return type
                            list

              get_size(dtype=PdfPage.FULL)
                     Get the page size.

                     Parameters
                            dtype (PdfPage) -- the type of document to consider

                     Returns
                            page size

                     Return type
                            (float, float)

              label()
                     Get the page label.

              links = []
                     All the links in the page, as a list of Link instances

              medias = []
                     All the media in the page, as a list of Media

              new_annotation(pos, rect=None, value='')
                     Add an annotation to this page

                     Parameterspos  (int)  --  The position in the list of annotations in which to
                              insert this annotation

                            • rect (Rectangle) -- A rectangle for the position of this annotation

                            • value (str) -- The contents of the annotation

              number()
                     Get the page number.

              page = None
                     Page handled by this class (instance of Page)

              page_label = None
                     str representing the page label

              page_nb = -1
                     int, number of the current page (starting from 0)

              parent = None
                     Instance of Document that contains this page.

              ph = 0.0
                     float, page height

              pw = 0.0
                     float, page width

              remove_annotation(pos)
                     Remove an annotation from this page

                     Parameters
                            pos (int) -- The number of the annotation

              render_cairo(cr, ww, wh, dtype=PdfPage.FULL)
                     Render the page on a Cairo surface.

                     Parameterscr (CairoContext) -- target surface

                            • ww (int) -- target width in pixels

                            • wh (int) -- target height in pixels

                            • dtype (PdfPage) -- the type of document that should be rendered

              set_annotation(pos, value)
                     Update an annotation on this page

                     Parameterspos (int) -- The number of the annotation

                            • value (str) -- The new contents of the annotation

       class   pympress.document.PdfPage(value,   names=<not   given>,   *values,    module=None,
       qualname=None, type=None, start=1, boundary=None)
              Bases: IntEnum

              Represents the part of a PDF page that we want to draw.

              AFTER = 6
                     Full page + draw another page for notes, which is after the slides

              BEFORE = 7
                     for a notes page, the slide page is BEFORE by half a document

                     Type   Complementary of AFTER

              BOTTOM = 2
                     Bottom half of PDF page

              EVEN = 9
                     Complementary of ODD

              FULL = 1
                     Full PDF page (without notes)

              LEFT = 5
                     Left half of PDF page

              MAP = 10
                     An arbitrary mapping of notes pages to slide pages

              NONE = 0
                     No notes on PDF page, only falsy value

              ODD = 8
                     Slides on even pages (0-indexed), notes on uneven pages

              RIGHT = 4
                     Right half of PDF page

              RMAP = 11
                     Reverse the arbitrary mapping MAP

              TOP = 3
                     Top half of PDF page

              complement()
                     Return the enum value for the other part of the page.

              direction()
                     Returns whether the pdf page/notes mode is horizontal or vertical.

                     Returns
                            a  string  representing  the direction that can be used as the key in
                            the config section

                     Return type
                            str

              from_screen(x, y, x2=None, y2=None)
                     Transform visible part of the page coordinates to full page coordinates.

                     Pass 2 floats to transform coordinates, 4 to  transform  margins,  i.e.  the
                     second pair of coordinates is taken from the opposite corner.

                     Parametersx (float) -- x coordinate on the screen, on a scale 0..1

                            • y (float) -- y coordinate on the screen, on a scale 0..1

                            • x2  (float)  --  second  x coordinate on the screen, from the other
                              side, on a scale 0..1

                            • y2 (float) -- second y coordinate on the  screen,  from  the  other
                              side, on a scale 0..1

              scale()
                     Return the enum value that does only scaling not shifting.

              to_screen(x, y, x2=None, y2=None)
                     Transform full page coordinates to visible part coordinates.

                     Pass  2  floats  to  transform coordinates, 4 to transform margins, i.e. the
                     second pair of coordinates is taken from the opposite corner.

                     Parametersx (float) -- x coordinate on the page, on a scale 0..1

                            • y (float) -- y coordinate on the page, on a scale 0..1

                            • x2 (float) -- second x coordinate on the page, from the other side,
                              on a scale 0..1

                            • y2 (float) -- second y coordinate on the page, from the other side,
                              on a scale 0..1

       pympress.document.get_extension(mime_type)
              Returns a valid filename extension (recognized by python) for a given mime type.

              Parameters
                     mime_type (str) -- The mime type for which to find an extension

              Returns
                     A file extension used for the given mimetype

              Return type
                     str

   pympress.ui_builder -- abstract GUI management
       This module contains the tools to load the graphical user interface of pympress,  building
       the  widgets/objects  from  XML  (glade)  files,  applying translation "manually" to avoid
       dealing with all the mess of C/GNU gettext's bad portability.

       class pympress.builder.Builder
              Bases: Builder

              GUI builder, inherits from Builder to read XML descriptions of GUIs and load them.

              connect_signals(base_target)
                     Signal connector connecting to properties of base_target, or  properties  of
                     its properties, etc.

                     Parametersbase_target  (Builder)  -- The target object, that has functions to
                              be connected to

                            • builder. (signals loaded in this) --

              get_callback_handler(handler_name)
                     Returns the handler from its name, searching in target.

                     Parse handler names and split on '.' to use recursion.

                     Parameterstarget (object) -- An object that has a method called handler_namehandler_name (str) -- The name of the function to be connected to a
                              signal

                     Returns
                            A function bound to an object

                     Return type
                            function

              list_attributes(target)
                     List the None-valued attributes of target.

                     Parameters
                            target (dict) -- An object with None-valued attributes

              load_ui(resource_name, **kwargs)
                     Loads the UI defined in the file named resource_name using the builder.

                     Parameters
                            resource_name  (str)  --  the  basename  of  the  glade file (without
                            extension), identifying the resource to load.

              load_widgets(target)
                     Fill in target with the missing elements introspectively.

                     This means that all attributes of target that are None now must exist  under
                     the same name in the builder.

                     Parameters
                            target  (dict)  --  An object with None-valued properties whose names
                            correspond to ids of built widgets.

              pending_pane_resizes = {}
                     dict mapping Paned names to a tuple of  (handler  id  of  the  size-allocate
                     signal,  remaining  number of times we allow this signal to run), and we run
                     the signal 2 * (depth + 1) for each pane.  This is because  size  allocation
                     is done bottom-up but each pane sets a top-down constraint.

              replace_layout(layout, top_widget, leaf_widgets, pane_resize_handler=None)
                     Remix  the  layout  below  top_widget with the layout configuration given in
                     'layout' (assumed to be valid!).

                     Parameterslayout (dict) -- the json-parsed config string, thus a hierarchy of
                              lists/dicts, with strings as leaves

                            • top_widget (Container) -- The top-level widget under which we build
                              the hierachyy

                            • leaf_widgets (dict) -- the map of valid leaf identifiers  (strings)
                              to the corresponding Widgetpane_resize_handler  (function)  --  callback function to be called
                              when the panes are resized

                     Returns
                            The mapping of the  used  Paned  widgets  to  their  relative  handle
                            position (in 0..1).

                     Return type
                            dict

              resize_paned(paned, rect, relpos)
                     Resize  paned  to  have  its  handle  at relpos, then disconnect this signal
                     handler.

                     Called from the Gtk.Widget.signals.size_allocate() signal.

                     Parameterspaned (Paned) -- Panel whose size  has  just  been  allocated,  and
                              whose handle needs initial placement.

                            • rect (Rectangle) -- The rectangle specifying the size that has just
                              been allocated to panedrelpos (float) -- A number between 0. and  1.  that  specifies  the
                              handle position

                     Returns
                            True

              static setup_actions(actions, action_map=None)
                     Sets up actions with a given prefix, using the Application as the ActionMap.

                     Parametersactions  (dict) -- Maps the action names to dictionaries containing
                              their parameters.

                            • action_map (ActionMap) -- The object implementing  the  action  map
                              interface to register actions

              signal_connector(builder,  obj,  signal_name,  handler_name, connect_object, flags,
              *user_data)
                     Callback for signal connection. Implements the  BuilderConnectFunc  function
                     interface.

                     Parametersbuilder (Builder) -- The builder, unused

                            • obj  (Object)  -- The object (usually a wiget) that has a signal to
                              be connected

                            • signal_name (str) -- The name of the signal

                            • handler_name (str) -- The name of the function to be  connected  to
                              the signal

                            • connect_object (Object) -- unused

                            • flags (ConnectFlags) -- unused

                            • user_data  (tuple)  --  supplementary  positional  arguments  to be
                              passed to the handler

   pympress.surfacecache -- pages prerendering and caching
       This modules contains stuff needed for caching pages and prerendering them. This  is  done
       by the SurfaceCache class, using several dict of ImageSurface for storing rendered pages.

       The  problem  is,  neither  Gtk+  nor  Poppler  are  particularly  threadsafe.   Hence the
       prerendering isn't really done in parallel in another thread, but scheduled  on  the  main
       thread at idle times using GLib.idle_add().

       class pympress.surfacecache.SurfaceCache(doc, max_pages)
              Bases: object

              Pages caching and prerendering made (almost) easy.

              Parametersdoc (Document) -- the current document

                     • max_pages (int) -- The maximum page number.

              active_widgets = {}
                     Set of active widgets

              add_widget(widget, wtype, prerender_enabled=True, zoomed=False, ignore_max=False)
                     Add a widget to the list of widgets that have to be managed (for caching and
                     prerendering).

                     This creates new  entries  for  widget_name  in  the  needed  internal  data
                     structures, and creates a new thread for prerendering pages for this widget.

                     Parameterswidget (Widget) -- The widget for which we need to cache

                            • wtype  (int)  --  type  of  document  handled  by  the  widget (see
                              surface_type)

                            • prerender_enabled (bool) -- whether this widget is initially in the
                              list of widgets to prerender

                            • zoomed  (bool)  --  whether  we  will cache a zoomed portion of the
                              widget

                            • ignore_max (bool) -- whether we will cache an unlimited  number  of
                              slides

              clear_cache(widget_name=None)
                     Remove all cached values for a given widget. Useful for zoomed views.

                     Parameters
                            widget_name (str) -- name of the widget that is resized, None for all
                            widgets.

              disable_prerender(widget_name)
                     Remove a widget from the ones to be prerendered.

                     Parameters
                            widget_name (str) -- string used to identify a widget

              doc = None
                     The current Document.

              doc_lock = None
                     Lock used to manage conccurent accesses to doc.

              enable_prerender(widget_name)
                     Add a widget to the ones to be prerendered.

                     Parameters
                            widget_name (str) -- string used to identify a widget

              get(widget_name, page_nb)
                     Fetch a cached, prerendered page for the specified widget.

                     Parameterswidget_name (str) -- name of the concerned widget

                            • page_nb (int) -- number of the page to fetch in the cache

                     Returns
                            the cached page if available, or None otherwise

                     Return type
                            ImageSurface

              get_widget_type(widget_name)
                     Get the document type of a widget.

                     Parameters
                            widget_name (str) -- string used to identify a widget

                     Returns
                            type of document handled by the widget (see surface_type)

                     Return type
                            int

              locks = {}
                     Dictionary of Lock used for managing conccurent  accesses  to  surface_cache
                     and surface_size

              max_pages = 200
                     maximum number fo pages we keep in cache

              prerender(page_nb)
                     Queue a page for prerendering.

                     The specified page will be prerendered for all the registered widgets.

                     Parameters
                            page_nb (int) -- number of the page to be prerendered

              put(widget_name, page_nb, val)
                     Store a rendered page in the cache.

                     Parameterswidget_name (str) -- name of the concerned widget

                            • page_nb (int) -- number of the page to store in the cache

                            • val (ImageSurface) -- content to store in the cache

              renderer(widget_name, page_nb)
                     Rendering function.

                     This  function  is meant to be scheduled on the GLib main loop. When run, it
                     will go through the following steps:

                     • check if the job's result is not already available in the cache

                     • render it in a new ImageSurface if necessary

                     • store it in the cache if it was not added there since the beginning of the
                       process and the widget configuration is still valid

                     Parameterswidget_name (str) -- name of the concerned widget

                            • page_nb (int) -- number of the page to store in the cache

              resize_widget(widget_name, width, height)
                     Change  the  size  of  a registered widget, thus invalidating all the cached
                     pages.

                     Parameterswidget_name (str) -- name of the widget that is resized

                            • width (int) -- new width of the widget

                            • height (int) -- new height of the widget

              set_widget_type(widget_name, wtype)
                     Set the document type of a widget.

                     Parameterswidget_name (str) -- string used to identify a widget

                            • wtype (int)  --  type  of  document  handled  by  the  widget  (see
                              surface_type)

              surface_cache = {}
                     The  actual  cache.  The  dict`s  keys  are  widget names and its values are
                     :class:`~collections.OrderedDict, whose keys are page numbers and values are
                     instances  of  ImageSurface.   In each OrderedDict keys are ordered by Least
                     Recently Used (get or set), when the size is  beyond  max_pages,  pages  are
                     popped from the start of the cache.

              surface_factory = {}
                     dict  containing  functions  that return a Surface given a Format, width int
                     and height int, see create_similar_image_surface()

              surface_size = {}
                     Size of the different managed widgets, as a dict of tuples

              surface_type = {}
                     its keys are widget names and its values are document types from ui.

                     Type   Type of document handled by each widget. It is a dict

              swap_document(new_doc)
                     Replaces the current document for which to cache slides with a new one.

                     This function also clears the cached pages, since  they  now  belong  to  an
                     outdated document.

                     Parameters
                            new_doc (Document) -- the new document

              unlimited = {}
                     Set of widgets for which we ignore the max

   pympress.scribble -- Manage user drawings on the current slide
       class pympress.scribble.Scribbler(config, builder, notes_mode)
              Bases: Builder

              UI that allows to draw free-hand on top of the current slide.

              Parametersconfig (Config) -- A config object containing preferences

                     • builder (Builder) -- A builder from which to load widgets

                     • notes_mode  (bool)  -- The current notes mode, i.e. whether we display the
                       notes on second slide

              active_preset = -1
                     int that is the currently selected element

              adjust_buttons()
                     Properly enable and disable buttons based on scribblings lists.

              adjust_tools_orientation()
                     Actually change  the  highlight  tool  elements  orientations  according  to
                     self.tools_orientation

              c_da = None
                     The DrawingArea in the content window

              clear_scribble(*args)
                     Callback for the scribble clear button, to remove all scribbles.

              current_page = (None, None)
                     tuple of (int, str) indicating the current page number and label

              disable_scribbling()
                     Disable the scribbling mode.

                     Returns
                            whether  it  was  possible  to  disable  (thus if it was not disabled
                            already)

                     Return type
                            bool

              draw_scribble(widget, cairo_context)
                     Perform the drawings by user.

                     Parameterswidget (DrawingArea) -- The widget where to draw the scribbles.

                            • cairo_context (Context) --  The  canvas  on  which  to  render  the
                              drawings

              enable_scribbling()
                     Enable the scribbling mode.

                     Returns
                            whether  it  was  possible  to  enable  (thus  if  it was not enabled
                            already)

                     Return type
                            bool

              get_slide_point()
                     callback, to be connected to get_slide_point()

              highlight_mode = 'single-page'

              key_event(widget, event)
                     Handle key events to activate the eraser while the shortcut is held

                     Parameterswidget (Widget) -- the widget which has received the event.

                            • event (Event) -- the GTK event.

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              load_layout()
                     callback, to be connected to load_layout()

              load_preset(gaction=None, target=None)
                     Loads the preset color of a given number or designed by a given  widget,  as
                     an event handler.

                     Parametersgaction (Action) -- the action triggering the call

                            • target  (Variant) -- the new preset to load, as a string wrapped in
                              a GLib.Variant

                     Returns
                            whether the preset was loaded

                     Return type
                            bool

              mouse_pos = None
                     The position of the mouse on the slide as tuple of float

              next_render = 0
                     The next scribble to render (i.e. that is not rendered in cache)

              on_configure_da(widget, event)
                     Transfer configure resize to the cache.

                     Parameterswidget (Widget) -- the widget which has been resized

                            • event (Event) -- the GTK event, which contains the  new  dimensions
                              of the widget

              on_draw()
                     callback, to be connected to on_draw()

              on_eraser_button_draw(widget, cairo_context)
                     Handle drawing the eraser button.

                     Parameterswidget (Widget) -- the widget to update

                            • cairo_context  (Context)  --  the  Cairo context (or None if called
                              directly)

              on_preset_button_draw(widget, cairo_context)
                     Handle drawing the marker/pencil buttons,  with  appropriate  thickness  and
                     color.

                     Parameterswidget (Widget) -- the widget to update

                            • cairo_context  (Context)  --  the  Cairo context (or None if called
                              directly)

              p_central = None
                     Box in the Presenter window, where we insert scribbling.

              page_change(page_number, page_label)
                     Called when we change pages, to clear or restore scribbles

                     Parameterspage_number (int) -- The number of the new page

                            • page_label (str) -- The label of the new page

              page_change_action(gaction, param)
                     Change whether we exit or stay in highlighting mode on page changes

                     Parametersgaction (Action) -- the action triggering the call

                            • param  (Variant)  --  the  new  mode  as  a  string  wrapped  in  a
                              GLib.Variant

              page_change_exits = True
                     bool indicating whether we exit highlighting mode on page change

              static parse_color(text)
                     Transform a string to a Gdk object in a single function call

                     Parameters
                            text (str) -- A string describing a color

                     Returns
                            A new color object parsed from the string

                     Return type
                            RGBA

              pen_action = None
                     The Action that contains the currently selected pen

              points_to_curves(points)
                     Transform a list of points from scribbles to bezier curves

                     Returns
                            control points of a bezier curves to draw

                     Return type
                            list

              pop_scribble(*args)
                     Callback for the scribble undo button, to undo the last scribble.

              prerender()
                     Commit scribbles to cache so they are faster to draw on the slide

              preset_toolbar = None
                     Box containing the presets

              previous_preset = -1
                     int to remember the previously selected element, before holding “eraser”

              redo_scribble(*args)
                     Callback for the scribble undo button, to undo the last scribble.

              redraw_current_slide()
                     callback, to be connected to redraw_current_slide()

              remembered_scribbles = {}
                     dict of scribbles per page

              render_scribble(cairo_context, color, width, points, pressures)
                     Draw a single scribble, i.e. a bezier curve, on the cairo context

                     Parameterscairo_context  (Context)  --  The  canvas  on  which  to render the
                              drawings

                            • color (RGBA) -- The color of the scribble

                            • width (float) -- The width of the curve

                            • points (list) -- The control points of the  curve,  scaled  to  the
                              surface.

                            • pressures  (list) -- The relative line width at each point as float
                              values in 0..1

              reset_scribble_cache()
                     Clear the cached scribbles.

              resize_cache()
                     callback, to be connected to resize_widget()

              scribble_c_eb = None
                     EventBox for the scribbling in the Content window, captures freehand drawing

              scribble_cache = None
                     A Surface to hold drawn highlights

              scribble_clear = None
                     Button for removing all drawn scribbles

              scribble_color    =    Gdk.RGBA(red=1.000000,    green=1.000000,     blue=1.000000,
              alpha=1.000000)
                     RGBA current color of the scribbling tool

              scribble_color_selector = None
                     The ColorButton selecting the color of the pen

              scribble_color_toolbox = None
                     Box containing the scribble color and width selectors

              scribble_drawing = False
                     Whether the current mouse movements are drawing strokes or should be ignored

              scribble_list = []
                     list of scribbles to be drawn, as tuples of color RGBA, width int, a list of
                     points, and a list of pressure values.

              scribble_off_render = None
                     A OffscreenWindow where we render the scribbling  interface  when  it's  not
                     shown

              scribble_overlay = None
                     HBox  that replaces normal panes when scribbling is on, contains buttons and
                     scribble drawing area.

              scribble_p_da = None
                     DrawingArea for the scribbles in the Presenter window. Actually redraws  the
                     slide.

              scribble_p_eb = None
                     EventBox  for  the  scribbling  in  the  Presenter window, captures freehand
                     drawing

              scribble_p_frame = None
                     AspectFrame for the slide in the Presenter's highlight mode

              scribble_preset_buttons = []
                     The list containing the radio buttons ModelButton

              scribble_redo = None
                     Button for drawing the last removed scribble

              scribble_redo_list = []
                     list of undone scribbles to possibly redo

              scribble_toolbar = None
                     Box containing the scribble buttons

              scribble_undo = None
                     Button for removing the last drawn scribble

              scribble_width = 1
                     int current stroke width of the scribbling tool

              scribble_width_selector = None
                     The Scale selecting the size of the pen

              scribbling_mode = False
                     Whether we are displaying the  interface  to  scribble  on  screen  and  the
                     overlays containing said scribbles

              set_mode(gaction, param)
                     Change the mode of clearing and restoring highlights

                     Parametersgaction (Action) -- the action triggering the call

                            • param  (Variant)  --  the  new  mode  as  a  string  wrapped  in  a
                              GLib.Variant

              set_tools_orientation(gaction, target)
                     Changes the orientation of the highlighting tool box.

                     Parametersgaction (Action) -- the action triggering the call

                            • target (Variant) -- the new orientation to set, as a string wrapped
                              in a GLib.Variant

                     Returns
                            whether the preset was loaded

                     Return type
                            bool

              start_zooming()
                     callback, to be connected to start_zooming()

              stop_zooming()
                     callback, to be connected to stop_zooming()

              switch_scribbling(gaction, target=None)
                     Starts the mode where one can read on top of the screen.

                     Args:

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              toggle_erase_modifiers = []
                     list  that contains the modifiers which, when held on scribble start, toggle
                     the eraser

              toggle_erase_shortcuts = []
                     list that contains the non-modifier shortcuts which, when held  on  scribble
                     start, toggle the eraser

              toggle_erase_source = None
                     str  or None that indicates whether a modifier + click or a held shortcut is
                     toggling the eraser

              toggle_scribble(widget, event)
                     Start/stop drawing scribbles.

                     Parameterswidget (Widget) -- the widget which has received the event.

                            • event (Event) -- the GTK event.

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              tools_orientation = 'vertical'
                     str indicating the current layout of the highlight toolbar

              track_clicks()
                     callback, to be connected to track_clicks()

              track_motions()
                     callback, to be connected to track_motions()

              track_scribble(widget, event)
                     Draw the scribble following the mouse's moves.

                     Parameterswidget (Widget) -- the widget which has received the event.

                            • event (Event) -- the GTK event.

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              try_cancel()
                     Cancel scribbling, if it is enabled.

                     Returns
                            True if scribbling got cancelled, False if it was already disabled.

                     Return type
                            bool

              update_active_color_width()
                     Update modifications to the active scribble color  and  width,  on  the  pen
                     button and config object

              update_color(widget)
                     Callback for the color chooser button, to set scribbling color.

                     Parameters
                            widget  (ColorButton) -- the clicked button to trigger this event, if
                            any

              update_width(widget, event, value)
                     Callback for the width chooser slider, to set scribbling width.

                     Parameterswidget (Scale) -- The slider control used to  select  the  scribble
                              width

                            • event (Event) -- the GTK event triggering this update.

                            • value (int) -- the width of the scribbles to be drawn

              zoom_stop_button = None
                     Button that is clicked to stop zooming, unsensitive when there is no zooming

   pympress.pointer -- Manage when and where to draw a software-emulated laser pointer on screen
       class pympress.pointer.Pointer(config, builder)
              Bases: object

              Manage and draw the software “laser pointer” to point at the slide.

              Displays  a  pointer of chosen color on the current slide (in both windows), either
              on all the time or only when clicking while ctrl pressed.

              Parametersconfig (Config) -- A config object containing preferences

                     • builder (Builder) -- A builder from which to load widgets

              activate_pointermode(mode=None)
                     Activate the pointer as given by mode.

                     Depending on the given mode, shows or hides the laser pointer and the normal
                     mouse pointer.

                     Parameters
                            mode (PointerMode) -- The mode to activate

              c_da = None
                     DrawingArea Slide in the Contents window, used to reliably set cursors.

              c_frame = None
                     AspectFrame Frame of the Contents window, used to reliably set cursors.

              change_pointercolor(action, target)
                     Callback  for  a  radio  item selection as pointer mode (continuous, manual,
                     none).

                     Parametersaction (Action) -- The action activatd

                            • target (Variant) -- The selected mode

              change_pointermode(action, target)
                     Callback for a radio item selection as  pointer  mode  (continuous,  manual,
                     none).

                     Parametersaction (Action) -- The action activatd

                            • target (Variant) -- The selected mode

              config = None
                     A reference to the UI's Config, to update the pointer preference

              load_pointer(name)
                     Perform the change of pointer using its color name.

                     Parameters
                            name (str) -- Name of the pointer to load

              old_pointer_mode = 2
                     The PointerMode to which we toggle back

              p_da_cur = None
                     DrawingArea Slide in the Presenter window, used to reliably set cursors.

              pointer = <GdkPixbuf.Pixbuf object at 0x7f0ec4a400c0 (GdkPixbuf at 0x21e5850)>
                     Pixbuf to read XML descriptions of GUIs and load them.

              pointer_mode = 1
                     PointerMode indicating the pointer mode

              pointer_pos = (0.5, 0.5)
                     (float,  float)  of  position  relative  to  slide, where the pointer should
                     appear

              pointermode_radios = {}
                     a dict of the RadioMenuItem selecting the pointer mode

              redraw_current_slide()
                     callback, to be connected to redraw_current_slide()

              render_pointer(cairo_context, ww, wh)
                     Draw the laser pointer on screen.

                     Parameterscairo_context (Context) --  The  canvas  on  which  to  render  the
                              pointer

                            • ww (int) -- The widget width

                            • wh (int) -- The widget height

              set_action_state = None
                     callback, to be connected to set_action_state()

              show_pointer = False
                     bool indicating whether we should show the pointer

              toggle_pointer(widget, event)
                     Track events defining when the laser is pointing.

                     Parameterswidget (Widget) -- the widget which has received the event.

                            • event (Event) -- the GTK event.

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              track_enter_leave(widget, event)
                     Switches laser off/on in continuous mode on leave/enter slides.

                     In  continuous mode, the laser pointer is switched off when the mouse leaves
                     the slide (otherwise the laser pointer "sticks" to the edge of  the  slide).
                     It is switched on again when the mouse reenters the slide.

                     Parameterswidget (Widget) -- the widget which has received the event.

                            • event (Event) -- the GTK event.

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              track_pointer(widget, event)
                     Move the laser pointer at the mouse location.

                     Parameterswidget (Widget) -- the widget which has received the event.

                            • event (Event) -- the GTK event.

                     Returns
                            whether the event was consumed

                     Return type
                            bool

       class   pympress.pointer.PointerMode(value,   names=<not   given>,  *values,  module=None,
       qualname=None, type=None, start=1, boundary=None)
              Bases: Enum

              Possible values for the pointer.

              CONTINUOUS = 2
                     Pointer switched on continuously

              DISABLED = 0
                     Pointer never switched on

              MANUAL = 1
                     Pointer switched on only manual

   pympress.editable_label -- A label that can be swapped out for an editable entry
       class pympress.editable_label.EditableLabel
              Bases: object

              A label that can switch between simply displaying a value, and allowing user  input
              to edit this value.

              cancel()
                     Cancel editing the label. Needs to be reimplemented by children classes.

              editing = False
                     bool tracking whether we are currently editing the label.

              event_box = None
                     EventBox around the label, used to sense clicks

              on_keypress(widget, event)
                     Manage  key  presses  for  the  editable label. Needs to be reimplemented by
                     children classes.

                     If we are editing the label, intercept some  key  presses  (to  validate  or
                     cancel  editing or other specific behaviour), otherwise pass the key presses
                     on to the button for normal behaviour.

                     Parameterswidget (Widget) -- the widget which has received the event.

                            • event (Event) -- the GTK event.

                            • name (str) -- the name of the key stroke

                            • command (str) -- the name of the command in case this  function  is
                              called by on_key_input

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              on_label_event(widget_or_action, event=None)
                     Manage events on the current slide label/entry.

                     This  function  triggers  replacing  the label with an entry when clicked or
                     otherwise toggled.

                     Parameterswidget (Widget) -- the widget in which the event occurred

                            • event (Event or None) -- the event that occurred,  None  if  tf  we
                              called from a menu item

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              restore_label()
                     Make sure that the editable label is not in entry mode.

                     If it is an entry, then replace it with the label.

              start_editing()
                     Start the editing of the label if it is disabled.

              stop_editing()
                     Disable the editing of the label if it was enabled.

              swap_label_for_entry()
                     Perform the actual work of starting the editing.

              try_cancel()
                     Cancel editing the label, if it is being edited.

                     Returns
                            True  if  editing  got  cancelled,  False  if the label was not being
                            edited.

                     Return type
                            bool

              try_validate()
                     Validate the page choice, if the page label is being edited.

                     Returns
                            True if editing got validated, False  if  the  label  was  not  being
                            edited.

                     Return type
                            bool

              validate()
                     Validate  the  input  to  the  label.  Needs to be reimplemented by children
                     classes.

       class pympress.editable_label.EstimatedTalkTime(builder)
              Bases: EditableLabel

              A label that displays the time elapsed since the start of the  talk,  that  can  be
              edited to select talk duration.

              The  duration  of  the  talk will cause the label to blink and change colour as the
              elapsed time gets closer to the targeted talk duration.

              Parameters
                     builder (builder.Builder) -- The builder from which to load widgets.

              eb_ett = None
                     EventBox associated with the estimated talk time.

              entry_ett = None
                     Entry used to set the estimated talk time.

              est_time = 0
                     Estimated talk time, int in seconds.

              label_ett = None
                     Estimated talk time Label for the talk.

              label_time = None
                     Elapsed time Label.

              on_keypress(widget, event)
                     Pass on keystrokes to do_key_press_event().

              restore_label(gaction=None, param=None)
                     Make sure that the current page number is displayed in a label and not in an
                     entry.

                     If it is an entry, then replace it with the label.

              set_time(gaction, param)
                     Set the talk time.

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- The time in seconds, as an int64 variant

              stop_editing_page_number()
                     callback, to be connected to stop_editing()

              swap_label_for_entry(*args)
                     Perform the actual work of starting the editing.

              validate()
                     Update estimated talk time from the input.

       class pympress.editable_label.PageNumber(builder, page_num_scroll)
              Bases: EditableLabel

              A  label  that  displays  "current page / max page", that can be edited to select a
              page to which to go.

              Parameters
                     builder (Builder) -- A builder from which to load widgets

              cancel(gaction=None, param=None)
                     Make the UI re-display the pages from before editing the current page.

              changed_page_label(*args)
                     Get the page number from the spinner and go to that page.

              eb_cur = None
                     EventBox associated with the slide counter label in the Presenter window.

              edit_label = None
                     Entry used to switch to another slide by typing its label.

              enable_labels(enable)
                     Allow one to use or ignore labels.

                     Parameters
                            enable (bool) -- Whether to enable labels

              find_label()
                     callback, to be connected to lookup_label()

              goto_page()
                     callback, to be connected to goto()

              hb_cur = None
                     HBox containing the slide counter label in the Presenter window.

              invert_scroll = True
                     bool whether to scroll with the  pages  (True)  or  with  the  page  numbers
                     (False)

              label_after()
                     callback, to be connected to label_before()

              label_before()
                     callback, to be connected to label_after()

              label_cur = None
                     Slide counter Label for the current slide.

              label_last = None
                     Slide counter Label for the last slide.

              label_sep = None
                     Label separating spin_cur and edit_label

              max_page_number = 1
                     int holding the maximum page number in the document

              on_keypress(widget, event)
                     Implement directions (left/right/home/end) keystrokes.

                     Otherwise pass on to do_key_press_event().

              on_scroll(widget, event)
                     Scroll  event.  Pass it on to the spin button if we're currently editing the
                     page number.

                     Parameterswidget (Widget) -- the widget which has received the event.

                            • event (Event) -- the GTK event.

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              page_change()
                     callback, to be connected to do_page_change()

              page_labels = True
                     bool holding whether we display or ignore page labels

              restore_label()
                     Make sure that the current page number is displayed in a label and not in an
                     entry.

                     If it is an entry, then replace it with the label.

              set_last(num_pages)
                     Set  the max number of pages, both on display and as the range of values for
                     the spinner.

                     Parameters
                            num_pages (int) -- The maximum page number

              setup_doc_callbacks(doc)
                     Callbacks that need to be setup again at every new document

                     Parameters
                            doc (Document) -- The new document that got loaded

              spin_cur = None
                     SpinButton used to switch to another slide by typing its number.

              swap_label_for_entry(hint=None)
                     Perform the actual work of starting the editing.

              update_page_numbers(cur_nb, label)
                     Update the displayed page numbers.

                     Parameterscur_nb (int) -- The current page number, in documentation numbering
                              (range [0..max - 1])

                            • label (str) -- The current page label

              validate()
                     Get the page number from the spinner and go to that page.

   pympress.talk_time -- Manages the clock of elapsed talk time
       class pympress.talk_time.TimeCounter(builder, ett, timing_tracker, autoplay)
              Bases: object

              A double counter, that displays the time elapsed in the talk and a clock.

              Parametersbuilder (builder.Builder) -- The builder from which to load widgets.

                     • ett (int) -- the estimated time for the talk, in seconds.

                     • timing_tracker -- (TimingReport): to inform when the slides change

                     • autoplay   --   (AutoPlay):   to   adjust   the  timer  display  if  we’re
                       auto-playing/looping slides

              autoplay = None
                     The AutoPlay, to adjust the  timer  display  if  we’re  auto-playing/looping
                     slides

              current_time()
                     Returns the time elapsed in the presentation.

                     Returns
                            the time since the presentation started in seconds.

                     Return type
                            int

              elapsed_time = 0
                     Time elapsed since the beginning of the presentation, int in seconds

              ett = None
                     EstimatedTalkTime that handles changing the ett

              label_clock = None
                     Clock Label

              label_colorer = None
                     TimeLabelColorer that handles setting the colors of label_time

              label_time = None
                     Elapsed time Label

              pause()
                     Pause the timer if it is not paused, otherwise do nothing.

                     Returns
                            whether the clock's pause was toggled.

                     Return type
                            bool

              pause_action = None
                     The pause-timer Action

              paused = True
                     Timer paused status, bool

              reset_timer(*args)
                     Reset the timer.

              restart_time = 0
                     Time at which the counter was started, int in seconds as returned by time()

              switch_pause(gaction, param=None)
                     Switch the timer between paused mode and running (normal) mode.

                     Returns
                            whether the clock's pause was toggled.

                     Return type
                            bool

              timing_tracker = None
                     The TimingReport, needs to know when the slides change

              unpause()
                     Unpause the timer if it is paused, otherwise do nothing.

                     Returns
                            whether the clock's pause was toggled.

                     Return type
                            bool

              update_time()
                     Update the timer and clock labels.

                     Returns
                            True (to prevent the timer from stopping)

                     Return type
                            bool

       class pympress.talk_time.TimeLabelColorer(label_time)
              Bases: object

              Manage  the  colors of a label with a set of colors between which to fade, based on
              how much time remains.

              Times are given in seconds (<0 has run out of  time).  In  between  timestamps  the
              color  will  interpolated linearly, outside of the intervals the closest color will
              be used.

              Parameters
                     label_time (Gtk.Label) -- the label where the talk time is displayed

              color_map = []
                     list  of  tuples  (int,  RGBA),  which  are  the  desired  colors   at   the
                     corresponding timestamps.  Sorted on the timestamps.

              color_override = None
                     CssProvider affecting the style context of the labels

              default_color()
                     Forces to reset the default colors on the label.

              label_color_default = None
                     RGBA The default color of the info labels

              label_time = None
                     The Gtk.Label whose colors need updating

              load_color_from_css(style_context, class_name=None)
                     Add class class_name to the time label and return its color.

                     Parameterslabel_time  (Gtk.Label)  --  the  label  where  the  talk  time  is
                              displayed

                            • style_context (StyleContext) -- the CSS context managing the  color
                              of the label

                            • class_name (str or None) -- The name of the class, if any

                     Returns
                            The color of the label with class "class_name"

                     Return type
                            RGBA

              update_time_color(remaining)
                     Update the color of the time label based on how much time is remaining.

                     Parameters
                            remaining  (int)  --  Remaining  time  until  estimated  talk time is
                            reached, in seconds.

   pympress.config -- Configuration
       class pympress.config.Config
              Bases: ConfigParser, object

              Manage configuration :Get the configuration from its file and store its back.

              get_layout(layout_name)
                     Getter for the layout_name layout.

              getboolean(*args, **kwargs)
                     Wrapper for configparser’s  getboolean  to  handle  parsing  errors  when  a
                     fallback is given.

                     getboolean()

              getfloat(*args, **kwargs)
                     Wrapper  for  configparser’s  to  handle  parsing  errors when a fallback is
                     given.

                     See getfloat()

              getint(*args, **kwargs)
                     Wrapper for configparser’s getint to handle parsing errors when  a  fallback
                     is given.

                     See getint()

              getlist(*args)
                     Parse a config value and return the list by splitting the value on commas.

                     i.e. bar = foo,qux  returns the list ['foo', 'qux']

                     Returns
                            a config value split into a list.

                     Return type
                            list

              layout = {}
                     dict-tree of presenter layouts for various modes

              load_window_layouts()
                     Parse and validate layouts loaded from config, with fallbacks if needed.

              static path_to_config(search_legacy_locations=False)
                     Return the path to the currently used configuration file.

                     Parameters
                            search_legacy_locations  (bool) -- whether to look in previously used
                            locations

                     Returns
                            The path to the config file to use

                     Return type
                            Path

              placeable_widgets  =  {'annotations':  'p_frame_annot',  'current':  'p_frame_cur',
              'highlight': 'scribble_overlay', 'next': 'grid_next', 'notes': 'p_frame_notes'}
                     dict  of  strings  that  are  the  valid representations of widgets from the
                     presenter window that can be dynamically rearranged, mapping to their names

              register_actions(builder)
                     Register actions that impact the config file only.

                     Parameters
                            builder (pympress.builder.Builder) -- a builder to setup the actions

              save_config()
                     Save the configuration to its file.

              shortcuts = {}
                     dict mapping accelerator keys to actions

              static_layout = {'deck-overview': 'deck'}
                     dict-tree of presenter layouts that are not configurable

              static toggle_portable_config(gaction, param=None)
                     Create or remove a configuration file for portable installs.

                     The portable install file will be used by default, and  deleting  it  causes
                     the config to fall back to the user profile location.

                     No need to populate the new config file, this will be done on pympress exit.

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              toggle_start(gaction, param=None)
                     Generic function to toggle some boolean startup configuration.

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              update_layout_from_widgets(layout_name, widget, pane_handle_pos)
                     Setter for the notes layout.

                     Parameterslayout_name (str) -- the name of the layout to update

                            • widget (Widget) -- the widget that will contain the layout.

                            • pane_handle_pos  (dict)  --  Map  of  Paned  to the relative handle
                              position (float in 0..1)

              update_layout_tree(layout_name, layout)
                     Update the layout named layout_name. Throws ValueError on invalid layouts.

                     Parameterslayout_name (str) -- the name of the layout to update

                            • layout (dict) -- the hierarchy of dictionaries, lists, and  strings
                              representing the layout

              upgrade()
                     Update obsolete config options when pympress updates.

              static using_portable_config()
                     Checks which configuration file location is in use.

                     Returns
                            True iff we are using the portable (i.e. in install dir) location

                     Return type
                            bool

              validate_layout(layout, expected_widgets, optional_widgets={})
                     Validate  layout:  check whether the layout of widgets built from the config
                     string is valid.

                     Parameterslayout (dict) -- the json-parsed config string

                            • expected_widgets (set) -- strings with the names  of  widgets  that
                              have to be used in this layout

                            • optional_widgets  (set)  --  strings with the names of widgets that
                              may or may not be used in this layout

                     Layout must have all self.placeable_widgets (leaves of the tree, as str) and
                     only allowed properties on the nodes of the tree (as dict).

                     Constraints  on  the only allowed properties of the nodes are: - resizeable:
                     bool (optional, defaults to no), - orientation: str,  either  "vertical"  or
                     "horizontal"  (mandatory) - children: list of size >= 2, containing str`s or
                     `dict`s (mandatory) - proportions: `list of float with sum =  1,  length  ==
                     len(children),  representing  the relative sizes of all the resizeable items
                     (if and only if resizeable).

              widget_layout_to_tree(widget, pane_handle_pos)
                     Build a tree representing a widget hierarchy, leaves are strings  and  nodes
                     are dict.

                     Recursive  function.  See  validate_layout()  for  more  info  on  the  tree
                     structure.

                     Parameterswidget (Widget) -- the widget where to start

                            • pane_handle_pos (dict) -- Map  of  Paned  to  the  relative  handle
                              position (float in 0..1)

                     Returns
                            A tree of dicts reprensenting the widget hierarchy

                     Return type
                            dict

              widget_reqs  =  {'highlight':  ({'highlight'},  {'annotations',  'current', 'next',
              'notes'}), 'highlight_notes': ({'highlight'},  {'annotations',  'current',  'next',
              'notes'}), 'note_pages': ({'annotations', 'next', 'notes'},), 'notes': ({'current',
              'next', 'notes'}, {'annotations'}), 'plain': ({'annotations', 'current', 'next'},)}
                     dict mapping layout ids to tuples of their expected and optional widgets

   pympress.extras -- Manages the display of fancy extras such as annotations, videos and cursors
       class pympress.dialog.AutoPlay(parent)
              Bases: Builder

              Widget and machinery to setup and play slides automatically, optionally in a loop

              autoplay_button_loop = None
                     The CheckButton to loop

              autoplay_dialog = None
                     A Dialog to contain the layout edition dialog

              autoplay_spin_lower = None
                     The SpinButton for the lower page

              autoplay_spin_time = None
                     The SpinButton for the transition between slides

              autoplay_spin_upper = None
                     The SpinButton for the upper page

              get_page_range()
                     Return the autoplay info

                     Returns
                            (first page, stop page, looping, delay i ms)

                     Return type
                            tuple

              goto_page()
                     callback, to be connected to goto_page()

              is_looping()
                     Return whether an auto-playing

              next_page(it)
                     Callback to turn the page to the next slide

                     Parameters
                            it (iterator) -- An iterator that contains the next  pages  to  load.
                            Stop when there are no more pages.

                     Returns
                            True if he callback needs to be called again, otherwise False

                     Return type
                            bool

              page_changed(spin_button, scroll_direction)
                     Callback  for  when  a page spin button is modified, maintains a delta of at
                     least 2 pages between first and last page of the intended  loop.  (No  loops
                     needed to loop a single slide.)

                     Parametersspin_button (SpinButton) -- The button whose value was changed

                            • scroll_direction (ScrollType) -- The speed and amount of change

              pause()
                     Pause the looping if it’s running

              remain = None
                     if  the  timeout  has  been  paused,  int  which  represents  the  number of
                     milliseconds until the next page slide

              run(gaction, param=None)
                     Show the dialog to setup auto-play, and start the autoplay if « apply  »  is
                     selected

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              set_doc_pages(n_pages)
                     Callback for when a document number of pages changes

                     Parameters
                            n_pages (int) -- the number of pages of the loaded document

              source = None
                     Source  which  is the source id of the periodic slide transition, or None if
                     there is no autoplay

              start_looping()
                     Start the auto-playing

              stop_looping()
                     Stop the auto-playing

              unpause()
                     Unpause the looping if it’s paused

       class pympress.dialog.LayoutEditor(parent, config)
              Bases: Builder

              Widget tracking and displaying hierachically  how  much  time  was  spent  in  each
              page/section of the presentation.

              config = None
                     Config to remember preferences

              current_layout = 'plain'
                     str containing the layout currently edited

              get_info(path)
                     Given  a  path  string,  look up the appropriate item in both the actual and
                     GtkStore models

                     Parameters
                            path (str) -- A string representing a path in the treemodel

                     Returns
                            the node and iterator representing the position  in  the  layout  and
                            model

                     Return type
                            dict, TreeIter

              hltools_orientation_action = None
                     Action containing the orientation

              layout_description = None
                     A Label to contain the description of the layout

              layout_descriptions  =  {'highlight':  'Layout  to  draw  on  the  current  slide',
              'highlight_notes': 'Layout to draw on the  current  slide  with  notes  displayed',
              'note_pages':  'Layout  for libreoffice notes on separate pages (with current slide
              preview in notes)', 'notes': 'Layout for beamer notes on second screen (no  current
              slide preview in notes)', 'plain': 'Plain layout, without note slides'}

              layout_dialog = None
                     A Dialog to contain the layout edition dialog

              layout_selected(widget, event=None)
                     Manage events for the layout selector drop-down menu

                     Parameterswidget (ComboBox) -- the widget which has been modified

                            • event (Event) -- the GTK event

              layout_selector = None
                     A ComboBoxText to select the layout to edit

              layout_treemodel = None
                     The TreeModel containing the model of the layouts to view in the treeview

              layout_treeview = None
                     The TreeView displaying the hierarchical layouts

              load_layout()
                     Load  the  given layout in the treemodel for display and manipulation in the
                     treeview

              next_frames_action = None
                     Action containing the number of next frames

              next_slide_count_edited(widget, path, value)
                     Handle when the next slide count is modified

                     Parameterswidget (ComboBox) -- the widget which has been modified

                            • path (str) -- A string representing the path to the modfied item

                            • value (int) -- the new number of next slides

              normalize_layout(widget=None, drag_context=None, reload=True)
                     Handler at the end of a drag-and-drop in the treeview

                     Here we transform the listmodel modified by drag-and-drop back  to  a  valid
                     dict  and str hierarchy, and then trigger the loading of the layout again to
                     display the corrected layout.

                     Parameterswidget (Widget) -- The object which received the signal

                            • drag_context (DragContext) -- the drag context

                            • reload (bool) -- whether to reload the layout into the treemodel

              orientation_changed(widget, path, orient_it)
                     Handle when the orientation of a box is changed

                     Parameterswidget (ComboBox) -- the widget which has been modified

                            • path (str) -- A string representing the path to the modfied item

                            • orient_it (TreeIter) -- the row of the newly selected value in  the
                              orientations liststore model

              orientations_model = None
                     The ListModel containing the possible orientations

              resizeable_toggled(widget, path)
                     Handle when box’ resizeable value is toggled

                     Parameterswidget (ComboBox) -- the widget which has been modified

                            • path (str) -- A string representing the path to the modfied item

              set_current_layout(layout)
                     Update which is the layout currently used by the UI

                     Parameters
                            layout (str) -- the layout id

              show_editor(gaction, param=None)
                     Show  the  popup  to edit the layout. Gather info to populate it, and handle
                     apply/cancel at the end.

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              treemodel_to_tree(iterator, parent_horizontal=False, parent_resizeable=False)
                     Recursive function to transform  the  treemodel  back  into  our  dict-based
                     representation of the layout

                     Parametersiterator (TreeIter) -- the position in the treemodel

                            • parent_horizontal (bool) -- whether the parent node is horizontal

                            • parent_resieable (bool) -- whether the parent node is resizeable

                     Returns
                            the list of dict or str representing the widgets at this level

                     Return type
                            list

              ui_load_layout()
                     callback, to be connected to load_layout()

       class pympress.dialog.TimingReport(parent)
              Bases: Builder

              Widget  tracking  and  displaying  hierachically  how  much  time was spent in each
              page/section of the presentation.

              clear_on_next_transition = False
                     bool marking whether next page transition should reset the history  of  page
                     timings

              doc_structure = {}
                     A dict containing the structure of the current document

              document_open = False
                     bool tracking whether a document is opened

              end_time = -1
                     int the time at which the clock was reset

              static format_time(secs)
                     Formats a number of seconds as minutes:seconds.

                     Returns
                            The  formatted  time,  with  2+  digits  for minutes and 2 digits for
                            seconds.

                     Return type
                            str

              page_labels = []
                     A list with the page label of each page of the current document

              page_time = []
                     list of time at which each page was reached

              reset(reset_time)
                     A timer reset. Clear the history as soon as we start changing pages again.

              set_document_metadata(doc_structure, page_labels)
                     Show the popup with the timing infortmation.

                     Parametersdoc_structure (dict) -- the structure of the document

                            • page_labels (list) -- the page labels for each of the pages

              show_report(gaction, param=None)
                     Show the popup with the timing infortmation.

                     Parametersgaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              time_report_dialog = None
                     A Dialog to contain the timing to show

              timing_treeview = None
                     The TreeView containing the timing data to display in the dialog

              transition(page, time)
                     Record a transition time between slides.

                     Parameterspage (int) -- the page number of the current slide

                            • time (int) -- the number of seconds elapsed since the beginning  of
                              the presentation

   pympress.extras -- Manages the display of fancy extras such as annotations, videos and cursors
       class pympress.extras.Annotations(builder)
              Bases: object

              Widget displaying a PDF’s text annotations.

              add_annotation(gaction, param=None)
                     Add an annotation to the the page’s annotation list

                     Parametersgaction   (Action)   --  the  action  triggering  the  call,  which
                              identifies which backend

                            • param (Variant) -- an optional parameter

              annotation_column = None
                     The TreeViewColumn where the text is rendered

              annotation_renderer = None
                     The CellRendererText defining how text is rendered

              annotations_liststore = None
                     The containing ListStore storing the annotations to be displayed

              annotations_treeview = None
                     The containing TreeView widget for the annotations

              editing = None
                     The Entry in which we are currently editing an annotation, or None

              editing_finished(cell_renderer)
                     Handle the end of editing

                     Parameters
                            cell_renderer (CellRenderer)  --  The  renderer  which  received  the
                            signal

              editing_started(cell_renderer, widget, entry_number)
                     Handle edit start

                     Parameterscell_renderer  (CellRenderer)  --  The  renderer which received the
                              signal

                            • widget (CellEditable) -- the Gtk entry editing the annotation entry

                            • entry_number  (str)  --  the  string  representation  of  the  path
                              identifying the edited cell

              editing_validated(cell_renderer, entry_number, new_content)
                     Handle  successful  edit:  store  the  new  cell  value in the model and the
                     document

                     Parameterscell_renderer (CellRenderer) -- The  renderer  which  received  the
                              signal

                            • entry_number  (str)  --  the  string  representation  of  the  path
                              identifying the edited cell

                            • new_content (str) -- the new value of the edited cell

              key_event(widget, event)
                     Handle a key (press/release) event.

                     Needed to forward events directly to the Entry, bypassing the global  action
                     accelerators.

                     Parameterswidget (Widget) -- the widget which has received the event.

                            • event (Event) -- the GTK event.

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              load_annotations(annot_page)
                     Add annotations to be displayed (typically on going to a new slide).

                     Parameters
                            annot_page (Page) -- The page object that contains the annotations

              new_doc_annotation()

              remove_annotation(gaction, param=None)
                     Remove an annotation to the from the page’s annotation list

                     Parametersgaction   (Action)   --  the  action  triggering  the  call,  which
                              identifies which backend

                            • param (Variant) -- an optional parameter

              remove_doc_annotation()

              rewrap_annotations()
                     Update the wrap-width of the annotation column to fit its actual width

              set_doc_annotation()

              try_cancel()
                     Try to cancel editing

                     Returns
                            whether editing was enabled and thus canceled

                     Return type
                            bool

       class pympress.extras.Cursor
              Bases: object

              Class managing cursors statically for displays, so we can select the  mouse  cursor
              with a simple string.

              classmethod set_cursor(widget, cursor_name='parent')
                     Set the cursor named cursor_name'.

                     Parameterswidget (Widget) -- The widget triggering the cursor change, used to
                              retrieve a Gdk.Window

                            • cursor_name (str) -- Name of the cursor to be set

       class pympress.extras.FileWatcher
              Bases: object

              A class that wraps watchdog objects, to trigger callbacks when a file changes.

              callback()
                     Callback  to   be   called   on   file   changes,   usually   connected   to
                     reload_document()

              monitor = None
                     A FileSystemEventHandler to get notified when the file changes

              observer = None
                     A Observer to watch when the file changes

              path = None
                     The Path to the file being watched

              stop_watching()
                     Remove all files that are being watched.

              timeout = 0

              watch_file(uri, callback, *args, **kwargs)
                     Watches a new file with a new callback. Removes any precedent watched files.

                     If the optional watchdog dependency is missing, does nothing.

                     Parametersuri (str) -- URI of the file to watch

                            • callback  (function)  --  callback  to  call  with  all the further
                              arguments when the file changes

       class pympress.extras.Media(builder, conf)
              Bases: object

              Class  managing  statically  the  medias  and  media  player  backends,  to  enable
              play/pause callbacks.

              Parametersbuilder (Builder) -- A builder from which to load widgets

                     • conf (Config) -- An object containing the preferences

              adjust_margins_for_mode(page_type)
                     Adjust the relative margins of child widgets for notes mode update.

                     Parameters
                            page_type (PdfPage) -- The part of the page to display

              c_overlay = None
                     Overlay for the Content window.

              get_factory(mime_type)
                     Returns a class of type _backend.

              hide(media_id, gaction=None, param=None)
                     Stops playing a media and hides the player. Used as a callback.

                     Parametersmedia_id (int) -- A unique identifier of the media to start playing

                            • gaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              hide_all()
                     Stops all playing medias and hides the players. Used before exit.

              p_overlay = None
                     Overlay for the Presenter window.

              play(media_id, gaction=None, param=None)
                     Starts playing a media. Used as a callback.

                     Parametersmedia_id (int) -- A unique identifier of the media to start playing

                            • gaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              play_pause(media_id, gaction=None, param=None)
                     Toggles playing and pausing a media. Used as a callback.

                     Parametersmedia_id  (int)  --  A  unique  idientifier  of  the media to start
                              playing

                            • gaction (Action) -- the action triggering the call

                            • param (Variant) -- the parameter as a variant, or None

              purge_media_overlays()
                     Remove current media overlays.

              remove_media_overlays()
                     Remove current media overlays.

              replace_media_overlays(current_page, page_type)
                     Remove current media overlays, add new ones if page contains media.

                     Parameterscurrent_page (Page) -- The page for which to prepare medias

                            • page_type (PdfPage) -- The part of the page to consider

              resize(which=None)
                     Resize all media overlays that are a child of an overlay.

              set_time(media_id, gaction=None, param=None)
                     Set the player of a given media at time t. Used as a callback.

                     Parametersmedia_id (int) -- A  unique  idientifier  of  the  media  to  start
                              playing

                            • gaction (Action) -- the action triggering the call

                            • param  (Variant) -- A wrapped float containing the time to which we
                              have to go.

              toggle(gaction, param=None)
                     Toggle a backend (if it was loaded correctly)

                     Parametersgaction  (Action)  --  the  action  triggering  the   call,   which
                              identifies which backend

                            • param (Variant) -- an optional parameter

              types_list = {}
                     dict  containing  backends  and  their mappings to mime type lists for which
                     they are enabled.  A default backend is marked by an empty list.

       class pympress.extras.Zoom(builder)
              Bases: object

              Manage the zoom level (using a cairo matrix), draw area that will be  zoomed  while
              it is being selected.

              Parameters
                     builder (Builder) -- A builder from which to load widgets

              clear_cache()
                     callback, to be connected to clear_cache()

              draw_zoom_target(widget, cairo_context)
                     Perform the drawings by user.

                     Parameterswidget (DrawingArea) -- The widget where to draw the scribbles.

                            • cairo_context  (Context)  --  The  canvas  on  which  to render the
                              drawings

              get_matrix(ww, wh)
                     Returns the Matrix used to perform the zoom for the widget of size ww x wh.

                     Parametersww (float) -- widget width

                            • wh (float) -- widget height

                     Returns
                            the zoom transformation matrix

                     Return type
                            Matrix

              get_slide_point(widget, event)
                     Gets the point on the slide on a scale (0..1, 0..1), from  its  position  in
                     the widget.

              nop(**kwargs)
                     Do nothing

              p_central = None
                     Box in the Presenter window, used to reliably set cursors.

              redraw_current_slide()
                     callback, to be connected to redraw_current_slide()

              scale = 1.0

              set_action_enabled = None
                     callback, to be connected to set_action_enabled()

              shift = (0, 0)

              start_zooming(*args)
                     Setup for the user to select the zooming area.

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              stop_zooming(*args)
                     Cancel the zooming, reset the zoom level to full page.

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              toggle_zoom_target(widget, event)
                     Start/stop drawing the zoom's target rectangle.

                     Parameterswidget (Widget) -- the widget which has received the event.

                            • event (Event) -- the GTK event.

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              track_zoom_target(widget, event)
                     Draw the zoom's target rectangle.

                     Parameterswidget (Widget) -- the widget which has received the event.

                            • event (Event) -- the GTK event.

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              try_cancel()
                     Cancel the zoom selection, if it was enabled.

                     Returns
                            True  if the zoom was cancelled, False if a zoom selection was not in
                            progress.

                     Return type
                            bool

              zoom_points = None

              zoom_selecting = False
                     Whether we are displaying the  interface  to  scribble  on  screen  and  the
                     overlays containing said scribbles

   pympress.deck -- Manage user drawings on the current slide
       class pympress.deck.Overview(config, builder, notes_mode)
              Bases: Builder

              UI that allows to draw free-hand on top of the current slide.

              Parametersconfig (Config) -- A config object containing preferences

                     • builder (Builder) -- A builder from which to load widgets

                     • notes_mode  (bool)  -- The current notes mode, i.e. whether we display the
                       notes on second slide

              all_pages = False
                     bool whether we show all pages or  remove  consecutive  identically  labeled
                     pages, keeping only the last

              c_da = None
                     The DrawingArea in the content window

              cache = None
                     SurfaceCache instance.

              compute_frame_grid()
                     callback, to be connected to compute_frame_grid()

              create_drawing_areas()
                     Build DrawingArea and AspectFrame elements to display later on

              deck0 = None
                     The DrawingArea for the first slide

              deck_grid = None
                     Grid that displays all the slides of the overview

              deck_mode = False
                     Whether we are displaying the deck overview on screen

              deck_off_render = None
                     A OffscreenWindow where we render the deck interface when it's not shown

              deck_viewport = None
                     Viewport that replaces normal panes when deck is shown

              disable_deck_overview()
                     Disable the deck view.

                     Returns
                            whether  it  was  possible  to  disable  (thus if it was not disabled
                            already)

                     Return type
                            bool

              enable_deck_overview()
                     Enable the deck view.

                     Returns
                            whether it was possible  to  enable  (thus  if  it  was  not  enabled
                            already)

                     Return type
                            bool

              goto_page()
                     callback, to be connected to goto_page()

              grid_size = (0, 0)
                     tuple of rows/columns in the grid

              load_layout()
                     callback, to be connected to load_layout()

              max_row_size = 6
                     int How large (at most) to make rows

              on_deck_click(widget, event)
                     A slide has been clicked, go to it

                     Parameterswidget (Widget) -- the widget which has received the key stroke

                            • event  (Event)  --  the  GTK  event,  which contains the key stroke
                              details

              on_deck_draw(widget, cairo_context)
                     Actually draw the deck slide -- only do this from cache, to limit overhead

                     Parameterswidget (Widget) -- the widget to update

                            • cairo_context (Context) -- the Cairo context  (or  None  if  called
                              directly)

              on_deck_hover(widget, event)
                     Track when each deck in the slide is hovered

              p_central = None
                     Box in the Presenter window, where we insert deck.

              prerender(da)
                     Perform in-cache rendering

                     Parameters
                            da (DrawingArea) -- the widget for which we’re rendering

              reset_grid(*args)
                     Set the slides configuration and size in the grid

              resize_cache()
                     callback, to be connected to resize_widget()

              setup_doc_callbacks(doc)
                     Callbacks that need to be setup again at every new document

                     Parameters
                            doc (Document) -- The new document that got loaded

              switch_deck_overview(gaction, target=None)
                     Starts the mode where one can read on top of the screen.

                     Args:

                     Returns
                            whether the event was consumed

                     Return type
                            bool

              try_cancel()
                     Cancel deck, if it is enabled.

                     Returns
                            True if deck got cancelled, False if it was already disabled.

                     Return type
                            bool

   pympress.util -- various utility functions
       class pympress.util.Monitor(obj, id_=None, num=None)
              Bases: ScreenArea

              A  specialised  ScreenArea representing a monitor, with an descriptive string and a
              monitor number

              static lookup_monitors(display, *windows)
                     Get the info on the monitors

                     Parametersdisplay (Display) -- the current screen

                            • *windows (tuple of Window) -- windows for  which  to  look  up  the
                              monitor position

                     Returns
                            The  monitors  for  each  window,  followed  by the best monitors for
                            presenter and content

                     Return type
                            tuple of Monitor

              monitor_number = -1
                     An int that identifies the monitor in Display

              name = ''
                     A str to represent a user-friendly name for the monitor

       exception pympress.util.NoMonitorPositions
              Bases: Exception

              The Exception we raise when there is no way of figuring out the monitor position of
              windows

       class pympress.util.ScreenArea(obj)
              Bases: object

              Convenience  class  to represent monitors or windows in terms of the area (position
              and size) they use on screen

              This is similar to Monitor, but necessary as we want to handle “mirrored”  monitors
              as  if  they  were a single monitor, and only use “extended” monitors as target for
              content window position and/or fullscreening.

              contains(other)
                     Check whether this area contains other

                     Parameters
                            other (ScreenArea) -- The screen area to compare with

                     Returns
                            True iff the area is contained

                     Return type
                            bool

              equal(other)
                     Check whether 2 areas cover the exact same space

                     Parameters
                            other (ScreenArea) -- The screen area to compare with

                     Returns
                            True iff the areas are identical

                     Return type
                            bool

              intersection(other)
                     Compute the intersection of 2 screen areas

                     Parameters
                            other (ScreenArea) -- The screen area to compare with

                     Returns
                            An area representing  the  intersection,  or  None  if  there  is  no
                            intersection

                     Return type
                            ScreenArea or None

              intersects(other)
                     Check whether this area intersects other

                     Parameters
                            other (ScreenArea) -- The screen area to compare with

                     Returns
                            True iff the areas have an intersection

                     Return type
                            bool

              least_intersection(candidates)
                     Find the rectangle that intersects least with rect in candidates

                     Parameters
                            candidates (iterable of
                            `
                            ScreenArea`s) -- The monitor areas to check for intersection

                     Returns
                            The   best   candidate  screen  area,  i.e.  that  has  the  smallest
                            intersection

                     Return type
                            ScreenArea

              most_intersection(candidates)
                     Find the rectangle that intersects most with rect in candidates

                     Parameters
                            candidates (iterable of
                            `
                            ScreenArea`s) -- The monitor areas to check for intersection

                     Returns
                            The  best  candidate  screen  area,  i.e.  that   has   the   largest
                            intersection

                     Return type
                            ScreenArea

       pympress.util.close_opened_resources()
              Close  all importlib context managers for resources that we needed over the program
              lifetime.

       pympress.util.fileopen(f)
              Call the right function to open files, based on the platform.

              Parameters
                     f (path-like) -- path to the file to open

       pympress.util.get_default_config()
              Returns the path to the configuration file containing the defaults.

              Returns
                     The path to the portable configuration file.

              Return type
                     Path

       pympress.util.get_icon_path(name)
              Get the path for an image from pympress' resources

              Parameters
                     name (str) -- The name of the icon to load

              Returns
                     The path to the icon to load

              Return type
                     str

       pympress.util.get_log_path()
              Returns the appropriate path to the log file in the user app dirs.

              Returns
                     path to the log file.

              Return type
                     Path

       pympress.util.get_portable_config()
              Returns the path to the configuration file for a  portable  install  (i.e.  in  the
              install root).

              May return None if the install root is not a real directory (e.g. in a zip file).

              Returns
                     The path to the portable configuration file.

              Return type
                     Path or None

       pympress.util.get_pympress_meta()
              Get metadata (version, etc) from pympress' __init__.py or git describe.

              Returns
                     metadata properties (version, contributors) mapped to their values

              Return type
                     dict

       pympress.util.get_translation(domain)
              Returns a gettext translation object.

              This  re-implements  gettext’s translation() and find() to allow using a python 3.9
              Traversable as localedir

              Returns
                     A gettext translation object with the strings for the domain loaded

              Return type
                     NullTranslations

       pympress.util.get_ui_resource_file(name, ext='.glade')
              Load an UI definition file from pympress' resources

              Parametersname (str) -- The name of the UI to load

                     • ext (str) -- The extension of the file

              Returns
                     The full path to the glade file

              Return type
                     str

       pympress.util.get_user_config()
              Returns the path to the configuration file in the user config directory

              Returns
                     path to the user configuration file.

              Return type
                     Path

       pympress.util.hard_set_screensaver(disabled)
              Enable or disable the screensaver.

              Parameters
                     disabled (bool) -- if True, indicates that the screensaver must be disabled;
                     otherwise it will be enabled

       pympress.util.introspect_flag_value(flags_class, nick, fallback)
              Get the value of a flag from its class, given a value’s name (or nick)

              Introspection   technique   (in  particular  __flags_values__ dict)  inspired  from
              pygtkcompat.  This is needed because there is no typelib for libgstplayback.

              Parametersflags_class (a  type  inheriting  from  GFlags)  --  the  flags  class  to
                       introspect

                     • nick (str) -- a name or nick of the flag value that should be returned

                     • fallback (int) -- the documented flag value, if lookup fails

       pympress.util.list_icons()
              List the icons from pympress' resources.

              Returns
                     The paths to the icons in the pixmaps directory

              Return type
                     list of str

       pympress.util.load_style_provider(style_provider)
              Load the css and in a style provider

              Parameters
                     style_provider (CssProvider) -- The style provider in which to load CSS

              Returns
                     The style provider with CSS loaded

              Return type
                     CssProvider

       pympress.util.make_windows_dpi_aware()
              Set to avoid blurriness issues on High-DPI resolutions with scaling.

   pympress.media_overlays.base -- base widget to play videos with an unspecified backend
       class pympress.media_overlays.base.VideoOverlay(container, page_type, action_map, media)
              Bases: Builder

              Simple Video widget.

              All  do_X()  functions  are  meant  to be called from the main thread, through e.g.
              idle_add(), for thread-safety in the handling of video backends.

              Parameterscontainer (Overlay) -- The container with the slide, at the top  of  which
                       we add the movie area

                     • page_type (PdfPage) -- the part of the page to display

                     • action_map  (ActionMap)  --  the  action map that contains the actions for
                       this media

                     • media (Media) -- the object defining the properties of the video  such  as
                       position etc.

              action_map = None
                     ActionMap containing the actios for this video overlay

              autoplay = False
                     bool that tracks whether we should play automatically

              do_hide(*args)
                     Remove widget from overlays. Needs to be called via idle_add().

                     Returns
                            True iff this function should be run again (idle_add() convention)

                     Return type
                            bool

              do_play()
                     Start playing the media file.

                     Should run on the main thread to ensure we avoid reentrency problems.

                     Returns
                            True iff this function should be run again (idle_add() convention)

                     Return type
                            bool

              do_play_pause()
                     Toggle pause mode of the media.

                     Should run on the main thread to ensure we avoid reentrency problems.

                     Returns
                            True iff this function should be run again (idle_add() convention)

                     Return type
                            bool

              do_set_time(t)
                     Set the player at time t.

                     Should  run  on  the  main thread to ensure we avoid vlc plugins' reentrency
                     problems.

                     Parameters
                            t (float) -- the timestamp, in s

                     Returns
                            True iff this function should be run again (idle_add() convention)

                     Return type
                            bool

              do_stop()
                     Stops playing in the backend player.

              dragging_paused = False
                     bool that tracks whether the playback  was  paused  when  the  user  started
                     dragging the position

              dragging_position = False
                     bool that tracks whether the user is dragging the position

              end_pos = None
                     float giving the end position for playback, if any

              format_millis(sc, prog)
                     Callback   to   format   the   current   timestamp   (in   milliseconds)  as
                     minutes:seconds.

                     Parameterssc (Scale) -- The scale whose position we are formatting

                            • prog (float) -- The position of  the  Scale,  i.e.  the  number  of
                              seconds elapsed

              handle_embed(mapped_widget)
                     Handler  to  embed  the  video  player  in  the window, connected to the map
                     signal.

              handle_end()
                     End of the stream reached: restart if looping, otherwise hide overlay

              is_playing()
                     Returns whether the media is currently playing (and not paused).

                     Returns
                            True iff the media is playing.

                     Return type
                            bool

              is_shown()
                     Returns whether the media overlay is currently added  to  the  overlays,  or
                     hidden.

                     Returns
                            True iff the overlay is currently displayed.

                     Return type
                            bool

              last_timestamp = 0.0
                     float representing the last know timestamp at which the progress bar updated

              maxval = 1
                     float holding the max time in s

              media_overlay = None
                     VBox that contains all the elements to be overlayed.

              media_type = ''
                     str representing the mime type of the media file

              movie_zone = None
                     DrawingArea where the media is rendered.

              parent = None
                     Overlay that is the parent of the VideoOverlay widget.

              play_pause(*args)
                     Callback to toggle play/pausing from clicking on the DrawingArea

              progress = None
                     Scale that is the progress bar in the controls toolbar - if we have one.

              progress_moved(rng, sc, val)
                     Callback  to  update  the  position  of  the  video  when the user moved the
                     progress bar.

                     Parametersrng (Range) -- The range corresponding to the scale whose  position
                              we are formatting

                            • sc (Scale) -- The scale whose position we are updating

                            • val  (float)  --  The position of the Scale, which is the number of
                              seconds elapsed in the video

              relative_margins = None
                     tuple containing the left/top/right/bottom space around the drawing area  in
                     the visible slide

              relative_page_margins = None
                     tuple  containing the left/top/right/bottom space around the drawing area in
                     the PDF page

              repeat = False
                     bool that tracks whether we should play after we finished playing

              resize()
                     Adjust the position and size of the media overlay.

              show() Bring the widget to the top of the overlays if necessary.

              start_pos = 0.0
                     float giving the initial starting position for playback

              time_format = '{:01}:{:02}'
                     ss / m:ss when the max time is known

                     Type   Format of the video time, defaults to m

                     Type   ss, changed to m

              toolbar = None
                     A HBox containing a toolbar with buttons and progress the progress bar

              update_margins_for_page(page_type)
                     Recalculate the margins around the media in the event of a page type change.

                     Parameters
                            page_type (PdfPage) -- the part of the page to display

              update_progress(time)
                     Update the toolbar slider to the current time.

                     Parameters
                            time (float) -- The time in this video in s

              update_range(max_time)
                     Update the toolbar slider size.

                     Parameters
                            max_time (float) -- The maximum time in this video in s

   pympress.media_overlays.gif -- widget to play gif images as videos
       class pympress.media_overlays.gif_backend.GifOverlay(*args, **kwargs)
              Bases: VideoOverlay

              A simple overlay mimicking the functionality of showing videos,  but  showing  gifs
              instead.

              advance_gif()
                     Advance the gif, queue redrawing if the frame changed, and schedule the next
                     frame.

              anim = None
                     A PixbufAnimation containing  all  the  frames  and  their  timing  for  the
                     displayed gif

              anim_iter = None
                     A  PixbufAnimationIter which will provide the timely access to the frames in
                     anim

              base_size = None
                     A tuple of (int, int) indicating the size of the bounding box of the gif

              do_play()
                     Start playing the media file.

                     Should run on the main thread to ensure we avoid reentrency problems.

                     Returns
                            True iff this function should be run again (idle_add() convention)

                     Return type
                            bool

              do_play_pause()
                     Toggle pause mode of the media.

                     Should run on the main thread to ensure we avoid reentrency problems.

                     Returns
                            True iff this function should be run again (idle_add() convention)

                     Return type
                            bool

              do_set_time(t)
                     Set the player at time t.

                     Should run on the main thread to ensure we avoid reentrency problems.

                     Parameters
                            t (int) -- the timestamp, in ms

                     Returns
                            True iff this function should be run again (idle_add() convention)

                     Return type
                            bool

              do_stop()
                     Stops playing in the backend player.

              draw(widget, ctx)
                     Simple resized drawing: get the pixbuf, set the transform, draw the image.

              is_playing()
                     Returns whether the media is currently playing (and not paused).

                     Returns
                            True iff the media is playing.

                     Return type
                            bool

              mute(*args)

              set_transform(*args)
                     Compute the transform to scale (not stretch nor crop) the gif.

              classmethod setup_backend()
                     Returns the name of this backend.

              transform = None
                     The Matrix defining the zoom & shift to scale the gif

   pympress.media_overlays.gst -- widget to play videos using Gstreamer's Gst
       class pympress.media_overlays.gst_backend.GstOverlay(*args, **kwargs)
              Bases: VideoOverlay

              Simple Gstramer widget.

              Wraps a simple gstreamer playbin.

              do_play()
                     Start playing the media file.

                     Returns
                            True iff this function should be run again (idle_add() convention)

                     Return type
                            bool

              do_play_pause()
                     Toggle pause mode of the media.

                     Should run on the main thread to ensure we avoid reentrency problems.

                     Returns
                            True iff this function should be run again (idle_add() convention)

                     Return type
                            bool

              do_set_time(time)
                     Set the player at time time.

                     Should run on the main thread to ensure we avoid reentrency problems.

                     Parameters
                            time (float) -- the timestamp, in s

                     Returns
                            True iff this function should be run again (idle_add() convention)

                     Return type
                            bool

              do_stop()
                     Stops playing in the backend player.

              do_update_duration(*args)
                     Transmit the change of file duration to the UI to adjust the scroll bar.

              do_update_time()
                     Update the current position in the progress bar.

                     Returns
                            True iff this function should be run again (timeout_add() convention)

                     Return type
                            bool

              is_playing()
                     Returns whether the media is currently playing (and not paused).

                     Returns
                            True iff the media is playing.

                     Return type
                            bool

              mute(value)
                     Mutes or unmutes the player.

                     Parameters
                            value (bool) -- True iff this player should be muted

              on_initial_play()
                     Set starting position, start scrollbar updates, unhide overlay.

              on_state_changed(bus, msg)
                     Callback triggered by playbin state changes.

                     Parametersbus (Bus) -- the bus that we are connected to

                            • msg (Message) -- the "state-changed" message

              playbin = None
                     A Playbin to be play videos

              classmethod setup_backend(gst_opts=[])
                     Prepare/check the Gst backend.

                     Returns
                            the version of Gst used by the backend

                     Return type
                            str

              sink = None
                     A Sink to display video content

              update_freq = 200
                     int number of milliseconds between updates

   pympress.media_overlays.vlc -- widget to play videos using VLC
       class pympress.media_overlays.vlc_backend.VlcOverlay(*args, **kwargs)
              Bases: VideoOverlay

              Simple VLC widget.

              Its player can be controlled through the 'player' attribute, which is a MediaPlayer
              instance.

              do_play()
                     Start playing the media file.

                     Should  run  on  the  main thread to ensure we avoid vlc plugins' reentrency
                     problems.

                     Returns
                            True iff this function should be run again (idle_add() convention)

                     Return type
                            bool

              do_play_pause()
                     Toggle pause mode of the media.

                     Should run on the main thread to ensure we  avoid  vlc  plugins'  reentrency
                     problems.

                     Returns
                            True iff this function should be run again (idle_add() convention)

                     Return type
                            bool

              do_set_time(time)
                     Set the player at time time.

                     Should  run  on  the  main thread to ensure we avoid vlc plugins' reentrency
                     problems.

                     Parameters
                            time (float) -- the timestamp, in s

                     Returns
                            True iff this function should be run again (idle_add() convention)

                     Return type
                            bool

              do_stop()
                     Stops playing in the backend player.

              handle_embed(mapped_widget)
                     Handler to embed the VLC player in the window, connected to the map signal.

              handle_end()
                     End of the stream reached: restart if looping, otherwise hide overlay

                     Overrided because, to implement looping, vlc plugin  needs  to  be  told  to
                     start on stream end, not to seek

              is_playing()
                     Returns whether the media is currently playing (and not paused).

                     Returns
                            True iff the media is playing.

                     Return type
                            bool

              mute(value)
                     Mutes the player.

                     Parameters
                            value (bool) -- True iff this player should be muted

              paint_backdrop(widget, context)
                     Draw behind/around the video, aka the black bars

                     Parameterswidget (Widget) -- the widget to update

                            • context (Context) -- the Cairo context (or None if called directly)

              classmethod setup_backend(vlc_opts=['--no-video-title-show'])
                     Prepare/check the VLC backend.

                     Parameters
                            vlc_opts (list) -- the arguments for starting vlc

                     Returns
                            the version of VLC used by the backend

                     Return type
                            str

              show() Bring the widget to the top of the overlays if necessary − also force redraw
                     of movie zone

              time_changed(event)
                     Handle time passing

                     Parameters
                            event (Event) -- The event that triggered the handler

       pympress.media_overlays.vlc_backend.get_window_handle(window)
              Uses ctypes to call gdk_win32_window_get_handle which is not  available  in  python
              gobject introspection porting.

              Solution from http://stackoverflow.com/a/27236258/1387346

              Parameters
                     window (Window) -- The window for which we want to get the handle

              Returns
                     The handle to the win32 window

AUTHOR

       Cimbali

COPYRIGHT

       2009-2024, Thomas Jost; 2015-2023 Cimbali