summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-24 20:01:20 +0000
committersadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-24 20:01:20 +0000
commit96de7910f611a4640bc9ade33abf981b6661680d (patch)
treeadb3f340851f595b20d27d552383b833900f5144
parent0173b96374dacfa596c6700b4c1b2ab6abc35f90 (diff)
downloadchromium_src-96de7910f611a4640bc9ade33abf981b6661680d.zip
chromium_src-96de7910f611a4640bc9ade33abf981b6661680d.tar.gz
chromium_src-96de7910f611a4640bc9ade33abf981b6661680d.tar.bz2
mpx: Use [mostly proper] glib event source for X events when GTK events are not used.
The non-gtk aura WM can be run with this message-pump without taking up 100% CPU. BUG=none TEST=none Review URL: http://codereview.chromium.org/7704003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@98099 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--base/message_pump_x.cc75
-rw-r--r--base/message_pump_x.h4
2 files changed, 69 insertions, 10 deletions
diff --git a/base/message_pump_x.cc b/base/message_pump_x.cc
index ada3fa3..9c0b90c 100644
--- a/base/message_pump_x.cc
+++ b/base/message_pump_x.cc
@@ -12,6 +12,34 @@
namespace {
+gboolean XSourcePrepare(GSource* source, gint* timeout_ms) {
+ if (XPending(base::MessagePumpX::GetDefaultXDisplay()))
+ *timeout_ms = 0;
+ else
+ *timeout_ms = -1;
+ return FALSE;
+}
+
+gboolean XSourceCheck(GSource* source) {
+ return XPending(base::MessagePumpX::GetDefaultXDisplay());
+}
+
+gboolean XSourceDispatch(GSource* source,
+ GSourceFunc unused_func,
+ gpointer unused_data) {
+ // TODO(sad): When GTK event proecssing is completely removed, the event
+ // processing and dispatching should be done here (i.e. XNextEvent,
+ // ProcessXEvent etc.)
+ return TRUE;
+}
+
+GSourceFuncs XSourceFuncs = {
+ XSourcePrepare,
+ XSourceCheck,
+ XSourceDispatch,
+ NULL
+};
+
// A flag to disable GTK's message pump. This is intermediate step
// to remove gtk and will be removed once migration is complete.
bool use_gtk_message_pump = true;
@@ -19,6 +47,10 @@ bool use_gtk_message_pump = true;
// The opcode used for checking events.
int xiopcode = -1;
+// When the GTK/GDK event processing is disabled, the message-pump opens a
+// connection to the display and owns it.
+Display* g_xdisplay = NULL;
+
gboolean PlaceholderDispatch(GSource* source,
GSourceFunc cb,
gpointer data) {
@@ -51,12 +83,24 @@ void InitializeXInput2(void) {
namespace base {
MessagePumpX::MessagePumpX() : MessagePumpGlib(),
+ x_source_(NULL),
gdksource_(NULL),
dispatching_event_(false),
capture_x_events_(0),
capture_gdk_events_(0) {
- gdk_window_add_filter(NULL, &GdkEventFilter, this);
- gdk_event_handler_set(&EventDispatcherX, this, NULL);
+ if (use_gtk_message_pump) {
+ gdk_window_add_filter(NULL, &GdkEventFilter, this);
+ gdk_event_handler_set(&EventDispatcherX, this, NULL);
+ } else {
+ GPollFD* x_poll = new GPollFD();
+ x_poll->fd = ConnectionNumber(g_xdisplay);
+ x_poll->events = G_IO_IN;
+
+ x_source_ = g_source_new(&XSourceFuncs, sizeof(GSource));
+ g_source_add_poll(x_source_, x_poll);
+ g_source_set_can_recurse(x_source_, FALSE);
+ g_source_attach(x_source_, g_main_context_default());
+ }
InitializeXInput2();
if (use_gtk_message_pump)
@@ -64,20 +108,32 @@ MessagePumpX::MessagePumpX() : MessagePumpGlib(),
}
MessagePumpX::~MessagePumpX() {
- gdk_window_remove_filter(NULL, &GdkEventFilter, this);
- gdk_event_handler_set(reinterpret_cast<GdkEventFunc>(gtk_main_do_event),
- this, NULL);
+ if (use_gtk_message_pump) {
+ gdk_window_remove_filter(NULL, &GdkEventFilter, this);
+ gdk_event_handler_set(reinterpret_cast<GdkEventFunc>(gtk_main_do_event),
+ this, NULL);
+ } else {
+ g_source_destroy(x_source_);
+ g_source_unref(x_source_);
+ XCloseDisplay(g_xdisplay);
+ g_xdisplay = NULL;
+ }
}
// static
void MessagePumpX::DisableGtkMessagePump() {
use_gtk_message_pump = false;
+ g_xdisplay = XOpenDisplay(NULL);
}
// static
Display* MessagePumpX::GetDefaultXDisplay() {
- static GdkDisplay* display = gdk_display_get_default();
- return display ? GDK_DISPLAY_XDISPLAY(display) : NULL;
+ if (use_gtk_message_pump) {
+ static GdkDisplay* display = gdk_display_get_default();
+ return display ? GDK_DISPLAY_XDISPLAY(display) : NULL;
+ } else {
+ return g_xdisplay;
+ }
}
// static
@@ -131,12 +187,11 @@ bool MessagePumpX::RunOnce(GMainContext* context, bool block) {
XNextEvent(display, &xev);
if (ProcessXEvent(&xev))
return true;
- } else {
+ } else if (use_gtk_message_pump && gdksource_) {
// TODO(sad): A couple of extra events can still sneak in during this.
// Those should be sent back to the X queue from the dispatcher
// EventDispatcherX.
- if (gdksource_ && use_gtk_message_pump)
- gdksource_->source_funcs->dispatch = gdkdispatcher_;
+ gdksource_->source_funcs->dispatch = gdkdispatcher_;
g_main_context_iteration(context, FALSE);
}
}
diff --git a/base/message_pump_x.h b/base/message_pump_x.h
index a6b68c6..c13f323 100644
--- a/base/message_pump_x.h
+++ b/base/message_pump_x.h
@@ -108,6 +108,10 @@ class BASE_EXPORT MessagePumpX : public MessagePumpGlib {
// processed so that GDK doesn't get to them.
void InitializeEventsToCapture(void);
+ // The event source for X events (used only when GTK event processing is
+ // disabled).
+ GSource* x_source_;
+
// The event source for GDK events.
GSource* gdksource_;