Revert 263726 "x11: Remove X11 message-pump."

Reason for revert: along with 263718 blamed for
http://build.chromium.org/p/chromium.linux/builders/Linux%20Tests%20%28dbg%29%282%29/builds/45298
http://build.chromium.org/p/chromium.chromiumos/builders/Linux%20ChromiumOS%20Tests%20%28dbg%29%281%29/builds/29956

> x11: Remove X11 message-pump.
> 
> The remaining use of the X11 mesage-pump was opening the connection to the
> X11 server. This patch moves that out of the message-pump, into gfx. This
> allows us to remove the X11 message-pump, and just use the base Glib-based
> message-pump on Linux and ChromeOS.
> 
> BUG=354062
> R=darin@chromium.org, sky@chromium.org
> 
> Review URL: https://codereview.chromium.org/235043005

TBR=sadrul@chromium.org

Review URL: https://codereview.chromium.org/238093002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@263733 0039d316-1c4b-4281-b951-d872f2087c98


CrOS-Libchrome-Original-Commit: dfca51a8801c7be9db5cb59de202dc0e0c91ccda
diff --git a/base/base.gyp b/base/base.gyp
index 12d2a5f..1e9ae28 100644
--- a/base/base.gyp
+++ b/base/base.gyp
@@ -245,6 +245,8 @@
         'message_loop/message_pump_libevent.h',
         'message_loop/message_pump_mac.h',
         'message_loop/message_pump_mac.mm',
+        'message_loop/message_pump_x11.cc',
+        'message_loop/message_pump_x11.h',
         'metrics/field_trial.cc',
         'metrics/field_trial.h',
         'posix/file_descriptor_shuffle.cc',
diff --git a/base/base.gypi b/base/base.gypi
index 92ecf6e..645ef66 100644
--- a/base/base.gypi
+++ b/base/base.gypi
@@ -733,6 +733,11 @@
                 'message_loop/message_pump_glib.cc',
               ],
           }],
+          ['<(use_x11)==0 or >(nacl_untrusted_build)==1', {
+              'sources!': [
+                'message_loop/message_pump_x11.cc',
+              ],
+          }],
           ['<(toolkit_uses_gtk)==0 or >(nacl_untrusted_build)==1', {
             'sources!': ['message_loop/message_pump_gtk.cc'],
           }],
