ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/screen.C
(Generate patch)

Comparing rxvt-unicode/src/screen.C (file contents):
Revision 1.129 by root, Wed Aug 25 03:52:09 2004 UTC vs.
Revision 1.139 by root, Sun Nov 21 18:51:13 2004 UTC

566 return scrn; 566 return scrn;
567 567
568 selection_check (2); /* check for boundary cross */ 568 selection_check (2); /* check for boundary cross */
569 569
570 SWAP_IT (current_screen, scrn, int); 570 SWAP_IT (current_screen, scrn, int);
571
572 SWAP_IT (screen.cur.row, swap.cur.row, int16_t);
573 SWAP_IT (screen.cur.col, swap.cur.col, int16_t);
574# ifdef DEBUG_STRICT
575 assert (screen.cur.row >= 0 && screen.cur.row < prev_nrow);
576 assert (screen.cur.col >= 0 && screen.cur.col < prev_ncol);
577# else /* drive with your eyes closed */
578 MAX_IT (screen.cur.row, 0);
579 MIN_IT (screen.cur.row, (int32_t)prev_nrow - 1);
580 MAX_IT (screen.cur.col, 0);
581 MIN_IT (screen.cur.col, (int32_t)prev_ncol - 1);
582# endif
583
571#if NSCREENS 584#if NSCREENS
572 if (options & Opt_secondaryScreen) 585 if (options & Opt_secondaryScreen)
573 { 586 {
574 num_scr = 0; 587 num_scr = 0;
575 offset = TermWin.saveLines; 588 offset = TermWin.saveLines;
589
576 for (i = prev_nrow; i--;) 590 for (i = prev_nrow; i--;)
577 { 591 {
578 SWAP_IT (screen.text[i + offset], swap.text[i], text_t *); 592 SWAP_IT (screen.text[i + offset], swap.text[i], text_t *);
579 SWAP_IT (screen.tlen[i + offset], swap.tlen[i], int16_t); 593 SWAP_IT (screen.tlen[i + offset], swap.tlen[i], int16_t);
580 SWAP_IT (screen.rend[i + offset], swap.rend[i], rend_t *); 594 SWAP_IT (screen.rend[i + offset], swap.rend[i], rend_t *);
581 } 595 }
582 SWAP_IT (screen.cur.row, swap.cur.row, int16_t); 596
583 SWAP_IT (screen.cur.col, swap.cur.col, int16_t);
584# ifdef DEBUG_STRICT
585 assert ((screen.cur.row >= 0) && (screen.cur.row < prev_nrow));
586 assert ((screen.cur.col >= 0) && (screen.cur.col < prev_ncol));
587# else /* drive with your eyes closed */
588 MAX_IT (screen.cur.row, 0);
589 MIN_IT (screen.cur.row, (int32_t)prev_nrow - 1);
590 MAX_IT (screen.cur.col, 0);
591 MIN_IT (screen.cur.col, (int32_t)prev_ncol - 1);
592# endif
593 SWAP_IT (screen.charset, swap.charset, int16_t); 597 SWAP_IT (screen.charset, swap.charset, int16_t);
594 SWAP_IT (screen.flags, swap.flags, int); 598 SWAP_IT (screen.flags, swap.flags, int);
595 screen.flags |= Screen_VisibleCursor; 599 screen.flags |= Screen_VisibleCursor;
596 swap.flags |= Screen_VisibleCursor; 600 swap.flags |= Screen_VisibleCursor;
597 } 601 }
598 else 602 else
599#endif 603#endif
600 if (options & Opt_secondaryScroll) 604 if (options & Opt_secondaryScroll)
601 //if (current_screen == PRIMARY) 605 //if (current_screen == PRIMARY)
602 scr_scroll_text (0, (prev_nrow - 1), prev_nrow, 0); 606 scr_scroll_text (0, prev_nrow - 1, prev_nrow, 0);
607
603 return scrn; 608 return scrn;
604} 609}
605 610
606// clear WrapNext indicator, solidifying position on next line 611// clear WrapNext indicator, solidifying position on next line
607void 612void
989 994
990 if (screen.cur.col > 0) 995 if (screen.cur.col > 0)
991 { 996 {
992 tp = stp + screen.cur.col - 1; 997 tp = stp + screen.cur.col - 1;
993 rp = srp + screen.cur.col - 1; 998 rp = srp + screen.cur.col - 1;
999
1000 while (*tp == NOCHAR && tp > stp)
1001 tp--, rp--;
994 } 1002 }
995 else if (screen.cur.row > 0 1003 else if (screen.cur.row > 0
996 && screen.tlen [screen.cur.row - 1 + TermWin.saveLines] == -1) 1004 && screen.tlen [screen.cur.row - 1 + TermWin.saveLines] == -1)
997 { 1005 {
998 tp = screen.text[screen.cur.row - 1 + TermWin.saveLines] + last_col - 1; 1006 int line = screen.cur.row - 1 + TermWin.saveLines;
999 rp = screen.rend[screen.cur.row - 1 + TermWin.saveLines] + last_col - 1; 1007
1008 tp = screen.text[line] + last_col - 1;
1009 rp = screen.rend[line] + last_col - 1;
1010
1011 while (*tp == NOCHAR && tp > screen.text[line])
1012 tp--, rp--;
1000 } 1013 }
1001 else 1014 else
1002 continue; 1015 continue;
1003
1004 // handle double-width-chars by making them look extremely ugly
1005 if (*tp == NOCHAR)
1006 {
1007 // hack //D //TODO //--tp, --rp;
1008 *tp = ' ';
1009 *rp &= ~RS_baseattrMask;
1010 *rp = SET_FONT (*rp, FONTSET (*rp)->find_font (*tp));
1011 }
1012 1016
1013 // first try to find a precomposed character 1017 // first try to find a precomposed character
1014 unicode_t n = rxvt_compose (*tp, c); 1018 unicode_t n = rxvt_compose (*tp, c);
1015 if (n == NOCHAR) 1019 if (n == NOCHAR)
1016 n = rxvt_composite.compose (*tp, c); 1020 n = rxvt_composite.compose (*tp, c);
1379 ren = DEFAULT_RSTYLE; 1383 ren = DEFAULT_RSTYLE;
1380 CLEAR_ROWS (row, num); 1384 CLEAR_ROWS (row, num);
1381 } 1385 }
1382 else 1386 else
1383 { 1387 {
1384 ren = (rstyle & (RS_fgMask | RS_bgMask)); 1388 ren = rstyle & (RS_fgMask | RS_bgMask);
1385 gcvalue.foreground = pix_colors[GET_BGCOLOR (rstyle)]; 1389 gcvalue.foreground = pix_colors[GET_BGCOLOR (rstyle)];
1386 XChangeGC (display->display, TermWin.gc, GCForeground, &gcvalue); 1390 XChangeGC (display->display, TermWin.gc, GCForeground, &gcvalue);
1387 ERASE_ROWS (row, num); 1391 ERASE_ROWS (row, num);
1388 gcvalue.foreground = pix_colors[Color_fg]; 1392 gcvalue.foreground = pix_colors[Color_fg];
1389 XChangeGC (display->display, TermWin.gc, GCForeground, &gcvalue); 1393 XChangeGC (display->display, TermWin.gc, GCForeground, &gcvalue);
1390 } 1394 }
1391 1395
1392 for (; num--; row++) 1396 for (; num--; row++)
1393 { 1397 {
1394 scr_blank_screen_mem (screen.text, screen.rend, 1398 scr_blank_screen_mem (screen.text, screen.rend, (unsigned int) (row + row_offset), rstyle);
1395 (unsigned int) (row + row_offset), rstyle);
1396 screen.tlen[row + row_offset] = 0; 1399 screen.tlen[row + row_offset] = 0;
1397 scr_blank_line (drawn_text[row], drawn_rend[row], 1400 scr_blank_line (drawn_text[row], drawn_rend[row], (unsigned int)TermWin.ncol, ren);
1398 (unsigned int)TermWin.ncol, ren);
1399 } 1401 }
1400} 1402}
1401 1403
1402/* ------------------------------------------------------------------------- */ 1404/* ------------------------------------------------------------------------- */
1403/* 1405/*
1487 slp = &screen.tlen[row]; 1489 slp = &screen.tlen[row];
1488 1490
1489 switch (insdel) 1491 switch (insdel)
1490 { 1492 {
1491 case INSERT: 1493 case INSERT:
1492 for (col = TermWin.ncol - 1; (col - count) >= screen.cur.col; 1494 for (col = TermWin.ncol - 1; (col - count) >= screen.cur.col; col--)
1493 col--)
1494 { 1495 {
1495 stp[col] = stp[col - count]; 1496 stp[col] = stp[col - count];
1496 srp[col] = srp[col - count]; 1497 srp[col] = srp[col - count];
1497 } 1498 }
1498 1499
1508 if (selection.end.row != screen.cur.row 1509 if (selection.end.row != screen.cur.row
1509 || (selection.end.col + count >= TermWin.ncol)) 1510 || (selection.end.col + count >= TermWin.ncol))
1510 CLEAR_SELECTION (); 1511 CLEAR_SELECTION ();
1511 else 1512 else
1512 { /* shift selection */ 1513 { /* shift selection */
1513 selection.beg.col += count; 1514 selection.beg.col += count;
1514 selection.mark.col += count; /* XXX: yes? */ 1515 selection.mark.col += count; /* XXX: yes? */
1515 selection.end.col += count; 1516 selection.end.col += count;
1516 } 1517 }
1517 } 1518 }
1518 1519
1519 scr_blank_line (& (stp[screen.cur.col]), & (srp[screen.cur.col]), 1520 scr_blank_line (&stp[screen.cur.col], &srp[screen.cur.col],
1520 (unsigned int)count, rstyle); 1521 (unsigned int)count, rstyle);
1521 break; 1522 break;
1522 1523
1523 case ERASE: 1524 case ERASE:
1524 screen.cur.col += count; /* don't worry if > TermWin.ncol */ 1525 screen.cur.col += count; /* don't worry if > TermWin.ncol */
1525 selection_check (1); 1526 selection_check (1);
1526 screen.cur.col -= count; 1527 screen.cur.col -= count;
1527 scr_blank_line (& (stp[screen.cur.col]), & (srp[screen.cur.col]), 1528 scr_blank_line (&stp[screen.cur.col], &srp[screen.cur.col],
1528 (unsigned int)count, rstyle); 1529 (unsigned int)count, rstyle);
1529 break; 1530 break;
1530 1531
1531 case DELETE: 1532 case DELETE:
1532 tr = srp[TermWin.ncol - 1] & (RS_fgMask | RS_bgMask | RS_baseattrMask); 1533 tr = srp[TermWin.ncol - 1] & (RS_fgMask | RS_bgMask | RS_baseattrMask);
1535 { 1536 {
1536 stp[col] = stp[col + count]; 1537 stp[col] = stp[col + count];
1537 srp[col] = srp[col + count]; 1538 srp[col] = srp[col + count];
1538 } 1539 }
1539 1540
1540 scr_blank_line (& (stp[TermWin.ncol - count]), 1541 scr_blank_line (&stp[TermWin.ncol - count], &srp[TermWin.ncol - count],
1541 & (srp[TermWin.ncol - count]),
1542 (unsigned int)count, tr); 1542 (unsigned int)count, tr);
1543 1543
1544 if (*slp == -1) /* break line continuation */ 1544 if (*slp == -1) /* break line continuation */
1545 *slp = TermWin.ncol; 1545 *slp = TermWin.ncol;
1546 1546
1555 || selection.end.col >= TermWin.ncol) 1555 || selection.end.col >= TermWin.ncol)
1556 CLEAR_SELECTION (); 1556 CLEAR_SELECTION ();
1557 else 1557 else
1558 { 1558 {
1559 /* shift selection */ 1559 /* shift selection */
1560 selection.beg.col -= count; 1560 selection.beg.col -= count;
1561 selection.mark.col -= count; /* XXX: yes? */ 1561 selection.mark.col -= count; /* XXX: yes? */
1562 selection.end.col -= count; 1562 selection.end.col -= count;
1563 } 1563 }
1564 } 1564 }
1565 1565
1566 break; 1566 break;
1567 } 1567 }
1751 * XTERM_SEQ: Invoke G2 character set: ESC N 1751 * XTERM_SEQ: Invoke G2 character set: ESC N
1752 * XTERM_SEQ: Invoke G3 character set: ESC O 1752 * XTERM_SEQ: Invoke G3 character set: ESC O
1753 */ 1753 */
1754void 1754void
1755rxvt_term::scr_charset_choose (int set) 1755rxvt_term::scr_charset_choose (int set)
1756 { 1756{
1757 screen.charset = set; 1757 screen.charset = set;
1758 set_font_style (); 1758 set_font_style ();
1759 } 1759}
1760 1760
1761/* ------------------------------------------------------------------------- */ 1761/* ------------------------------------------------------------------------- */
1762/* 1762/*
1763 * Set a font 1763 * Set a font
1764 * XTERM_SEQ: Set G0 character set: ESC ( <C> 1764 * XTERM_SEQ: Set G0 character set: ESC ( <C>
1767 * XTERM_SEQ: Set G3 character set: ESC + <C> 1767 * XTERM_SEQ: Set G3 character set: ESC + <C>
1768 * See set_font_style for possible values for <C> 1768 * See set_font_style for possible values for <C>
1769 */ 1769 */
1770void 1770void
1771rxvt_term::scr_charset_set (int set, unsigned int ch) 1771rxvt_term::scr_charset_set (int set, unsigned int ch)
1772 { 1772{
1773 charsets[set] = (unsigned char)ch; 1773 charsets[set] = (unsigned char)ch;
1774 set_font_style (); 1774 set_font_style ();
1775 } 1775}
1776 1776
1777 1777
1778/* ------------------------------------------------------------------------- * 1778/* ------------------------------------------------------------------------- *
1779 * MAJOR SCREEN MANIPULATION * 1779 * MAJOR SCREEN MANIPULATION *
1780 * ------------------------------------------------------------------------- */ 1780 * ------------------------------------------------------------------------- */
2035 row_offset; /* basic offset in screen structure */ 2035 row_offset; /* basic offset in screen structure */
2036#ifndef NO_CURSORCOLOR 2036#ifndef NO_CURSORCOLOR
2037 rend_t cc1; /* store colours at cursor position (s) */ 2037 rend_t cc1; /* store colours at cursor position (s) */
2038#endif 2038#endif
2039 rend_t *crp; // cursor rendition pointer 2039 rend_t *crp; // cursor rendition pointer
2040
2041 want_refresh = 0; /* screen is current */
2040 2042
2041 if (refresh_type == NO_REFRESH || !TermWin.mapped) 2043 if (refresh_type == NO_REFRESH || !TermWin.mapped)
2042 return; 2044 return;
2043 2045
2044 /* 2046 /*
2447 if (refresh_type & SMOOTH_REFRESH) 2449 if (refresh_type & SMOOTH_REFRESH)
2448 XFlush (display->display); 2450 XFlush (display->display);
2449 2451
2450 num_scr = 0; 2452 num_scr = 0;
2451 num_scr_allow = 1; 2453 num_scr_allow = 1;
2452 want_refresh = 0; /* screen is current */
2453} 2454}
2454 2455
2455void 2456void
2456rxvt_term::scr_remap_chars (text_t *tp, rend_t *rp) 2457rxvt_term::scr_remap_chars (text_t *tp, rend_t *rp)
2457{ 2458{
2544 int end_row = TermWin.saveLines - TermWin.view_start; 2545 int end_row = TermWin.saveLines - TermWin.view_start;
2545 int i = selection.beg.row + TermWin.saveLines; 2546 int i = selection.beg.row + TermWin.saveLines;
2546 int col, row = selection.end.row + TermWin.saveLines; 2547 int col, row = selection.end.row + TermWin.saveLines;
2547 rend_t *srp; 2548 rend_t *srp;
2548 2549
2549 if (i >= end_row) 2550#if ENABLE_FRILLS
2550 col = selection.beg.col; 2551 if (selection.rect)
2552 {
2553 end_row += TermWin.nrow;
2554
2555 for (; i <= row && i <= end_row; i++)
2556 for (srp = screen.rend[i], col = selection.beg.col; col < selection.end.col; col++)
2557 srp[col] ^= RS_RVid;
2558 }
2551 else 2559 else
2560#endif
2561 {
2562 if (i >= end_row)
2563 col = selection.beg.col;
2564 else
2552 { 2565 {
2553 col = 0; 2566 col = 0;
2554 i = end_row; 2567 i = end_row;
2555 } 2568 }
2556 2569
2557 end_row += TermWin.nrow; 2570 end_row += TermWin.nrow;
2571
2558 for (; i < row && i < end_row; i++, col = 0) 2572 for (; i < row && i < end_row; i++, col = 0)
2559 for (srp = screen.rend[i]; col < TermWin.ncol; col++) 2573 for (srp = screen.rend[i]; col < TermWin.ncol; col++)
2560 srp[col] ^= RS_RVid; 2574 srp[col] ^= RS_RVid;
2561 2575
2562 if (i == row && i < end_row) 2576 if (i == row && i < end_row)
2563 for (srp = screen.rend[i]; col < selection.end.col; col++) 2577 for (srp = screen.rend[i]; col < selection.end.col; col++)
2564 srp[col] ^= RS_RVid; 2578 srp[col] ^= RS_RVid;
2579 }
2565 } 2580 }
2566} 2581}
2567 2582
2568/* ------------------------------------------------------------------------- */ 2583/* ------------------------------------------------------------------------- */
2569/* 2584/*
2919 2934
2920 i = (selection.end.row - selection.beg.row + 1) * (TermWin.ncol + 1); 2935 i = (selection.end.row - selection.beg.row + 1) * (TermWin.ncol + 1);
2921 new_selection_text = (wchar_t *)rxvt_malloc ((i + 4) * sizeof (wchar_t)); 2936 new_selection_text = (wchar_t *)rxvt_malloc ((i + 4) * sizeof (wchar_t));
2922 2937
2923 col = selection.beg.col; 2938 col = selection.beg.col;
2924 MAX_IT (col, 0);
2925 row = selection.beg.row + TermWin.saveLines; 2939 row = selection.beg.row + TermWin.saveLines;
2926 end_row = selection.end.row + TermWin.saveLines; 2940 end_row = selection.end.row + TermWin.saveLines;
2927 int ofs = 0; 2941 int ofs = 0;
2928 int extra = 0; 2942 int extra = 0;
2929 2943
2930 for (; row <= end_row; row++, col = 0) 2944 for (; row <= end_row; row++, col = 0)
2931 { 2945 {
2932 t = &screen.text[row][col];
2933
2934 end_col = screen.tlen[row]; 2946 end_col = screen.tlen[row];
2947
2948#if ENABLE_FRILLS
2949 if (selection.rect)
2950 {
2951 col = selection.beg.col;
2952 end_col = TermWin.ncol + 1;
2953 }
2954#endif
2955
2956 MAX_IT (col, 0);
2935 2957
2936 if (end_col == -1) 2958 if (end_col == -1)
2937 end_col = TermWin.ncol; 2959 end_col = TermWin.ncol;
2938 2960
2939 if (row == end_row) 2961 if (row == end_row || selection.rect)
2940 MIN_IT (end_col, selection.end.col); 2962 MIN_IT (end_col, selection.end.col);
2941 2963
2964 t = &screen.text[row][col];
2942 for (; col < end_col; col++) 2965 for (; col < end_col; col++)
2943 { 2966 {
2944 if (*t == NOCHAR) 2967 if (*t == NOCHAR)
2945 t++; 2968 t++;
2946#if ENABLE_COMBINING 2969#if ENABLE_COMBINING
3206 enum { 3229 enum {
3207 LEFT, RIGHT 3230 LEFT, RIGHT
3208 } closeto = RIGHT; 3231 } closeto = RIGHT;
3209 3232
3210 want_refresh = 1; 3233 want_refresh = 1;
3234
3211 switch (selection.op) 3235 switch (selection.op)
3212 { 3236 {
3213 case SELECTION_INIT: 3237 case SELECTION_INIT:
3214 CLEAR_SELECTION (); 3238 CLEAR_SELECTION ();
3215 selection.op = SELECTION_BEGIN; 3239 selection.op = SELECTION_BEGIN;
3228 selection_start_colrow (col, row); 3252 selection_start_colrow (col, row);
3229 /* FALLTHROUGH */ 3253 /* FALLTHROUGH */
3230 default: 3254 default:
3231 return; 3255 return;
3232 } 3256 }
3257
3233 if (selection.beg.col == selection.end.col 3258 if (selection.beg.col == selection.end.col
3234 && selection.beg.col != selection.mark.col 3259 && selection.beg.col != selection.mark.col
3235 && selection.beg.row == selection.end.row 3260 && selection.beg.row == selection.end.row
3236 && selection.beg.row != selection.mark.row) 3261 && selection.beg.row != selection.mark.row)
3237 { 3262 {
3287 } 3312 }
3288 else 3313 else
3289 { /* button1 drag or button3 drag */ 3314 { /* button1 drag or button3 drag */
3290 if (ROWCOL_IS_AFTER (selection.mark, pos)) 3315 if (ROWCOL_IS_AFTER (selection.mark, pos))
3291 { 3316 {
3292 if ((selection.mark.row == selection.end.row) 3317 if (selection.mark.row == selection.end.row
3293 && (selection.mark.col == selection.end.col) 3318 && selection.mark.col == selection.end.col
3319 && clickchange
3294 && clickchange && selection.clicks == 2) 3320 && selection.clicks == 2)
3295 selection.mark.col--; 3321 selection.mark.col--;
3296 3322
3297 selection.beg.row = pos.row; 3323 selection.beg.row = pos.row;
3298 selection.beg.col = pos.col; 3324 selection.beg.col = pos.col;
3299 selection.end.row = selection.mark.row; 3325 selection.end.row = selection.mark.row;
3310 3336
3311 if (selection.clicks == 1) 3337 if (selection.clicks == 1)
3312 { 3338 {
3313 end_col = screen.tlen[selection.beg.row + TermWin.saveLines]; 3339 end_col = screen.tlen[selection.beg.row + TermWin.saveLines];
3314 3340
3315 if (end_col != -1 && selection.beg.col > end_col) 3341 if (selection.beg.col > end_col
3342 && end_col != -1
3343#if ENABLE_FRILLS
3344 && !selection.rect
3345#endif
3316 { 3346 )
3317#if 1
3318 selection.beg.col = ncol; 3347 selection.beg.col = ncol;
3319#else
3320 if (selection.beg.row != selection.end.row)
3321 selection.beg.col = ncol;
3322 else
3323 selection.beg.col = selection.mark.col;
3324#endif
3325 }
3326 3348
3327 end_col = screen.tlen[selection.end.row + TermWin.saveLines]; 3349 end_col = screen.tlen[selection.end.row + TermWin.saveLines];
3328 3350
3329 if (end_col != -1 && selection.end.col > end_col) 3351 if (
3352 selection.end.col > end_col
3353 && end_col != -1
3354#if ENABLE_FRILLS
3355 && !selection.rect
3356#endif
3357 )
3330 selection.end.col = ncol; 3358 selection.end.col = ncol;
3331 } 3359 }
3332 else if (selection.clicks == 2) 3360 else if (selection.clicks == 2)
3333 { 3361 {
3334 if (ROWCOL_IS_AFTER (selection.end, selection.beg)) 3362 if (ROWCOL_IS_AFTER (selection.end, selection.beg))
3335 selection.end.col--; 3363 selection.end.col--;
3336 3364
3337 selection_delimit_word (UP, & (selection.beg), & (selection.beg));
3338 selection_delimit_word (DN, & (selection.end), & (selection.end)); 3365 selection_delimit_word (UP, &selection.beg, &selection.beg);
3366 selection_delimit_word (DN, &selection.end, &selection.end);
3339 } 3367 }
3340 else if (selection.clicks == 3) 3368 else if (selection.clicks == 3)
3341 { 3369 {
3342#if ENABLE_FRILLS 3370#if ENABLE_FRILLS
3343 if ((options & Opt_tripleclickwords)) 3371 if ((options & Opt_tripleclickwords))
3344 { 3372 {
3345 int end_row; 3373 int end_row;
3346 3374
3347 selection_delimit_word (UP, & (selection.beg), & (selection.beg)); 3375 selection_delimit_word (UP, &selection.beg, &selection.beg);
3348 end_row = screen.tlen[selection.mark.row + TermWin.saveLines]; 3376 end_row = screen.tlen[selection.mark.row + TermWin.saveLines];
3349 3377
3350 for (end_row = selection.mark.row; end_row < TermWin.nrow; end_row++) 3378 for (end_row = selection.mark.row; end_row < TermWin.nrow; end_row++)
3351 { 3379 {
3352 end_col = screen.tlen[end_row + TermWin.saveLines]; 3380 end_col = screen.tlen[end_row + TermWin.saveLines];
3363 else 3391 else
3364#endif 3392#endif
3365 { 3393 {
3366 if (ROWCOL_IS_AFTER (selection.mark, selection.beg)) 3394 if (ROWCOL_IS_AFTER (selection.mark, selection.beg))
3367 selection.mark.col++; 3395 selection.mark.col++;
3396
3368 selection.beg.col = 0; 3397 selection.beg.col = 0;
3369 selection.end.col = ncol; 3398 selection.end.col = ncol;
3370 } 3399 }
3371 } 3400 }
3372 3401
3381 { 3410 {
3382 selection.mark.row = selection.beg.row; 3411 selection.mark.row = selection.beg.row;
3383 selection.mark.col = selection.beg.col; 3412 selection.mark.col = selection.beg.col;
3384 } 3413 }
3385 } 3414 }
3386}
3387 3415
3388#if ENABLE_FRILLS 3416#if ENABLE_FRILLS
3417 if (selection.rect && selection.beg.col > selection.end.col)
3418 SWAP_IT (selection.beg.col, selection.end.col, int);
3419#endif
3420}
3421
3422#if ENABLE_FRILLS
3389void 3423void
3390rxvt_term::selection_remove_trailing_spaces () 3424rxvt_term::selection_remove_trailing_spaces ()
3391{ 3425{
3392 int32_t end_col, end_row; 3426 int32_t end_col, end_row;
3393 text_t *stp; 3427 text_t *stp;
3394 3428
3395 end_col = selection.end.col; 3429 end_col = selection.end.col;
3396 end_row = selection.end.row; 3430 end_row = selection.end.row;
3431
3397 for ( ; end_row >= selection.beg.row; ) 3432 for ( ; end_row >= selection.beg.row; )
3398 { 3433 {
3399 stp = screen.text[end_row + TermWin.saveLines]; 3434 stp = screen.text[end_row + TermWin.saveLines];
3435
3400 while (--end_col >= 0) 3436 while (--end_col >= 0)
3401 { 3437 {
3402 if (stp[end_col] != ' ' && stp[end_col] != '\t') 3438 if (stp[end_col] != ' '
3439 && stp[end_col] != '\t'
3440 && stp[end_col] != NOCHAR)
3403 break; 3441 break;
3404 } 3442 }
3443
3405 if (end_col >= 0 3444 if (end_col >= 0
3406 || screen.tlen[end_row - 1 + TermWin.saveLines] != -1) 3445 || screen.tlen[end_row - 1 + TermWin.saveLines] != -1)
3407 { 3446 {
3408 selection.end.col = end_col + 1; 3447 selection.end.col = end_col + 1;
3409 selection.end.row = end_row; 3448 selection.end.row = end_row;
3410 break; 3449 break;
3411 } 3450 }
3451
3412 end_row--; 3452 end_row--;
3413 end_col = TermWin.ncol; 3453 end_col = TermWin.ncol;
3414 } 3454 }
3455
3415 if (selection.mark.row > selection.end.row) 3456 if (selection.mark.row > selection.end.row)
3416 { 3457 {
3417 selection.mark.row = selection.end.row; 3458 selection.mark.row = selection.end.row;
3418 selection.mark.col = selection.end.col; 3459 selection.mark.col = selection.end.col;
3419 } 3460 }
3432rxvt_term::selection_rotate (int x, int y) 3473rxvt_term::selection_rotate (int x, int y)
3433{ 3474{
3434 selection.clicks = selection.clicks % 3 + 1; 3475 selection.clicks = selection.clicks % 3 + 1;
3435 selection_extend_colrow (Pixel2Col (x), Pixel2Row (y), 1, 0, 1); 3476 selection_extend_colrow (Pixel2Col (x), Pixel2Row (y), 1, 0, 1);
3436} 3477}
3437
3438/* ------------------------------------------------------------------------- */
3439/*
3440 * On some systems, the Atom typedef is 64 bits wide. We need to have a type
3441 * that is exactly 32 bits wide, because a format of 64 is not allowed by
3442 * the X11 protocol.
3443 */
3444typedef CARD32 Atom32;
3445 3478
3446/* ------------------------------------------------------------------------- */ 3479/* ------------------------------------------------------------------------- */
3447/* 3480/*
3448 * Respond to a request for our current selection 3481 * Respond to a request for our current selection
3449 * EXT: SelectionRequest 3482 * EXT: SelectionRequest
3464 ev.target = rq.target; 3497 ev.target = rq.target;
3465 ev.time = rq.time; 3498 ev.time = rq.time;
3466 3499
3467 if (rq.target == xa[XA_TARGETS]) 3500 if (rq.target == xa[XA_TARGETS])
3468 { 3501 {
3469 Atom32 target_list[6]; 3502 Atom target_list[6];
3470 Atom32 *target = target_list; 3503 Atom *target = target_list;
3471 3504
3472 *target++ = (Atom32) xa[XA_TARGETS]; 3505 *target++ = xa[XA_TARGETS];
3473 *target++ = (Atom32) xa[XA_TIMESTAMP]; 3506 *target++ = xa[XA_TIMESTAMP];
3474 *target++ = (Atom32) XA_STRING; 3507 *target++ = XA_STRING;
3475 *target++ = (Atom32) xa[XA_TEXT]; 3508 *target++ = xa[XA_TEXT];
3476 *target++ = (Atom32) xa[XA_COMPOUND_TEXT]; 3509 *target++ = xa[XA_COMPOUND_TEXT];
3477#if X_HAVE_UTF8_STRING 3510#if X_HAVE_UTF8_STRING
3478 *target++ = (Atom32) xa[XA_UTF8_STRING]; 3511 *target++ = xa[XA_UTF8_STRING];
3479#endif 3512#endif
3480 3513
3481 XChangeProperty (display->display, rq.requestor, rq.property, XA_ATOM, 3514 XChangeProperty (display->display, rq.requestor, rq.property, XA_ATOM,
3482 (8 * sizeof (target_list[0])), PropModeReplace, 3515 32, PropModeReplace,
3483 (unsigned char *)target_list, 3516 (unsigned char *)target_list, target - target_list);
3484 target - target_list);
3485 ev.property = rq.property; 3517 ev.property = rq.property;
3486 } 3518 }
3487#if TODO // TODO 3519#if TODO // TODO
3488 else if (rq.target == xa[XA_MULTIPLE]) 3520 else if (rq.target == xa[XA_MULTIPLE])
3489 { 3521 {
3490 /* TODO: Handle MULTIPLE */ 3522 /* TODO: Handle MULTIPLE */
3491 } 3523 }
3492#endif 3524#endif
3493 else if (rq.target == xa[XA_TIMESTAMP] && selection.text) 3525 else if (rq.target == xa[XA_TIMESTAMP] && selection.text)
3494 { 3526 {
3495 XChangeProperty (display->display, rq.requestor, rq.property, XA_INTEGER, 3527 XChangeProperty (display->display, rq.requestor, rq.property, rq.target,
3496 (8 * sizeof (Time)), PropModeReplace,
3497 (unsigned char *)&selection_time, 1); 3528 32, PropModeReplace, (unsigned char *)&selection_time, 1);
3498 ev.property = rq.property; 3529 ev.property = rq.property;
3499 } 3530 }
3500 else if (rq.target == XA_STRING 3531 else if (rq.target == XA_STRING
3501 || rq.target == xa[XA_TEXT] 3532 || rq.target == xa[XA_TEXT]
3502 || rq.target == xa[XA_COMPOUND_TEXT] 3533 || rq.target == xa[XA_COMPOUND_TEXT]

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines