Fix delivery of focus/blur events (issue #1301).
git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@1717 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
parent
99faa3fda4
commit
62d9365b51
|
@ -235,10 +235,16 @@ typedef struct _cef_browser_host_t {
|
|||
int force_close);
|
||||
|
||||
///
|
||||
// Set focus for the browser window. If |enable| is true (1) focus will be set
|
||||
// to the window. Otherwise, focus will be removed.
|
||||
// Set whether the browser is focused.
|
||||
///
|
||||
void (CEF_CALLBACK *set_focus)(struct _cef_browser_host_t* self, int enable);
|
||||
void (CEF_CALLBACK *set_focus)(struct _cef_browser_host_t* self, int focus);
|
||||
|
||||
///
|
||||
// Set whether the window containing the browser is visible
|
||||
// (minimized/unminimized, app hidden/unhidden, etc). Only used on Mac OS X.
|
||||
///
|
||||
void (CEF_CALLBACK *set_window_visibility)(struct _cef_browser_host_t* self,
|
||||
int visible);
|
||||
|
||||
///
|
||||
// Retrieve the window handle for this browser.
|
||||
|
|
|
@ -271,11 +271,17 @@ class CefBrowserHost : public virtual CefBase {
|
|||
virtual void CloseBrowser(bool force_close) =0;
|
||||
|
||||
///
|
||||
// Set focus for the browser window. If |enable| is true focus will be set to
|
||||
// the window. Otherwise, focus will be removed.
|
||||
// Set whether the browser is focused.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void SetFocus(bool enable) =0;
|
||||
virtual void SetFocus(bool focus) =0;
|
||||
|
||||
///
|
||||
// Set whether the window containing the browser is visible
|
||||
// (minimized/unminimized, app hidden/unhidden, etc). Only used on Mac OS X.
|
||||
///
|
||||
/*--cef()--*/
|
||||
virtual void SetWindowVisibility(bool visible) =0;
|
||||
|
||||
///
|
||||
// Retrieve the window handle for this browser.
|
||||
|
|
|
@ -632,11 +632,29 @@ void CefBrowserHostImpl::CloseBrowser(bool force_close) {
|
|||
}
|
||||
}
|
||||
|
||||
void CefBrowserHostImpl::SetFocus(bool enable) {
|
||||
if (!enable)
|
||||
return;
|
||||
void CefBrowserHostImpl::SetFocus(bool focus) {
|
||||
if (focus) {
|
||||
OnSetFocus(FOCUS_SOURCE_SYSTEM);
|
||||
} else {
|
||||
if (CEF_CURRENTLY_ON_UIT()) {
|
||||
PlatformSetFocus(false);
|
||||
} else {
|
||||
CEF_POST_TASK(CEF_UIT,
|
||||
base::Bind(&CefBrowserHostImpl::PlatformSetFocus, this, false));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OnSetFocus(FOCUS_SOURCE_SYSTEM);
|
||||
void CefBrowserHostImpl::SetWindowVisibility(bool visible) {
|
||||
#if defined(OS_MACOSX)
|
||||
if (CEF_CURRENTLY_ON_UIT()) {
|
||||
PlatformSetWindowVisibility(visible);
|
||||
} else {
|
||||
CEF_POST_TASK(CEF_UIT,
|
||||
base::Bind(&CefBrowserHostImpl::PlatformSetWindowVisibility,
|
||||
this, visible));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
CefWindowHandle CefBrowserHostImpl::GetWindowHandle() {
|
||||
|
@ -1499,15 +1517,7 @@ void CefBrowserHostImpl::OnSetFocus(cef_focus_source_t source) {
|
|||
}
|
||||
}
|
||||
|
||||
if (web_contents_.get())
|
||||
web_contents_->Focus();
|
||||
|
||||
#if defined(OS_WIN)
|
||||
// When windowed rendering is used in combination with Aura on Windows we
|
||||
// need to explicitly set focus to the native window handle. Otherwise,
|
||||
// the window doesn't get keyboard focus.
|
||||
PlatformSetViewFocus();
|
||||
#endif // defined(OS_WIN)
|
||||
PlatformSetFocus(true);
|
||||
} else {
|
||||
CEF_POST_TASK(CEF_UIT,
|
||||
base::Bind(&CefBrowserHostImpl::OnSetFocus, this, source));
|
||||
|
|
|
@ -127,7 +127,8 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
|||
// CefBrowserHost methods.
|
||||
virtual CefRefPtr<CefBrowser> GetBrowser() OVERRIDE;
|
||||
virtual void CloseBrowser(bool force_close) OVERRIDE;
|
||||
virtual void SetFocus(bool enable) OVERRIDE;
|
||||
virtual void SetFocus(bool focus) OVERRIDE;
|
||||
virtual void SetWindowVisibility(bool visible) OVERRIDE;
|
||||
virtual CefWindowHandle GetWindowHandle() OVERRIDE;
|
||||
virtual CefWindowHandle GetOpenerWindowHandle() OVERRIDE;
|
||||
virtual CefRefPtr<CefClient> GetClient() OVERRIDE;
|
||||
|
@ -443,8 +444,6 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
|||
static LPCTSTR GetWndClass();
|
||||
static LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
|
||||
WPARAM wParam, LPARAM lParam);
|
||||
|
||||
void PlatformSetViewFocus();
|
||||
#endif
|
||||
|
||||
// Create the window.
|
||||
|
@ -454,6 +453,12 @@ class CefBrowserHostImpl : public CefBrowserHost,
|
|||
void PlatformCloseWindow();
|
||||
// Resize the window to the given dimensions.
|
||||
void PlatformSizeTo(int width, int height);
|
||||
// Set or remove focus from the window.
|
||||
void PlatformSetFocus(bool focus);
|
||||
#if defined(OS_MACOSX)
|
||||
// Set or remove window visibility.
|
||||
void PlatformSetWindowVisibility(bool visible);
|
||||
#endif
|
||||
// Return the handle for this window.
|
||||
CefWindowHandle PlatformGetWindowHandle();
|
||||
// Open the specified text in the default text editor.
|
||||
|
|
|
@ -100,6 +100,24 @@ void CefBrowserHostImpl::PlatformSizeTo(int width, int height) {
|
|||
}
|
||||
}
|
||||
|
||||
void CefBrowserHostImpl::PlatformSetFocus(bool focus) {
|
||||
if (!focus)
|
||||
return;
|
||||
|
||||
if (web_contents_) {
|
||||
// Give logical focus to the RenderWidgetHostViewAura in the views
|
||||
// hierarchy. This does not change the native keyboard focus.
|
||||
web_contents_->Focus();
|
||||
}
|
||||
|
||||
if (window_x11_) {
|
||||
// Give native focus to the DesktopNativeWidgetAura for the root window.
|
||||
// Needs to be done via the ::Window so that keyboard focus is assigned
|
||||
// correctly.
|
||||
window_x11_->Focus();
|
||||
}
|
||||
}
|
||||
|
||||
CefWindowHandle CefBrowserHostImpl::PlatformGetWindowHandle() {
|
||||
return window_info_.window;
|
||||
}
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include "base/strings/utf_string_conversions.h"
|
||||
#include "base/threading/thread_restrictions.h"
|
||||
#include "content/public/browser/native_web_keyboard_event.h"
|
||||
#include "content/public/browser/render_widget_host_view.h"
|
||||
#include "content/public/browser/web_contents.h"
|
||||
#include "content/public/common/file_chooser_params.h"
|
||||
#include "grit/ui_strings.h"
|
||||
|
@ -34,7 +35,6 @@
|
|||
@interface CefBrowserHostView : NSView {
|
||||
@private
|
||||
CefBrowserHostImpl* browser_; // weak
|
||||
bool is_in_onsetfocus_;
|
||||
}
|
||||
|
||||
@property (nonatomic, assign) CefBrowserHostImpl* browser;
|
||||
|
@ -55,23 +55,6 @@
|
|||
[super dealloc];
|
||||
}
|
||||
|
||||
- (BOOL)acceptsFirstResponder {
|
||||
return browser_ && browser_->GetWebContents();
|
||||
}
|
||||
|
||||
- (BOOL)becomeFirstResponder {
|
||||
if (browser_ && browser_->GetWebContents()) {
|
||||
// Avoid re-entering OnSetFocus.
|
||||
if (!is_in_onsetfocus_) {
|
||||
is_in_onsetfocus_ = true;
|
||||
browser_->OnSetFocus(FOCUS_SOURCE_SYSTEM);
|
||||
is_in_onsetfocus_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
// Receives notifications from the browser window. Will delete itself when done.
|
||||
|
@ -88,6 +71,48 @@
|
|||
|
||||
@synthesize browser = browser_;
|
||||
|
||||
// Called when we are activated (when we gain focus).
|
||||
- (void)windowDidBecomeKey:(NSNotification*)notification {
|
||||
if (browser_)
|
||||
browser_->SetFocus(true);
|
||||
}
|
||||
|
||||
// Called when we are deactivated (when we lose focus).
|
||||
- (void)windowDidResignKey:(NSNotification*)notification {
|
||||
if (browser_)
|
||||
browser_->SetFocus(false);
|
||||
}
|
||||
|
||||
// Called when we have been minimized.
|
||||
- (void)windowDidMiniaturize:(NSNotification *)notification {
|
||||
if (browser_)
|
||||
browser_->SetWindowVisibility(false);
|
||||
}
|
||||
|
||||
// Called when we have been unminimized.
|
||||
- (void)windowDidDeminiaturize:(NSNotification *)notification {
|
||||
if (browser_)
|
||||
browser_->SetWindowVisibility(true);
|
||||
}
|
||||
|
||||
// Called when the application has been hidden.
|
||||
- (void)applicationDidHide:(NSNotification *)notification {
|
||||
// If the window is miniaturized then nothing has really changed.
|
||||
if (![[notification object] isMiniaturized]) {
|
||||
if (browser_)
|
||||
browser_->SetWindowVisibility(false);
|
||||
}
|
||||
}
|
||||
|
||||
// Called when the application has been unhidden.
|
||||
- (void)applicationDidUnhide:(NSNotification *)notification {
|
||||
// If the window is miniaturized then nothing has really changed.
|
||||
if (![[notification object] isMiniaturized]) {
|
||||
if (browser_)
|
||||
browser_->SetWindowVisibility(true);
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)windowShouldClose:(id)window {
|
||||
// Protect against multiple requests to close while the close is pending.
|
||||
if (browser_ && browser_->destruction_state() <=
|
||||
|
@ -345,6 +370,31 @@ void CefBrowserHostImpl::PlatformSizeTo(int width, int height) {
|
|||
// Not needed; subviews are bound.
|
||||
}
|
||||
|
||||
void CefBrowserHostImpl::PlatformSetFocus(bool focus) {
|
||||
if (web_contents_) {
|
||||
if (content::RenderWidgetHostView* view =
|
||||
web_contents_->GetRenderWidgetHostView()) {
|
||||
view->SetActive(focus);
|
||||
|
||||
if (focus) {
|
||||
// Give keyboard focus to the native view.
|
||||
NSView* view = web_contents_->GetContentNativeView();
|
||||
DCHECK([view canBecomeKeyView]);
|
||||
[[view window] makeFirstResponder:view];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CefBrowserHostImpl::PlatformSetWindowVisibility(bool visible) {
|
||||
if (web_contents_) {
|
||||
if (content::RenderWidgetHostView* view =
|
||||
web_contents_->GetRenderWidgetHostView()) {
|
||||
view->SetWindowVisibility(visible);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CefWindowHandle CefBrowserHostImpl::PlatformGetWindowHandle() {
|
||||
return window_info_.view;
|
||||
}
|
||||
|
|
|
@ -601,7 +601,7 @@ LRESULT CALLBACK CefBrowserHostImpl::WndProc(HWND hwnd, UINT message,
|
|||
|
||||
case WM_SETFOCUS:
|
||||
if (browser)
|
||||
browser->OnSetFocus(FOCUS_SOURCE_SYSTEM);
|
||||
browser->SetFocus(true);
|
||||
return 0;
|
||||
|
||||
case WM_ERASEBKGND:
|
||||
|
@ -611,11 +611,6 @@ LRESULT CALLBACK CefBrowserHostImpl::WndProc(HWND hwnd, UINT message,
|
|||
return DefWindowProc(hwnd, message, wParam, lParam);
|
||||
}
|
||||
|
||||
void CefBrowserHostImpl::PlatformSetViewFocus() {
|
||||
if (window_widget_)
|
||||
::SetFocus(views::HWNDForWidget(window_widget_));
|
||||
}
|
||||
|
||||
ui::PlatformCursor CefBrowserHostImpl::GetPlatformCursor(
|
||||
blink::WebCursorInfo::Type type) {
|
||||
HMODULE module_handle = NULL;
|
||||
|
@ -701,6 +696,25 @@ void CefBrowserHostImpl::PlatformSizeTo(int width, int height) {
|
|||
rect.bottom, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
|
||||
}
|
||||
|
||||
void CefBrowserHostImpl::PlatformSetFocus(bool focus) {
|
||||
if (!focus)
|
||||
return;
|
||||
|
||||
if (web_contents_) {
|
||||
// Give logical focus to the RenderWidgetHostViewAura in the views
|
||||
// hierarchy. This does not change the native keyboard focus.
|
||||
web_contents_->Focus();
|
||||
}
|
||||
|
||||
if (window_widget_) {
|
||||
// Give native focus to the DesktopNativeWidgetAura for the root window.
|
||||
// Needs to be done via the HWND so that keyboard focus is assigned
|
||||
// correctly. DesktopNativeWidgetAura will update focus state on the
|
||||
// aura::Window when WM_SETFOCUS and WM_KILLFOCUS are received.
|
||||
::SetFocus(HWNDForWidget(window_widget_));
|
||||
}
|
||||
}
|
||||
|
||||
CefWindowHandle CefBrowserHostImpl::PlatformGetWindowHandle() {
|
||||
return window_info_.window;
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <X11/Xatom.h>
|
||||
#include <X11/Xutil.h>
|
||||
|
||||
#include "ui/base/x/x11_util.h"
|
||||
#include "ui/events/platform/x11/x11_event_source.h"
|
||||
|
||||
namespace {
|
||||
|
@ -58,7 +59,9 @@ CefWindowX11::CefWindowX11(CefRefPtr<CefBrowserHostImpl> browser,
|
|||
xwindow_(0),
|
||||
window_mapped_(false),
|
||||
bounds_(bounds),
|
||||
atom_cache_(xdisplay_, kAtomsToCache) {
|
||||
focus_pending_(false),
|
||||
atom_cache_(xdisplay_, kAtomsToCache),
|
||||
weak_ptr_factory_(this) {
|
||||
if (parent_xwindow_ == None)
|
||||
parent_xwindow_ = DefaultRootWindow(xdisplay_);
|
||||
|
||||
|
@ -166,6 +169,17 @@ void CefWindowX11::Hide() {
|
|||
}
|
||||
}
|
||||
|
||||
void CefWindowX11::Focus() {
|
||||
if (xwindow_ == None || !window_mapped_)
|
||||
return;
|
||||
|
||||
::Window child = FindChild(xdisplay_, xwindow_);
|
||||
if (child && ui::IsWindowVisible(child)) {
|
||||
// Give focus to the child DesktopWindowTreeHostX11.
|
||||
XSetInputFocus(xdisplay_, child, RevertToParent, CurrentTime);
|
||||
}
|
||||
}
|
||||
|
||||
void CefWindowX11::SetBounds(const gfx::Rect& bounds) {
|
||||
if (xwindow_ == None)
|
||||
return;
|
||||
|
@ -274,13 +288,31 @@ uint32_t CefWindowX11::DispatchEvent(const ui::PlatformEvent& event) {
|
|||
// "_NET_ACTIVE_WINDOW" message it will erroneously mark the WebView
|
||||
// (hosted in a DesktopWindowTreeHostX11) as unfocused. Use a delayed
|
||||
// task here to restore the WebView's focus state.
|
||||
CEF_POST_DELAYED_TASK(CEF_UIT,
|
||||
base::Bind(&CefBrowserHostImpl::OnSetFocus, browser_,
|
||||
FOCUS_SOURCE_SYSTEM),
|
||||
100);
|
||||
if (!focus_pending_) {
|
||||
focus_pending_ = true;
|
||||
CEF_POST_DELAYED_TASK(CEF_UIT,
|
||||
base::Bind(&CefWindowX11::ContinueFocus,
|
||||
weak_ptr_factory_.GetWeakPtr()),
|
||||
100);
|
||||
}
|
||||
break;
|
||||
case FocusOut:
|
||||
// Cancel the pending focus change if some other window has gained focus
|
||||
// while waiting for the async task to run. Otherwise we can get stuck in
|
||||
// a focus change loop.
|
||||
if (focus_pending_)
|
||||
focus_pending_ = false;
|
||||
break;
|
||||
}
|
||||
|
||||
return ui::POST_DISPATCH_STOP_PROPAGATION;
|
||||
}
|
||||
|
||||
void CefWindowX11::ContinueFocus() {
|
||||
if (!focus_pending_)
|
||||
return;
|
||||
browser_->SetFocus(true);
|
||||
focus_pending_ = false;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
|
||||
#include "libcef/browser/browser_host_impl.h"
|
||||
|
||||
#include "base/memory/weak_ptr.h"
|
||||
#include "ui/events/platform/platform_event_dispatcher.h"
|
||||
#include "ui/gfx/rect.h"
|
||||
#include "ui/gfx/x/x11_atom_cache.h"
|
||||
|
@ -29,6 +30,8 @@ class CefWindowX11 : public ui::PlatformEventDispatcher {
|
|||
void Show();
|
||||
void Hide();
|
||||
|
||||
void Focus();
|
||||
|
||||
void SetBounds(const gfx::Rect& bounds);
|
||||
|
||||
gfx::Rect GetBoundsInScreen();
|
||||
|
@ -41,6 +44,8 @@ class CefWindowX11 : public ui::PlatformEventDispatcher {
|
|||
gfx::Rect bounds() const { return bounds_; }
|
||||
|
||||
private:
|
||||
void ContinueFocus();
|
||||
|
||||
CefRefPtr<CefBrowserHostImpl> browser_;
|
||||
|
||||
// The display and the native X window hosting the root window.
|
||||
|
@ -54,8 +59,13 @@ class CefWindowX11 : public ui::PlatformEventDispatcher {
|
|||
// The bounds of |xwindow_|.
|
||||
gfx::Rect bounds_;
|
||||
|
||||
bool focus_pending_;
|
||||
|
||||
ui::X11AtomCache atom_cache_;
|
||||
|
||||
// Must always be the last member.
|
||||
base::WeakPtrFactory<CefWindowX11> weak_ptr_factory_;
|
||||
|
||||
DISALLOW_COPY_AND_ASSIGN(CefWindowX11);
|
||||
};
|
||||
|
||||
|
|
|
@ -126,7 +126,7 @@ void CEF_CALLBACK browser_host_close_browser(struct _cef_browser_host_t* self,
|
|||
}
|
||||
|
||||
void CEF_CALLBACK browser_host_set_focus(struct _cef_browser_host_t* self,
|
||||
int enable) {
|
||||
int focus) {
|
||||
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||
|
||||
DCHECK(self);
|
||||
|
@ -135,7 +135,20 @@ void CEF_CALLBACK browser_host_set_focus(struct _cef_browser_host_t* self,
|
|||
|
||||
// Execute
|
||||
CefBrowserHostCppToC::Get(self)->SetFocus(
|
||||
enable?true:false);
|
||||
focus?true:false);
|
||||
}
|
||||
|
||||
void CEF_CALLBACK browser_host_set_window_visibility(
|
||||
struct _cef_browser_host_t* self, int visible) {
|
||||
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||
|
||||
DCHECK(self);
|
||||
if (!self)
|
||||
return;
|
||||
|
||||
// Execute
|
||||
CefBrowserHostCppToC::Get(self)->SetWindowVisibility(
|
||||
visible?true:false);
|
||||
}
|
||||
|
||||
cef_window_handle_t CEF_CALLBACK browser_host_get_window_handle(
|
||||
|
@ -527,6 +540,7 @@ CefBrowserHostCppToC::CefBrowserHostCppToC(CefBrowserHost* cls)
|
|||
struct_.struct_.get_browser = browser_host_get_browser;
|
||||
struct_.struct_.close_browser = browser_host_close_browser;
|
||||
struct_.struct_.set_focus = browser_host_set_focus;
|
||||
struct_.struct_.set_window_visibility = browser_host_set_window_visibility;
|
||||
struct_.struct_.get_window_handle = browser_host_get_window_handle;
|
||||
struct_.struct_.get_opener_window_handle =
|
||||
browser_host_get_opener_window_handle;
|
||||
|
|
|
@ -87,7 +87,7 @@ void CefBrowserHostCToCpp::CloseBrowser(bool force_close) {
|
|||
force_close);
|
||||
}
|
||||
|
||||
void CefBrowserHostCToCpp::SetFocus(bool enable) {
|
||||
void CefBrowserHostCToCpp::SetFocus(bool focus) {
|
||||
if (CEF_MEMBER_MISSING(struct_, set_focus))
|
||||
return;
|
||||
|
||||
|
@ -95,7 +95,18 @@ void CefBrowserHostCToCpp::SetFocus(bool enable) {
|
|||
|
||||
// Execute
|
||||
struct_->set_focus(struct_,
|
||||
enable);
|
||||
focus);
|
||||
}
|
||||
|
||||
void CefBrowserHostCToCpp::SetWindowVisibility(bool visible) {
|
||||
if (CEF_MEMBER_MISSING(struct_, set_window_visibility))
|
||||
return;
|
||||
|
||||
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||
|
||||
// Execute
|
||||
struct_->set_window_visibility(struct_,
|
||||
visible);
|
||||
}
|
||||
|
||||
CefWindowHandle CefBrowserHostCToCpp::GetWindowHandle() {
|
||||
|
|
|
@ -39,7 +39,8 @@ class CefBrowserHostCToCpp
|
|||
// CefBrowserHost methods
|
||||
virtual CefRefPtr<CefBrowser> GetBrowser() OVERRIDE;
|
||||
virtual void CloseBrowser(bool force_close) OVERRIDE;
|
||||
virtual void SetFocus(bool enable) OVERRIDE;
|
||||
virtual void SetFocus(bool focus) OVERRIDE;
|
||||
virtual void SetWindowVisibility(bool visible) OVERRIDE;
|
||||
virtual CefWindowHandle GetWindowHandle() OVERRIDE;
|
||||
virtual CefWindowHandle GetOpenerWindowHandle() OVERRIDE;
|
||||
virtual CefRefPtr<CefClient> GetClient() OVERRIDE;
|
||||
|
|
|
@ -26,6 +26,22 @@ Index: desktop_aura/desktop_window_tree_host_win.cc
|
|||
parent_hwnd = params.parent->GetHost()->GetAcceleratedWidget();
|
||||
|
||||
message_handler_->set_remove_standard_frame(params.remove_standard_frame);
|
||||
@@ -775,6 +777,7 @@
|
||||
|
||||
void DesktopWindowTreeHostWin::HandleNativeFocus(HWND last_focused_window) {
|
||||
// TODO(beng): inform the native_widget_delegate_.
|
||||
+ GetWidget()->GetNativeWindow()->Focus();
|
||||
InputMethod* input_method = GetInputMethod();
|
||||
if (input_method)
|
||||
input_method->OnFocus();
|
||||
@@ -782,6 +785,7 @@
|
||||
|
||||
void DesktopWindowTreeHostWin::HandleNativeBlur(HWND focused_window) {
|
||||
// TODO(beng): inform the native_widget_delegate_.
|
||||
+ GetWidget()->GetNativeWindow()->Blur();
|
||||
InputMethod* input_method = GetInputMethod();
|
||||
if (input_method)
|
||||
input_method->OnBlur();
|
||||
Index: desktop_aura/desktop_window_tree_host_x11.cc
|
||||
===================================================================
|
||||
--- desktop_aura/desktop_window_tree_host_x11.cc (revision 272007)
|
||||
|
|
|
@ -94,9 +94,7 @@ gboolean WindowFocusIn(GtkWidget* widget,
|
|||
CefRefPtr<CefBrowser> browser = g_handler->GetBrowser();
|
||||
if (browser) {
|
||||
// Give focus to the browser window.
|
||||
::Display* xdisplay = cef_get_xdisplay();
|
||||
::Window xwindow = browser->GetHost()->GetWindowHandle();
|
||||
XSetInputFocus(xdisplay, xwindow, RevertToParent, CurrentTime);
|
||||
browser->GetHost()->SetFocus(true);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -202,10 +202,63 @@ const int kWindowHeight = 600;
|
|||
[self alert:@"File Download" withMessage:str];
|
||||
}
|
||||
|
||||
// Called when we are activated (when we gain focus).
|
||||
- (void)windowDidBecomeKey:(NSNotification*)notification {
|
||||
if (g_handler.get() && g_handler->GetBrowserId()) {
|
||||
// Give focus to the browser window.
|
||||
g_handler->GetBrowser()->GetHost()->SetFocus(true);
|
||||
if (g_handler.get()) {
|
||||
CefRefPtr<CefBrowser> browser = g_handler->GetBrowser();
|
||||
if (browser.get())
|
||||
browser->GetHost()->SetFocus(true);
|
||||
}
|
||||
}
|
||||
|
||||
// Called when we are deactivated (when we lose focus).
|
||||
- (void)windowDidResignKey:(NSNotification*)notification {
|
||||
if (g_handler.get()) {
|
||||
CefRefPtr<CefBrowser> browser = g_handler->GetBrowser();
|
||||
if (browser.get())
|
||||
browser->GetHost()->SetFocus(false);
|
||||
}
|
||||
}
|
||||
|
||||
// Called when we have been minimized.
|
||||
- (void)windowDidMiniaturize:(NSNotification *)notification {
|
||||
if (g_handler.get()) {
|
||||
CefRefPtr<CefBrowser> browser = g_handler->GetBrowser();
|
||||
if (browser.get())
|
||||
browser->GetHost()->SetWindowVisibility(false);
|
||||
}
|
||||
}
|
||||
|
||||
// Called when we have been unminimized.
|
||||
- (void)windowDidDeminiaturize:(NSNotification *)notification {
|
||||
if (g_handler.get()) {
|
||||
CefRefPtr<CefBrowser> browser = g_handler->GetBrowser();
|
||||
if (browser.get())
|
||||
browser->GetHost()->SetWindowVisibility(true);
|
||||
}
|
||||
}
|
||||
|
||||
// Called when the application has been hidden.
|
||||
- (void)applicationDidHide:(NSNotification *)notification {
|
||||
// If the window is miniaturized then nothing has really changed.
|
||||
if (![[notification object] isMiniaturized]) {
|
||||
if (g_handler.get()) {
|
||||
CefRefPtr<CefBrowser> browser = g_handler->GetBrowser();
|
||||
if (browser.get())
|
||||
browser->GetHost()->SetWindowVisibility(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Called when the application has been unhidden.
|
||||
- (void)applicationDidUnhide:(NSNotification *)notification {
|
||||
// If the window is miniaturized then nothing has really changed.
|
||||
if (![[notification object] isMiniaturized]) {
|
||||
if (g_handler.get()) {
|
||||
CefRefPtr<CefBrowser> browser = g_handler->GetBrowser();
|
||||
if (browser.get())
|
||||
browser->GetHost()->SetWindowVisibility(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -517,11 +517,8 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
|
|||
|
||||
case WM_SETFOCUS:
|
||||
if (g_handler.get() && g_handler->GetBrowser()) {
|
||||
// Pass focus to the browser window
|
||||
CefWindowHandle hwnd =
|
||||
g_handler->GetBrowser()->GetHost()->GetWindowHandle();
|
||||
if (hwnd)
|
||||
PostMessage(hwnd, WM_SETFOCUS, wParam, NULL);
|
||||
// Give focus to the browser.
|
||||
g_handler->GetBrowser()->GetHost()->SetFocus(true);
|
||||
}
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -306,6 +306,12 @@ void ClientHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser) {
|
|||
} else if (browser->IsPopup()) {
|
||||
// Add to the list of popup browsers.
|
||||
m_PopupBrowsers.push_back(browser);
|
||||
|
||||
// Give focus to the popup browser. Perform asynchronously because the
|
||||
// parent window may attempt to keep focus after launching the popup.
|
||||
CefPostTask(TID_UI,
|
||||
NewCefRunnableMethod(browser->GetHost().get(),
|
||||
&CefBrowserHost::SetFocus, true));
|
||||
}
|
||||
|
||||
m_BrowserCount++;
|
||||
|
|
Loading…
Reference in New Issue