desktop_screen_x11.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::NativeWindow GetWindowAtCursorScreenPoint() OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetNumDisplays() OVERRIDE;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Display GetDisplayNearestWindow(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::NativeView window) const OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Display GetDisplayNearestPoint(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Point& point) const OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Display GetDisplayMatching(
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Rect& match_rect) const OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Display GetPrimaryDisplay() const OVERRIDE;
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void AddObserver(gfx::DisplayObserver* observer) OVERRIDE;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void RemoveObserver(gfx::DisplayObserver* observer) OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DesktopScreenX11);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DesktopScreenX11, public:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DesktopScreenX11::DesktopScreenX11() {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DesktopScreenX11::~DesktopScreenX11() {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DesktopScreenX11, gfx::Screen implementation:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DesktopScreenX11::IsDIPEnabled() {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point DesktopScreenX11::GetCursorScreenPoint() {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Display* display = ui::GetXDisplay();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::Window root, child;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int root_x, root_y, win_x, win_y;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int mask;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XQueryPointer(display,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                DefaultRootWindow(display),
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                &root,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                &child,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                &root_x,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                &root_y,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                &win_x,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                &win_y,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                &mask);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Point(root_x, root_y);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow DesktopScreenX11::GetWindowAtCursorScreenPoint() {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erg): Implement using the discussion at
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://codereview.chromium.org/10279005/
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int DesktopScreenX11::GetNumDisplays() {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erg): Figure this out with oshima or piman because I have no clue
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // about the XRandR implications here.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 1;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display DesktopScreenX11::GetDisplayNearestWindow(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::NativeView window) const {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erg): Do the right thing once we know what that is.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Display(0, gfx::Rect(GetPrimaryDisplaySize()));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display DesktopScreenX11::GetDisplayNearestPoint(
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& point) const {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erg): Do the right thing once we know what that is.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Display(0, gfx::Rect(GetPrimaryDisplaySize()));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display DesktopScreenX11::GetDisplayMatching(
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& match_rect) const {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erg): Do the right thing once we know what that is.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Display(0, gfx::Rect(GetPrimaryDisplaySize()));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Display DesktopScreenX11::GetPrimaryDisplay() const {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erg): Do the right thing once we know what that is.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Display(0, gfx::Rect(GetPrimaryDisplaySize()));
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopScreenX11::AddObserver(gfx::DisplayObserver* observer) {
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(erg|oshima): Do the right thing once we know what that is.
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // crbug.com/122863
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DesktopScreenX11::RemoveObserver(gfx::DisplayObserver* observer) {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(erg|oshima): Do the right thing once we know what that is.
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // crbug.com/122863
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace views {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Screen* CreateDesktopScreen() {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new DesktopScreenX11;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace views
147