MANIFEST       |    2 
 Tekproc.c      |   55 +++++++--
 button.c       |  336 +++++++++++++++++++++++++++++++++++++++++++--------------
 cachedGCs.c    |    6 -
 charproc.c     |   27 +++-
 input.c        |   80 +++++--------
 main.h         |   18 ++-
 menu.c         |   32 ++---
 minstall.sh    |   14 +-
 misc.c         |   33 ++---
 ptyx.h         |   11 +
 trace.c        |   27 ++++
 trace.h        |   15 ++
 util.c         |    8 -
 version.h      |    4 
 xterm.h        |   17 ++
 xterm.log.html |   54 ++++++++-
 xterm.man      |  127 ++++++++++++++++++++-
 xtermcap.c     |  252 +++++++++++++++++++++++++++---------------
 xtermcap.h     |   20 +--
 20 files changed, 818 insertions(+), 320 deletions(-)

New commits:
commit 5cc6c9ac6341aa3b67f68c5980c6d0349b5cfef0
Author: Julien Cristau <[email protected]>
Date:   Mon May 25 19:25:59 2009 +0200

    Import xterm 243

diff --git a/MANIFEST b/MANIFEST
index 3aa34db..0a8ae68 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,4 +1,4 @@
-MANIFEST for xterm-242, version xterm-242
+MANIFEST for xterm-243, version xterm-243
 
--------------------------------------------------------------------------------
 MANIFEST                        this file
 256colres.h                     resource-definitions for 256-color mode
diff --git a/Tekproc.c b/Tekproc.c
index 01ae484..6edcee0 100644
--- a/Tekproc.c
+++ b/Tekproc.c
@@ -1,4 +1,4 @@
-/* $XTermId: Tekproc.c,v 1.163 2009/02/13 20:01:21 tom Exp $ */
+/* $XTermId: Tekproc.c,v 1.167 2009/03/28 17:03:35 tom Exp $ */
 
 /*
  * Warning, there be crufty dragons here.
@@ -897,8 +897,8 @@ TekClear(TekWidget tw)
 static void
 TekConfigure(Widget w)
 {
-    if (IsTekWidget(w)) {
-       TekWidget tw = (TekWidget) w;
+    TekWidget tw = getTekWidget(w);
+    if (tw != 0) {
        TekScreen *tekscr = TekScreenOf(tw);
        TScreen *screen = TScreenOf(term);
        int border = 2 * screen->border;
@@ -922,11 +922,11 @@ TekExpose(Widget w,
          XEvent * event GCC_UNUSED,
          Region region GCC_UNUSED)
 {
-    if (IsTekWidget(w)) {
-       TekWidget tw = (TekWidget) w;
+    TekWidget tw = getTekWidget(w);
+    if (tw != 0) {
        TekScreen *tekscr = TekScreenOf(tw);
 
-       TRACE(("TekExpose\n"));
+       TRACE(("TekExpose {{\n"));
 
 #ifdef lint
        region = region;
@@ -937,8 +937,8 @@ TekExpose(Widget w,
        Tpushback = Tpushb;
        tekscr->cur_X = 0;
        tekscr->cur_Y = TEKHOME;
-       TekSetFontSize(tw, tekscr->page.fontsize);
        tekscr->cur = tekscr->page;
+       TekSetFontSize(tw, tekscr->cur.fontsize);
        tekscr->margin = MARGIN1;
        if (tekscr->TekGIN) {
            tekscr->TekGIN = NULL;
@@ -952,6 +952,7 @@ TekExpose(Widget w,
        first_map_occurred();
        if (!tekscr->waitrefresh)
            TekRefresh(tw);
+       TRACE(("}} TekExpose\n"));
     }
 }
 
@@ -979,6 +980,7 @@ TekRefresh(TekWidget tw)
 void
 TekRepaint(TekWidget tw)
 {
+    TRACE(("TekRepaint\n"));
     TekClear(tw);
     TekExpose((Widget) tw, (XEvent *) NULL, (Region) NULL);
 }
@@ -1655,7 +1657,7 @@ TekSetFontSize(TekWidget tw, int newitem)
        int newsize = MI2FS(newitem);
        Font fid;
 
-       TRACE(("TekSetFontSize(%d)\n", newitem));
+       TRACE(("TekSetFontSize(%d) size %d ->%d\n", newitem, oldsize, newsize));
        if (newsize < 0 || newsize >= TEKNUMFONTS) {
            Bell(XkbBI_MinorError, 0);
        } else if (oldsize != newsize) {
@@ -1663,6 +1665,9 @@ TekSetFontSize(TekWidget tw, int newitem)
                TCursorToggle(tw, TOGGLE);
            set_tekfont_menu_item(oldsize, False);
 
+           tekscr->cur.fontsize = newsize;
+           tekscr->page.fontsize = newsize;
+
            fid = tw->tek.Tfont[newsize]->fid;
            if (fid == DefaultGCID) {
                /* we didn't succeed in opening a real font
@@ -1674,10 +1679,15 @@ TekSetFontSize(TekWidget tw, int newitem)
                XSetFont(XtDisplay(tw), tekscr->TnormalGC, fid);
            }
 
-           tekscr->cur.fontsize = newsize;
            set_tekfont_menu_item(newsize, True);
            if (!Ttoggled)
                TCursorToggle(tw, TOGGLE);
+
+           /* we'll get an exposure event after changing fontsize, so we
+            * have to clear the screen to avoid painting over the previous
+            * text.
+            */
+           TekClear(tw);
        }
     }
 }
