blob: 7d3546a07eb2be3766804646d9a9e1e035c4d4fd (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
// Bug 564005 - Valgrind errors and crash on exit with Gtk::UIManager
// Bug 154498 - Unnecessary warning on console: signalproxy_connectionnode.cc
#include <glibmm/refptr.h>
#include <iostream>
#include <sigc++/sigc++.h>
#include <stdlib.h>
#define ACTIVATE_BUG 1
class Action : public sigc::trackable
{
public:
Action() : ref_count(1) {}
void reference() { ++ref_count; }
void unreference()
{
if (--ref_count <= 0)
delete this;
}
void emit_sig1(int n) { sig1.emit(n); }
sigc::signal<void, int>& signal_sig1() { return sig1; }
private:
sigc::signal<void, int> sig1;
int ref_count;
};
class Test : public sigc::trackable
{
public:
Test() : action(new Action)
{
// std::cout << "new Test" << std::endl;
#ifdef ACTIVATE_BUG // See https://bugzilla.gnome.org/show_bug.cgi?id=564005#c15s
action->signal_sig1().connect(sigc::bind(sigc::mem_fun(this, &Test::on_sig1), action));
#else
Glib::RefPtr<Action> action2(new Action);
action->signal_sig1().connect(sigc::bind(sigc::mem_fun(this, &Test::on_sig1), action2));
#endif
}
~Test()
{
// std::cout << "delete Test" << std::endl;
}
void on_sig1(int /* n */, Glib::RefPtr<Action> /* action */)
{
// std::cout << "Test::on_sig1, n=" << n << std::endl;
}
Glib::RefPtr<Action> action;
}; // end Test
int
main(int, char**)
{
Test* test = new Test;
test->action->emit_sig1(23);
delete test;
return EXIT_SUCCESS;
}
|