gtk: Handle accelerators after renderer handled them.
The key-press signal captured the key events before renderer handles, which violated the behavior on OS X and Windows. Fixes #221.
This commit is contained in:
parent
3d518c2105
commit
5bbf749693
2 changed files with 18 additions and 12 deletions
|
@ -13,6 +13,7 @@
|
||||||
#include "base/nix/xdg_util.h"
|
#include "base/nix/xdg_util.h"
|
||||||
#include "base/values.h"
|
#include "base/values.h"
|
||||||
#include "chrome/browser/ui/gtk/gtk_window_util.h"
|
#include "chrome/browser/ui/gtk/gtk_window_util.h"
|
||||||
|
#include "content/public/browser/native_web_keyboard_event.h"
|
||||||
#include "content/public/browser/web_contents.h"
|
#include "content/public/browser/web_contents.h"
|
||||||
#include "content/public/browser/web_contents_view.h"
|
#include "content/public/browser/web_contents_view.h"
|
||||||
#include "content/public/common/renderer_preferences.h"
|
#include "content/public/common/renderer_preferences.h"
|
||||||
|
@ -104,8 +105,6 @@ NativeWindowGtk::NativeWindowGtk(content::WebContents* web_contents,
|
||||||
G_CALLBACK(OnWindowDeleteEventThunk), this);
|
G_CALLBACK(OnWindowDeleteEventThunk), this);
|
||||||
g_signal_connect(window_, "focus-out-event",
|
g_signal_connect(window_, "focus-out-event",
|
||||||
G_CALLBACK(OnFocusOutThunk), this);
|
G_CALLBACK(OnFocusOutThunk), this);
|
||||||
g_signal_connect(window_, "key-press-event",
|
|
||||||
G_CALLBACK(OnKeyPressThunk), this);
|
|
||||||
|
|
||||||
if (!has_frame_) {
|
if (!has_frame_) {
|
||||||
gtk_window_set_decorated(window_, false);
|
gtk_window_set_decorated(window_, false);
|
||||||
|
@ -343,6 +342,18 @@ void NativeWindowGtk::UpdateDraggableRegions(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NativeWindowGtk::HandleKeyboardEvent(
|
||||||
|
content::WebContents*,
|
||||||
|
const content::NativeWebKeyboardEvent& event) {
|
||||||
|
if (event.type == WebKit::WebInputEvent::RawKeyDown) {
|
||||||
|
GdkEventKey* os_event = reinterpret_cast<GdkEventKey*>(event.os_event);
|
||||||
|
ui::Accelerator accelerator = ui::AcceleratorForGdkKeyCodeAndModifier(
|
||||||
|
os_event->keyval, static_cast<GdkModifierType>(os_event->state));
|
||||||
|
accelerator_util::TriggerAcceleratorTableCommand(&accelerator_table_,
|
||||||
|
accelerator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void NativeWindowGtk::ActiveWindowChanged(GdkWindow* active_window) {
|
void NativeWindowGtk::ActiveWindowChanged(GdkWindow* active_window) {
|
||||||
is_active_ = gtk_widget_get_window(GTK_WIDGET(window_)) == active_window;
|
is_active_ = gtk_widget_get_window(GTK_WIDGET(window_)) == active_window;
|
||||||
}
|
}
|
||||||
|
@ -505,13 +516,6 @@ gboolean NativeWindowGtk::OnButtonPress(GtkWidget* widget,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean NativeWindowGtk::OnKeyPress(GtkWidget* widget, GdkEventKey* event) {
|
|
||||||
ui::Accelerator accelerator = ui::AcceleratorForGdkKeyCodeAndModifier(
|
|
||||||
event->keyval, static_cast<GdkModifierType>(event->state));
|
|
||||||
return accelerator_util::TriggerAcceleratorTableCommand(
|
|
||||||
&accelerator_table_, accelerator) ? TRUE: FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// static
|
// static
|
||||||
NativeWindow* NativeWindow::Create(content::WebContents* web_contents,
|
NativeWindow* NativeWindow::Create(content::WebContents* web_contents,
|
||||||
base::DictionaryValue* options) {
|
base::DictionaryValue* options) {
|
||||||
|
|
|
@ -71,6 +71,11 @@ class NativeWindowGtk : public NativeWindow,
|
||||||
virtual void UpdateDraggableRegions(
|
virtual void UpdateDraggableRegions(
|
||||||
const std::vector<DraggableRegion>& regions) OVERRIDE;
|
const std::vector<DraggableRegion>& regions) OVERRIDE;
|
||||||
|
|
||||||
|
// Overridden from content::WebContentsDelegate:
|
||||||
|
virtual void HandleKeyboardEvent(
|
||||||
|
content::WebContents*,
|
||||||
|
const content::NativeWebKeyboardEvent&) OVERRIDE;
|
||||||
|
|
||||||
// Overridden from ActiveWindowWatcherXObserver.
|
// Overridden from ActiveWindowWatcherXObserver.
|
||||||
virtual void ActiveWindowChanged(GdkWindow* active_window) OVERRIDE;
|
virtual void ActiveWindowChanged(GdkWindow* active_window) OVERRIDE;
|
||||||
|
|
||||||
|
@ -101,9 +106,6 @@ class NativeWindowGtk : public NativeWindow,
|
||||||
CHROMEGTK_CALLBACK_1(NativeWindowGtk, gboolean, OnButtonPress,
|
CHROMEGTK_CALLBACK_1(NativeWindowGtk, gboolean, OnButtonPress,
|
||||||
GdkEventButton*);
|
GdkEventButton*);
|
||||||
|
|
||||||
// Key press event callback.
|
|
||||||
CHROMEGTK_CALLBACK_1(NativeWindowGtk, gboolean, OnKeyPress, GdkEventKey*);
|
|
||||||
|
|
||||||
GtkWindow* window_;
|
GtkWindow* window_;
|
||||||
GtkWidget* vbox_;
|
GtkWidget* vbox_;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue