desktop_screen_x11.cc revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_screen.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xlib.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It clashes with out RootWindow.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef RootWindow
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window_host.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/x/x11_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(erg): This method is a temporary hack, until we can reliably extract
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// location data out of XRandR.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size GetPrimaryDisplaySize() {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::Display* display = ui::GetXDisplay();
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::Screen* screen = DefaultScreenOfDisplay(display);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int width = WidthOfScreen(screen);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int height = HeightOfScreen(screen);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size(width, height);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DesktopScreenX11 : public gfx::Screen {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DesktopScreenX11();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DesktopScreenX11();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from gfx::Screen:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsDIPEnabled() OVERRIDE;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Point GetCursorScreenPoint() OVERRIDE;
41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual gfx::NativeWindow GetWindowUnderCursor() OVERRIDE;
42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual gfx::NativeWindow GetWindowAtScreenPoint(const gfx::Point& point)
43424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      OVERRIDE;
44424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual int GetNumDisplays() const OVERRIDE;
45424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual std::vector<gfx::Display> GetAllDisplays() const OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Display GetDisplayNearestWindow(
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::NativeView window) const OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Display GetDisplayNearestPoint(
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Point& point) const OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Display GetDisplayMatching(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Rect& match_rect) const OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Display GetPrimaryDisplay() const OVERRIDE;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AddObserver(gfx::DisplayObserver* observer) OVERRIDE;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void RemoveObserver(gfx::DisplayObserver* observer) OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DesktopScreenX11);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DesktopScreenX11, public:
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DesktopScreenX11::DesktopScreenX11() {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DesktopScreenX11::~DesktopScreenX11() {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DesktopScreenX11, gfx::Screen implementation:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DesktopScreenX11::IsDIPEnabled() {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point DesktopScreenX11::GetCursorScreenPoint() {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Display* display = ui::GetXDisplay();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::Window root, child;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int root_x, root_y, win_x, win_y;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int mask;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XQueryPointer(display,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                DefaultRootWindow(display),
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                &root,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                &child,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                &root_x,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                &root_y,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                &win_x,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                &win_y,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                &mask);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Point(root_x, root_y);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)gfx::NativeWindow DesktopScreenX11::GetWindowUnderCursor() {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erg): Implement using the discussion at
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://codereview.chromium.org/10279005/
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)gfx::NativeWindow DesktopScreenX11::GetWindowAtScreenPoint(
102424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const gfx::Point& point) {
103424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  NOTIMPLEMENTED();
104424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return NULL;
105424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
106424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
107424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)int DesktopScreenX11::GetNumDisplays() const {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erg): Figure this out with oshima or piman because I have no clue
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // about the XRandR implications here.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 1;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
113424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)std::vector<gfx::Display> DesktopScreenX11::GetAllDisplays() const {
114424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // TODO(erg): Do the right thing once we know what that is.
115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  return std::vector<gfx::Display>(1, GetPrimaryDisplay());
116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display DesktopScreenX11::GetDisplayNearestWindow(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::NativeView window) const {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erg): Do the right thing once we know what that is.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Display(0, gfx::Rect(GetPrimaryDisplaySize()));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display DesktopScreenX11::GetDisplayNearestPoint(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& point) const {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erg): Do the right thing once we know what that is.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Display(0, gfx::Rect(GetPrimaryDisplaySize()));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display DesktopScreenX11::GetDisplayMatching(
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& match_rect) const {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erg): Do the right thing once we know what that is.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Display(0, gfx::Rect(GetPrimaryDisplaySize()));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display DesktopScreenX11::GetPrimaryDisplay() const {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erg): Do the right thing once we know what that is.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Display(0, gfx::Rect(GetPrimaryDisplaySize()));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopScreenX11::AddObserver(gfx::DisplayObserver* observer) {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(erg|oshima): Do the right thing once we know what that is.
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // crbug.com/122863
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopScreenX11::RemoveObserver(gfx::DisplayObserver* observer) {
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(erg|oshima): Do the right thing once we know what that is.
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // crbug.com/122863
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace views {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Screen* CreateDesktopScreen() {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new DesktopScreenX11;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace views
161