message_pump_glib_x.h revision 513209b27ff55e2841eac0e4120199c23acce758
1// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef BASE_MESSAGE_PUMP_GLIB_X_H
6#define BASE_MESSAGE_PUMP_GLIB_X_H
7
8#include "base/message_pump.h"
9#include "base/message_pump_glib.h"
10
11#include <bitset>
12
13#include <glib.h>
14#include <gtk/gtk.h>
15#include <X11/X.h>
16
17namespace base {
18
19class MessagePumpGlibX : public MessagePumpForUI {
20 public:
21  MessagePumpGlibX();
22  virtual ~MessagePumpGlibX();
23
24  // MessagePumpForUI implementation.
25  virtual bool RunOnce(GMainContext* context, bool block);
26
27  // Indicates whether a GDK event was injected by chrome (when |true|) or if it
28  // was captured and being processed by GDK (when |false|).
29  bool IsDispatchingEvent(void) { return dispatching_event_; }
30
31 private:
32  static void EventDispatcherX(GdkEvent* event, gpointer data);
33
34  // Update the lookup table and flag the events that should be captured and
35  // processed so that GDK doesn't get to them.
36  void InitializeEventsToCapture(void);
37
38  // The event source for GDK events.
39  GSource* gdksource_;
40
41  // Indicates whether a GDK event was injected by chrome (when |true|) or if it
42  // was captured and being processed by GDK (when |false|).
43  bool dispatching_event_;
44
45#if ! GTK_CHECK_VERSION(2,18,0)
46// GDK_EVENT_LAST was introduced in GTK+ 2.18.0. For earlier versions, we pick a
47// large enough value (the value of GDK_EVENT_LAST in 2.18.0) so that it works
48// for all versions.
49#define GDK_EVENT_LAST 37
50#endif
51
52  // We do not want to process all the events ourselves. So we use a lookup
53  // table to quickly check if a particular event should be handled by us or if
54  // it should be passed on to the default GDK handler.
55  std::bitset<LASTEvent> capture_x_events_;
56  std::bitset<GDK_EVENT_LAST> capture_gdk_events_;
57
58  DISALLOW_COPY_AND_ASSIGN(MessagePumpGlibX);
59};
60
61}  // namespace base
62
63#endif  // BASE_MESSAGE_PUMP_GLIB_X_H
64