| Index: views/controls/native/native_view_host_gtk.cc
|
| diff --git a/views/controls/native/native_view_host_gtk.cc b/views/controls/native/native_view_host_gtk.cc
|
| index 5e91d1871d74482156fff92a730bd7e0a4ea4159..306aa9465da1bad0d6e315f6bb9de850866593b5 100644
|
| --- a/views/controls/native/native_view_host_gtk.cc
|
| +++ b/views/controls/native/native_view_host_gtk.cc
|
| @@ -8,6 +8,7 @@
|
|
|
| #include "base/logging.h"
|
| #include "views/controls/native/native_view_host.h"
|
| +#include "views/focus/focus_manager.h"
|
| #include "views/widget/widget_gtk.h"
|
|
|
| namespace views {
|
| @@ -19,6 +20,7 @@ NativeViewHostGtk::NativeViewHostGtk(NativeViewHost* host)
|
| : host_(host),
|
| installed_clip_(false),
|
| destroy_signal_id_(0),
|
| + focus_signal_id_(0),
|
| fixed_(NULL) {
|
| CreateFixed(false);
|
| }
|
| @@ -44,6 +46,12 @@ void NativeViewHostGtk::NativeViewAttached() {
|
| this);
|
| }
|
|
|
| + if (!focus_signal_id_) {
|
| + focus_signal_id_ = g_signal_connect(G_OBJECT(host_->native_view()),
|
| + "focus-in-event",
|
| + G_CALLBACK(CallFocusIn), this);
|
| + }
|
| +
|
| // Always layout though.
|
| host_->Layout();
|
|
|
| @@ -61,8 +69,10 @@ void NativeViewHostGtk::NativeViewDetaching() {
|
| destroy_signal_id_);
|
| destroy_signal_id_ = 0;
|
|
|
| - // TODO(port): focus.
|
| - // FocusManager::UninstallFocusSubclass(native_view());
|
| + g_signal_handler_disconnect(G_OBJECT(host_->native_view()),
|
| + focus_signal_id_);
|
| + focus_signal_id_ = 0;
|
| +
|
| installed_clip_ = false;
|
|
|
| // Release ownership back to the caller.
|
| @@ -154,7 +164,8 @@ void NativeViewHostGtk::HideWidget() {
|
| }
|
|
|
| void NativeViewHostGtk::SetFocus() {
|
| - NOTIMPLEMENTED();
|
| + DCHECK(host_->native_view());
|
| + gtk_widget_grab_focus(host_->native_view());
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -199,7 +210,20 @@ WidgetGtk* NativeViewHostGtk::GetHostWidget() const {
|
| // static
|
| void NativeViewHostGtk::CallDestroy(GtkObject* object,
|
| NativeViewHostGtk* host) {
|
| - return host->host_->NativeViewDestroyed();
|
| + host->host_->NativeViewDestroyed();
|
| +}
|
| +
|
| +// static
|
| +void NativeViewHostGtk::CallFocusIn(GtkWidget* widget,
|
| + GdkEventFocus* event,
|
| + NativeViewHostGtk* host) {
|
| + FocusManager* focus_manager =
|
| + FocusManager::GetFocusManagerForNativeView(widget);
|
| + if (!focus_manager) {
|
| + NOTREACHED();
|
| + return;
|
| + }
|
| + focus_manager->SetFocusedView(host->host_->focus_view());
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|