@@ -886,6 +891,7 @@
           ['<(use_ozone) == 1', {
             'sources!': [
               'message_loop/message_pump_glib.cc',
+              'message_loop/message_pump_x11.cc',
             ]
           }],
           ['OS == "linux" and >(nacl_untrusted_build)==0', {
diff --git a/base/message_loop/message_loop.h b/base/message_loop/message_loop.h
index 07f9105..6539c65 100644
--- a/base/message_loop/message_loop.h
+++ b/base/message_loop/message_loop.h
@@ -34,10 +34,14 @@
 #include "base/message_loop/message_pump_libevent.h"
 #if !defined(OS_MACOSX) && !defined(OS_ANDROID)
 
-#if defined(USE_GLIB) && !defined(OS_NACL)
-#include "base/message_loop/message_pump_glib.h"
+#if defined(USE_AURA) && defined(USE_X11) && !defined(OS_NACL)
+#include "base/message_loop/message_pump_x11.h"
 #elif !defined(OS_ANDROID_HOST)
-#include "base/message_loop/message_pump_glib.h"
+#define USE_GTK_MESSAGE_PUMP
+#include "base/message_loop/message_pump_gtk.h"
+#if defined(TOOLKIT_GTK)
+#include "base/message_loop/message_pump_x11.h"
+#endif
 #endif
 
 #endif
@@ -91,6 +95,8 @@
  public:
 #if defined(OS_WIN)
   typedef MessagePumpObserver Observer;
+#elif defined(USE_GTK_MESSAGE_PUMP)
+  typedef MessagePumpGdkObserver Observer;
 #endif
 
   // A MessageLoop has a particular type, which indicates the set of
@@ -407,6 +413,13 @@
   MessagePumpLibevent* pump_libevent() {
     return static_cast<MessagePumpLibevent*>(pump_.get());
   }
+#if defined(TOOLKIT_GTK)
+  friend class MessagePumpX11;
+  MessagePumpX11* pump_gpu() {
+    DCHECK_EQ(TYPE_GPU, type());
+    return static_cast<MessagePumpX11*>(pump_.get());
+  }
+#endif
 #endif
 
   scoped_ptr<MessagePump> pump_;
@@ -580,6 +593,10 @@
 #endif
 
  protected:
+#if defined(USE_X11)
+  friend class MessagePumpX11;
+#endif
+
 #if !defined(OS_MACOSX) && !defined(OS_ANDROID)
   // TODO(rvargas): Make this platform independent.
   MessagePumpForUI* pump_ui() {
diff --git a/base/message_loop/message_pump_glib.h b/base/message_loop/message_pump_glib.h
index 9acc472..0211b0f 100644
--- a/base/message_loop/message_pump_glib.h
+++ b/base/message_loop/message_pump_glib.h
@@ -94,8 +94,6 @@
   DISALLOW_COPY_AND_ASSIGN(MessagePumpGlib);
 };
 
-typedef MessagePumpGlib MessagePumpForUI;
-
 }  // namespace base
 
 #endif  // BASE_MESSAGE_LOOP_MESSAGE_PUMP_GLIB_H_
diff --git a/base/message_loop/message_pump_x11.cc b/base/message_loop/message_pump_x11.cc
new file mode 100644
index 0000000..fb40b1d
--- /dev/null
+++ b/base/message_loop/message_pump_x11.cc
@@ -0,0 +1,63 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/message_loop/message_pump_x11.h"
+
+#include <glib.h>
+#include <X11/X.h>
+#include <X11/extensions/XInput2.h>
+#include <X11/XKBlib.h>
+
+#include "base/basictypes.h"
+#include "base/message_loop/message_loop.h"
+
+namespace base {
+
+namespace {
+
+// The connection is essentially a global that's accessed through a static
+// method and destroyed whenever ~MessagePumpX11() is called. We do this
+// for historical reasons so user code can call
+// MessagePumpForUI::GetDefaultXDisplay() where MessagePumpForUI is a typedef
+// to whatever type in the current build.
+//
+// TODO(erg): This can be changed to something more sane like
+// MessagePumpX11::Current()->display() once MessagePumpGtk goes away.
+Display* g_xdisplay = NULL;
+
+}  // namespace
+
+MessagePumpX11::MessagePumpX11() : MessagePumpGlib() {
+  GetDefaultXDisplay();
+}
+
+MessagePumpX11::~MessagePumpX11() {
+  if (g_xdisplay) {
+    XCloseDisplay(g_xdisplay);
+    g_xdisplay = NULL;
+  }
+}
+
+// static
+Display* MessagePumpX11::GetDefaultXDisplay() {
+  if (!g_xdisplay)
+    g_xdisplay = XOpenDisplay(NULL);
+  return g_xdisplay;
+}
+
+#if defined(TOOLKIT_GTK)
+// static
+MessagePumpX11* MessagePumpX11::Current() {
+  MessageLoop* loop = MessageLoop::current();
+  return static_cast<MessagePumpX11*>(loop->pump_gpu());
+}
+#else
+// static
+MessagePumpX11* MessagePumpX11::Current() {
+  MessageLoopForUI* loop = MessageLoopForUI::current();
+  return static_cast<MessagePumpX11*>(loop->pump_ui());
+}
+#endif
+
+}  // namespace base
diff --git a/base/message_loop/message_pump_x11.h b/base/message_loop/message_pump_x11.h
new file mode 100644
index 0000000..5fdfeea
--- /dev/null
+++ b/base/message_loop/message_pump_x11.h
@@ -0,0 +1,42 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_MESSAGE_LOOP_MESSAGE_PUMP_X11_H
+#define BASE_MESSAGE_LOOP_MESSAGE_PUMP_X11_H
+
+#include <bitset>
+#include <map>
+
+#include "base/memory/scoped_ptr.h"
+#include "base/message_loop/message_pump.h"
+#include "base/message_loop/message_pump_glib.h"
+#include "base/observer_list.h"
+
+typedef struct _XDisplay Display;
+
+namespace base {
+
+// This class implements a message-pump for dispatching X events.
+class BASE_EXPORT MessagePumpX11 : public MessagePumpGlib {
+ public:
+  MessagePumpX11();
+  virtual ~MessagePumpX11();
+
+  // Returns default X Display.
+  static Display* GetDefaultXDisplay();
+
+  // Returns the UI or GPU message pump.
+  static MessagePumpX11* Current();
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MessagePumpX11);
+};
+
+#if !defined(TOOLKIT_GTK)
+typedef MessagePumpX11 MessagePumpForUI;
+#endif
+
+}  // namespace base
+
+#endif  // BASE_MESSAGE_LOOP_MESSAGE_PUMP_X11_H