#include "ui/compositor/compositor.h"
#include "ui/compositor/layer.h"
#include "ui/events/event.h"
+#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/screen.h"
#include "ui/views/controls/menu/menu_controller.h"
#include "ui/views/focus/focus_manager.h"
#include "ui/views/widget/widget_delegate.h"
#include "ui/views/widget/widget_deletion_observer.h"
#include "ui/views/widget/widget_observer.h"
+#include "ui/views/widget/widget_removals_observer.h"
#include "ui/views/window/custom_frame_view.h"
#include "ui/views/window/dialog_delegate.h"
last_mouse_event_was_move_(false),
auto_release_capture_(true),
root_layers_dirty_(false),
- movement_disabled_(false) {
+ movement_disabled_(false),
+ observer_manager_(this) {
}
Widget::~Widget() {
// static
Widget* Widget::CreateWindowWithParent(WidgetDelegate* delegate,
- gfx::NativeWindow parent) {
+ gfx::NativeView parent) {
return CreateWindowWithParentAndBounds(delegate, parent, gfx::Rect());
}
// static
Widget* Widget::CreateWindowWithParentAndBounds(WidgetDelegate* delegate,
- gfx::NativeWindow parent,
+ gfx::NativeView parent,
const gfx::Rect& bounds) {
Widget* widget = new Widget;
Widget::InitParams params;
internal::NativeWidgetPrivate::IsMouseButtonDown();
}
native_widget_->InitNativeWidget(params);
+ observer_manager_.Add(GetNativeTheme());
if (RequiresNonClientView(params.type)) {
non_client_view_ = new NonClientView;
non_client_view_->SetFrameView(CreateNonClientFrameView());
return observers_.HasObserver(observer);
}
+void Widget::AddRemovalsObserver(WidgetRemovalsObserver* observer) {
+ removals_observers_.AddObserver(observer);
+}
+
+void Widget::RemoveRemovalsObserver(WidgetRemovalsObserver* observer) {
+ removals_observers_.RemoveObserver(observer);
+}
+
+bool Widget::HasRemovalsObserver(WidgetRemovalsObserver* observer) {
+ return removals_observers_.HasObserver(observer);
+}
+
bool Widget::GetAccelerator(int cmd_id, ui::Accelerator* accelerator) {
return false;
}
root_view_->NotifyNativeViewHierarchyChanged();
}
+void Widget::NotifyWillRemoveView(View* view) {
+ FOR_EACH_OBSERVER(WidgetRemovalsObserver,
+ removals_observers_,
+ OnWillRemoveView(this, view));
+}
+
// Converted methods (see header) ----------------------------------------------
Widget* Widget::GetTopLevelWidget() {
}
}
+ui::InputMethod* Widget::GetHostInputMethod() {
+ return native_widget_private()->GetHostInputMethod();
+}
+
void Widget::RunShellDrag(View* view,
const ui::OSExchangeData& data,
const gfx::Point& location,
}
void Widget::OnNativeFocus(gfx::NativeView old_focused_view) {
+ // Ensure the focused view's TextInputClient is used for text input.
+ views::FocusManager* focus_manager = GetFocusManager();
+ focus_manager->FocusTextInputClient(focus_manager->GetFocusedView());
+
WidgetFocusManager::GetInstance()->OnWidgetFocusEvent(old_focused_view,
GetNativeView());
}
void Widget::OnNativeBlur(gfx::NativeView new_focused_view) {
+ // Ensure the focused view's TextInputClient is not used for text input.
+ views::FocusManager* focus_manager = GetFocusManager();
+ focus_manager->BlurTextInputClient(focus_manager->GetFocusedView());
+
WidgetFocusManager::GetInstance()->OnWidgetFocusEvent(GetNativeView(),
new_focused_view);
}
void Widget::OnNativeWidgetMove() {
widget_delegate_->OnWidgetMove();
+ if (GetRootView()->GetFocusManager()) {
+ View* focused_view = GetRootView()->GetFocusManager()->GetFocusedView();
+ if (focused_view && focused_view->GetInputMethod())
+ focused_view->GetInputMethod()->OnCaretBoundsChanged(focused_view);
+ }
FOR_EACH_OBSERVER(WidgetObserver, observers_, OnWidgetBoundsChanged(
this,
GetWindowBoundsInScreen()));
void Widget::OnNativeWidgetSizeChanged(const gfx::Size& new_size) {
root_view_->SetSize(new_size);
+ if (GetRootView()->GetFocusManager()) {
+ View* focused_view = GetRootView()->GetFocusManager()->GetFocusedView();
+ if (focused_view && focused_view->GetInputMethod())
+ focused_view->GetInputMethod()->OnCaretBoundsChanged(focused_view);
+ }
+
// Size changed notifications can fire prior to full initialization
// i.e. during session restore. Avoid saving session state during these
// startup procedures.
is_mouse_button_pressed_ = false;
}
-void Widget::OnTouchEvent(ui::TouchEvent* event) {
- SendEventToProcessor(event);
-}
-
void Widget::OnScrollEvent(ui::ScrollEvent* event) {
- SendEventToProcessor(event);
+ ui::ScrollEvent event_copy(*event);
+ SendEventToProcessor(&event_copy);
+
+ // Convert unhandled ui::ET_SCROLL events into ui::ET_MOUSEWHEEL events.
+ if (!event_copy.handled() && event_copy.type() == ui::ET_SCROLL) {
+ ui::MouseWheelEvent wheel(*event);
+ OnMouseEvent(&wheel);
+ }
}
void Widget::OnGestureEvent(ui::GestureEvent* event) {
}
////////////////////////////////////////////////////////////////////////////////
+// Widget, ui::NativeThemeObserver implementation:
+
+void Widget::OnNativeThemeUpdated(ui::NativeTheme* observed_theme) {
+ DCHECK(observer_manager_.IsObserving(observed_theme));
+
+ ui::NativeTheme* current_native_theme = GetNativeTheme();
+ if (!observer_manager_.IsObserving(current_native_theme)) {
+ observer_manager_.RemoveAll();
+ observer_manager_.Add(current_native_theme);
+ }
+
+ root_view_->PropagateNativeThemeChanged(current_native_theme);
+}
+
+////////////////////////////////////////////////////////////////////////////////
// Widget, protected:
internal::RootView* Widget::CreateRootView() {