blob: e1cb7f65c4af05e9d3d09ac5db3a144df0c26a07 [file] [log] [blame]
// Copyright (c) 2011 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_pump_gtk.h"
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
namespace base {
MessagePumpGtk::MessagePumpGtk() : MessagePumpGlib() {
gdk_event_handler_set(&EventDispatcher, this, NULL);
}
MessagePumpGtk::~MessagePumpGtk() {
gdk_event_handler_set(reinterpret_cast<GdkEventFunc>(gtk_main_do_event),
this, NULL);
}
void MessagePumpGtk::DispatchEvents(GdkEvent* event) {
WillProcessEvent(event);
MessagePumpDispatcher* dispatcher = GetDispatcher();
if (!dispatcher)
gtk_main_do_event(event);
else if (!dispatcher->Dispatch(event))
Quit();
DidProcessEvent(event);
}
// static
Display* MessagePumpGtk::GetDefaultXDisplay() {
static GdkDisplay* display = gdk_display_get_default();
return display ? GDK_DISPLAY_XDISPLAY(display) : NULL;
}
bool MessagePumpGtk::RunOnce(GMainContext* context, bool block) {
// g_main_context_iteration returns true if events have been dispatched.
return g_main_context_iteration(context, block);
}
void MessagePumpGtk::WillProcessEvent(GdkEvent* event) {
FOR_EACH_OBSERVER(MessagePumpObserver, observers(), WillProcessEvent(event));
}
void MessagePumpGtk::DidProcessEvent(GdkEvent* event) {
FOR_EACH_OBSERVER(MessagePumpObserver, observers(), DidProcessEvent(event));
}
// static
void MessagePumpGtk::EventDispatcher(GdkEvent* event, gpointer data) {
MessagePumpGtk* message_pump = reinterpret_cast<MessagePumpGtk*>(data);
message_pump->DispatchEvents(event);
}
} // namespace base