[master/rhel7-branch][PATCH] Global screenshot support (#1025038)

Martin Kolman mkolman at redhat.com
Tue Nov 26 10:15:22 UTC 2013


On Mon, 2013-11-25 at 18:06 +0100, Vratislav Podzimek wrote:
> On Mon, 2013-11-25 at 17:29 +0100, Martin Kolman wrote:
> > Previously, Anaconda was not able to take
> > a screenshot of foreign windows, like for
> > example the connection editor window or
> > the keymap window.
> > This has been fixed by using the scrot
> > screenshot tool, which record the whole
> > visible screen content and the keybinder
> > global shortcut library, which registers
> > shortcuts that work regardless of window focus.
> > As a result, it is now possible to take
> > a screenshot of any window at any time.
> > 
> > Related: rhbz#752051
> > Signed-off-by: Martin Kolman <mkolman at redhat.com>
> > ---
> >  anaconda.spec.in              |  2 ++
> >  pyanaconda/ui/gui/__init__.py | 51 ++++++++++++++++++++++++-------------------
> >  2 files changed, 31 insertions(+), 22 deletions(-)
> > 
> > diff --git a/anaconda.spec.in b/anaconda.spec.in
> > index d53792c..ee763ac 100755
> > --- a/anaconda.spec.in
> > +++ b/anaconda.spec.in
> > @@ -166,6 +166,8 @@ Requires: nm-connection-editor
> >  %ifarch %livearches
> >  Requires: zenity
> >  %endif
> > +Requires: scrot
> > +Requires: keybinder3
> >  
> >  %description gui
> >  This package contains graphical user interface for the Anaconda installer.
> > diff --git a/pyanaconda/ui/gui/__init__.py b/pyanaconda/ui/gui/__init__.py
> > index 92a40de..ea596d4 100644
> > --- a/pyanaconda/ui/gui/__init__.py
> > +++ b/pyanaconda/ui/gui/__init__.py
> > @@ -21,10 +21,11 @@
> >  import inspect, os, sys, time, site
> >  import meh.ui.gui
> >  
> > -from gi.repository import Gdk, Gtk, AnacondaWidgets
> > +from gi.repository import Gdk, Gtk, AnacondaWidgets, Keybinder
> >  
> >  from pyanaconda.i18n import _
> >  from pyanaconda import product
> > +from pyanaconda import iutil
> >  
> >  from pyanaconda.ui import UserInterface, common
> >  from pyanaconda.ui.gui.utils import enlightbox, gtk_action_wait, busyCursor, unbusyCursor
> > @@ -36,6 +37,8 @@ log = logging.getLogger("anaconda")
> >  __all__ = ["GraphicalUserInterface", "QuitDialog"]
> >  
> >  _screenshotIndex = 0
> > +_last_screenshot_timestamp = 0
> > +SCREENSHOT_DELAY = 1  # in seconds
> >  
> >  ANACONDA_WINDOW_GROUP = Gtk.WindowGroup()
> >  
> > @@ -206,7 +209,10 @@ class GUIObject(common.UIObject):
> >  
> >          ANACONDA_WINDOW_GROUP.add_window(self.window)
> >          self.builder.connect_signals(self)
> > -        self.window.connect("key-release-event", self._handlePrntScreen)
> > +
> > +        # Keybinder from GI needs to be initialized before use
> > +        Keybinder.init()
> > +        Keybinder.bind("<Shift>Print", self._handlePrntScreen, [])
> >  
> >          self._check_list = []
> >  
> > @@ -224,27 +230,28 @@ class GUIObject(common.UIObject):
> >  
> >          raise IOError("Could not load UI file '%s' for object '%s'" % (self.uiFile, self))
> >  
> > -    def _handlePrntScreen(self, window, event):
> > +    def _handlePrntScreen(self, *args, **kwargs):
> >          global _screenshotIndex
> > -
> > -        if event.keyval != Gdk.KEY_Print:
> > -            return
> > -
> > -        # Make sure the screenshot directory exists.
> > -        if not os.access(self.screenshots_directory, os.W_OK):
> > -            os.mkdir(self.screenshots_directory)
> > -
> > -        fn = os.path.join(self.screenshots_directory,
> > -                          "screenshot-%04d.png" % _screenshotIndex)
> > -
> > -        win = window.get_window()
> > -        width = win.get_width()
> > -        height = win.get_height()
> > -
> > -        pixbuf = Gdk.pixbuf_get_from_window(win, 0, 0, width, height)
> > -        pixbuf.savev(fn, "png", [], [])
> > -
> > -        _screenshotIndex += 1
> > +        global _last_screenshot_timestamp
> > +        # as pressing single press of the key biding
> too much pressing here, I'd say, resulting in "biding"
Ok, sending minions to do my bidding elsewhere. :)
> 
> > +        # generates multiple callbacks, we need to suppress
> > +        # additional callbacks for some time once a screenshot
> > +        # is taken
> > +        if (time.time() - _last_screenshot_timestamp) >= SCREENSHOT_DELAY:
> > +            # Make sure the screenshot directory exists.
> > +            if not os.access(self.screenshots_directory, os.W_OK):
> > +                os.mkdir(self.screenshots_directory)
> os.makedirs should be safer here
> 
> Otherwise this looks good to me.
> 
Thanks, fixing locally.




More information about the anaconda-patches mailing list