Use an X event loop in the GPU process on Linux.

In future patches, X windows will be created in the GPU
process, and events sent to these windows will need to
be forwarded to their parent windows.

Linux uses GTK as the default UI event loop type, but
GTK is not in the GPU process, so the X11 event loop
type is used instead.

Update package dependencies.

This will cause a regression in nacl_helper-text/text. Test
expectations will need to be updated.

BUG=145600
TBR=thakis, piman, mmoss, erg

Review URL: https://chromiumcodereview.appspot.com/23530050

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


CrOS-Libchrome-Original-Commit: 4fc7cc52d49f4de12f17a1254674b4dfc449d035
diff --git a/base/message_loop/message_loop.cc b/base/message_loop/message_loop.cc
index cdd8721..87a0b63 100644
--- a/base/message_loop/message_loop.cc
+++ b/base/message_loop/message_loop.cc
@@ -184,6 +184,10 @@
       pump_.reset(MESSAGE_PUMP_UI);
   } else if (type_ == TYPE_IO) {
     pump_.reset(MESSAGE_PUMP_IO);
+#if defined(TOOLKIT_GTK)
+  } else if (type_ == TYPE_GPU) {
+    pump_.reset(new MessagePumpX11());
+#endif
 #if defined(OS_ANDROID)
   } else if (type_ == TYPE_JAVA) {
     pump_.reset(MESSAGE_PUMP_UI);
diff --git a/base/message_loop/message_loop.h b/base/message_loop/message_loop.h
index bdad1b2..3520b72 100644
--- a/base/message_loop/message_loop.h
+++ b/base/message_loop/message_loop.h
@@ -42,6 +42,9 @@
 #else
 #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
@@ -110,6 +113,11 @@
   //   This type of ML also supports native UI events (e.g., Windows messages).
   //   See also MessageLoopForUI.
   //
+  // TYPE_GPU
+  //   This type of ML also supports native UI events for use in the GPU
+  //   process. On Linux this will always be an X11 ML (as compared with the
+  //   sometimes-GTK ML in the browser process).
+  //
   // TYPE_IO
   //   This type of ML also supports asynchronous IO.  See also
   //   MessageLoopForIO.
@@ -123,6 +131,9 @@
   enum Type {
     TYPE_DEFAULT,
     TYPE_UI,
+#if defined(TOOLKIT_GTK)
+    TYPE_GPU,
+#endif
     TYPE_IO,
 #if defined(OS_ANDROID)
     TYPE_JAVA,
@@ -416,6 +427,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_;
@@ -599,7 +617,7 @@
 #endif
 
  protected:
-#if defined(USE_AURA) && defined(USE_X11) && !defined(OS_NACL)
+#if defined(USE_X11)
   friend class MessagePumpX11;
 #endif
 #if defined(USE_OZONE) && !defined(OS_NACL)
diff --git a/base/message_loop/message_pump_x11.cc b/base/message_loop/message_pump_x11.cc
index 7e780b2..dd8b965 100644
--- a/base/message_loop/message_pump_x11.cc
+++ b/base/message_loop/message_pump_x11.cc
@@ -158,7 +158,13 @@
   return InitializeXInput2();
 }
 
-#if !defined(TOOLKIT_GTK)
+#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();
diff --git a/base/message_loop/message_pump_x11.h b/base/message_loop/message_pump_x11.h
index 6f2c609..f1f678a 100644
--- a/base/message_loop/message_pump_x11.h
+++ b/base/message_loop/message_pump_x11.h
@@ -43,10 +43,8 @@
   // Returns true if the system supports XINPUT2.
   static bool HasXInput2();
 
-#if !defined(TOOLKIT_GTK)
-  // Returns the UI message pump.
+  // Returns the UI or GPU message pump.
   static MessagePumpX11* Current();
-#endif
 
   // Adds/Removes |dispatcher| for the |xid|. This will route all messages from
   // the window |xid| to |dispatcher.