// 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> 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); } 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