1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-20 18:17:20 +00:00

Support 'TARGETS' in clipboard selections on MS-Windows

* src/w32select.c (Fw32_selection_targets): New function.

* lisp/term/w32-win.el (w32--get-selection): Call
'w32-selection-targets' to obtain the list of data formats
available in the clipboard.
This commit is contained in:
Eli Zaretskii 2016-11-01 18:04:07 +02:00
parent 2664eb5394
commit c3640fcc96
2 changed files with 117 additions and 5 deletions

View File

@ -400,11 +400,15 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
(put 'x-selections (or type 'PRIMARY) value)))
(defun w32--get-selection (&optional type data-type)
(if (and (eq type 'CLIPBOARD)
(eq data-type 'STRING))
(with-demoted-errors "w32-get-clipboard-data:%S"
(w32-get-clipboard-data))
(get 'x-selections (or type 'PRIMARY))))
(cond ((and (eq type 'CLIPBOARD)
(eq data-type 'STRING))
(with-demoted-errors "w32-get-clipboard-data:%S"
(w32-get-clipboard-data)))
((eq data-type 'TARGETS)
(if (eq type 'CLIPBOARD)
(w32-selection-targets type)
(if (get 'x-selections (or type 'PRIMARY)) '[STRING])))
(t (get 'x-selections (or type 'PRIMARY)))))
(defun w32--selection-owner-p (selection)
(and (memq selection '(nil PRIMARY SECONDARY))

View File

@ -1052,6 +1052,113 @@ frame's display, or the first available X display. */)
return Qnil;
}
/* Support enumerating available clipboard selection formats. */
DEFUN ("w32-selection-targets", Fw32_selection_targets, Sw32_selection_targets,
0, 2, 0,
doc: /* Return a vector of data formats available in the specified SELECTION.
SELECTION should be the name of the selection in question, typically
one of the symbols `PRIMARY', `SECONDARY', or `CLIPBOARD'.
The symbol nil is the same as `PRIMARY', and t is the same as `SECONDARY'.
TERMINAL should be a terminal object or a frame specifying the X
server to query. If omitted or nil, that stands for the selected
frame's display, or the first available X display.
This function currently ignores TERMINAL, and only returns non-nil
for `CLIPBOARD'. The return value is a vector of symbols, each symbol
representing a data format that is currently available in the clipboard. */)
(Lisp_Object selection, Lisp_Object terminal)
{
/* Xlib-like names for standard Windows clipboard data formats.
They are in upper-case to mimic xselect.c. A couple of the names
were changed to be more like their X counterparts. */
static const char *stdfmt_name[] = {
"UNDEFINED",
"STRING",
"BITMAP",
"METAFILE",
"SYMLINK",
"DIF",
"TIFF",
"OEM_STRING",
"DIB",
"PALETTE",
"PENDATA",
"RIFF",
"WAVE",
"UTF8_STRING",
"ENHMETAFILE",
"FILE_NAMES", /* DND */
"LOCALE", /* not used */
"DIBV5"
};
CHECK_SYMBOL (selection);
/* Return nil for PRIMARY and SECONDARY selections; for CLIPBOARD, check
if the clipboard currently has valid text format contents. */
if (EQ (selection, QCLIPBOARD))
{
Lisp_Object val = Qnil;
setup_config ();
if (OpenClipboard (NULL))
{
UINT format = 0;
/* Count how many formats are available. We ignore the
CF_LOCALE format, and don't put it into the vector we
return, because CF_LOCALE is automatically created by
Windows for any text in the clipboard, so its presence in
the value will simply confuse. */
int fmtcount = 0;
while ((format = EnumClipboardFormats (format)))
if (format != CF_LOCALE)
fmtcount++;
if (fmtcount > 0)
{
int i;
/* We generate a vector because that's what xselect.c
does in this case. */
val = Fmake_vector (make_number (fmtcount), Qnil);
/* Note: when stepping with GDB through this code, the
loop below terminates immediately because
EnumClipboardFormats for some reason returns with
"Thread does not have a clipboard open" error. */
for (i = 0, format = 0;
(format = EnumClipboardFormats (format)) != 0; )
{
const char *name;
if (format == CF_LOCALE)
continue;
else if (format < CF_MAX)
name = stdfmt_name[format];
else
{
char fmt_name[256];
if (!GetClipboardFormatName (format, fmt_name,
sizeof (fmt_name)))
continue;
name = fmt_name;
}
ASET (val, i, intern (name));
i++;
}
}
CloseClipboard ();
}
return val;
}
/* For PRIMARY and SECONDARY we cons the values in w32--get-selection. */
return Qnil;
}
/* One-time init. Called in the un-dumped Emacs, but not in the
dumped version. */
@ -1061,6 +1168,7 @@ syms_of_w32select (void)
defsubr (&Sw32_set_clipboard_data);
defsubr (&Sw32_get_clipboard_data);
defsubr (&Sw32_selection_exists_p);
defsubr (&Sw32_selection_targets);
DEFVAR_LISP ("selection-coding-system", Vselection_coding_system,
doc: /* Coding system for communicating with other programs.