-
Notifications
You must be signed in to change notification settings - Fork 0
/
libwinclip.c
85 lines (62 loc) · 1.72 KB
/
libwinclip.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
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <Windows.h>
#include <stdlib.h>
#include <string.h>
#include "libwinclip.h"
int winclip_init_n(struct winclip *wclip, UINT format, size_t buf_size) {
wclip->format = format;
wclip->data = malloc(buf_size);
if(!wclip->data) return 0;
wclip->size = buf_size;
return 1;
}
int winclip_init(struct winclip *wclip, UINT format) {
return winclip_init_n(wclip, format, LIBWINCLIP_INIT_BUF_SIZE);
}
int winclip_free(struct winclip *wclip) {
free(wclip->data);
wclip->data = NULL;
wclip->size = 0;
wclip->format = 0;
return 1;
}
int winclip_get(struct winclip *wclip) {
void *data = GetClipboardData(wclip->format);
if (!data) return 0;
void *locked_data = GlobalLock(data);
if (!locked_data) return 0;
HGLOBAL hglb = GlobalHandle(locked_data);
if(!hglb) return 0;
size_t data_size = GlobalSize(hglb);
if (data_size > wclip->size) {
void *tmp = realloc(wclip->data, data_size);
if (!tmp) return 0;
wclip->data = tmp;
wclip->size = data_size;
}
memcpy(wclip->data, locked_data, data_size);
GlobalUnlock(data);
return 1;
}
int winclip_put_n(void *data, size_t size, UINT format) {
if(!EmptyClipboard()) return 0;
HGLOBAL hglb = GlobalAlloc(GMEM_MOVEABLE, size);
if (!hglb) return 0;
void *hglb_locked = GlobalLock(hglb);
if (!hglb_locked) {
GlobalFree(hglb);
return 0;
}
memcpy(hglb_locked, data, size);
GlobalUnlock(hglb);
SetClipboardData(format, hglb);
return 1;
}
int winclip_put(struct winclip *wclip) {
return winclip_put_n(wclip->data, wclip->size, wclip->format);
}
int winclip_put_str(char *str) {
return winclip_put_n(str, strlen(str) + 1, CF_TEXT);
}
int winclip_put_wstr(wchar_t *str) {
return winclip_put_n(str, (wcslen(str) + 1) * sizeof(wchar_t), CF_UNICODETEXT);
}