[RHEL 7.2/PATCH] Keyboard Scroll Fails in Viewports (rhbz#1189899)

Vratislav Podzimek vpodzime at redhat.com
Wed Jun 3 06:30:18 UTC 2015


On Tue, 2015-06-02 at 16:39 -0400, Robert Marshall wrote:
> From: David Shea <dshea at redhat.com>
> 
> Robert Marshall's cherry pick of David Shea's original commit-id:
> 
> 35324b3fd891400c0405c50a18798080910627ed
> 
> This patch corrects an issue where users tried to navigate through
> the storage or software selections with a keyboard and the window
> failed to scroll when the selection was not in the current viewport.
> 
> It does not include changes to filter.py and filter.glade per
> consultation with David Shea.
> 
> Resolves: rhbz#1189899
> ---
>  pyanaconda/ui/gui/spokes/custom.py     |  8 ++++++++
>  pyanaconda/ui/gui/spokes/software.py   |  6 ++++++
>  pyanaconda/ui/gui/spokes/source.glade  |  6 +++---
>  pyanaconda/ui/gui/spokes/source.py     |  5 +++++
>  pyanaconda/ui/gui/spokes/storage.glade |  6 +++---
>  pyanaconda/ui/gui/spokes/storage.py    | 11 +++++++++++
>  6 files changed, 36 insertions(+), 6 deletions(-)
> 
> diff --git a/pyanaconda/ui/gui/spokes/custom.py b/pyanaconda/ui/gui/spokes/custom.py
> index 5319c7c..ec6c8ac 100644
> --- a/pyanaconda/ui/gui/spokes/custom.py
> +++ b/pyanaconda/ui/gui/spokes/custom.py
> @@ -201,6 +201,10 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
>          self._partitionsViewport = self.builder.get_object("partitionsViewport")
>          self._partitionsNotebook = self.builder.get_object("partitionsNotebook")
>  
> +        # Connect partitionsNotebook focus events to scrolling in the parent viewport
> +        partitionsNotebookViewport = self.builder.get_object("partitionsNotebookViewport")
> +        self._partitionsNotebook.set_focus_vadjustment(partitionsNotebookViewport.get_vadjustment())
> +
>          self._whenCreateLabel = self.builder.get_object("whenCreateLabel")
>  
>          self._availableSpaceLabel = self.builder.get_object("availableSpaceLabel")
> @@ -265,6 +269,10 @@ class CustomPartitioningSpoke(NormalSpoke, StorageChecker):
>          # this list will include things like PVs and RAID members.
>          self._fsCombo.remove_all()
>  
> +        # Connect viewport scrolling with accordion focus events
> +        self._accordion.set_focus_hadjustment(self._partitionsViewport.get_hadjustment())
> +        self._accordion.set_focus_vadjustment(self._partitionsViewport.get_vadjustment())
> +
>          threadMgr.add(AnacondaThread(name=THREAD_CUSTOM_STORAGE_INIT, target=self._initialize))
>  
>      def _initialize(self):
> diff --git a/pyanaconda/ui/gui/spokes/software.py b/pyanaconda/ui/gui/spokes/software.py
> index 97516e3..7c704c6 100644
> --- a/pyanaconda/ui/gui/spokes/software.py
> +++ b/pyanaconda/ui/gui/spokes/software.py
> @@ -72,6 +72,12 @@ class SoftwareSelectionSpoke(NormalSpoke):
>          self._environmentListBox = self.builder.get_object("environmentListBox")
>          self._addonListBox = self.builder.get_object("addonListBox")
>  
> +        # Connect viewport scrolling with listbox focus events
> +        environmentViewport = self.builder.get_object("environmentViewport")
> +        addonViewport = self.builder.get_object("addonViewport")
> +        self._environmentListBox.set_focus_vadjustment(environmentViewport.get_vadjustment())
> +        self._addonListBox.set_focus_vadjustment(addonViewport.get_vadjustment())
> +
>          # Used to store how the user has interacted with add-ons for the default add-on
>          # selection logic. The dictionary keys are group IDs, and the values are selection
>          # state constants. See refreshAddons for how the values are used.
> diff --git a/pyanaconda/ui/gui/spokes/source.glade b/pyanaconda/ui/gui/spokes/source.glade
> index a3969ea..bd7e154 100644
> --- a/pyanaconda/ui/gui/spokes/source.glade
> +++ b/pyanaconda/ui/gui/spokes/source.glade
> @@ -508,18 +508,18 @@
>                  <property name="vexpand">True</property>
>                  <property name="orientation">vertical</property>
>                  <child>
> -                  <object class="GtkScrolledWindow" id="scrolledwindow1">
> +                  <object class="GtkScrolledWindow" id="mainScrolledWindow">
>                      <property name="visible">True</property>
>                      <property name="can_focus">True</property>
>                      <property name="hscrollbar_policy">never</property>
>                      <child>
> -                      <object class="GtkViewport" id="viewport1">
> +                      <object class="GtkViewport" id="mainViewport">
>                          <property name="visible">True</property>
>                          <property name="can_focus">False</property>
>                          <property name="margin_right">24</property>
>                          <property name="shadow_type">none</property>
>                          <child>
> -                          <object class="GtkBox" id="box4">
> +                          <object class="GtkBox" id="mainBox">
>                              <property name="visible">True</property>
>                              <property name="can_focus">False</property>
>                              <property name="orientation">vertical</property>
> diff --git a/pyanaconda/ui/gui/spokes/source.py b/pyanaconda/ui/gui/spokes/source.py
> index 67e968c..015a404 100644
> --- a/pyanaconda/ui/gui/spokes/source.py
> +++ b/pyanaconda/ui/gui/spokes/source.py
> @@ -122,6 +122,11 @@ class ProxyDialog(GUIObject, GUIDialogInputCheckHandler):
>          self._proxyValidate = self.add_check(self._proxyURLEntry, self._checkProxyURL)
>          self._proxyValidate.update_check_status()
>  
> +        # Connect scroll events on the viewport with focus events on the box
> +        mainViewport = self.builder.get_object("mainViewport")
> +        mainBox = self.builder.get_object("mainBox")
> +        mainBox.set_focus_vadjustment(mainViewport.get_vadjustment())
> +
>      def _checkProxyURL(self, inputcheck):
>          proxy_string = self.get_input(inputcheck.input_obj)
>  
> diff --git a/pyanaconda/ui/gui/spokes/storage.glade b/pyanaconda/ui/gui/spokes/storage.glade
> index 6074750..4beddc2 100644
> --- a/pyanaconda/ui/gui/spokes/storage.glade
> +++ b/pyanaconda/ui/gui/spokes/storage.glade
> @@ -484,18 +484,18 @@
>                  <property name="orientation">vertical</property>
>                  <property name="spacing">6</property>
>                  <child>
> -                  <object class="GtkScrolledWindow" id="scrolledwindow1">
> +                  <object class="GtkScrolledWindow" id="storageScrolledWindow">
>                      <property name="visible">True</property>
>                      <property name="can_focus">True</property>
>                      <property name="vexpand">True</property>
>                      <property name="hscrollbar_policy">never</property>
>                      <child>
> -                      <object class="GtkViewport" id="viewport1">
> +                      <object class="GtkViewport" id="storageViewport">
>                          <property name="visible">True</property>
>                          <property name="can_focus">False</property>
>                          <property name="shadow_type">none</property>
>                          <child>
> -                          <object class="GtkBox" id="box3">
> +                          <object class="GtkBox" id="storageMainBox">
>                              <property name="visible">True</property>
>                              <property name="can_focus">False</property>
>                              <property name="orientation">vertical</property>
> diff --git a/pyanaconda/ui/gui/spokes/storage.py b/pyanaconda/ui/gui/spokes/storage.py
> index bbd993c..e902cfe 100644
> --- a/pyanaconda/ui/gui/spokes/storage.py
> +++ b/pyanaconda/ui/gui/spokes/storage.py
> @@ -513,6 +513,17 @@ class StorageSpoke(NormalSpoke, StorageChecker):
>          self.local_disks_box = self.builder.get_object("local_disks_box")
>          self.specialized_disks_box = self.builder.get_object("specialized_disks_box")
>  
> +        # Connect the viewport adjustments to the child widgets
> +        # See also https://bugzilla.gnome.org/show_bug.cgi?id=744721
> +        localViewport = self.builder.get_object("localViewport")
> +        specializedViewport = self.builder.get_object("specializedViewport")
> +        self.local_disks_box.set_focus_hadjustment(localViewport.get_hadjustment())
> +        self.specialized_disks_box.set_focus_hadjustment(specializedViewport.get_hadjustment())
> +
> +        mainViewport = self.builder.get_object("storageViewport")
> +        mainBox = self.builder.get_object("storageMainBox")
> +        mainBox.set_focus_vadjustment(mainViewport.get_vadjustment())
> +
>          threadMgr.add(AnacondaThread(name=constants.THREAD_STORAGE_WATCHER,
>                        target=self._initialize))
Looks good to me.

-- 
Vratislav Podzimek

Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic



More information about the anaconda-patches mailing list