@@ -1794,6 +1804,7 @@ TCursorToggle(TekWidget tw, int toggle)           /* 
TOGGLE or CLEAR */
     if (!TEK4014_SHOWN(term))
        return;
 
+    TRACE(("TCursorToggle %s\n", (toggle == TOGGLE) ? "toggle" : "clear"));
     c = tekscr->cur.fontsize;
     cellwidth = (unsigned) tw->tek.Tfont[c]->max_bounds.width;
     cellheight = (unsigned) (tw->tek.Tfont[c]->ascent +
@@ -1891,8 +1902,8 @@ HandleGINInput(Widget w,
               String * param_list,
               Cardinal *nparamsp)
 {
-    if (IsTekWidget(w)) {
-       TekWidget tw = (TekWidget) w;
+    TekWidget tw = getTekWidget(w);
+    if (tw != 0) {
        TekScreen *tekscr = TekScreenOf(tw);
 
        if (tekscr->TekGIN && *nparamsp == 1) {
@@ -1916,3 +1927,25 @@ HandleGINInput(Widget w,
        }
     }
 }
+
+/*
+ * Check if the current widget, or any parent, is the VT100 "xterm" widget.
+ */
+TekWidget
+getTekWidget(Widget w)
+{
+    TekWidget xw;
+
+    if (w == 0) {
+       xw = (TekWidget) CURRENT_EMU();
+       if (!IsTekWidget(xw)) {
+           xw = 0;
+       }
+    } else if (IsTekWidget(w)) {
+       xw = (TekWidget) w;
+    } else {
+       xw = getTekWidget(XtParent(w));
+    }
+    TRACE2(("getTekWidget %p -> %p\n", w, xw));
+    return xw;
+}
diff --git a/button.c b/button.c
index 70e8ffc..86e7392 100644
--- a/button.c
+++ b/button.c
@@ -1,4 +1,4 @@
-/* $XTermId: button.c,v 1.306 2009/02/13 21:09:08 tom Exp $ */
+/* $XTermId: button.c,v 1.320 2009/03/27 00:00:56 tom Exp $ */
 
 /*
  * Copyright 1999-2008,2009 by Thomas E. Dickey
@@ -1076,12 +1076,12 @@ DECtoASCII(unsigned ch)
  */
 #if OPT_WIDE_CHARS
 static Char *
-UTF8toLatin1(Char * s, unsigned len, unsigned long *result)
+UTF8toLatin1(TScreen * screen, Char * s, unsigned len, unsigned long *result)
 {
     static Char *buffer;
     static Cardinal used;
 
-    Char *q;
+    Char *p, *q;
 
     if (len > used) {
        used = 1 + (2 * len);
@@ -1094,9 +1094,11 @@ UTF8toLatin1(Char * s, unsigned len, unsigned long 
*result)
        q = buffer;
        fakePtyData(&data, s, s + len);
        while (decodeUtf8(&data)) {
+           Bool fails = False;
+           Bool extra = False;
            IChar value = skipPtyData(&data);
            if (value == UCS_REPL) {
-               *q++ = '#';
+               fails = True;
            } else if (value < 256) {
                *q++ = CharOf(value);
            } else {
@@ -1105,13 +1107,33 @@ UTF8toLatin1(Char * s, unsigned len, unsigned long 
*result)
                    *q++ = (Char) DECtoASCII(eqv);
                } else {
                    eqv = AsciiEquivs(value);
-                   if (eqv == value)
-                       eqv = '#';
-                   *q++ = (Char) eqv;
+                   if (eqv == value) {
+                       fails = True;
+                   } else {
+                       *q++ = (Char) eqv;
+                   }
                    if (isWide((wchar_t) value))
-                       *q++ = ' ';
+                       extra = True;
+               }
+           }
+
+           /*
+            * If we're not able to plug in a single-byte result, insert the
+            * defaultString (which normally is a single "#", but could be
+            * whatever the user wants).
+            */
+           if (fails) {
+               for (p = (Char *) screen->default_string; *p != '\0'; ++p) {
+                   len = (unsigned) (3 + q - buffer);
+                   if (len >= used) {
+                       used = 1 + (2 * len);
+                       allocXtermChars(&buffer, used);
+                   }
+                   *q++ = *p;
                }
            }
+           if (extra)
+               *q++ = ' ';
        }
        *q = 0;
        *result = (unsigned long) (q - buffer);
@@ -1122,64 +1144,208 @@ UTF8toLatin1(Char * s, unsigned len, unsigned long 
*result)
 }
 #endif /* OPT_WIDE_CHARS */
 
-static Atom *
-_SelectionTargets(Widget w)
+static char *
+parseItem(char *value, char *nextc)
 {
-    static Atom *eightBitSelectionTargets = NULL;
-    TScreen *screen;
-    int n;
+    char *nextp = value;
+    while (*nextp != '\0' && *nextp != ',') {
+       *nextp = x_toupper(*nextp);
+       ++nextp;
+    }
+    *nextc = *nextp;
+    *nextp = '\0';
+    x_strtrim(value);
+
+    return nextp;
+}
+
+/*
+ * All of the wanted strings are unique in the first character, so we can
+ * use simple abbreviations.
+ */
+static Bool
+sameItem(const char *actual, const char *wanted)
+{
+    Bool result = False;
+    size_t have = strlen(actual);
+    size_t need = strlen(wanted);
+
+    if (have != 0 && have <= need) {
+       if (!strncmp(actual, wanted, have)) {
+           TRACE(("...matched \"%s\"\n", wanted));
+           result = True;
+       }
+    }
+
+    return result;
+}
 
+/*
+ * Handle the eightBitSelectTypes or utf8SelectTypes resource values.
+ */
+static Bool
+overrideTargets(Widget w, String value, Atom ** resultp)
+{
+    Bool override = False;
     XtermWidget xw;
 
-    if ((xw = getXtermWidget(w)) == 0)
-       return NULL;
+    if ((xw = getXtermWidget(w)) != 0) {
+       TScreen *screen = TScreenOf(xw);
 
-    screen = TScreenOf(xw);
+       if (value != 0 && *value != '\0') {
+           String copied = x_strdup(value);
+           if (copied != 0) {
+               Atom *result = 0;
+               Cardinal count = 1;
+               int n;
+
+               TRACE(("decoding SelectTypes \"%s\"\n", value));
+               for (n = 0; copied[n] != '\0'; ++n) {
+                   if (copied[n] == ',')
+                       ++count;
+               }
+               result = (Atom *) XtMalloc(((2 * count) + 1) * sizeof(Atom));
+               if (result == NULL) {
+                   TRACE(("Couldn't allocate selection types\n"));
+               } else {
+                   char nextc = '?';
+                   char *listp = copied;
+                   count = 0;
+                   do {
+                       char *nextp = parseItem(listp, &nextc);
+                       size_t len = strlen(listp);
+
+                       if (len == 0) {
+                           ;
+                       }
+#if OPT_WIDE_CHARS
+                       else if (sameItem(listp, "UTF8")) {
+                           result[count++] = XA_UTF8_STRING(XtDisplay(w));
+                       }
+#endif
+                       else if (sameItem(listp, "I18N")) {
+                           if (screen->i18nSelections) {
+                               result[count++] = XA_TEXT(XtDisplay(w));
+                               result[count++] = 
XA_COMPOUND_TEXT(XtDisplay(w));
+                           }
+                       } else if (sameItem(listp, "TEXT")) {
+                           result[count++] = XA_TEXT(XtDisplay(w));
+                       } else if (sameItem(listp, "COMPOUND_TEXT")) {
+                           result[count++] = XA_COMPOUND_TEXT(XtDisplay(w));
+                       } else if (sameItem(listp, "STRING")) {
+                           result[count++] = XA_STRING;
+                       }
+                       *nextp++ = nextc;
+                       listp = nextp;
+                   } while (nextc != '\0');
+                   if (count) {
+                       result[count] = None;
+                       override = True;
+                       *resultp = result;
+                   } else {
+                       XtFree((char *) result);
+                   }
+               }
+           } else {
+               TRACE(("Couldn't allocate copy of selection types\n"));
+           }
+       }
+    }
+    return override;
+}
 
 #if OPT_WIDE_CHARS
-    if (screen->wide_chars) {
-       static Atom *utf8SelectionTargets = NULL;
+static Atom *
+allocUtf8Targets(Widget w, TScreen * screen)
+{
+    Atom **resultp = &(screen->selection_targets_utf8);
 
-       if (utf8SelectionTargets == NULL) {
-           utf8SelectionTargets = (Atom *) XtMalloc(5 * sizeof(Atom));
-           if (utf8SelectionTargets == NULL) {
-               TRACE(("Couldn't allocate utf8SelectionTargets\n"));
-               return NULL;
-           }
-           n = 0;
-           utf8SelectionTargets[n++] = XA_UTF8_STRING(XtDisplay(w));
+    if (*resultp == 0) {
+       Atom *result;
+
+       if (!overrideTargets(w, screen->utf8_select_types, &result)) {
+           result = (Atom *) XtMalloc(5 * sizeof(Atom));
+           if (result == NULL) {
+               TRACE(("Couldn't allocate utf-8 selection targets\n"));
+           } else {
+               int n = 0;
+
+               result[n++] = XA_UTF8_STRING(XtDisplay(w));
 #ifdef X_HAVE_UTF8_STRING
-           if (screen->i18nSelections) {
-               utf8SelectionTargets[n++] = XA_TEXT(XtDisplay(w));
-               utf8SelectionTargets[n++] = XA_COMPOUND_TEXT(XtDisplay(w));
-           }
+               if (screen->i18nSelections) {
+                   result[n++] = XA_TEXT(XtDisplay(w));
+                   result[n++] = XA_COMPOUND_TEXT(XtDisplay(w));
+               }
 #endif
-           utf8SelectionTargets[n++] = XA_STRING;
-           utf8SelectionTargets[n] = None;
+               result[n++] = XA_STRING;
+               result[n] = None;
+           }
        }
-       return utf8SelectionTargets;
+
+       *resultp = result;
     }
+
+    return *resultp;
+}
 #endif
 
-    /* not screen->wide_chars */
-    if (eightBitSelectionTargets == NULL) {
-       eightBitSelectionTargets = (Atom *) XtMalloc(5 * sizeof(Atom));
-       if (eightBitSelectionTargets == NULL) {
-           TRACE(("Couldn't allocate eightBitSelectionTargets\n"));
-           return NULL;
-       }
-       n = 0;
+static Atom *
+alloc8bitTargets(Widget w, TScreen * screen)
+{
+    Atom **resultp = &(screen->selection_targets_8bit);
+
+    if (*resultp == 0) {
+       Atom *result = 0;
+
+       if (!overrideTargets(w, screen->eightbit_select_types, &result)) {
+           result = (Atom *) XtMalloc(5 * sizeof(Atom));
+           if (result == NULL) {
+               TRACE(("Couldn't allocate 8bit selection targets\n"));
+           } else {
+               int n = 0;
+
 #ifdef X_HAVE_UTF8_STRING
-       eightBitSelectionTargets[n++] = XA_UTF8_STRING(XtDisplay(w));
+               result[n++] = XA_UTF8_STRING(XtDisplay(w));
+#endif
+               if (screen->i18nSelections) {
+                   result[n++] = XA_TEXT(XtDisplay(w));
+                   result[n++] = XA_COMPOUND_TEXT(XtDisplay(w));
+               }
+               result[n++] = XA_STRING;
+               result[n] = None;
+           }
+       }
+
+       *resultp = result;
+    }
+
+    return *resultp;
+}
+
+static Atom *
+_SelectionTargets(Widget w)
+{
+    Atom *result;
+    TScreen *screen;
+    XtermWidget xw;
+
+    if ((xw = getXtermWidget(w)) == 0) {
+       result = NULL;
+    } else {
+       screen = TScreenOf(xw);
+
+#if OPT_WIDE_CHARS
+       if (screen->wide_chars) {
+           result = allocUtf8Targets(w, screen);
+       } else
 #endif
-       if (screen->i18nSelections) {
-           eightBitSelectionTargets[n++] = XA_TEXT(XtDisplay(w));
-           eightBitSelectionTargets[n++] = XA_COMPOUND_TEXT(XtDisplay(w));
+       {
+           /* not screen->wide_chars */
+           result = alloc8bitTargets(w, screen);
        }
-       eightBitSelectionTargets[n++] = XA_STRING;
-       eightBitSelectionTargets[n] = None;
     }
-    return eightBitSelectionTargets;
+
+    return result;
 }
 
 #define isSELECT(value) (!strcmp(value, "SELECT"))
@@ -1321,14 +1487,16 @@ xtermGetSelection(Widget w,
     if ((xw = getXtermWidget(w)) == 0)
        return;
 
-    TRACE(("xtermGetSelection\n"));
+    TRACE(("xtermGetSelection num_params %d\n", num_params));
     params = MapSelections(xw, params, num_params);
 
     XmuInternStrings(XtDisplay(w), params, (Cardinal) 1, &selection);
     cutbuffer = CutBuffer(selection);
 
-    TRACE(("Cutbuffer: %d, target: %lu\n", cutbuffer,
-          targets ? (unsigned long) targets[0] : 0));
+    TRACE(("Cutbuffer: %d, target: %s\n", cutbuffer,
+          (targets
+           ? visibleSelectionTarget(XtDisplay(w), targets[0])
+           : "None")));
 
     if (cutbuffer >= 0) {
        int inbytes;
@@ -1618,6 +1786,11 @@ SelectionReceived(Widget w,
     text_prop.format = *format;
     text_prop.nitems = *length;
 
+    TRACE(("SelectionReceived %s format %d, nitems %ld\n",
+          visibleSelectionTarget(dpy, text_prop.encoding),
+          text_prop.format,
+          text_prop.nitems));
+
 #if OPT_WIDE_CHARS
     if (screen->wide_chars) {
        if (*type == XA_UTF8_STRING(dpy) ||
@@ -1664,7 +1837,7 @@ SelectionReceived(Widget w,
                    for (i = 0; i < text_list_count; ++i) {
                        data = (Char *) text_list[i];
                        size = strlen(text_list[i]) + 1;
-                       data = UTF8toLatin1(data, size, &size);
+                       data = UTF8toLatin1(screen, data, size, &size);
                        new_size += size + 1;
                    }
                    new_text_list =
@@ -1673,7 +1846,7 @@ SelectionReceived(Widget w,
                    for (i = 0; i < text_list_count; ++i) {
                        data = (Char *) text_list[i];
                        size = strlen(text_list[i]) + 1;
-                       data = UTF8toLatin1(data, size, &size);
+                       data = UTF8toLatin1(screen, data, size, &size);
                        memcpy(tmp, data, size + 1);
                        new_text_list[i] = tmp;
                        tmp += size + 1;
@@ -1737,6 +1910,8 @@ SelectionReceived(Widget w,
   fail:
     if (client_data != 0) {
        struct _SelectionList *list = (struct _SelectionList *) client_data;
+
+       TRACE(("SelectionReceived ->xtermGetSelection\n"));
        xtermGetSelection(w, list->time,
                          list->params, list->count, list->targets);
        XtFree((char *) client_data);
@@ -3012,15 +3187,14 @@ SaltTextAway(XtermWidget xw,
     TScreen *screen = TScreenOf(xw);
     int i, j = 0;
     int eol;
+    int tmp;
     Char *line;
     Char *lp;
     CELL first = *cellc;
     CELL last = *cell;
 
     if (isSameRow(&first, &last) && first.col > last.col) {
-       int tmp = first.col;
-       first.col = last.col;
-       last.col = tmp;
+       EXCHANGE(first.col, last.col, tmp);
     }
 
     --last.col;
@@ -3259,6 +3433,9 @@ ConvertSelection(Widget w,
     if (screen->selection_data == NULL)
        return False;           /* can this happen? */
 
+    TRACE(("ConvertSelection %s\n",
+          visibleSelectionTarget(dpy, *target)));
+
     if (*target == XA_TARGETS(dpy)) {
        Atom *allocP;
        Atom *targetP;
@@ -3266,10 +3443,12 @@ ConvertSelection(Widget w,
        XPointer std_return = 0;
        unsigned long std_length;
 
-       TRACE(("ConvertSelection XA_TARGETS(dpy)\n"));
        if (XmuConvertStandardSelection(w, screen->selection_time, selection,
                                        target, type, &std_return,
                                        &std_length, format)) {
+           Atom *my_targets = _SelectionTargets(w);
+
+           TRACE(("XmuConvertStandardSelection - success\n"));
            std_targets = (Atom *) (std_return);
            *length = std_length + 6;
 
@@ -3278,18 +3457,9 @@ ConvertSelection(Widget w,
 
            *value = (XtPointer) targetP;
 
-           *targetP++ = XA_STRING;
-           *targetP++ = XA_TEXT(dpy);
-#ifdef X_HAVE_UTF8_STRING
-           *targetP++ = XA_COMPOUND_TEXT(dpy);
-           *targetP++ = XA_UTF8_STRING(dpy);
-#else
-           *targetP = XA_COMPOUND_TEXT(dpy);
-           if_OPT_WIDE_CHARS(screen, {
-               *targetP = XA_UTF8_STRING(dpy);
-           });
-           targetP++;
-#endif
+           while (*my_targets != None) {
+               *targetP++ = *my_targets++;
+           }
            *targetP++ = XA_LENGTH(dpy);
            *targetP++ = XA_LIST_LENGTH(dpy);
 
@@ -3300,37 +3470,39 @@ ConvertSelection(Widget w,
            *type = XA_ATOM;
            *format = 32;
            result = True;
+       } else {
+           TRACE(("XmuConvertStandardSelection - failed\n"));
        }
     }
 #if OPT_WIDE_CHARS
     else if (screen->wide_chars && *target == XA_STRING) {
-       TRACE(("ConvertSelection XA_STRING - wide\n"));
        result =
            _ConvertSelectionHelper(w,
                                    type, value, length, format,
                                    Xutf8TextListToTextProperty,
                                    XStringStyle);
+       TRACE(("...Xutf8TextListToTextProperty:%d\n", result));
     } else if (screen->wide_chars && *target == XA_UTF8_STRING(dpy)) {
-       TRACE(("ConvertSelection XA_UTF8_STRING(dpy) - wide\n"));
        result =
            _ConvertSelectionHelper(w,
                                    type, value, length, format,
                                    Xutf8TextListToTextProperty,
                                    XUTF8StringStyle);
+       TRACE(("...Xutf8TextListToTextProperty:%d\n", result));
     } else if (screen->wide_chars && *target == XA_TEXT(dpy)) {
-       TRACE(("ConvertSelection XA_TEXT(dpy) - wide\n"));
        result =
            _ConvertSelectionHelper(w,
                                    type, value, length, format,
                                    Xutf8TextListToTextProperty,
                                    XStdICCTextStyle);
+       TRACE(("...Xutf8TextListToTextProperty:%d\n", result));
     } else if (screen->wide_chars && *target == XA_COMPOUND_TEXT(dpy)) {
-       TRACE(("ConvertSelection XA_COMPOUND_TEXT(dpy) - wide\n"));
        result =
            _ConvertSelectionHelper(w,
                                    type, value, length, format,
                                    Xutf8TextListToTextProperty,
                                    XCompoundTextStyle);
+       TRACE(("...Xutf8TextListToTextProperty:%d\n", result));
     }
 #endif
 
@@ -3341,56 +3513,56 @@ ConvertSelection(Widget w,
           properly internationalised, and dump raw eight-bit data
           with no conversion into the selection.  Yes, this breaks
           the ICCCM in non-Latin-1 locales. */
-       TRACE(("ConvertSelection XA_STRING\n"));
        *type = XA_STRING;
        *value = (XtPointer) screen->selection_data;
        *length = screen->selection_length;
        *format = 8;
        result = True;
+       TRACE(("...raw 8-bit data:%d\n", result));
     } else if (*target == XA_TEXT(dpy)) {      /* not wide_chars */
-       TRACE(("ConvertSelection XA_TEXT(dpy)\n"));
        result =
            _ConvertSelectionHelper(w,
                                    type, value, length, format,
                                    XmbTextListToTextProperty,
                                    XStdICCTextStyle);
+       TRACE(("...XmbTextListToTextProperty(StdICC):%d\n", result));
     } else if (*target == XA_COMPOUND_TEXT(dpy)) {     /* not wide_chars */
-       TRACE(("ConvertSelection XA_COMPOUND_TEXT(dpy)\n"));
        result =
            _ConvertSelectionHelper(w,
                                    type, value, length, format,
                                    XmbTextListToTextProperty,
                                    XCompoundTextStyle);
+       TRACE(("...XmbTextListToTextProperty(Compound):%d\n", result));
     }
 #ifdef X_HAVE_UTF8_STRING
     else if (*target == XA_UTF8_STRING(dpy)) { /* not wide_chars */
-       TRACE(("ConvertSelection XA_UTF8_STRING(dpy)\n"));
        result =
            _ConvertSelectionHelper(w,
                                    type, value, length, format,
                                    XmbTextListToTextProperty,
                                    XUTF8StringStyle);
+       TRACE(("...XmbTextListToTextProperty(UTF8):%d\n", result));
     }
 #endif
     else if (*target == XA_LIST_LENGTH(dpy)) {
-       TRACE(("ConvertSelection XA_LIST_LENGTH(dpy)\n"));
        result = SaveConvertedLength(value, 1);
        *type = XA_INTEGER;
        *length = 1;
        *format = 32;
+       TRACE(("...list of values:%d\n", result));
     } else if (*target == XA_LENGTH(dpy)) {
-       TRACE(("ConvertSelection XA_LENGTH(dpy)\n"));
        /* This value is wrong if we have UTF-8 text */
        result = SaveConvertedLength(value, screen->selection_length);
        *type = XA_INTEGER;
        *length = 1;
        *format = 32;
+       TRACE(("...list of values:%d\n", result));
     } else if (XmuConvertStandardSelection(w,
                                           screen->selection_time, selection,
                                           target, type, (XPointer *) value,
                                           length, format)) {
-       TRACE(("ConvertSelection XmuConvertStandardSelection\n"));
        result = True;
+       TRACE(("...XmuConvertStandardSelection:%d\n", result));
     }
 
     /* else */
@@ -3458,7 +3630,7 @@ _OwnSelection(XtermWidget xw,
     if (screen->selection_length == 0)
        return;
 
-    TRACE(("_OwnSelection\n"));
+    TRACE(("_OwnSelection count %d\n", count));
     selections = MapSelections(xw, selections, count);
 
     if (count > screen->sel_atoms_size) {
@@ -3486,7 +3658,7 @@ _OwnSelection(XtermWidget xw,
                unsigned long length = screen->selection_length;
                Char *data = screen->selection_data;
                if_OPT_WIDE_CHARS((screen), {
-                   data = UTF8toLatin1(data, length, &length);
+                   data = UTF8toLatin1(screen, data, length, &length);
                });
                TRACE(("XStoreBuffer(%d)\n", cutbuffer));
                XStoreBuffer(XtDisplay((Widget) xw),
diff --git a/cachedGCs.c b/cachedGCs.c
index 88819fc..3c525ee 100644
--- a/cachedGCs.c
+++ b/cachedGCs.c
@@ -1,4 +1,4 @@
-/* $XTermId: cachedGCs.c,v 1.51 2009/02/13 00:37:46 tom Exp $ */
+/* $XTermId: cachedGCs.c,v 1.52 2009/03/26 23:59:32 tom Exp $ */
 
 /************************************************************
 
@@ -812,9 +812,7 @@ swapCgs(XtermWidget xw, VTwin * cgsWin, CgsEnum dstCgsId, 
CgsEnum srcCgsId)
                int srcIndex = dataIndex(src);
                int dstIndex = dataIndex(dst);
 
-               tmp = *dst;
-               *dst = *src;
-               *src = tmp;
+               EXCHANGE(*src, *dst, tmp);
 
                relinkData(src, dstIndex);
                relinkData(dst, srcIndex);
diff --git a/charproc.c b/charproc.c
index 97e1c9d..f2f3136 100644
--- a/charproc.c
+++ b/charproc.c
@@ -1,4 +1,4 @@
-/* $XTermId: charproc.c,v 1.892 2009/02/13 21:15:35 tom Exp $ */
+/* $XTermId: charproc.c,v 1.897 2009/03/29 00:23:12 tom Exp $ */
 
 /*
 
@@ -395,10 +395,10 @@ static XtActionsRec actionsList[] = {
 static XtResource resources[] =
 {
     Bres(XtNallowSendEvents, XtCAllowSendEvents, screen.allowSendEvent0, 
False),
-    Bres(XtNallowFontOps, XtCAllowFontOps, screen.allowFontOp0, True),
-    Bres(XtNallowTcapOps, XtCAllowTcapOps, screen.allowTcapOp0, False),
-    Bres(XtNallowTitleOps, XtCAllowTitleOps, screen.allowTitleOp0, True),
-    Bres(XtNallowWindowOps, XtCAllowWindowOps, screen.allowWindowOp0, True),
+    Bres(XtNallowFontOps, XtCAllowFontOps, screen.allowFontOp0, 
DEF_ALLOW_FONT),
+    Bres(XtNallowTcapOps, XtCAllowTcapOps, screen.allowTcapOp0, 
DEF_ALLOW_TCAP),
+    Bres(XtNallowTitleOps, XtCAllowTitleOps, screen.allowTitleOp0, 
DEF_ALLOW_TITLE),
+    Bres(XtNallowWindowOps, XtCAllowWindowOps, screen.allowWindowOp0, 
DEF_ALLOW_FONT),
     Bres(XtNaltIsNotMeta, XtCAltIsNotMeta, screen.alt_is_not_meta, False),
     Bres(XtNaltSendsEscape, XtCAltSendsEscape, screen.alt_sends_esc, False),
     Bres(XtNalwaysBoldMode, XtCAlwaysBoldMode, screen.always_bold_mode, False),
@@ -474,10 +474,14 @@ static XtResource resources[] =
     Sres(XtNfont4, XtCFont4, screen.MenuFontName(fontMenu_font4), NULL),
     Sres(XtNfont5, XtCFont5, screen.MenuFontName(fontMenu_font5), NULL),
     Sres(XtNfont6, XtCFont6, screen.MenuFontName(fontMenu_font6), NULL),
+
     Sres(XtNanswerbackString, XtCAnswerbackString, screen.answer_back, ""),
     Sres(XtNboldFont, XtCBoldFont, misc.default_font.f_b, DEFBOLDFONT),
     Sres(XtNcharClass, XtCCharClass, screen.charClass, NULL),
     Sres(XtNdecTerminalID, XtCDecTerminalID, screen.term_id, DFT_DECID),
+    Sres(XtNdefaultString, XtCDefaultString, screen.default_string, "#"),
+    Sres(XtNeightBitSelectTypes, XtCEightBitSelectTypes,
+        screen.eightbit_select_types, NULL),
     Sres(XtNfont, XtCFont, misc.default_font.f_n, DEFFONT),
     Sres(XtNgeometry, XtCGeometry, misc.geo_metry, NULL),
     Sres(XtNkeyboardDialect, XtCKeyboardDialect, screen.keyboard_dialect, 
DFT_KBD_DIALECT),
@@ -669,6 +673,7 @@ static XtResource resources[] =
     Ires(XtNutf8, XtCUtf8, screen.utf8_mode, uDefault),
     Sres(XtNwideBoldFont, XtCWideBoldFont, misc.default_font.f_wb, 
DEFWIDEBOLDFONT),
     Sres(XtNwideFont, XtCWideFont, misc.default_font.f_w, DEFWIDEFONT),
+    Sres(XtNutf8SelectTypes, XtCUtf8SelectTypes, screen.utf8_select_types, 
NULL),
 #endif
 
 #if OPT_LUIT_PROG
@@ -3731,9 +3736,9 @@ HandleStructNotify(Widget w GCC_UNUSED,
 
 #if OPT_BLINK_CURS
 static void
-SetCursorBlink(TScreen * screen, Boolean enable)
+SetCursorBlink(TScreen * screen, Bool enable)
 {
-    screen->cursor_blink = enable;
+    screen->cursor_blink = (Boolean) enable;
     if (DoStartBlinking(screen)) {
        StartBlinking(screen);
     } else {
@@ -3747,7 +3752,7 @@ SetCursorBlink(TScreen * screen, Boolean enable)
 void
 ToggleCursorBlink(TScreen * screen)
 {
-    SetCursorBlink(screen, (Boolean) (!(screen->cursor_blink)));
+    SetCursorBlink(screen, (Bool) (!(screen->cursor_blink)));
 }
 #endif
 
@@ -5602,6 +5607,12 @@ VTInitialize(Widget wrequest,
     init_Bres(screen.allowTitleOp0);
     init_Bres(screen.allowWindowOp0);
 
+    init_Sres(screen.default_string);
+    init_Sres(screen.eightbit_select_types);
+#if OPT_WIDE_CHARS
+    init_Sres(screen.utf8_select_types);
+#endif
+
     /* make a copy so that editres cannot change the resource after startup */
     wnew->screen.allowSendEvents = wnew->screen.allowSendEvent0;
     wnew->screen.allowFontOps = wnew->screen.allowFontOp0;
diff --git a/input.c b/input.c
index 76e48c4..7de33bf 100644
--- a/input.c
+++ b/input.c
@@ -1,4 +1,4 @@
-/* $XTermId: input.c,v 1.304 2009/01/26 00:09:29 tom Exp $ */
+/* $XTermId: input.c,v 1.307 2009/03/15 18:53:57 tom Exp $ */
 
 /*
  * Copyright 1999-2008,2009 by Thomas E. Dickey
@@ -342,35 +342,23 @@ allowModifierParm(XtermWidget xw, KEY_DATA * kd)
 *       Meta+Ctrl+Alt+Shift  16 = 1(None)+8(Meta)+1(Shift)+2(Alt)+4(Ctrl)
 */
 
-#undef CTRL
-
-/* FIXME - make these used in xtermcap.c */
-#define        UNMOD   1
-#define        SHIFT   1
-#define        ALT     2
-#define        CTRL    4
-#define        META    8
-
-#define MODIFIER_NAME(parm, name) \
-       (((parm > UNMOD) && ((parm - UNMOD) & name)) ? " "#name : "")
-
 unsigned
 xtermParamToState(XtermWidget xw, unsigned param)
 {
     unsigned result = 0;
 #if OPT_NUM_LOCK
-    if (param > UNMOD
+    if (param > MOD_NONE
        && ((ShiftMask
             | ControlMask
             | xw->misc.alt_mods
             | xw->misc.meta_mods) & xw->misc.other_mods) == 0) {
-       if ((param - UNMOD) & SHIFT)
+       if ((param - MOD_NONE) & MOD_SHIFT)
            result |= ShiftMask;
-       if ((param - UNMOD) & CTRL)
+       if ((param - MOD_NONE) & MOD_CTRL)
            result |= ControlMask;
-       if ((param - UNMOD) & ALT)
+       if ((param - MOD_NONE) & MOD_ALT)
            result |= xw->misc.alt_mods;
-       if ((param - UNMOD) & META)
+       if ((param - MOD_NONE) & MOD_META)
            result |= xw->misc.meta_mods;
     }
 #else
@@ -378,10 +366,10 @@ xtermParamToState(XtermWidget xw, unsigned param)
     (void) param;
 #endif
     TRACE(("xtermParamToState(%d) %s%s%s%s -> %#x\n", param,
-          MODIFIER_NAME(param, SHIFT),
-          MODIFIER_NAME(param, ALT),
-          MODIFIER_NAME(param, CTRL),
-          MODIFIER_NAME(param, META),
+          MODIFIER_NAME(param, MOD_SHIFT),
+          MODIFIER_NAME(param, MOD_ALT),
+          MODIFIER_NAME(param, MOD_CTRL),
+          MODIFIER_NAME(param, MOD_META),
           result));
     return result;
 }
@@ -389,36 +377,39 @@ xtermParamToState(XtermWidget xw, unsigned param)
 unsigned
 xtermStateToParam(XtermWidget xw, unsigned state)
 {
-    unsigned modify_parm = UNMOD;
+    unsigned modify_parm = MOD_NONE;
 
+    TRACE(("xtermStateToParam %#x\n", state));
 #if OPT_NUM_LOCK
     if ((state & xw->misc.other_mods) == 0) {
        if (state & ShiftMask) {
-           modify_parm += SHIFT;
+           modify_parm += MOD_SHIFT;
            state &= ~ShiftMask;
        }
        if (state & ControlMask) {
-           modify_parm += CTRL;
+           modify_parm += MOD_CTRL;
            state &= ~ControlMask;
        }
        if ((state & xw->misc.alt_mods) != 0) {
-           modify_parm += ALT;
+           modify_parm += MOD_ALT;
            state &= ~xw->misc.alt_mods;
        }
        if ((state & xw->misc.meta_mods) != 0) {
-           modify_parm += META;
+           modify_parm += MOD_META;
            state &= ~xw->misc.meta_mods;
        }
     }
+    if (modify_parm == MOD_NONE)
+       modify_parm = 0;
 #else
     (void) xw;
     (void) state;
 #endif
     TRACE(("...xtermStateToParam %d%s%s%s%s\n", modify_parm,
-          MODIFIER_NAME(modify_parm, SHIFT),
-          MODIFIER_NAME(modify_parm, ALT),
-          MODIFIER_NAME(modify_parm, CTRL),
-          MODIFIER_NAME(modify_parm, META)));
+          MODIFIER_NAME(modify_parm, MOD_SHIFT),
+          MODIFIER_NAME(modify_parm, MOD_ALT),
+          MODIFIER_NAME(modify_parm, MOD_CTRL),
+          MODIFIER_NAME(modify_parm, MOD_META)));
     return modify_parm;
 }
 
@@ -572,26 +563,25 @@ ModifyOtherKeys(XtermWidget xw,
                    break;
 #ifdef XK_ISO_Left_Tab
                case XK_ISO_Left_Tab:
-                   if (computeMaskedModifier(xw, state, ShiftMask) > 1)
+                   if (computeMaskedModifier(xw, state, ShiftMask))
                        result = True;
                    break;
 #endif
                case XK_Return:
                case XK_Tab:
-                   result = (modify_parm > 1);
+                   result = (modify_parm != 0);
                    break;
                default:
                    if (IsControlInput(kd)) {
                        if (state == ControlMask || state == ShiftMask) {
                            result = False;
                        } else {
-                           result = (modify_parm > 1);
+                           result = (modify_parm != 0);
                        }
                    } else if (IsControlAlias(kd)) {
                        if (state == ShiftMask)
                            result = False;
-                       else if (computeMaskedModifier(xw, state, ControlMask)


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]

Reply via email to