--- rxvt-unicode/src/screen.C 2009/03/29 13:36:03 1.328 +++ rxvt-unicode/src/screen.C 2010/01/24 21:53:13 1.333 @@ -233,6 +233,8 @@ selection.op = SELECTION_CLEAR; selection.screen = PRIMARY; selection.clicks = 0; + selection.clip_text = NULL; + selection.clip_len = 0; } else { @@ -288,9 +290,7 @@ do { p = MOD (p - 1, prev_total_rows); -#ifdef DEBUG_STRICT assert (old_buf [MOD (p, prev_total_rows)].t); -#endif int plines = 1; int llen = old_buf [MOD (p, prev_total_rows)].l; @@ -512,10 +512,8 @@ /* boundary check in case screen size changed between SAVE and RESTORE */ min_it (s->cur.row, nrow - 1); min_it (s->cur.col, ncol - 1); -#ifdef DEBUG_STRICT assert (s->cur.row >= 0); assert (s->cur.col >= 0); -#endif } void @@ -550,7 +548,7 @@ selection_check (2); /* check for boundary cross */ - int i = current_screen; current_screen = scrn; scrn = i; + current_screen = scrn; #if NSCREENS if (option (Opt_secondaryScreen)) @@ -785,11 +783,9 @@ } } -#ifdef DEBUG_STRICT assert (screen.cur.col < ncol); assert (screen.cur.row < nrow && screen.cur.row >= top_row); -#endif int row = screen.cur.row; checksel = selection.op && current_screen == selection.screen ? 1 : 0; @@ -1003,9 +999,7 @@ max_it (line->l, screen.cur.col); -#ifdef DEBUG_STRICT assert (screen.cur.row >= 0); -#endif } /* ------------------------------------------------------------------------- */ @@ -1943,6 +1937,7 @@ } else XBell (dpy, 0); + HOOK_INVOKE ((this, HOOK_BELL, DT_END)); #endif } @@ -1971,7 +1966,7 @@ wctomb (0, 0); - for (int r1 = 0; r1 < nrows; r1++) + for (int r1 = row_start; r1 < row_start + nrows; r1++) { text_t *tp = ROW(r1).t; int len = ROW(r1).l; @@ -2953,16 +2948,42 @@ * EXT: SelectionClear */ void -rxvt_term::selection_clear () NOTHROW +rxvt_term::selection_clear (bool clipboard) NOTHROW { - want_refresh = 1; - free (selection.text); - selection.text = NULL; - selection.len = 0; - CLEAR_SELECTION (); + if (!clipboard) + { + want_refresh = 1; + free (selection.text); + selection.text = NULL; + selection.len = 0; + CLEAR_SELECTION (); - if (display->selection_owner == this) - display->selection_owner = 0; + if (display->selection_owner == this) + display->selection_owner = 0; + } + else + { + free (selection.clip_text); + selection.clip_text = NULL; + selection.clip_len = 0; + + if (display->clipboard_owner == this) + display->clipboard_owner = 0; + } +} + +void +rxvt_term::clipboard_copy (Time tm) +{ + if (selection.len > 0) + { + free (selection.clip_text); + selection.clip_len = selection.len; + selection.clip_text = (wchar_t *) malloc (sizeof (wchar_t) * selection.clip_len); + memcpy (selection.clip_text, selection.text, + sizeof (wchar_t) * selection.clip_len); + selection_grab (tm, true); + } } /* ------------------------------------------------------------------------- */ @@ -3098,19 +3119,30 @@ } bool -rxvt_term::selection_grab (Time tm) NOTHROW +rxvt_term::selection_grab (Time tm, bool clipboard) NOTHROW { - selection_time = tm; + Atom sel; + + if (!clipboard) + { + selection_time = tm; + sel = XA_PRIMARY; + } + else + { + clipboard_time = tm; + sel = xa[XA_CLIPBOARD]; + } - XSetSelectionOwner (dpy, XA_PRIMARY, vt, tm); - if (XGetSelectionOwner (dpy, XA_PRIMARY) == vt) + XSetSelectionOwner (dpy, sel, vt, tm); + if (XGetSelectionOwner (dpy, sel) == vt) { - display->set_selection_owner (this); + display->set_selection_owner (this, clipboard); return true; } else { - selection_clear (); + selection_clear (clipboard); return false; } @@ -3615,12 +3647,18 @@ /* TODO: Handle MULTIPLE */ } #endif - else if (rq.target == xa[XA_TIMESTAMP] && selection.text) + else if (rq.target == xa[XA_TIMESTAMP] && rq.selection == XA_PRIMARY && selection.text) { XChangeProperty (dpy, rq.requestor, rq.property, rq.target, 32, PropModeReplace, (unsigned char *)&selection_time, 1); ev.property = rq.property; } + else if (rq.target == xa[XA_TIMESTAMP] && rq.selection == xa[XA_CLIPBOARD] && selection.clip_text) + { + XChangeProperty (dpy, rq.requestor, rq.property, rq.target, + 32, PropModeReplace, (unsigned char *)&clipboard_time, 1); + ev.property = rq.property; + } else if (rq.target == XA_STRING || rq.target == xa[XA_TEXT] || rq.target == xa[XA_COMPOUND_TEXT] @@ -3661,11 +3699,16 @@ style = enc_compound_text; } - if (selection.text) + if (rq.selection == XA_PRIMARY && selection.text) { cl = selection.text; selectlen = selection.len; } + else if (rq.selection == xa[XA_CLIPBOARD] && selection.clip_text) + { + cl = selection.clip_text; + selectlen = selection.clip_len; + } else { cl = L"";