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
| | /* Haiku window system selection support. Hey Emacs, this is -*- C++ -*-
Copyright (C) 2021 Free Software Foundation, Inc.
This file is part of GNU Emacs.
GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#include <config.h>
#include "lisp.h"
#include "blockinput.h"
#include "coding.h"
#include "haikuselect.h"
#include "haikuterm.h"
DEFUN ("haiku-selection-data", Fhaiku_selection_data, Shaiku_selection_data,
2, 2, 0,
doc: /* Retrieve content typed as NAME from the clipboard
CLIPBOARD. CLIPBOARD is the symbol `PRIMARY', `SECONDARY' or
`CLIPBOARD'. NAME is a MIME type denoting the type of the data to
fetch. */)
(Lisp_Object clipboard, Lisp_Object name)
{
CHECK_SYMBOL (clipboard);
CHECK_STRING (name);
char *dat;
block_input ();
if (EQ (clipboard, QPRIMARY))
dat = BClipboard_find_primary_selection_data (SSDATA (name));
else if (EQ (clipboard, QSECONDARY))
dat = BClipboard_find_secondary_selection_data (SSDATA (name));
else if (EQ (clipboard, QCLIPBOARD))
dat = BClipboard_find_system_data (SSDATA (name));
else
{
unblock_input ();
signal_error ("Bad clipboard", clipboard);
}
unblock_input ();
if (!dat)
return Qnil;
Lisp_Object str = build_string (dat);
block_input ();
BClipboard_free_data (dat);
unblock_input ();
return str;
}
DEFUN ("haiku-selection-put", Fhaiku_selection_put, Shaiku_selection_put,
3, 3, 0,
doc: /* Add or remove content from the clipboard CLIPBOARD.
CLIPBOARD is the symbol `PRIMARY', `SECONDARY' or `CLIPBOARD'. NAME
is a MIME type denoting the type of the data to add. DATA is the
string that will be placed in the clipboard, or nil if the content is
to be removed. */)
(Lisp_Object clipboard, Lisp_Object name, Lisp_Object data)
{
CHECK_SYMBOL (clipboard);
CHECK_STRING (name);
if (!NILP (data))
CHECK_STRING (data);
block_input ();
char *dat = !NILP (data) ? SSDATA (ENCODE_UTF_8 (data)) : NULL;
if (EQ (clipboard, QPRIMARY))
BClipboard_set_primary_selection_data (SSDATA (name), dat);
else if (EQ (clipboard, QSECONDARY))
BClipboard_set_secondary_selection_data (SSDATA (name), dat);
else if (EQ (clipboard, QCLIPBOARD))
BClipboard_set_system_data (SSDATA (name), dat);
else
{
unblock_input ();
signal_error ("Bad clipboard", clipboard);
}
unblock_input ();
return Qnil;
}
void
syms_of_haikuselect (void)
{
DEFSYM (QSECONDARY, "SECONDARY");
DEFSYM (QCLIPBOARD, "CLIPBOARD");
defsubr (&Shaiku_selection_data);
defsubr (&Shaiku_selection_put);
}
|