[gnome-documents] Fix keyboard navigation in preview mode



commit f135e584da1c3f3b1460b887b47d63e3aa4d764a
Author: Paul Martin <codemobius gmail com>
Date:   Sun Mar 16 21:55:42 2014 -0400

    Fix keyboard navigation in preview mode
    
    Make it work even if the PreviewView widget is not in focus, and ensure
    that it does not interfere with text input in the search bar.
    
    To simplify the logic we have consolidated the code that deals with
    key events in the searchbar and preview mode.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=726485

 src/mainWindow.js |   31 ++++++++++++++++++++++++++-
 src/preview.js    |   35 ------------------------------
 src/searchbar.js  |   60 ++++++++++++++++++++++++++++++++--------------------
 3 files changed, 67 insertions(+), 59 deletions(-)
---
diff --git a/src/mainWindow.js b/src/mainWindow.js
index 470031e..6218134 100644
--- a/src/mainWindow.js
+++ b/src/mainWindow.js
@@ -223,15 +223,44 @@ const MainWindow = new Lang.Class({
     _handleKeyPreview: function(event) {
         let keyval = event.get_keyval()[1];
         let fullscreen = Application.modeController.getFullscreen();
+        let def_mod_mask = Gtk.accelerator_get_default_mod_mask();
+        let preview = this._embed.getPreview();
+        let state = event.get_state()[1];
 
         if (keyval == Gdk.KEY_Escape) {
-            let preview = this._embed.getPreview();
             let model = preview.getModel();
 
             if (preview.controlsVisible && (model != null))
                 preview.controlsVisible = false;
             else if (fullscreen)
                 Application.documentManager.setActiveItem(null);
+
+            return false;
+        }
+
+        if (((keyval == Gdk.KEY_Page_Up) &&
+            ((state & Gdk.ModifierType.CONTROL_MASK) != 0)) ||
+            ((keyval == Gdk.KEY_Left) && ((state & def_mod_mask) == 0))) {
+            preview.view.previous_page();
+            return true;
+        }
+
+        if (((keyval == Gdk.KEY_Page_Down) &&
+            ((state & Gdk.ModifierType.CONTROL_MASK) != 0)) ||
+            ((keyval == Gdk.KEY_Right) && ((state & def_mod_mask) == 0))) {
+            preview.view.next_page();
+            return true;
+        }
+
+        if (keyval == Gdk.KEY_Page_Up) {
+            preview.view.scroll(Gtk.ScrollType.PAGE_BACKWARD, false);
+            return true;
+        }
+
+        if (keyval == Gdk.KEY_space ||
+            keyval == Gdk.KEY_Page_Down) {
+            preview.view.scroll(Gtk.ScrollType.PAGE_FORWARD, false);
+            return true;
         }
 
         return false;
diff --git a/src/preview.js b/src/preview.js
index 4bfa170..7ae294e 100644
--- a/src/preview.js
+++ b/src/preview.js
@@ -335,8 +335,6 @@ const PreviewView = new Lang.Class({
             this._onButtonPressEvent));
         this.view.connect('button-release-event', Lang.bind(this,
             this._onButtonReleaseEvent));
-        this.view.connect('key-press-event', Lang.bind(this,
-            this._onKeyPressEvent));
         this.view.connect('selection-changed', Lang.bind(this,
             this._onViewSelectionChanged));
         this.view.connect('external-link', Lang.bind(this,
@@ -389,39 +387,6 @@ const PreviewView = new Lang.Class({
         this._syncControlsVisible();
     },
 
-    _onKeyPressEvent: function(widget, event) {
-        let keyval = event.get_keyval()[1];
-        let state = event.get_state()[1];
-        let def_mod_mask = Gtk.accelerator_get_default_mod_mask();
-
-        if (((keyval == Gdk.KEY_Page_Up) &&
-            ((state & Gdk.ModifierType.CONTROL_MASK) != 0)) ||
-            ((keyval == Gdk.KEY_Left) && ((state & def_mod_mask) == 0))) {
-            this.view.previous_page();
-            return true;
-        }
-
-        if (((keyval == Gdk.KEY_Page_Down) &&
-            ((state & Gdk.ModifierType.CONTROL_MASK) != 0)) ||
-            ((keyval == Gdk.KEY_Right) && ((state & def_mod_mask) == 0))) {
-            this.view.next_page();
-            return true;
-        }
-
-        if (keyval == Gdk.KEY_Page_Up) {
-            this.view.scroll(Gtk.ScrollType.PAGE_BACKWARD, false);
-            return true;
-        }
-
-        if (keyval == Gdk.KEY_space ||
-            keyval == Gdk.KEY_Page_Down) {
-            this.view.scroll(Gtk.ScrollType.PAGE_FORWARD, false);
-            return true;
-        }
-
-        return false;
-     },
-
     _flipControlsTimeout: function() {
         this._controlsFlipId = 0;
         let visible = this.controlsVisible;
diff --git a/src/searchbar.js b/src/searchbar.js
index e77a908..804e199 100644
--- a/src/searchbar.js
+++ b/src/searchbar.js
@@ -60,21 +60,6 @@ const Searchbar = new Lang.Class({
         item.add(this._searchContainer);
         toolbar.insert(item, 0);
 
-        this._searchEntry.connect('key-press-event', Lang.bind(this,
-            function(widget, event) {
-                let keyval = event.get_keyval()[1];
-
-                if (keyval == Gdk.KEY_Escape) {
-                    Application.application.change_action_state('search', GLib.Variant.new('b', false));
-                    return true;
-                } else if (keyval == Gdk.KEY_Return) {
-                    this.emit('activate-result');
-                    return true;
-                }
-
-                return false;
-            }));
-
         this._searchEntry.connect('search-changed', Lang.bind(this,
             function() {
                 if (this.searchChangeBlocked)
@@ -116,13 +101,16 @@ const Searchbar = new Lang.Class({
         this.widget.destroy();
     },
 
+    _isEscapeEvent: function(event) {
+        let keyval = event.get_keyval()[1];
+        return (keyval == Gdk.KEY_Escape);
+    },
+
     _isKeynavEvent: function(event) {
         let keyval = event.get_keyval()[1];
         let state = event.get_state()[1];
 
-        if (keyval == Gdk.KEY_Tab ||
-            keyval == Gdk.KEY_KP_Tab ||
-            keyval == Gdk.KEY_Up ||
+        if (keyval == Gdk.KEY_Up ||
             keyval == Gdk.KEY_KP_Up ||
             keyval == Gdk.KEY_Down ||
             keyval == Gdk.KEY_KP_Down ||
@@ -149,20 +137,46 @@ const Searchbar = new Lang.Class({
         return (keyval == Gdk.KEY_space);
     },
 
+    _isTabEvent: function(event) {
+        let keyval = event.get_keyval()[1];
+        return (keyval == Gdk.KEY_Tab || keyval == Gdk.KEY_KP_Tab);
+    },
+
     handleEvent: function(event) {
-        if (this._in)
+        // Skip if the search bar is shown and the focus is elsewhere
+        if (this._in && !this._searchEntry.is_focus)
             return false;
 
-        if (this._isKeynavEvent(event))
-            return false;
+        let isEscape = this._isEscapeEvent(event);
+        let isKeynav = this._isKeynavEvent(event);
+        let isTab = this._isTabEvent(event);
+        let isSpace = this._isSpaceEvent(event);
 
-        if (this._isSpaceEvent(event))
+        // Skip these if the search bar is hidden
+        if (!this._in && (isEscape || isKeynav || isTab || isSpace))
             return false;
 
+        // At this point, either the search bar is hidden and the event
+        // is neither escape nor keynav nor space; or the search bar is
+        // shown and has the focus.
+
+        let keyval = event.get_keyval()[1];
+        if (isEscape) {
+            Application.application.change_action_state('search', GLib.Variant.new('b', false));
+            return true;
+        } else if (keyval == Gdk.KEY_Return) {
+            this.emit('activate-result');
+            return true;
+        }
+
         if (!this._searchEntry.get_realized())
             this._searchEntry.realize();
 
-        let handled = false;
+        // Since we can have keynav or space only when the search bar
+        // is shown, we want to handle it. Otherwise it will hinder
+        // text input. However, we don't want to handle tabs so that
+        // focus can be shifted to other widgets.
+        let handled = isKeynav || isSpace;
 
         let preeditChanged = false;
         let preeditChangedId =


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]