--- rxvt-unicode/src/screen.C 2004/02/24 22:28:42 1.36 +++ rxvt-unicode/src/screen.C 2004/02/25 15:06:05 1.39 @@ -3,6 +3,7 @@ *---------------------------------------------------------------------------* * * Copyright (c) 1997-2001 Geoff Wing + * Copyright (c) 2003-2004 Marc Lehmann * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,8 +19,9 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *--------------------------------------------------------------------------*/ + /* - * We handle _all_ screen updates and selections + * This file handles _all_ screen updates and selections */ #include "../config.h" /* NECESSARY */ @@ -32,7 +34,7 @@ #include #include -#include "salloc.C" // HACK!! +#include "salloc.C" // HACK, should be a seperate compile! inline void fill_text (text_t *start, text_t value, int len) { @@ -864,17 +866,23 @@ if (charsets[screen.charset] == '0') // DEC SPECIAL switch (c) { + // dunno where these come from +#if 0 case '+': c = 0x2192; break; case ',': c = 0x2190; break; case '-': c = 0x2191; break; - case '.': c = 0x2193; break; case '0': c = 0x25ae; break; case '`': c = 0x25c6; break; - case 'a': c = 0x2592; break; case 'f': c = 0x00b0; break; case 'g': c = 0x00b1; break; - case 'h': c = 0x2592; break; case 'i': c = 0x2603; break; case 'j': c = 0x2518; break; - case 'k': c = 0x2510; break; case 'l': c = 0x250c; break; case 'm': c = 0x2514; break; - case 'n': c = 0x253c; break; case 'o': c = 0x23ba; break; case 'p': c = 0x23bb; break; - case 'q': c = 0x2500; break; case 'r': c = 0x23bc; break; case 's': c = 0x23bd; break; - case 't': c = 0x251c; break; case 'u': c = 0x2524; break; case 'v': c = 0x2534; break; - case 'w': c = 0x252c; break; case 'x': c = 0x2502; break; case 'y': c = 0x2264; break; - case 'z': c = 0x2265; break; case '{': c = 0x03c0; break; case '|': c = 0x2260; break; - case '}': c = 0x00a3; break; case '~': c = 0x00b7; break; + case '.': c = 0x2193; break; case '0': c = 0x25ae; break; +#endif + // vt100 special graphics and line drawing + case '`': c = 0x25c6; break; case '_': c = 0x0020; break; + case 'a': c = 0x2592; break; case 'b': c = 0x2409; break; case 'c': c = 0x240c; break; + case 'd': c = 0x240d; break; case 'e': c = 0x240a; break; case 'f': c = 0x00b0; break; + case 'g': c = 0x00b1; break; case 'h': c = 0x2424; break; case 'i': c = 0x240b; break; + case 'j': c = 0x2518; break; case 'k': c = 0x2510; break; case 'l': c = 0x250c; break; + case 'm': c = 0x2514; break; case 'n': c = 0x253c; break; case 'o': c = 0x23ba; break; + case 'p': c = 0x23bb; break; case 'q': c = 0x2500; break; case 'r': c = 0x23bc; break; + case 's': c = 0x23bd; break; case 't': c = 0x251c; break; case 'u': c = 0x2524; break; + case 'v': c = 0x2534; break; case 'w': c = 0x252c; break; case 'x': c = 0x2502; break; + case 'y': c = 0x2264; break; case 'z': c = 0x2265; break; case '{': c = 0x03c0; break; + case '|': c = 0x2260; break; case '}': c = 0x00a3; break; case '~': c = 0x00b7; break; } rend_t rend = SET_FONT (rstyle, TermWin.fontset->find_font (c)); @@ -2118,19 +2126,6 @@ rvid = !!(rend & RS_RVid); -#ifdef TEXT_BLINK - if (rend & RS_Blink) - { - if (!text_blink_ev.active) - { - text_blink_ev.start (NOW + TEXT_BLINK_INTERVAL); - hidden_text = 0; - } - else if (hidden_text) - fore = back; - } -#endif - #ifndef NO_BOLD_UNDERLINE_REVERSE if (rend & RS_Bold && fore == Color_fg) { @@ -2161,6 +2156,19 @@ #endif } +#ifdef TEXT_BLINK + if (rend & RS_Blink) + { + if (!text_blink_ev.active) + { + text_blink_ev.start (NOW + TEXT_BLINK_INTERVAL); + hidden_text = 0; + } + else if (hidden_text) + fore = back; + } +#endif + /* * Actually do the drawing of the string here */ @@ -2484,10 +2492,10 @@ for (;;) { if (XGetWindowProperty (display->display, win, prop, (long) (nread / 4), - (long) (PROP_SIZE / 4), delete_prop, - AnyPropertyType, &ct.encoding, &ct.format, - &ct.nitems, &bytes_after, - &ct.value) != Success) + (long) (PROP_SIZE / 4), delete_prop, + AnyPropertyType, &ct.encoding, &ct.format, + &ct.nitems, &bytes_after, + &ct.value) != Success) break; if (ct.encoding == 0) @@ -2505,7 +2513,8 @@ if (ct.nitems == 0) { D_SELECT ((stderr, "rxvt_selection_paste: property empty - also INCR end")); - if (selection_wait == Sel_normal && nread == 0) + if (selection_wait == Sel_normal && nread == 0 + && (win != display->root || prop != XA_CUT_BUFFER0)) // avoid recursion { /* * pass through again trying CUT_BUFFER0 if we've come from @@ -2728,6 +2737,7 @@ default: return; } + selection.op = SELECTION_DONE; if (selection.clicks == 4) @@ -2788,7 +2798,7 @@ return; } - // due to MB_MAX_CUR, selection wastage is usually high, so realloc + // due to MB_CUR_MAX, selection wastage is usually high, so realloc if (str - (char *)new_selection_text > 1024) new_selection_text = (unsigned char *)rxvt_realloc (new_selection_text, i + 1); @@ -2812,12 +2822,12 @@ if (XmbTextListToTextProperty (display->display, &cl, 1, XStringStyle, &ct) >= 0) { XChangeProperty (display->display, display->root, XA_CUT_BUFFER0, XA_STRING, 8, - PropModeReplace, ct.value, ct.nitems); + PropModeReplace, ct.value, ct.nitems); XFree (ct.value); } else XChangeProperty (display->display, display->root, XA_CUT_BUFFER0, XA_STRING, 8, - PropModeReplace, selection.text, (int)selection.len); + PropModeReplace, selection.text, (int)selection.len); } selection_time = tm;