… | |
… | |
50 | #undef LINENO |
50 | #undef LINENO |
51 | #define LINENO(n) MOD (THIS->term_start + int(n), THIS->total_rows) |
51 | #define LINENO(n) MOD (THIS->term_start + int(n), THIS->total_rows) |
52 | #undef ROW |
52 | #undef ROW |
53 | #define ROW(n) THIS->row_buf [LINENO (n)] |
53 | #define ROW(n) THIS->row_buf [LINENO (n)] |
54 | |
54 | |
|
|
55 | #define ENABLE_PERL_FRILLS 1 |
|
|
56 | |
55 | ///////////////////////////////////////////////////////////////////////////// |
57 | ///////////////////////////////////////////////////////////////////////////// |
56 | |
58 | |
57 | static SV * |
59 | static SV * |
58 | taint (SV *sv) |
60 | taint (SV *sv) |
59 | { |
61 | { |
… | |
… | |
347 | for (int y = ov_h; y--; ) |
349 | for (int y = ov_h; y--; ) |
348 | { |
350 | { |
349 | text_t *t1 = text [y]; |
351 | text_t *t1 = text [y]; |
350 | rend_t *r1 = rend [y]; |
352 | rend_t *r1 = rend [y]; |
351 | |
353 | |
352 | text_t *t2 = ROW(y + ov_y - THIS->view_start).t + ov_x; |
354 | text_t *t2 = ROW(y + ov_y + THIS->view_start).t + ov_x; |
353 | rend_t *r2 = ROW(y + ov_y - THIS->view_start).r + ov_x; |
355 | rend_t *r2 = ROW(y + ov_y + THIS->view_start).r + ov_x; |
354 | |
356 | |
355 | for (int x = ov_w; x--; ) |
357 | for (int x = ov_w; x--; ) |
356 | { |
358 | { |
357 | text_t t = *t1; *t1++ = *t2; *t2++ = t; |
359 | text_t t = *t1; *t1++ = *t2; *t2++ = t; |
358 | rend_t r = *r1; *r1++ = *r2; *r2++ = SET_FONT (r, THIS->fontset [GET_STYLE (r)]->find_font (t)); |
360 | rend_t r = *r1; *r1++ = *r2; *r2++ = SET_FONT (r, THIS->fontset [GET_STYLE (r)]->find_font (t)); |
… | |
… | |
443 | if (THIS->perl.grabtime) |
445 | if (THIS->perl.grabtime) |
444 | { |
446 | { |
445 | XUngrabKeyboard (THIS->display->display, THIS->perl.grabtime); |
447 | XUngrabKeyboard (THIS->display->display, THIS->perl.grabtime); |
446 | XUngrabPointer (THIS->display->display, THIS->perl.grabtime); |
448 | XUngrabPointer (THIS->display->display, THIS->perl.grabtime); |
447 | THIS->perl.grabtime = 0; |
449 | THIS->perl.grabtime = 0; |
|
|
450 | } |
|
|
451 | } |
|
|
452 | |
|
|
453 | static void |
|
|
454 | swap_overlays (rxvt_term *term) |
|
|
455 | { |
|
|
456 | HV *hv = (HV *)SvRV (*hv_fetch ((HV *)SvRV ((SV *)term->perl.self), "_overlay", 8, 0)); |
|
|
457 | |
|
|
458 | if (HvKEYS (hv)) |
|
|
459 | { |
|
|
460 | hv_iterinit (hv); |
|
|
461 | |
|
|
462 | while (HE *he = hv_iternext (hv)) |
|
|
463 | ((overlay *)SvIV (hv_iterval (hv, he)))->swap (); |
448 | } |
464 | } |
449 | } |
465 | } |
450 | |
466 | |
451 | bool |
467 | bool |
452 | rxvt_perl_interp::invoke (rxvt_term *term, hook_type htype, ...) |
468 | rxvt_perl_interp::invoke (rxvt_term *term, hook_type htype, ...) |
… | |
… | |
465 | { |
481 | { |
466 | // handled later |
482 | // handled later |
467 | } |
483 | } |
468 | else |
484 | else |
469 | { |
485 | { |
470 | if (htype == HOOK_REFRESH_BEGIN || htype == HOOK_REFRESH_END) |
486 | if (htype == HOOK_REFRESH_END) |
|
|
487 | swap_overlays (term); |
|
|
488 | |
|
|
489 | if (!term->perl.should_invoke [htype]) |
471 | { |
490 | { |
472 | HV *hv = (HV *)SvRV (*hv_fetch ((HV *)SvRV ((SV *)term->perl.self), "_overlay", 8, 0)); |
491 | if (htype == HOOK_REFRESH_BEGIN) |
|
|
492 | swap_overlays (term); |
473 | |
493 | |
474 | if (HvKEYS (hv)) |
494 | return false; |
475 | { |
|
|
476 | hv_iterinit (hv); |
|
|
477 | |
|
|
478 | while (HE *he = hv_iternext (hv)) |
|
|
479 | ((overlay *)SvIV (hv_iterval (hv, he)))->swap (); |
|
|
480 | } |
|
|
481 | |
|
|
482 | } |
495 | } |
483 | |
|
|
484 | if (!should_invoke [htype]) |
|
|
485 | return false; |
|
|
486 | } |
496 | } |
487 | |
497 | |
488 | swap (perl_environ, environ); |
498 | swap (perl_environ, environ); |
489 | |
499 | |
490 | try |
500 | try |
… | |
… | |
611 | { |
621 | { |
612 | rxvt_warn ("perl hook %d evaluation error: %s", htype, SvPV_nolen (ERRSV)); |
622 | rxvt_warn ("perl hook %d evaluation error: %s", htype, SvPV_nolen (ERRSV)); |
613 | ungrab (term); // better lose the grab than the session |
623 | ungrab (term); // better lose the grab than the session |
614 | } |
624 | } |
615 | |
625 | |
|
|
626 | if (htype == HOOK_REFRESH_BEGIN) |
|
|
627 | swap_overlays (term); |
616 | if (htype == HOOK_DESTROY) |
628 | else if (htype == HOOK_DESTROY) |
617 | { |
629 | { |
618 | clearSVptr ((SV *)term->perl.self); |
630 | clearSVptr ((SV *)term->perl.self); |
619 | SvREFCNT_dec ((SV *)term->perl.self); |
631 | SvREFCNT_dec ((SV *)term->perl.self); |
620 | } |
632 | } |
621 | |
633 | |
… | |
… | |
659 | # include "optinc.h" |
671 | # include "optinc.h" |
660 | # undef nodef |
672 | # undef nodef |
661 | # undef def |
673 | # undef def |
662 | |
674 | |
663 | HV *stash = gv_stashpv ("urxvt", 1); |
675 | HV *stash = gv_stashpv ("urxvt", 1); |
664 | # define export_const_iv(name) newCONSTSUB (stash, # name, newSViv (name)); |
676 | struct { |
|
|
677 | const char *name; |
|
|
678 | IV iv; |
|
|
679 | } *civ, const_iv[] = { |
|
|
680 | # define const_iv(name) { # name, (IV)name } |
665 | export_const_iv (DEFAULT_RSTYLE); |
681 | const_iv (DEFAULT_RSTYLE), |
666 | export_const_iv (OVERLAY_RSTYLE); |
682 | const_iv (OVERLAY_RSTYLE), |
667 | export_const_iv (RS_Bold); |
683 | const_iv (RS_Bold), |
668 | export_const_iv (RS_Italic); |
684 | const_iv (RS_Italic), |
669 | export_const_iv (RS_Blink); |
685 | const_iv (RS_Blink), |
670 | export_const_iv (RS_RVid); |
686 | const_iv (RS_RVid), |
671 | export_const_iv (RS_Uline); |
687 | const_iv (RS_Uline), |
672 | |
688 | |
673 | export_const_iv (CurrentTime); |
689 | const_iv (CurrentTime), |
674 | export_const_iv (ShiftMask); |
690 | const_iv (ShiftMask), |
675 | export_const_iv (LockMask); |
691 | const_iv (LockMask), |
676 | export_const_iv (ControlMask); |
692 | const_iv (ControlMask), |
677 | export_const_iv (Mod1Mask); |
693 | const_iv (Mod1Mask), |
678 | export_const_iv (Mod2Mask); |
694 | const_iv (Mod2Mask), |
679 | export_const_iv (Mod3Mask); |
695 | const_iv (Mod3Mask), |
680 | export_const_iv (Mod4Mask); |
696 | const_iv (Mod4Mask), |
681 | export_const_iv (Mod5Mask); |
697 | const_iv (Mod5Mask), |
682 | export_const_iv (Button1Mask); |
698 | const_iv (Button1Mask), |
683 | export_const_iv (Button2Mask); |
699 | const_iv (Button2Mask), |
684 | export_const_iv (Button3Mask); |
700 | const_iv (Button3Mask), |
685 | export_const_iv (Button4Mask); |
701 | const_iv (Button4Mask), |
686 | export_const_iv (Button5Mask); |
702 | const_iv (Button5Mask), |
687 | export_const_iv (AnyModifier); |
703 | const_iv (AnyModifier), |
688 | |
704 | |
689 | export_const_iv (EVENT_NONE); |
705 | const_iv (EVENT_NONE), |
690 | export_const_iv (EVENT_READ); |
706 | const_iv (EVENT_READ), |
691 | export_const_iv (EVENT_WRITE); |
707 | const_iv (EVENT_WRITE), |
692 | } |
|
|
693 | |
708 | |
694 | void |
709 | const_iv (NoEventMask), |
695 | set_should_invoke (int htype, int value) |
710 | const_iv (KeyPressMask), |
696 | CODE: |
711 | const_iv (KeyReleaseMask), |
697 | rxvt_perl.should_invoke [htype] = value; |
712 | const_iv (ButtonPressMask), |
|
|
713 | const_iv (ButtonReleaseMask), |
|
|
714 | const_iv (EnterWindowMask), |
|
|
715 | const_iv (LeaveWindowMask), |
|
|
716 | const_iv (PointerMotionMask), |
|
|
717 | const_iv (PointerMotionHintMask), |
|
|
718 | const_iv (Button1MotionMask), |
|
|
719 | const_iv (Button2MotionMask), |
|
|
720 | const_iv (Button3MotionMask), |
|
|
721 | const_iv (Button4MotionMask), |
|
|
722 | const_iv (Button5MotionMask), |
|
|
723 | const_iv (ButtonMotionMask), |
|
|
724 | const_iv (KeymapStateMask), |
|
|
725 | const_iv (ExposureMask), |
|
|
726 | const_iv (VisibilityChangeMask), |
|
|
727 | const_iv (StructureNotifyMask), |
|
|
728 | const_iv (ResizeRedirectMask), |
|
|
729 | const_iv (SubstructureNotifyMask), |
|
|
730 | const_iv (SubstructureRedirectMask), |
|
|
731 | const_iv (FocusChangeMask), |
|
|
732 | const_iv (PropertyChangeMask), |
|
|
733 | const_iv (ColormapChangeMask), |
|
|
734 | const_iv (OwnerGrabButtonMask), |
|
|
735 | |
|
|
736 | const_iv (KeyPress), |
|
|
737 | const_iv (KeyRelease), |
|
|
738 | const_iv (ButtonPress), |
|
|
739 | const_iv (ButtonRelease), |
|
|
740 | const_iv (MotionNotify), |
|
|
741 | const_iv (EnterNotify), |
|
|
742 | const_iv (LeaveNotify), |
|
|
743 | const_iv (FocusIn), |
|
|
744 | const_iv (FocusOut), |
|
|
745 | const_iv (KeymapNotify), |
|
|
746 | const_iv (Expose), |
|
|
747 | const_iv (GraphicsExpose), |
|
|
748 | const_iv (NoExpose), |
|
|
749 | const_iv (VisibilityNotify), |
|
|
750 | const_iv (CreateNotify), |
|
|
751 | const_iv (DestroyNotify), |
|
|
752 | const_iv (UnmapNotify), |
|
|
753 | const_iv (MapNotify), |
|
|
754 | const_iv (MapRequest), |
|
|
755 | const_iv (ReparentNotify), |
|
|
756 | const_iv (ConfigureNotify), |
|
|
757 | const_iv (ConfigureRequest), |
|
|
758 | const_iv (GravityNotify), |
|
|
759 | const_iv (ResizeRequest), |
|
|
760 | const_iv (CirculateNotify), |
|
|
761 | const_iv (CirculateRequest), |
|
|
762 | const_iv (PropertyNotify), |
|
|
763 | const_iv (SelectionClear), |
|
|
764 | const_iv (SelectionRequest), |
|
|
765 | const_iv (SelectionNotify), |
|
|
766 | const_iv (ColormapNotify), |
|
|
767 | const_iv (ClientMessage), |
|
|
768 | const_iv (MappingNotify), |
|
|
769 | }; |
|
|
770 | |
|
|
771 | for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); |
|
|
772 | civ-- > const_iv; ) |
|
|
773 | newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); |
|
|
774 | } |
698 | |
775 | |
699 | void |
776 | void |
700 | warn (const char *msg) |
777 | warn (const char *msg) |
701 | CODE: |
778 | CODE: |
702 | rxvt_warn ("%s", msg); |
779 | rxvt_warn ("%s", msg); |
… | |
… | |
825 | OUTPUT: |
902 | OUTPUT: |
826 | RETVAL |
903 | RETVAL |
827 | |
904 | |
828 | void |
905 | void |
829 | rxvt_term::destroy () |
906 | rxvt_term::destroy () |
|
|
907 | |
|
|
908 | #if ENABLE_PERL_FRILLS |
|
|
909 | |
|
|
910 | void |
|
|
911 | rxvt_term::XListProperties (U32 window) |
|
|
912 | PPCODE: |
|
|
913 | { |
|
|
914 | int count; |
|
|
915 | Atom *props = XListProperties (THIS->display->display, (Window)window, &count); |
|
|
916 | |
|
|
917 | EXTEND (SP, count); |
|
|
918 | while (count--) |
|
|
919 | PUSHs (newSVuv ((U32)props [count])); |
|
|
920 | |
|
|
921 | XFree (props); |
|
|
922 | } |
|
|
923 | |
|
|
924 | void |
|
|
925 | rxvt_term::XGetWindowProperty (U32 window, U32 property) |
|
|
926 | PPCODE: |
|
|
927 | { |
|
|
928 | Atom type; |
|
|
929 | int format; |
|
|
930 | unsigned long nitems; |
|
|
931 | unsigned long bytes_after; |
|
|
932 | unsigned char *prop; |
|
|
933 | XGetWindowProperty (THIS->display->display, (Window)window, (Atom)property, |
|
|
934 | 0, 1<<30, 0, AnyPropertyType, |
|
|
935 | &type, &format, &nitems, &bytes_after, &prop); |
|
|
936 | if (type != None) |
|
|
937 | { |
|
|
938 | EXTEND (SP, 3); |
|
|
939 | PUSHs (newSVuv ((U32)type)); |
|
|
940 | PUSHs (newSViv (format)); |
|
|
941 | PUSHs (newSVpvn ((char *)prop, nitems * format / 8)); |
|
|
942 | XFree (prop); |
|
|
943 | } |
|
|
944 | } |
|
|
945 | |
|
|
946 | void |
|
|
947 | rxvt_term::XChangeWindowProperty (U32 window, U32 property, U32 type, int format, SV *data) |
|
|
948 | CODE: |
|
|
949 | { |
|
|
950 | STRLEN len; |
|
|
951 | char *data_ = SvPVbyte (data, len); |
|
|
952 | |
|
|
953 | XChangeProperty (THIS->display->display, (Window)window, (Atom)property, |
|
|
954 | type, format, PropModeReplace, |
|
|
955 | (unsigned char *)data, len * 8 / format); |
|
|
956 | } |
|
|
957 | |
|
|
958 | void |
|
|
959 | rxvt_term::XDeleteProperty (U32 window, U32 property) |
|
|
960 | CODE: |
|
|
961 | XDeleteProperty (THIS->display->display, (Window)window, (Atom)property); |
|
|
962 | |
|
|
963 | U32 |
|
|
964 | rxvt_term::DefaultRootWindow () |
|
|
965 | CODE: |
|
|
966 | RETVAL = (U32)THIS->display->root; |
|
|
967 | OUTPUT: |
|
|
968 | RETVAL |
|
|
969 | |
|
|
970 | U32 |
|
|
971 | rxvt_term::XCreateSimpleWindow (U32 parent, int x, int y, unsigned int width, unsigned int height) |
|
|
972 | CODE: |
|
|
973 | RETVAL = XCreateSimpleWindow (THIS->display->display, (Window)parent, |
|
|
974 | x, y, width, height, 0, |
|
|
975 | THIS->pix_colors_focused[Color_border], |
|
|
976 | THIS->pix_colors_focused[Color_border]); |
|
|
977 | OUTPUT: |
|
|
978 | RETVAL |
|
|
979 | |
|
|
980 | void |
|
|
981 | rxvt_term::XReparentWindow (U32 window, U32 parent, int x = 0, int y = 0) |
|
|
982 | CODE: |
|
|
983 | XReparentWindow (THIS->display->display, (Window)window, (Window)parent, x, y); |
|
|
984 | |
|
|
985 | void |
|
|
986 | rxvt_term::XMapWindow (U32 window) |
|
|
987 | CODE: |
|
|
988 | XMapWindow (THIS->display->display, (Window)window); |
|
|
989 | |
|
|
990 | void |
|
|
991 | rxvt_term::XUnmapWindow (U32 window) |
|
|
992 | CODE: |
|
|
993 | XUnmapWindow (THIS->display->display, (Window)window); |
|
|
994 | |
|
|
995 | #endif |
|
|
996 | |
|
|
997 | void |
|
|
998 | rxvt_term::set_should_invoke (int htype, int inc) |
|
|
999 | CODE: |
|
|
1000 | THIS->perl.should_invoke [htype] += inc; |
830 | |
1001 | |
831 | void |
1002 | void |
832 | rxvt_term::grab_button (int button, U32 modifiers) |
1003 | rxvt_term::grab_button (int button, U32 modifiers) |
833 | CODE: |
1004 | CODE: |
834 | XGrabButton (THIS->display->display, button, modifiers, THIS->vt, 1, |
1005 | XGrabButton (THIS->display->display, button, modifiers, THIS->vt, 1, |
… | |
… | |
938 | #define TERM_OFFSET_ncol TERM_OFFSET(ncol) |
1109 | #define TERM_OFFSET_ncol TERM_OFFSET(ncol) |
939 | #define TERM_OFFSET_focus TERM_OFFSET(focus) |
1110 | #define TERM_OFFSET_focus TERM_OFFSET(focus) |
940 | #define TERM_OFFSET_mapped TERM_OFFSET(mapped) |
1111 | #define TERM_OFFSET_mapped TERM_OFFSET(mapped) |
941 | #define TERM_OFFSET_saveLines TERM_OFFSET(saveLines) |
1112 | #define TERM_OFFSET_saveLines TERM_OFFSET(saveLines) |
942 | #define TERM_OFFSET_total_rows TERM_OFFSET(total_rows) |
1113 | #define TERM_OFFSET_total_rows TERM_OFFSET(total_rows) |
943 | #define TERM_OFFSET_nsaved TERM_OFFSET(nsaved) |
1114 | #define TERM_OFFSET_top_row TERM_OFFSET(top_row) |
944 | |
1115 | |
945 | int |
1116 | int |
946 | rxvt_term::width () |
1117 | rxvt_term::width () |
947 | ALIAS: |
1118 | ALIAS: |
948 | width = TERM_OFFSET_width |
1119 | width = TERM_OFFSET_width |
… | |
… | |
954 | ncol = TERM_OFFSET_ncol |
1125 | ncol = TERM_OFFSET_ncol |
955 | focus = TERM_OFFSET_focus |
1126 | focus = TERM_OFFSET_focus |
956 | mapped = TERM_OFFSET_mapped |
1127 | mapped = TERM_OFFSET_mapped |
957 | saveLines = TERM_OFFSET_saveLines |
1128 | saveLines = TERM_OFFSET_saveLines |
958 | total_rows = TERM_OFFSET_total_rows |
1129 | total_rows = TERM_OFFSET_total_rows |
959 | nsaved = TERM_OFFSET_nsaved |
1130 | top_row = TERM_OFFSET_top_row |
960 | CODE: |
1131 | CODE: |
961 | RETVAL = *(int *)((char *)THIS + ix); |
1132 | RETVAL = *(int *)((char *)THIS + ix); |
962 | OUTPUT: |
1133 | OUTPUT: |
963 | RETVAL |
1134 | RETVAL |
964 | |
1135 | |
… | |
… | |
1033 | CODE: |
1204 | CODE: |
1034 | RETVAL = (U32)THIS->vt; |
1205 | RETVAL = (U32)THIS->vt; |
1035 | OUTPUT: |
1206 | OUTPUT: |
1036 | RETVAL |
1207 | RETVAL |
1037 | |
1208 | |
|
|
1209 | void |
|
|
1210 | rxvt_term::vt_emask_add (U32 emask) |
|
|
1211 | CODE: |
|
|
1212 | THIS->vt_emask_perl |= emask; |
|
|
1213 | THIS->vt_select_input (); |
|
|
1214 | |
1038 | U32 |
1215 | U32 |
1039 | rxvt_term::rstyle (U32 new_rstyle = THIS->rstyle) |
1216 | rxvt_term::rstyle (U32 new_rstyle = THIS->rstyle) |
1040 | CODE: |
1217 | CODE: |
1041 | { |
|
|
1042 | RETVAL = THIS->rstyle; |
1218 | RETVAL = THIS->rstyle; |
1043 | THIS->rstyle = new_rstyle; |
1219 | THIS->rstyle = new_rstyle; |
1044 | } |
|
|
1045 | OUTPUT: |
1220 | OUTPUT: |
1046 | RETVAL |
1221 | RETVAL |
1047 | |
1222 | |
1048 | int |
1223 | int |
1049 | rxvt_term::view_start (int newval = -1) |
1224 | rxvt_term::view_start (int newval = 1) |
|
|
1225 | PROTOTYPE: $;$ |
1050 | CODE: |
1226 | CODE: |
1051 | { |
1227 | { |
1052 | RETVAL = THIS->view_start; |
1228 | RETVAL = THIS->view_start; |
1053 | |
1229 | |
1054 | if (newval >= 0) |
1230 | if (newval <= 0) |
1055 | { |
1231 | THIS->scr_changeview (max (newval, THIS->top_row)); |
1056 | THIS->view_start = min (newval, THIS->nsaved); |
|
|
1057 | THIS->scr_changeview (RETVAL); |
|
|
1058 | } |
|
|
1059 | } |
1232 | } |
1060 | OUTPUT: |
1233 | OUTPUT: |
1061 | RETVAL |
1234 | RETVAL |
1062 | |
1235 | |
1063 | void |
1236 | void |
… | |
… | |
1067 | |
1240 | |
1068 | void |
1241 | void |
1069 | rxvt_term::ROW_t (int row_number, SV *new_text = 0, int start_col = 0, int start_ofs = 0, int max_len = MAX_COLS) |
1242 | rxvt_term::ROW_t (int row_number, SV *new_text = 0, int start_col = 0, int start_ofs = 0, int max_len = MAX_COLS) |
1070 | PPCODE: |
1243 | PPCODE: |
1071 | { |
1244 | { |
1072 | if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) |
1245 | if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow)) |
1073 | XSRETURN_EMPTY; |
1246 | XSRETURN_EMPTY; |
1074 | |
1247 | |
1075 | line_t &l = ROW(row_number); |
1248 | line_t &l = ROW(row_number); |
1076 | |
1249 | |
1077 | if (GIMME_V != G_VOID) |
1250 | if (GIMME_V != G_VOID) |
… | |
… | |
1110 | |
1283 | |
1111 | void |
1284 | void |
1112 | rxvt_term::ROW_r (int row_number, SV *new_rend = 0, int start_col = 0, int start_ofs = 0, int max_len = MAX_COLS) |
1285 | rxvt_term::ROW_r (int row_number, SV *new_rend = 0, int start_col = 0, int start_ofs = 0, int max_len = MAX_COLS) |
1113 | PPCODE: |
1286 | PPCODE: |
1114 | { |
1287 | { |
1115 | if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) |
1288 | if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow)) |
1116 | XSRETURN_EMPTY; |
1289 | XSRETURN_EMPTY; |
1117 | |
1290 | |
1118 | line_t &l = ROW(row_number); |
1291 | line_t &l = ROW(row_number); |
1119 | |
1292 | |
1120 | if (GIMME_V != G_VOID) |
1293 | if (GIMME_V != G_VOID) |
… | |
… | |
1150 | |
1323 | |
1151 | int |
1324 | int |
1152 | rxvt_term::ROW_l (int row_number, int new_length = -1) |
1325 | rxvt_term::ROW_l (int row_number, int new_length = -1) |
1153 | CODE: |
1326 | CODE: |
1154 | { |
1327 | { |
1155 | if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) |
1328 | if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow)) |
1156 | XSRETURN_EMPTY; |
1329 | XSRETURN_EMPTY; |
1157 | |
1330 | |
1158 | line_t &l = ROW(row_number); |
1331 | line_t &l = ROW(row_number); |
1159 | RETVAL = l.l; |
1332 | RETVAL = l.l; |
1160 | |
1333 | |
… | |
… | |
1166 | |
1339 | |
1167 | bool |
1340 | bool |
1168 | rxvt_term::ROW_is_longer (int row_number, int new_is_longer = -1) |
1341 | rxvt_term::ROW_is_longer (int row_number, int new_is_longer = -1) |
1169 | CODE: |
1342 | CODE: |
1170 | { |
1343 | { |
1171 | if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) |
1344 | if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow)) |
1172 | XSRETURN_EMPTY; |
1345 | XSRETURN_EMPTY; |
1173 | |
1346 | |
1174 | line_t &l = ROW(row_number); |
1347 | line_t &l = ROW(row_number); |
1175 | RETVAL = l.is_longer (); |
1348 | RETVAL = l.is_longer (); |
1176 | |
1349 | |
… | |
… | |
1366 | PUSHs (sv_2mortal (newSViv (rc.col))); |
1539 | PUSHs (sv_2mortal (newSViv (rc.col))); |
1367 | } |
1540 | } |
1368 | |
1541 | |
1369 | if (items == 3) |
1542 | if (items == 3) |
1370 | { |
1543 | { |
1371 | rc.row = clamp (SvIV (ST (1)), -THIS->nsaved, THIS->nrow - 1); |
1544 | rc.row = clamp (SvIV (ST (1)), THIS->top_row, THIS->nrow - 1); |
1372 | rc.col = clamp (SvIV (ST (2)), 0, THIS->ncol - 1); |
1545 | rc.col = clamp (SvIV (ST (2)), 0, THIS->ncol - 1); |
1373 | |
1546 | |
1374 | if (ix) |
1547 | if (ix) |
1375 | THIS->want_refresh = 1; |
1548 | THIS->want_refresh = 1; |
1376 | } |
1549 | } |