summaryrefslogtreecommitdiffstats
path: root/ash/touch
diff options
context:
space:
mode:
authormohsen@chromium.org <mohsen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-01 19:27:13 +0000
committermohsen@chromium.org <mohsen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-01 19:27:13 +0000
commit5817504024ccc2ee20f5c5019b8910f27ea9dcac (patch)
treebc7e7223eed30c6bac3d320dd8fb760ad080d9ee /ash/touch
parent2f93bcc8883a14ad50f51ccb0d127cf10f2c0bf4 (diff)
downloadchromium_src-5817504024ccc2ee20f5c5019b8910f27ea9dcac.zip
chromium_src-5817504024ccc2ee20f5c5019b8910f27ea9dcac.tar.gz
chromium_src-5817504024ccc2ee20f5c5019b8910f27ea9dcac.tar.bz2
Added touch HUD for all displays
Previously, there was only one touch HUD for the primary display and other displays had none. Now each display gets its own touch HUD when added. BUG=172237 Review URL: https://chromiumcodereview.appspot.com/13106004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@191635 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash/touch')
-rw-r--r--ash/touch/touch_observer_hud.cc68
-rw-r--r--ash/touch/touch_observer_hud.h26
2 files changed, 74 insertions, 20 deletions
diff --git a/ash/touch/touch_observer_hud.cc b/ash/touch/touch_observer_hud.cc
index cb615f7..28b0a38 100644
--- a/ash/touch/touch_observer_hud.cc
+++ b/ash/touch/touch_observer_hud.cc
@@ -4,13 +4,18 @@
#include "ash/touch/touch_observer_hud.h"
+#include "ash/display/display_controller.h"
+#include "ash/display/display_manager.h"
+#include "ash/root_window_controller.h"
#include "ash/shell_window_ids.h"
+#include "ash/wm/property_util.h"
#include "base/json/json_string_value_serializer.h"
#include "base/stringprintf.h"
+#include "base/strings/string_number_conversions.h"
#include "base/utf_string_conversions.h"
-#include "base/values.h"
#include "third_party/skia/include/core/SkPath.h"
#include "third_party/skia/include/core/SkXfermode.h"
+#include "ui/aura/root_window.h"
#include "ui/aura/window.h"
#include "ui/base/events/event.h"
#include "ui/gfx/canvas.h"
@@ -178,8 +183,6 @@ class TouchHudCanvas : public views::View {
path_index_(0),
color_index_(0),
scale_(1) {
- gfx::Display display = Shell::GetScreen()->GetPrimaryDisplay();
- gfx::Rect bounds = display.bounds();
SetPaintToLayer(true);
SetFillsBoundsOpaquely(false);
}
@@ -273,16 +276,16 @@ class TouchHudCanvas : public views::View {
DISALLOW_COPY_AND_ASSIGN(TouchHudCanvas);
};
-TouchObserverHUD::TouchObserverHUD() {
+TouchObserverHUD::TouchObserverHUD(const gfx::Display& display)
+ : display_id_(display.id()) {
views::View* content = new views::View;
canvas_ = new TouchHudCanvas(this);
content->AddChildView(canvas_);
- gfx::Display display = Shell::GetScreen()->GetPrimaryDisplay();
- gfx::Rect display_bounds = display.bounds();
- canvas_->SetBoundsRect(display_bounds);
- content->SetBoundsRect(display_bounds);
+ const gfx::Size& display_size = display.size();
+ canvas_->SetSize(display_size);
+ content->SetSize(display_size);
label_container_ = new views::View;
label_container_->SetLayoutManager(new views::BoxLayout(
@@ -298,7 +301,7 @@ TouchObserverHUD::TouchObserverHUD() {
label_container_->AddChildView(touch_labels_[i]);
}
label_container_->SetX(0);
- label_container_->SetY(display_bounds.height() / kReducedScale);
+ label_container_->SetY(display_size.height() / kReducedScale);
label_container_->SetSize(label_container_->GetPreferredSize());
label_container_->SetVisible(false);
content->AddChildView(label_container_);
@@ -309,9 +312,10 @@ TouchObserverHUD::TouchObserverHUD() {
params.transparent = true;
params.can_activate = false;
params.accept_events = false;
- params.bounds = display_bounds;
+ params.bounds = gfx::Rect(display_size);
params.parent = Shell::GetContainer(
- Shell::GetPrimaryRootWindow(),
+ Shell::GetInstance()->display_controller()->GetRootWindowForDisplayId(
+ display_id_),
internal::kShellWindowId_OverlayContainer);
widget_->Init(params);
widget_->SetContentsView(content);
@@ -321,11 +325,33 @@ TouchObserverHUD::TouchObserverHUD() {
// The TouchObserverHUD's lifetime is always more than |widget_|. The
// |widget_| is unset from the OnWidgetDestroying callback.
widget_->AddObserver(this);
+
+ // Observe display changes to handle changes in display size.
+ Shell::GetScreen()->AddObserver(this);
}
TouchObserverHUD::~TouchObserverHUD() {
// The widget should have already been destroyed.
DCHECK(!widget_);
+ Shell::GetScreen()->RemoveObserver(this);
+}
+
+// static
+scoped_ptr<DictionaryValue> TouchObserverHUD::GetAllAsDictionary() {
+ scoped_ptr<DictionaryValue> value(new DictionaryValue());
+ Shell::RootWindowList roots = Shell::GetInstance()->GetAllRootWindows();
+ for (Shell::RootWindowList::iterator iter = roots.begin();
+ iter != roots.end(); ++iter) {
+ internal::RootWindowController* controller = GetRootWindowController(*iter);
+ if (controller->touch_observer_hud()) {
+ int64 display_id = (*iter)->GetProperty(kDisplayIdKey);
+ scoped_ptr<ListValue> list =
+ controller->touch_observer_hud()->GetLogAsList();
+ if (!list->empty())
+ value->Set(base::Int64ToString(display_id), list.release());
+ }
+ }
+ return value.Pass();
}
void TouchObserverHUD::ChangeToNextMode() {
@@ -348,12 +374,8 @@ void TouchObserverHUD::Clear() {
canvas_->Clear();
}
-std::string TouchObserverHUD::GetLogAsString() const {
- std::string string;
- scoped_ptr<ListValue> list = canvas_->GetAsList();
- JSONStringValueSerializer json(&string);
- json.set_pretty_print(true);
- return json.Serialize(*list) ? string : std::string();
+scoped_ptr<ListValue> TouchObserverHUD::GetLogAsList() const {
+ return canvas_->GetAsList();
}
void TouchObserverHUD::UpdateTouchPointLabel(int index) {
@@ -389,5 +411,17 @@ void TouchObserverHUD::OnWidgetDestroying(views::Widget* widget) {
widget_ = NULL;
}
+void TouchObserverHUD::OnDisplayBoundsChanged(const gfx::Display& display) {
+ const gfx::Size& size = display.size();
+ if (display.id() == display_id_) {
+ widget_->SetSize(size);
+ canvas_->SetSize(size);
+ label_container_->SetY(size.height() / kReducedScale);
+ }
+}
+
+void TouchObserverHUD::OnDisplayAdded(const gfx::Display& new_display) {}
+void TouchObserverHUD::OnDisplayRemoved(const gfx::Display& old_display) {}
+
} // namespace internal
} // namespace ash
diff --git a/ash/touch/touch_observer_hud.h b/ash/touch/touch_observer_hud.h
index 9851cac..1728112 100644
--- a/ash/touch/touch_observer_hud.h
+++ b/ash/touch/touch_observer_hud.h
@@ -7,7 +7,9 @@
#include "ash/ash_export.h"
#include "ash/shell.h"
+#include "base/values.h"
#include "ui/base/events/event_handler.h"
+#include "ui/gfx/display_observer.h"
#include "ui/gfx/point.h"
#include "ui/views/widget/widget_observer.h"
@@ -15,6 +17,10 @@ namespace aura {
class Window;
}
+namespace gfx {
+class Display;
+}
+
namespace views {
class Label;
class View;
@@ -28,11 +34,16 @@ class TouchHudCanvas;
// An event filter which handles system level gesture events.
class ASH_EXPORT TouchObserverHUD : public ui::EventHandler,
- public views::WidgetObserver {
+ public views::WidgetObserver,
+ public gfx::DisplayObserver {
public:
- TouchObserverHUD();
+ explicit TouchObserverHUD(const gfx::Display& display);
virtual ~TouchObserverHUD();
+ // Returns the log of touch events as a dictionary mapping id of each display
+ // to its touch log.
+ static scoped_ptr<DictionaryValue> GetAllAsDictionary();
+
// Changes the display mode (e.g. scale, visibility). Calling this repeatedly
// cycles between a fixed number of display modes.
void ChangeToNextMode();
@@ -41,7 +52,9 @@ class ASH_EXPORT TouchObserverHUD : public ui::EventHandler,
// visible).
void Clear();
- std::string GetLogAsString() const;
+ // Returns log of touch events as a list value. Each item in the list is a
+ // trace of one touch point.
+ scoped_ptr<ListValue> GetLogAsList() const;
private:
void UpdateTouchPointLabel(int index);
@@ -52,8 +65,15 @@ class ASH_EXPORT TouchObserverHUD : public ui::EventHandler,
// Overridden from views::WidgetObserver:
virtual void OnWidgetDestroying(views::Widget* widget) OVERRIDE;
+ // Overridden from gfx::DisplayObserver.
+ virtual void OnDisplayBoundsChanged(const gfx::Display& display) OVERRIDE;
+ virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE;
+ virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE;
+
static const int kMaxTouchPoints = 32;
+ const int64 display_id_;
+
views::Widget* widget_;
TouchHudCanvas* canvas_;
views::View* label_container_;