aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKarl Heuer1997-02-20 06:58:45 +0000
committerKarl Heuer1997-02-20 06:58:45 +0000
commite6c7c98823ac95f36ca0c83653a8e33a88cc604e (patch)
tree3506ee3d297ab345a009e807732ad979a027e81f /src
parent942ea06da56679aa06e237850252ea4589895454 (diff)
downloademacs-e6c7c98823ac95f36ca0c83653a8e33a88cc604e.tar.gz
emacs-e6c7c98823ac95f36ca0c83653a8e33a88cc604e.zip
Include charset.h and coding.h.
(QCOMPOUND_TEXT): New variable. (symbol_to_x_atom): Handle it. (selection_data_to_lisp_data): Decode a selection data if selection type is TEXT or COMPOUND_TEXT. (lisp_data_to_selection_data): Encode a text to COMPOUND_TEXT if it contains multibyte characters. (syms_of_xselect): Initialize and staticpro QCOMPOUND_TEXT.
Diffstat (limited to 'src')
-rw-r--r--src/xselect.c81
1 files changed, 78 insertions, 3 deletions
diff --git a/src/xselect.c b/src/xselect.c
index 009e206ebdf..60a596e6e50 100644
--- a/src/xselect.c
+++ b/src/xselect.c
@@ -27,6 +27,8 @@ Boston, MA 02111-1307, USA. */
27#include "dispextern.h" /* frame.h seems to want this */ 27#include "dispextern.h" /* frame.h seems to want this */
28#include "frame.h" /* Need this to get the X window of selected_frame */ 28#include "frame.h" /* Need this to get the X window of selected_frame */
29#include "blockinput.h" 29#include "blockinput.h"
30#include "charset.h"
31#include "coding.h"
30 32
31#define CUT_BUFFER_SUPPORT 33#define CUT_BUFFER_SUPPORT
32 34
@@ -34,6 +36,8 @@ Lisp_Object QPRIMARY, QSECONDARY, QSTRING, QINTEGER, QCLIPBOARD, QTIMESTAMP,
34 QTEXT, QDELETE, QMULTIPLE, QINCR, QEMACS_TMP, QTARGETS, QATOM, QNULL, 36 QTEXT, QDELETE, QMULTIPLE, QINCR, QEMACS_TMP, QTARGETS, QATOM, QNULL,
35 QATOM_PAIR; 37 QATOM_PAIR;
36 38
39Lisp_Object QCOMPOUND_TEXT; /* This is a type of selection. */
40
37#ifdef CUT_BUFFER_SUPPORT 41#ifdef CUT_BUFFER_SUPPORT
38Lisp_Object QCUT_BUFFER0, QCUT_BUFFER1, QCUT_BUFFER2, QCUT_BUFFER3, 42Lisp_Object QCUT_BUFFER0, QCUT_BUFFER1, QCUT_BUFFER2, QCUT_BUFFER3,
39 QCUT_BUFFER4, QCUT_BUFFER5, QCUT_BUFFER6, QCUT_BUFFER7; 43 QCUT_BUFFER4, QCUT_BUFFER5, QCUT_BUFFER6, QCUT_BUFFER7;
@@ -110,6 +114,7 @@ symbol_to_x_atom (dpyinfo, display, sym)
110 if (EQ (sym, QCLIPBOARD)) return dpyinfo->Xatom_CLIPBOARD; 114 if (EQ (sym, QCLIPBOARD)) return dpyinfo->Xatom_CLIPBOARD;
111 if (EQ (sym, QTIMESTAMP)) return dpyinfo->Xatom_TIMESTAMP; 115 if (EQ (sym, QTIMESTAMP)) return dpyinfo->Xatom_TIMESTAMP;
112 if (EQ (sym, QTEXT)) return dpyinfo->Xatom_TEXT; 116 if (EQ (sym, QTEXT)) return dpyinfo->Xatom_TEXT;
117 if (EQ (sym, QCOMPOUND_TEXT)) return dpyinfo->Xatom_COMPOUND_TEXT;
113 if (EQ (sym, QDELETE)) return dpyinfo->Xatom_DELETE; 118 if (EQ (sym, QDELETE)) return dpyinfo->Xatom_DELETE;
114 if (EQ (sym, QMULTIPLE)) return dpyinfo->Xatom_MULTIPLE; 119 if (EQ (sym, QMULTIPLE)) return dpyinfo->Xatom_MULTIPLE;
115 if (EQ (sym, QINCR)) return dpyinfo->Xatom_INCR; 120 if (EQ (sym, QINCR)) return dpyinfo->Xatom_INCR;
@@ -188,6 +193,8 @@ x_atom_to_symbol (dpyinfo, display, atom)
188 return QTIMESTAMP; 193 return QTIMESTAMP;
189 if (atom == dpyinfo->Xatom_TEXT) 194 if (atom == dpyinfo->Xatom_TEXT)
190 return QTEXT; 195 return QTEXT;
196 if (atom == dpyinfo->Xatom_COMPOUND_TEXT)
197 return QCOMPOUND_TEXT;
191 if (atom == dpyinfo->Xatom_DELETE) 198 if (atom == dpyinfo->Xatom_DELETE)
192 return QDELETE; 199 return QDELETE;
193 if (atom == dpyinfo->Xatom_MULTIPLE) 200 if (atom == dpyinfo->Xatom_MULTIPLE)
@@ -1457,8 +1464,31 @@ selection_data_to_lisp_data (display, data, size, type, format)
1457 1464
1458 /* Convert any 8-bit data to a string, for compactness. */ 1465 /* Convert any 8-bit data to a string, for compactness. */
1459 else if (format == 8) 1466 else if (format == 8)
1460 return make_string ((char *) data, size); 1467 {
1468 Lisp_Object str;
1461 1469
1470 if (type != dpyinfo->Xatom_TEXT && type != dpyinfo->Xatom_COMPOUND_TEXT)
1471 str = make_string ((char *) data, size);
1472 else
1473 {
1474 /* If TYPE is `TEXT' or `COMPOUND_TEXT', we should decode
1475 DATA to Emacs internal format because DATA may be
1476 encoded in compound text format. */
1477 int bufsize, dummy;
1478 unsigned char *buf;
1479 struct coding_system coding;
1480 Lisp_Object sym = intern ("coding-system-ctext");
1481
1482 setup_coding_system (Fcheck_coding_system (sym), &coding);
1483 coding.last_block = 1;
1484 bufsize = decoding_buffer_size (&coding, size);
1485 buf = (unsigned char *) xmalloc (bufsize);
1486 size = decode_coding (&coding, data, buf, size, bufsize, &dummy);
1487 str = make_string ((char *) buf, size);
1488 xfree (buf);
1489 }
1490 return str;
1491 }
1462 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to 1492 /* Convert a single atom to a Lisp_Symbol. Convert a set of atoms to
1463 a vector of symbols. 1493 a vector of symbols.
1464 */ 1494 */
@@ -1550,11 +1580,55 @@ lisp_data_to_selection_data (display, obj,
1550 } 1580 }
1551 else if (STRINGP (obj)) 1581 else if (STRINGP (obj))
1552 { 1582 {
1583 /* Since we are now handling multilingual text, we must consider
1584 sending back compound text. */
1585 char charsets[MAX_CHARSET];
1586 int num;
1587
1553 *format_ret = 8; 1588 *format_ret = 8;
1554 *size_ret = XSTRING (obj)->size; 1589 *size_ret = XSTRING (obj)->size;
1555 *data_ret = XSTRING (obj)->data; 1590 *data_ret = XSTRING (obj)->data;
1556 *nofree_ret = 1; 1591 bzero (charsets, MAX_CHARSET);
1557 if (NILP (type)) type = QSTRING; 1592 num = ((*size_ret <= 1) /* Check the possibility of short cut. */
1593 ? 0
1594 : find_charset_in_str (*data_ret, *size_ret, charsets));
1595
1596 if (!num || (num == 1 && charsets[CHARSET_ASCII]))
1597 {
1598 /* No multibyte character in OBJ. We need not encode it. */
1599 *nofree_ret = 1;
1600 if (NILP (type)) type = QSTRING;
1601 }
1602 else
1603 {
1604 /* We must encode contents of OBJ to compound text format.
1605 The format is compatible with what the target `STRING'
1606 expects if OBJ contains only ASCII and Latin-1
1607 characters. */
1608 int bufsize, dummy;
1609 unsigned char *buf;
1610 struct coding_system coding;
1611 Lisp_Object sym = intern ("coding-system-ctext");
1612
1613 setup_coding_system (Fcheck_coding_system (sym), &coding);
1614 coding.last_block = 1;
1615 bufsize = encoding_buffer_size (&coding, *size_ret);
1616 buf = (unsigned char *) xmalloc (bufsize);
1617 *size_ret = encode_coding (&coding, *data_ret, buf,
1618 *size_ret, bufsize, &dummy);
1619 *data_ret = buf;
1620 if (charsets[charset_latin_iso8859_1]
1621 && (num == 1 || (num == 2 && charsets[CHARSET_ASCII])))
1622 {
1623 /* Ok, we can return it as `STRING'. */
1624 if (NILP (type)) type = QSTRING;
1625 }
1626 else
1627 {
1628 /* We must return it as `COMPOUND_TEXT'. */
1629 if (NILP (type)) type = QCOMPOUND_TEXT;
1630 }
1631 }
1558 } 1632 }
1559 else if (SYMBOLP (obj)) 1633 else if (SYMBOLP (obj))
1560 { 1634 {
@@ -2185,6 +2259,7 @@ A value of 0 means wait as long as necessary. This is initialized from the\n\
2185 QCLIPBOARD = intern ("CLIPBOARD"); staticpro (&QCLIPBOARD); 2259 QCLIPBOARD = intern ("CLIPBOARD"); staticpro (&QCLIPBOARD);
2186 QTIMESTAMP = intern ("TIMESTAMP"); staticpro (&QTIMESTAMP); 2260 QTIMESTAMP = intern ("TIMESTAMP"); staticpro (&QTIMESTAMP);
2187 QTEXT = intern ("TEXT"); staticpro (&QTEXT); 2261 QTEXT = intern ("TEXT"); staticpro (&QTEXT);
2262 QCOMPOUND_TEXT = intern ("COMPOUND_TEXT"); staticpro (&QCOMPOUND_TEXT);
2188 QTIMESTAMP = intern ("TIMESTAMP"); staticpro (&QTIMESTAMP); 2263 QTIMESTAMP = intern ("TIMESTAMP"); staticpro (&QTIMESTAMP);
2189 QDELETE = intern ("DELETE"); staticpro (&QDELETE); 2264 QDELETE = intern ("DELETE"); staticpro (&QDELETE);
2190 QMULTIPLE = intern ("MULTIPLE"); staticpro (&QMULTIPLE); 2265 QMULTIPLE = intern ("MULTIPLE"); staticpro (&QMULTIPLE);