… | |
… | |
215 | h += 2; |
215 | h += 2; |
216 | } |
216 | } |
217 | |
217 | |
218 | text = new text_t *[h]; |
218 | text = new text_t *[h]; |
219 | rend = new rend_t *[h]; |
219 | rend = new rend_t *[h]; |
220 | |
220 | |
221 | for (int y = 0; y < h; y++) |
221 | for (int y = 0; y < h; y++) |
222 | { |
222 | { |
223 | text_t *tp = text[y] = new text_t[w]; |
223 | text_t *tp = text[y] = new text_t[w]; |
224 | rend_t *rp = rend[y] = new rend_t[w]; |
224 | rend_t *rp = rend[y] = new rend_t[w]; |
225 | |
225 | |
226 | text_t t0, t1, t2; |
226 | text_t t0, t1, t2; |
227 | rend_t r = rstyle; |
227 | rend_t r = rstyle; |
228 | |
228 | |
229 | if (border == 2) |
229 | if (border == 2) |
230 | { |
230 | { |
231 | if (y == 0) |
231 | if (y == 0) |
232 | t0 = 0x2554, t1 = 0x2550, t2 = 0x2557; |
232 | t0 = 0x2554, t1 = 0x2550, t2 = 0x2557; |
233 | else if (y < h - 1) |
233 | else if (y < h - 1) |
234 | t0 = 0x2551, t1 = 0x0020, t2 = 0x2551; |
234 | t0 = 0x2551, t1 = 0x0020, t2 = 0x2551; |
235 | else |
235 | else |
236 | t0 = 0x255a, t1 = 0x2550, t2 = 0x255d; |
236 | t0 = 0x255a, t1 = 0x2550, t2 = 0x255d; |
237 | |
237 | |
238 | *tp++ = t0; |
238 | *tp++ = t0; |
239 | *rp++ = r; |
239 | *rp++ = r; |
240 | |
240 | |
241 | for (int x = w - 2; x-- > 0; ) |
241 | for (int x = w - 2; x-- > 0; ) |
242 | { |
242 | { |
243 | *tp++ = t1; |
243 | *tp++ = t1; |
244 | *rp++ = r; |
244 | *rp++ = r; |
245 | } |
245 | } |
246 | |
246 | |
247 | *tp = t2; |
247 | *tp = t2; |
248 | *rp = r; |
248 | *rp = r; |
249 | } |
249 | } |
250 | else |
250 | else |
251 | for (int x = w; x-- > 0; ) |
251 | for (int x = w; x-- > 0; ) |
252 | { |
252 | { |
253 | *tp++ = 0x0020; |
253 | *tp++ = 0x0020; |
254 | *rp++ = r; |
254 | *rp++ = r; |
255 | } |
255 | } |
256 | } |
256 | } |
257 | |
257 | |
258 | show (); |
258 | show (); |
259 | THIS->want_refresh = 1; |
259 | THIS->want_refresh = 1; |
260 | } |
260 | } |
261 | |
261 | |
… | |
… | |
308 | |
308 | |
309 | for (int y = ov_h; y--; ) |
309 | for (int y = ov_h; y--; ) |
310 | { |
310 | { |
311 | text_t *t1 = text [y]; |
311 | text_t *t1 = text [y]; |
312 | rend_t *r1 = rend [y]; |
312 | rend_t *r1 = rend [y]; |
313 | |
313 | |
314 | text_t *t2 = ROW(y + ov_y - THIS->view_start).t + ov_x; |
314 | text_t *t2 = ROW(y + ov_y - THIS->view_start).t + ov_x; |
315 | rend_t *r2 = ROW(y + ov_y - THIS->view_start).r + ov_x; |
315 | rend_t *r2 = ROW(y + ov_y - THIS->view_start).r + ov_x; |
316 | |
316 | |
317 | for (int x = ov_w; x--; ) |
317 | for (int x = ov_w; x--; ) |
318 | { |
318 | { |
319 | text_t t = *t1; *t1++ = *t2; *t2++ = t; |
319 | text_t t = *t1; *t1++ = *t2; *t2++ = t; |
320 | rend_t r = *r1; *r1++ = *r2; *r2++ = SET_FONT (r, THIS->fontset [GET_STYLE (r)]->find_font (t)); |
320 | rend_t r = *r1; *r1++ = *r2; *r2++ = SET_FONT (r, THIS->fontset [GET_STYLE (r)]->find_font (t)); |
321 | } |
321 | } |
322 | } |
322 | } |
323 | |
323 | |
… | |
… | |
333 | |
333 | |
334 | wchar_t *wtext = sv2wcs (text); |
334 | wchar_t *wtext = sv2wcs (text); |
335 | |
335 | |
336 | for (int col = min (wcslen (wtext), w - x - border); col--; ) |
336 | for (int col = min (wcslen (wtext), w - x - border); col--; ) |
337 | this->text [y][x + col] = wtext [col]; |
337 | this->text [y][x + col] = wtext [col]; |
338 | |
338 | |
339 | free (wtext); |
339 | free (wtext); |
340 | |
340 | |
341 | if (rend) |
341 | if (rend) |
342 | { |
342 | { |
343 | if (!SvROK (rend) || SvTYPE (SvRV (rend)) != SVt_PVAV) |
343 | if (!SvROK (rend) || SvTYPE (SvRV (rend)) != SVt_PVAV) |
… | |
… | |
400 | bool |
400 | bool |
401 | rxvt_perl_interp::invoke (rxvt_term *term, hook_type htype, ...) |
401 | rxvt_perl_interp::invoke (rxvt_term *term, hook_type htype, ...) |
402 | { |
402 | { |
403 | if (!perl) |
403 | if (!perl) |
404 | return false; |
404 | return false; |
405 | |
405 | |
406 | if (htype == HOOK_INIT) // first hook ever called |
406 | if (htype == HOOK_INIT) // first hook ever called |
407 | { |
407 | { |
408 | term->self = (void *)newSVptr ((void *)term, "urxvt::term"); |
408 | term->self = (void *)newSVptr ((void *)term, "urxvt::term"); |
409 | hv_store ((HV *)SvRV ((SV *)term->self), "_overlay", 8, newRV_noinc ((SV *)newHV ()), 0); |
409 | hv_store ((HV *)SvRV ((SV *)term->self), "_overlay", 8, newRV_noinc ((SV *)newHV ()), 0); |
410 | } |
410 | } |
… | |
… | |
501 | |
501 | |
502 | PROTOTYPES: ENABLE |
502 | PROTOTYPES: ENABLE |
503 | |
503 | |
504 | BOOT: |
504 | BOOT: |
505 | { |
505 | { |
506 | # define export_const(name) newCONSTSUB (gv_stashpv ("urxvt", 1), #name, newSViv (name)); |
506 | # define export_const(name) newCONSTSUB (gv_stashpv ("urxvt", 1), # name, newSViv (name)); |
507 | AV *hookname = get_av ("urxvt::HOOKNAME", 1); |
507 | AV *hookname = get_av ("urxvt::HOOKNAME", 1); |
508 | # define def(sym) av_store (hookname, HOOK_ ## sym, newSVpv (# sym, 0)); |
508 | # define def(sym) av_store (hookname, HOOK_ ## sym, newSVpv (# sym, 0)); |
509 | # include "hookinc.h" |
509 | # include "hookinc.h" |
510 | # undef def |
510 | # undef def |
511 | |
511 | |
… | |
… | |
644 | free (str); |
644 | free (str); |
645 | } |
645 | } |
646 | OUTPUT: |
646 | OUTPUT: |
647 | RETVAL |
647 | RETVAL |
648 | |
648 | |
|
|
649 | # very portable, especially on objects as opposed to pods |
|
|
650 | #define TERM_OFFSET(sym) (((char *)&((TermWin_t *)0)->sym) - (char *)(TermWin_t *)0) |
|
|
651 | |
|
|
652 | #define TERM_OFFSET_width TERM_OFFSET(width) |
|
|
653 | #define TERM_OFFSET_height TERM_OFFSET(height) |
|
|
654 | #define TERM_OFFSET_fwidth TERM_OFFSET(fwidth) |
|
|
655 | #define TERM_OFFSET_fheight TERM_OFFSET(fheight) |
|
|
656 | #define TERM_OFFSET_fbase TERM_OFFSET(fbase) |
|
|
657 | #define TERM_OFFSET_nrow TERM_OFFSET(nrow) |
|
|
658 | #define TERM_OFFSET_ncol TERM_OFFSET(ncol) |
|
|
659 | #define TERM_OFFSET_focus TERM_OFFSET(focus) |
|
|
660 | #define TERM_OFFSET_mapped TERM_OFFSET(mapped) |
|
|
661 | #define TERM_OFFSET_saveLines TERM_OFFSET(saveLines) |
|
|
662 | #define TERM_OFFSET_total_rows TERM_OFFSET(total_rows) |
|
|
663 | #define TERM_OFFSET_nsaved TERM_OFFSET(nsaved) |
|
|
664 | |
649 | int |
665 | int |
650 | rxvt_term::nsaved () |
666 | rxvt_term::width () |
|
|
667 | ALIAS: |
|
|
668 | width = TERM_OFFSET_width |
|
|
669 | height = TERM_OFFSET_height |
|
|
670 | fwidth = TERM_OFFSET_fwidth |
|
|
671 | fheight = TERM_OFFSET_fheight |
|
|
672 | fbase = TERM_OFFSET_fbase |
|
|
673 | nrow = TERM_OFFSET_nrow |
|
|
674 | ncol = TERM_OFFSET_ncol |
|
|
675 | focus = TERM_OFFSET_focus |
|
|
676 | mapped = TERM_OFFSET_mapped |
|
|
677 | saveLines = TERM_OFFSET_saveLines |
|
|
678 | total_rows = TERM_OFFSET_total_rows |
|
|
679 | nsaved = TERM_OFFSET_nsaved |
651 | CODE: |
680 | CODE: |
|
|
681 | RETVAL = *(int *)((char *)THIS + ix); |
|
|
682 | OUTPUT: |
|
|
683 | RETVAL |
|
|
684 | |
|
|
685 | U32 |
|
|
686 | rxvt_term::screen_rstyle (U32 new_rstyle = THIS->screen.s_rstyle) |
|
|
687 | CODE: |
|
|
688 | { |
652 | RETVAL = THIS->nsaved; |
689 | RETVAL = THIS->screen.s_rstyle; |
|
|
690 | THIS->screen.s_rstyle = new_rstyle; |
|
|
691 | } |
653 | OUTPUT: |
692 | OUTPUT: |
654 | RETVAL |
693 | RETVAL |
655 | |
694 | |
656 | int |
695 | int |
657 | rxvt_term::view_start (int newval = -1) |
696 | rxvt_term::view_start (int newval = -1) |
658 | CODE: |
697 | CODE: |
659 | { |
698 | { |
… | |
… | |
665 | THIS->scr_changeview (RETVAL); |
704 | THIS->scr_changeview (RETVAL); |
666 | } |
705 | } |
667 | } |
706 | } |
668 | OUTPUT: |
707 | OUTPUT: |
669 | RETVAL |
708 | RETVAL |
670 | |
|
|
671 | int |
|
|
672 | rxvt_term::nrow () |
|
|
673 | CODE: |
|
|
674 | RETVAL = THIS->nrow; |
|
|
675 | OUTPUT: |
|
|
676 | RETVAL |
|
|
677 | |
|
|
678 | int |
|
|
679 | rxvt_term::ncol () |
|
|
680 | CODE: |
|
|
681 | RETVAL = THIS->ncol; |
|
|
682 | OUTPUT: |
|
|
683 | RETVAL |
|
|
684 | |
709 | |
685 | void |
710 | void |
686 | rxvt_term::want_refresh () |
711 | rxvt_term::want_refresh () |
687 | CODE: |
712 | CODE: |
688 | THIS->want_refresh = 1; |
713 | THIS->want_refresh = 1; |
… | |
… | |
852 | THIS->rs [index] = 0; |
877 | THIS->rs [index] = 0; |
853 | } |
878 | } |
854 | } |
879 | } |
855 | |
880 | |
856 | void |
881 | void |
857 | rxvt_term::selection_mark (...) |
882 | rxvt_term::cur (...) |
858 | PROTOTYPE: $;$$ |
883 | PROTOTYPE: $;$$ |
859 | ALIAS: |
884 | ALIAS: |
|
|
885 | screen_cur = 0 |
860 | selection_beg = 1 |
886 | selection_beg = 1 |
861 | selection_end = 2 |
887 | selection_end = 2 |
|
|
888 | selection_mark = 3 |
862 | PPCODE: |
889 | PPCODE: |
863 | { |
890 | { |
864 | row_col_t &sel = ix == 1 ? THIS->selection.beg |
891 | row_col_t &rc = ix == 0 ? THIS->screen.cur |
|
|
892 | : ix == 1 ? THIS->selection.beg |
865 | : ix == 2 ? THIS->selection.end |
893 | : ix == 2 ? THIS->selection.end |
866 | : THIS->selection.mark; |
894 | : THIS->selection.mark; |
867 | |
895 | |
868 | if (GIMME_V != G_VOID) |
896 | if (GIMME_V != G_VOID) |
869 | { |
897 | { |
870 | EXTEND (SP, 2); |
898 | EXTEND (SP, 2); |
871 | PUSHs (sv_2mortal (newSViv (sel.row))); |
899 | PUSHs (sv_2mortal (newSViv (rc.row))); |
872 | PUSHs (sv_2mortal (newSViv (sel.col))); |
900 | PUSHs (sv_2mortal (newSViv (rc.col))); |
873 | } |
901 | } |
874 | |
902 | |
875 | if (items == 3) |
903 | if (items == 3) |
876 | { |
904 | { |
877 | sel.row = clamp (SvIV (ST (1)), -THIS->nsaved, THIS->nrow - 1); |
905 | rc.row = clamp (SvIV (ST (1)), -THIS->nsaved, THIS->nrow - 1); |
878 | sel.col = clamp (SvIV (ST (2)), 0, THIS->ncol - 1); |
906 | rc.col = clamp (SvIV (ST (2)), 0, THIS->ncol - 1); |
879 | |
907 | |
880 | if (ix) |
908 | if (ix) |
881 | THIS->want_refresh = 1; |
909 | THIS->want_refresh = 1; |
882 | } |
910 | } |
883 | } |
911 | } |
… | |
… | |
904 | |
932 | |
905 | THIS->selection.text = sv2wcs (newtext); |
933 | THIS->selection.text = sv2wcs (newtext); |
906 | THIS->selection.len = wcslen (THIS->selection.text); |
934 | THIS->selection.len = wcslen (THIS->selection.text); |
907 | } |
935 | } |
908 | } |
936 | } |
909 | |
937 | |
910 | void |
938 | void |
911 | rxvt_term::tt_write (SV *octets) |
939 | rxvt_term::tt_write (SV *octets) |
912 | INIT: |
940 | INIT: |
913 | STRLEN len; |
941 | STRLEN len; |
914 | char *str = SvPVbyte (octets, len); |
942 | char *str = SvPVbyte (octets, len); |
915 | C_ARGS: |
943 | C_ARGS: |
916 | (unsigned char *)str, len |
944 | str, len |
917 | |
945 | |
918 | SV * |
946 | SV * |
919 | rxvt_term::overlay (int x, int y, int w, int h, int rstyle = OVERLAY_RSTYLE, int border = 2) |
947 | rxvt_term::overlay (int x, int y, int w, int h, int rstyle = OVERLAY_RSTYLE, int border = 2) |
920 | CODE: |
948 | CODE: |
921 | { |
949 | { |