diff options
Diffstat (limited to 'base/message_loop/message_pump_gtk.cc')
-rw-r--r-- | base/message_loop/message_pump_gtk.cc | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/base/message_loop/message_pump_gtk.cc b/base/message_loop/message_pump_gtk.cc new file mode 100644 index 0000000..8fa8cf2 --- /dev/null +++ b/base/message_loop/message_pump_gtk.cc @@ -0,0 +1,114 @@ +// Copyright (c) 2012 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_loop/message_pump_gtk.h" + +#include <gtk/gtk.h> +#include <gdk/gdkx.h> + +#include "base/debug/trace_event.h" +#include "base/profiler/scoped_profile.h" + +namespace base { + +namespace { + +const char* EventToTypeString(const GdkEvent* event) { + switch (event->type) { + case GDK_NOTHING: return "GDK_NOTHING"; + case GDK_DELETE: return "GDK_DELETE"; + case GDK_DESTROY: return "GDK_DESTROY"; + case GDK_EXPOSE: return "GDK_EXPOSE"; + case GDK_MOTION_NOTIFY: return "GDK_MOTION_NOTIFY"; + case GDK_BUTTON_PRESS: return "GDK_BUTTON_PRESS"; + case GDK_2BUTTON_PRESS: return "GDK_2BUTTON_PRESS"; + case GDK_3BUTTON_PRESS: return "GDK_3BUTTON_PRESS"; + case GDK_BUTTON_RELEASE: return "GDK_BUTTON_RELEASE"; + case GDK_KEY_PRESS: return "GDK_KEY_PRESS"; + case GDK_KEY_RELEASE: return "GDK_KEY_RELEASE"; + case GDK_ENTER_NOTIFY: return "GDK_ENTER_NOTIFY"; + case GDK_LEAVE_NOTIFY: return "GDK_LEAVE_NOTIFY"; + case GDK_FOCUS_CHANGE: return "GDK_FOCUS_CHANGE"; + case GDK_CONFIGURE: return "GDK_CONFIGURE"; + case GDK_MAP: return "GDK_MAP"; + case GDK_UNMAP: return "GDK_UNMAP"; + case GDK_PROPERTY_NOTIFY: return "GDK_PROPERTY_NOTIFY"; + case GDK_SELECTION_CLEAR: return "GDK_SELECTION_CLEAR"; + case GDK_SELECTION_REQUEST: return "GDK_SELECTION_REQUEST"; + case GDK_SELECTION_NOTIFY: return "GDK_SELECTION_NOTIFY"; + case GDK_PROXIMITY_IN: return "GDK_PROXIMITY_IN"; + case GDK_PROXIMITY_OUT: return "GDK_PROXIMITY_OUT"; + case GDK_DRAG_ENTER: return "GDK_DRAG_ENTER"; + case GDK_DRAG_LEAVE: return "GDK_DRAG_LEAVE"; + case GDK_DRAG_MOTION: return "GDK_DRAG_MOTION"; + case GDK_DRAG_STATUS: return "GDK_DRAG_STATUS"; + case GDK_DROP_START: return "GDK_DROP_START"; + case GDK_DROP_FINISHED: return "GDK_DROP_FINISHED"; + case GDK_CLIENT_EVENT: return "GDK_CLIENT_EVENT"; + case GDK_VISIBILITY_NOTIFY: return "GDK_VISIBILITY_NOTIFY"; + case GDK_NO_EXPOSE: return "GDK_NO_EXPOSE"; + case GDK_SCROLL: return "GDK_SCROLL"; + case GDK_WINDOW_STATE: return "GDK_WINDOW_STATE"; + case GDK_SETTING: return "GDK_SETTING"; + case GDK_OWNER_CHANGE: return "GDK_OWNER_CHANGE"; + case GDK_GRAB_BROKEN: return "GDK_GRAB_BROKEN"; + case GDK_DAMAGE: return "GDK_DAMAGE"; + default: + return "Unknown Gdk Event"; + } +} + +} // namespace + +MessagePumpGtk::MessagePumpGtk() : MessagePumpGlib() { + gdk_event_handler_set(&EventDispatcher, this, NULL); +} + +void MessagePumpGtk::DispatchEvents(GdkEvent* event) { + UNSHIPPED_TRACE_EVENT1("task", "MessagePumpGtk::DispatchEvents", + "type", EventToTypeString(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(); + if (!display) { + // GTK / GDK has not been initialized, which is a decision we wish to + // support, for example for the GPU process. + static Display* xdisplay = XOpenDisplay(NULL); + return xdisplay; + } + return GDK_DISPLAY_XDISPLAY(display); +} + +MessagePumpGtk::~MessagePumpGtk() { + gdk_event_handler_set(reinterpret_cast<GdkEventFunc>(gtk_main_do_event), + this, NULL); +} + +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 |