// 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 #include namespace base { MessagePumpGtk::MessagePumpGtk() : MessagePumpGlib() { gdk_event_handler_set(&EventDispatcher, this, NULL); } MessagePumpGtk::~MessagePumpGtk() { gdk_event_handler_set(reinterpret_cast(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(data); message_pump->DispatchEvents(event); } } // namespace base