/
ClipboardModule.cpp
109 lines (86 loc) · 2.31 KB
/
ClipboardModule.cpp
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "ClipboardModule.h"
#include "itextstream.h"
#include "math/Hash.h"
#include <wx/clipbrd.h>
#include <wx/app.h>
#include "module/StaticModule.h"
namespace ui
{
namespace
{
inline std::string getContentHash(const std::string& content)
{
// Inspect the clipboard when the main window regains focus
// and fire the event if the contents changed
math::Hash hash;
hash.addString(content);
return hash;
}
}
std::string ClipboardModule::getString()
{
std::string returnValue;
if (wxTheClipboard->Open())
{
if (wxTheClipboard->IsSupported(wxDF_TEXT))
{
wxTextDataObject data;
wxTheClipboard->GetData(data);
returnValue = data.GetText().ToStdString();
}
wxTheClipboard->Close();
}
return returnValue;
}
void ClipboardModule::setString(const std::string& str)
{
if (wxTheClipboard->Open())
{
// This data objects are held by the clipboard, so do not delete them in the app.
wxTheClipboard->SetData(new wxTextDataObject(str));
wxTheClipboard->Close();
_contentHash = getContentHash(str);
// Contents changed signal
_sigContentsChanged.emit();
}
}
sigc::signal<void>& ClipboardModule::signal_clipboardContentChanged()
{
return _sigContentsChanged;
}
const std::string& ClipboardModule::getName() const
{
static std::string _name(MODULE_CLIPBOARD);
return _name;
}
const StringSet& ClipboardModule::getDependencies() const
{
static StringSet _dependencies;
return _dependencies;
}
void ClipboardModule::initialiseModule(const IApplicationContext& ctx)
{
rMessage() << getName() << "::initialiseModule called." << std::endl;
wxTheApp->Bind(wxEVT_ACTIVATE_APP, &ClipboardModule::onAppActivated, this);
}
void ClipboardModule::shutdownModule()
{
wxTheApp->Unbind(wxEVT_ACTIVATE_APP, &ClipboardModule::onAppActivated, this);
}
void ClipboardModule::onAppActivated(wxActivateEvent& ev)
{
if (ev.GetActive())
{
// Inspect the clipboard when the main window regains focus
// and fire the event if the contents changed
auto newHash = getContentHash(getString());
if (newHash != _contentHash)
{
_contentHash.swap(newHash);
_sigContentsChanged.emit();
}
}
ev.Skip();
}
module::StaticModuleRegistration<ClipboardModule> clipboardModule;
}