-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgauche_clipboard.c
71 lines (60 loc) · 1.87 KB
/
gauche_clipboard.c
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
/*
* gauche_clipboard.c
*/
#include "gauche_clipboard.h"
void write_clipboard(const char* str)
{
HGLOBAL hText;
WCHAR *pText;
int nc = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
if (nc == 0) {
Scm_Error("Windows error %d on MultiByteToWideChar", GetLastError());
}
hText = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE, 2*nc);
pText = GlobalLock(hText);
if(MultiByteToWideChar(CP_UTF8, 0, str, -1, pText, nc) == 0) {
GlobalUnlock(hText);
Scm_Error("Windows error %d on MultiByteToWideChar", GetLastError());
}
GlobalUnlock(hText);
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_UNICODETEXT, hText);
CloseClipboard();
}
ScmObj read_clipboard(void)
{
ScmObj result;
OpenClipboard(NULL);
HANDLE hText = GetClipboardData(CF_UNICODETEXT);
if(hText == NULL) result = SCM_FALSE;
else {
WCHAR *pText = GlobalLock(hText);
int nb = WideCharToMultiByte(CP_UTF8, 0, pText, -1, NULL, 0, 0, 0);
if (nb == 0) {
Scm_Error("Windows error %d on WideCharToMultiByte", GetLastError());
}
char *mb = SCM_NEW_ATOMIC_ARRAY(char, nb);
if (WideCharToMultiByte(CP_UTF8, 0, pText, -1, mb, nb, 0, 0) == 0) {
Scm_Error("Windows error %d on WideCharToMultiByte", GetLastError());
}
GlobalUnlock(hText);
result = Scm_MakeString(mb, -1, -1, 0);
}
CloseClipboard();
return result;
}
/*
* Module initialization function.
*/
extern void Scm_Init_gauche_clipboardlib(ScmModule*);
void Scm_Init_gauche_clipboard(void)
{
ScmModule *mod;
/* Register this DSO to Gauche */
SCM_INIT_EXTENSION(gauche_clipboard);
/* Create the module if it doesn't exist yet. */
mod = SCM_MODULE(SCM_FIND_MODULE("clipboard", TRUE));
/* Register stub-generated procedures */
Scm_Init_gauche_clipboardlib(mod);
}