• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 CHROME_BROWSER_UI_LIBGTK2UI_GTK2_SIGNAL_REGISTRAR_H_
6 #define CHROME_BROWSER_UI_LIBGTK2UI_GTK2_SIGNAL_REGISTRAR_H_
7 
8 #include <glib.h>
9 #include <map>
10 #include <vector>
11 
12 #include "base/basictypes.h"
13 
14 typedef void (*GCallback) (void);
15 typedef struct _GObject GObject;
16 typedef struct _GtkWidget GtkWidget;
17 
18 namespace libgtk2ui {
19 
20 // A class that ensures that callbacks don't run on stale owner objects. Similar
21 // in spirit to NotificationRegistrar. Use as follows:
22 //
23 //   class ChromeObject {
24 //    public:
25 //     ChromeObject() {
26 //       ...
27 //
28 //       signals_.Connect(widget, "event", CallbackThunk, this);
29 //     }
30 //
31 //     ...
32 //
33 //    private:
34 //     Gtk2SignalRegistrar signals_;
35 //   };
36 //
37 // When |signals_| goes down, it will disconnect the handlers connected via
38 // Connect.
39 class Gtk2SignalRegistrar {
40  public:
41   Gtk2SignalRegistrar();
42   ~Gtk2SignalRegistrar();
43 
44   // Connect before the default handler. Returns the handler id.
45   glong Connect(gpointer instance, const gchar* detailed_signal,
46                 GCallback signal_handler, gpointer data);
47   // Connect after the default handler. Returns the handler id.
48   glong ConnectAfter(gpointer instance, const gchar* detailed_signal,
49                      GCallback signal_handler, gpointer data);
50 
51   // Disconnects all signal handlers connected to |instance|.
52   void DisconnectAll(gpointer instance);
53 
54  private:
55   typedef std::vector<glong> HandlerList;
56   typedef std::map<GObject*, HandlerList> HandlerMap;
57 
WeakNotifyThunk(gpointer data,GObject * where_the_object_was)58   static void WeakNotifyThunk(gpointer data, GObject* where_the_object_was) {
59     reinterpret_cast<Gtk2SignalRegistrar*>(data)->WeakNotify(
60         where_the_object_was);
61   }
62   void WeakNotify(GObject* where_the_object_was);
63 
64   glong ConnectInternal(gpointer instance, const gchar* detailed_signal,
65                         GCallback signal_handler, gpointer data, bool after);
66 
67   HandlerMap handler_lists_;
68 
69   DISALLOW_COPY_AND_ASSIGN(Gtk2SignalRegistrar);
70 };
71 
72 }  // namespace libgtk2ui
73 
74 #endif  // CHROME_BROWSER_UI_LIBGTK2UI_GTK2_SIGNAL_REGISTRAR_H_
75