Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2439)

Unified Diff: ash/display/display_change_observer_chromeos.cc

Issue 336863002: Moving input device hotplug event processing outside of ui/display (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ash/display/display_change_observer_chromeos.cc
diff --git a/ash/display/display_change_observer_chromeos.cc b/ash/display/display_change_observer_chromeos.cc
index 54b39dce7c9e4d1237eaca3b4250dae863df0371..0d93df146ef07fcc4f480ef8cc854aa059a4d471 100644
--- a/ash/display/display_change_observer_chromeos.cc
+++ b/ash/display/display_change_observer_chromeos.cc
@@ -22,6 +22,8 @@
#include "ui/display/types/chromeos/display_mode.h"
#include "ui/display/types/chromeos/display_snapshot.h"
#include "ui/display/util/display_util.h"
+#include "ui/events/device_data_manager.h"
+#include "ui/events/touchscreen_device.h"
#include "ui/gfx/display.h"
namespace ash {
@@ -48,6 +50,76 @@ struct DisplayModeSorter {
}
};
+gfx::Size GetNativeModeSize(const DisplayInfo& display) {
+ const std::vector<DisplayMode>& modes = display.display_modes();
+ for (size_t i = 0; i < modes.size(); ++i) {
+ if (modes[i].native) {
Daniel Erat 2014/06/17 21:59:18 nit: omit curly brackets on this one
dnicoara 2014/06/20 17:01:05 Done.
+ return modes[i].size;
+ }
+ }
+
+ return gfx::Size();
+}
+
+void AssociateTouchscreens(std::vector<DisplayInfo>* displays) {
+ std::set<int> no_match_touchscreen;
+ std::vector<ui::TouchscreenDevice> devices =
+ ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices();
+ for (size_t i = 0; i < devices.size(); ++i) {
+ bool found_mapping = false;
+ for (size_t j = 0; j < displays->size(); ++j) {
+ DisplayInfo* state = &(*displays)[j];
+ gfx::Size native_size = GetNativeModeSize(*state);;
Daniel Erat 2014/06/17 21:59:18 nit: const
dnicoara 2014/06/20 17:01:05 Done.
+ if (state->touch_support() == gfx::Display::TOUCH_SUPPORT_AVAILABLE ||
+ native_size.IsEmpty())
+ continue;
+
+ // Allow 1 pixel difference between screen and touchscreen
+ // resolutions. Because in some cases for monitor resolution
+ // 1024x768 touchscreen's resolution would be 1024x768, but for
+ // some 1023x767. It really depends on touchscreen's firmware
+ // configuration.
+ if (std::abs(native_size.width() - devices[i].size.width()) <= 1 &&
+ std::abs(native_size.height() - devices[i].size.height()) <= 1) {
+ state->set_touch_device_id(devices[i].id);
+
+ VLOG(2) << "Found touchscreen for display " << state->id()
+ << " touch_device_id " << state->touch_device_id() << " size "
+ << devices[i].size.ToString();
+ found_mapping = true;
+ break;
+ }
+ }
+
+ if (!found_mapping) {
+ no_match_touchscreen.insert(devices[i].id);
+ VLOG(2) << "No matching display for touch_device_id "
+ << devices[i].id << " size " << devices[i].size.ToString();
+ }
+ }
+
+ // Sometimes we can't find a matching screen for the touchscreen, e.g.
+ // due to the touchscreen's reporting range having no correlation with the
+ // screen's resolution. In this case, we arbitrarily assign unmatched
+ // touchscreens to unmatched screens.
+ for (std::set<int>::iterator it = no_match_touchscreen.begin();
+ it != no_match_touchscreen.end();
+ ++it) {
+ for (size_t i = 0; i < displays->size(); ++i) {
+ DisplayInfo* state = &(*displays)[i];
+ if (state->id() != gfx::Display::InternalDisplayId() &&
+ !GetNativeModeSize(*state).IsEmpty() &&
+ state->touch_support() == gfx::Display::TOUCH_SUPPORT_UNAVAILABLE) {
+ state->set_touch_device_id(*it);
+ VLOG(2) << "Arbitrarily matching touchscreen "
+ << state->touch_device_id() << " to display "
+ << state->id();
+ break;
+ }
+ }
+ }
+}
+
} // namespace
// static
@@ -90,9 +162,11 @@ std::vector<DisplayMode> DisplayChangeObserver::GetDisplayModeList(
DisplayChangeObserver::DisplayChangeObserver() {
Shell::GetInstance()->AddShellObserver(this);
+ ui::DeviceDataManager::GetInstance()->AddObserver(this);
}
DisplayChangeObserver::~DisplayChangeObserver() {
+ ui::DeviceDataManager::GetInstance()->RemoveObserver(this);
Shell::GetInstance()->RemoveShellObserver(this);
}
@@ -160,10 +234,6 @@ void DisplayChangeObserver::OnDisplayModeChanged(
new_info.SetBounds(display_bounds);
new_info.set_native(true);
new_info.set_display_modes(display_modes);
- new_info.set_touch_support(state.touch_device_id == 0 ?
- gfx::Display::TOUCH_SUPPORT_UNAVAILABLE :
- gfx::Display::TOUCH_SUPPORT_AVAILABLE);
- new_info.set_touch_device_id(state.touch_device_id);
new_info.set_is_aspect_preserving_scaling(
state.display->is_aspect_preserving_scaling());
new_info.set_available_color_profiles(
@@ -172,6 +242,7 @@ void DisplayChangeObserver::OnDisplayModeChanged(
->GetAvailableColorCalibrationProfiles(id));
}
+ AssociateTouchscreens(&displays);
// DisplayManager can be null during the boot.
Shell::GetInstance()->display_manager()->OnNativeDisplaysChanged(displays);
}
@@ -184,4 +255,25 @@ void DisplayChangeObserver::OnAppTerminating() {
#endif
}
+void DisplayChangeObserver::OnInputDeviceConfigurationChanged() {
+ std::vector<DisplayInfo> display_infos;
+ DisplayManager* display_manager =
+ ash::Shell::GetInstance()->display_manager();
+ const std::vector<gfx::Display>& displays = display_manager->displays();
+ // Reuse the current state in DisplayManager and re-associate the displays
+ // with the touchscreens.
+ for (size_t i = 0; i < displays.size(); ++i) {
+ DisplayInfo display = display_manager->GetDisplayInfo(displays[i].id());
dnicoara 2014/06/13 18:47:58 Bleh, I hate that we need to get the gfx::Displays
+ // Unset the touchscreen configuration since we'll be rematching them from
+ // scratch.
+ display.set_touch_support(gfx::Display::TOUCH_SUPPORT_UNAVAILABLE);
+ display.set_touch_device_id(ui::TouchscreenDevice::kInvalidId);
+
+ display_infos.push_back(display);
+ }
+
+ AssociateTouchscreens(&display_infos);
+ display_manager->OnNativeDisplaysChanged(display_infos);
+}
+
} // namespace ash

Powered by Google App Engine
This is Rietveld 408576698