-
Notifications
You must be signed in to change notification settings - Fork 2
/
macos.m
66 lines (52 loc) · 1.81 KB
/
macos.m
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
/*
* Copyright (c) 2020 Joris Vink <[email protected]>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <CoreFoundation/CoreFoundation.h>
#include <Foundation/Foundation.h>
#include <Appkit/Appkit.h>
#include "ce.h"
void
ce_macos_set_pasteboard_contents(const void *data, size_t len)
{
NSString *str;
NSPasteboard *pb = [NSPasteboard generalPasteboard];
[pb clearContents];
str = [[NSString alloc] initWithBytes:data length:len
encoding:NSUTF8StringEncoding];
[pb setString:str forType:NSPasteboardTypeString];
ce_debug("added %zu bytes to macos pasteboard", len);
}
void
ce_macos_get_pasteboard_contents(u_int8_t **out, size_t *len)
{
NSString *res;
size_t slen;
const char *ptr;
NSPasteboard *pb = [NSPasteboard generalPasteboard];
res = [pb stringForType:NSPasteboardTypeString];
if (res == NULL)
return;
ptr = [res UTF8String];
if (ptr == NULL)
return;
slen = strlen(ptr);
if (slen > 1 && ptr[slen - 2] == '\n')
slen--;
ce_debug("obtained %zu bytes from macos pasteboard", slen);
if ((*out = calloc(1, slen)) == NULL)
fatal("%s: calloc(%zu): %s", __func__, slen, errno_s);
memcpy(*out, ptr, slen);
*len = slen;
}