diff options
| author | Karl Heuer | 1997-02-20 06:58:45 +0000 |
|---|---|---|
| committer | Karl Heuer | 1997-02-20 06:58:45 +0000 |
| commit | e6c7c98823ac95f36ca0c83653a8e33a88cc604e (patch) | |
| tree | 3506ee3d297ab345a009e807732ad979a027e81f /src | |
| parent | 942ea06da56679aa06e237850252ea4589895454 (diff) | |
| download | emacs-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.c | 81 |
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 | ||
| 39 | Lisp_Object QCOMPOUND_TEXT; /* This is a type of selection. */ | ||
| 40 | |||
| 37 | #ifdef CUT_BUFFER_SUPPORT | 41 | #ifdef CUT_BUFFER_SUPPORT |
| 38 | Lisp_Object QCUT_BUFFER0, QCUT_BUFFER1, QCUT_BUFFER2, QCUT_BUFFER3, | 42 | Lisp_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); |