diff -Naur aterm-orig/configure aterm-0.4.2/configure --- aterm-orig/configure 2001-09-06 18:38:07.000000000 +0200 +++ aterm-0.4.2/configure 2004-03-30 18:14:38.189000472 +0200 @@ -2609,7 +2609,7 @@ ; \ do ac_save_LIBS=$LIBS - LIBS="-L$ac_dir -lXpm $LIBS -lX11" + LIBS="-L$ac_dir -lXpm $LIBS -lX11 -lXmu" cat > conftest.$ac_ext <xbutton.button) { case Button1: case Button3: - selection_make(ev->xbutton.time); + selection_make(ev->xbutton.time, ev->xbutton.state); break; case Button2: diff -Naur aterm-orig/src/screen.c aterm-0.4.2/src/screen.c --- aterm-orig/src/screen.c 2004-03-30 18:13:11.070244536 +0200 +++ aterm-0.4.2/src/screen.c 2004-03-30 18:06:42.000000000 +0200 @@ -44,7 +44,7 @@ #include #include /* get the typedef for CARD32 */ - +#include static screen_t screen; @@ -2759,21 +2759,97 @@ long nread; unsigned long bytes_after, nitems; unsigned char *data; + XTextProperty ct; Atom actual_type; int actual_fmt; + int dummy_count; + char **cl; + XEvent ev; + XWindowAttributes wa; + int setpropertyevent = 0; + + if (prop == None) { + prop = XInternAtom(Xdisplay, "VT_SELECTION", False); + + if (selection.type == 0) { + selection.type++; + XConvertSelection(Xdisplay, XA_PRIMARY, XA_UTF8_STRING(Xdisplay), prop, TermWin.vt,selection.request_time); + } else if (selection.type == 1) { + selection.type++; + XConvertSelection(Xdisplay, XA_PRIMARY, XA_STRING, prop, TermWin.vt,selection.request_time); + } + return; + } - if (prop == None) - return; for (nread = 0, bytes_after = 1; bytes_after > 0; nread += nitems) { if ((XGetWindowProperty(Xdisplay, win, prop, (nread / 4), PROP_SIZE, - Delete, AnyPropertyType, &actual_type, - &actual_fmt, &nitems, &bytes_after, - &data) != Success)) { - XFree(data); + False, AnyPropertyType, &ct.encoding, &ct.format, + &ct.nitems, &bytes_after, &ct.value) != Success)) { + XFree(ct.value); return; } - PasteIt(data, nitems); - XFree(data); + + if (ct.encoding == XInternAtom(Xdisplay, "INCR", False)) { + /* + * This is an INCR (incremental large) paste + */ + XGetWindowAttributes(Xdisplay, win, &wa); + if ((wa.your_event_mask | PropertyChangeMask) != wa.your_event_mask) { + /* We need to register the PropertyNotify event */ + XSelectInput(Xdisplay, win, (wa.your_event_mask | PropertyChangeMask) ); + setpropertyevent = 1; + } + XDeleteProperty(Xdisplay, win, prop); + while (1) { + XWindowEvent(Xdisplay, win, PropertyChangeMask, &ev); + if (ev.xproperty.state != PropertyNewValue) + continue; + if ((XGetWindowProperty(Xdisplay, win, prop, 0, PROP_SIZE, + True, AnyPropertyType, &ct.encoding, &ct.format, + &ct.nitems, &bytes_after, &ct.value) != Success)) { + XFree(ct.value); + /* error */ + break; + } + + if (ct.nitems == 0) { + /* end of INCR transfer */ + XFree(ct.value); + break; + } + else { + if (XmbTextPropertyToTextList(Xdisplay, &ct, &cl, &dummy_count) == Success && cl) { + PasteIt(cl[0], strlen(cl[0])); + XFreeStringList(cl); + } else { + PasteIt(ct.value, (unsigned int)ct.nitems); + } + + XFree(ct.value); + } + } + if (setpropertyevent == 1) { + /* We need to unregister the PropertyNotify event */ + XGetWindowAttributes(Xdisplay, win, &wa); + XSelectInput(Xdisplay, win, (wa.your_event_mask ^ PropertyChangeMask)); + setpropertyevent = 0; + } + } else { + /* + * This is a normal 1-time paste + */ + if (Delete) { + XDeleteProperty(Xdisplay, win, prop); + } + + if (XmbTextPropertyToTextList(Xdisplay, &ct, &cl, &dummy_count) == Success && cl) { + PasteIt(cl[0], strlen(cl[0])); + XFreeStringList(cl); + } else { + PasteIt(ct.value, (unsigned int)ct.nitems); + } + XFree(ct.value); + } } } @@ -2787,6 +2863,11 @@ selection_request(Time tm, int x, int y) { Atom prop; + Atom xa; + + xa = XInternAtom(Xdisplay, "COMPOUND_TEXT", False); + + selection.request_time = tm; if (!(Options & Opt_pasteMouseOutside)) if (x < 0 || x >= TermWin.width || y < 0 || y >= TermWin.height) @@ -2798,8 +2879,8 @@ selection_paste(Xroot, XA_CUT_BUFFER0, False); } else { prop = XInternAtom(Xdisplay, "VT_SELECTION", False); - XConvertSelection(Xdisplay, XA_PRIMARY, XA_STRING, prop, TermWin.vt, - tm); + selection.type = 0; + XConvertSelection(Xdisplay, XA_PRIMARY, xa, prop, TermWin.vt,tm); } } @@ -2828,7 +2909,7 @@ */ /* PROTO */ void -selection_make(Time tm) +selection_make(Time tm, unsigned int key_state) { int i, col, end_col, row, end_row; unsigned char *new_selection_text; @@ -2895,7 +2976,13 @@ FREE(selection.text); selection.text = new_selection_text; - XSetSelectionOwner(Xdisplay, XA_PRIMARY, TermWin.vt, tm); + // selecting with ALT will put the text to clipboard + if (key_state & Mod1Mask) { + XSetSelectionOwner(Xdisplay, XA_CLIPBOARD(Xdisplay), TermWin.vt, tm); + } else { + XSetSelectionOwner(Xdisplay, XA_PRIMARY, TermWin.vt, tm); + } + if (XGetSelectionOwner(Xdisplay, XA_PRIMARY) != TermWin.vt) print_error("can't get primary selection"); XChangeProperty(Xdisplay, Xroot, XA_CUT_BUFFER0, XA_STRING, 8, diff -Naur aterm-orig/src/screen.h aterm-0.4.2/src/screen.h --- aterm-orig/src/screen.h 2001-09-06 18:38:07.000000000 +0200 +++ aterm-0.4.2/src/screen.h 2004-03-30 18:00:53.000000000 +0200 @@ -88,6 +88,8 @@ short screen; /* screen being used */ short clicks; /* number of clicks */ row_col_t beg, mark, end; + char type; + int request_time; } selection_t; /* ------------------------------------------------------------------------- */