… | |
… | |
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 0 |
55 | #define ENABLE_PERL_FRILLS 1 |
56 | |
56 | |
57 | ///////////////////////////////////////////////////////////////////////////// |
57 | ///////////////////////////////////////////////////////////////////////////// |
58 | |
58 | |
59 | static SV * |
59 | static SV * |
60 | taint (SV *sv) |
60 | taint (SV *sv) |
… | |
… | |
349 | for (int y = ov_h; y--; ) |
349 | for (int y = ov_h; y--; ) |
350 | { |
350 | { |
351 | text_t *t1 = text [y]; |
351 | text_t *t1 = text [y]; |
352 | rend_t *r1 = rend [y]; |
352 | rend_t *r1 = rend [y]; |
353 | |
353 | |
354 | 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; |
355 | 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; |
356 | |
356 | |
357 | for (int x = ov_w; x--; ) |
357 | for (int x = ov_w; x--; ) |
358 | { |
358 | { |
359 | text_t t = *t1; *t1++ = *t2; *t2++ = t; |
359 | text_t t = *t1; *t1++ = *t2; *t2++ = t; |
360 | 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)); |
… | |
… | |
445 | if (THIS->perl.grabtime) |
445 | if (THIS->perl.grabtime) |
446 | { |
446 | { |
447 | XUngrabKeyboard (THIS->display->display, THIS->perl.grabtime); |
447 | XUngrabKeyboard (THIS->display->display, THIS->perl.grabtime); |
448 | XUngrabPointer (THIS->display->display, THIS->perl.grabtime); |
448 | XUngrabPointer (THIS->display->display, THIS->perl.grabtime); |
449 | 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 (); |
450 | } |
464 | } |
451 | } |
465 | } |
452 | |
466 | |
453 | bool |
467 | bool |
454 | rxvt_perl_interp::invoke (rxvt_term *term, hook_type htype, ...) |
468 | rxvt_perl_interp::invoke (rxvt_term *term, hook_type htype, ...) |
… | |
… | |
467 | { |
481 | { |
468 | // handled later |
482 | // handled later |
469 | } |
483 | } |
470 | else |
484 | else |
471 | { |
485 | { |
472 | 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]) |
473 | { |
490 | { |
474 | 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); |
475 | |
493 | |
476 | if (HvKEYS (hv)) |
494 | return false; |
477 | { |
|
|
478 | hv_iterinit (hv); |
|
|
479 | |
|
|
480 | while (HE *he = hv_iternext (hv)) |
|
|
481 | ((overlay *)SvIV (hv_iterval (hv, he)))->swap (); |
|
|
482 | } |
|
|
483 | |
|
|
484 | } |
495 | } |
485 | |
|
|
486 | if (!term->perl.should_invoke [htype]) |
|
|
487 | return false; |
|
|
488 | } |
496 | } |
489 | |
497 | |
490 | swap (perl_environ, environ); |
498 | swap (perl_environ, environ); |
491 | |
499 | |
492 | try |
500 | try |
… | |
… | |
613 | { |
621 | { |
614 | 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)); |
615 | ungrab (term); // better lose the grab than the session |
623 | ungrab (term); // better lose the grab than the session |
616 | } |
624 | } |
617 | |
625 | |
|
|
626 | if (htype == HOOK_REFRESH_BEGIN) |
|
|
627 | swap_overlays (term); |
618 | if (htype == HOOK_DESTROY) |
628 | else if (htype == HOOK_DESTROY) |
619 | { |
629 | { |
620 | clearSVptr ((SV *)term->perl.self); |
630 | clearSVptr ((SV *)term->perl.self); |
621 | SvREFCNT_dec ((SV *)term->perl.self); |
631 | SvREFCNT_dec ((SV *)term->perl.self); |
622 | } |
632 | } |
623 | |
633 | |
… | |
… | |
968 | RETVAL |
978 | RETVAL |
969 | |
979 | |
970 | void |
980 | void |
971 | rxvt_term::XReparentWindow (U32 window, U32 parent, int x = 0, int y = 0) |
981 | rxvt_term::XReparentWindow (U32 window, U32 parent, int x = 0, int y = 0) |
972 | CODE: |
982 | CODE: |
973 | XReparentWindow (THIS->display->display, window, parent, x, y); |
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); |
974 | |
994 | |
975 | #endif |
995 | #endif |
976 | |
996 | |
977 | void |
997 | void |
978 | rxvt_term::set_should_invoke (int htype, int inc) |
998 | rxvt_term::set_should_invoke (int htype, int inc) |
… | |
… | |
1089 | #define TERM_OFFSET_ncol TERM_OFFSET(ncol) |
1109 | #define TERM_OFFSET_ncol TERM_OFFSET(ncol) |
1090 | #define TERM_OFFSET_focus TERM_OFFSET(focus) |
1110 | #define TERM_OFFSET_focus TERM_OFFSET(focus) |
1091 | #define TERM_OFFSET_mapped TERM_OFFSET(mapped) |
1111 | #define TERM_OFFSET_mapped TERM_OFFSET(mapped) |
1092 | #define TERM_OFFSET_saveLines TERM_OFFSET(saveLines) |
1112 | #define TERM_OFFSET_saveLines TERM_OFFSET(saveLines) |
1093 | #define TERM_OFFSET_total_rows TERM_OFFSET(total_rows) |
1113 | #define TERM_OFFSET_total_rows TERM_OFFSET(total_rows) |
1094 | #define TERM_OFFSET_nsaved TERM_OFFSET(nsaved) |
1114 | #define TERM_OFFSET_top_row TERM_OFFSET(top_row) |
1095 | |
1115 | |
1096 | int |
1116 | int |
1097 | rxvt_term::width () |
1117 | rxvt_term::width () |
1098 | ALIAS: |
1118 | ALIAS: |
1099 | width = TERM_OFFSET_width |
1119 | width = TERM_OFFSET_width |
… | |
… | |
1105 | ncol = TERM_OFFSET_ncol |
1125 | ncol = TERM_OFFSET_ncol |
1106 | focus = TERM_OFFSET_focus |
1126 | focus = TERM_OFFSET_focus |
1107 | mapped = TERM_OFFSET_mapped |
1127 | mapped = TERM_OFFSET_mapped |
1108 | saveLines = TERM_OFFSET_saveLines |
1128 | saveLines = TERM_OFFSET_saveLines |
1109 | total_rows = TERM_OFFSET_total_rows |
1129 | total_rows = TERM_OFFSET_total_rows |
1110 | nsaved = TERM_OFFSET_nsaved |
1130 | top_row = TERM_OFFSET_top_row |
1111 | CODE: |
1131 | CODE: |
1112 | RETVAL = *(int *)((char *)THIS + ix); |
1132 | RETVAL = *(int *)((char *)THIS + ix); |
1113 | OUTPUT: |
1133 | OUTPUT: |
1114 | RETVAL |
1134 | RETVAL |
1115 | |
1135 | |
… | |
… | |
1199 | THIS->rstyle = new_rstyle; |
1219 | THIS->rstyle = new_rstyle; |
1200 | OUTPUT: |
1220 | OUTPUT: |
1201 | RETVAL |
1221 | RETVAL |
1202 | |
1222 | |
1203 | int |
1223 | int |
1204 | rxvt_term::view_start (int newval = -1) |
1224 | rxvt_term::view_start (int newval = 1) |
1205 | PROTOTYPE: $;$ |
1225 | PROTOTYPE: $;$ |
1206 | CODE: |
1226 | CODE: |
1207 | { |
1227 | { |
1208 | RETVAL = THIS->view_start; |
1228 | RETVAL = THIS->view_start; |
1209 | |
1229 | |
1210 | if (newval >= 0) |
1230 | if (newval <= 0) |
1211 | { |
1231 | THIS->scr_changeview (max (newval, THIS->top_row)); |
1212 | THIS->view_start = min (newval, THIS->nsaved); |
|
|
1213 | THIS->scr_changeview (RETVAL); |
|
|
1214 | } |
|
|
1215 | } |
1232 | } |
1216 | OUTPUT: |
1233 | OUTPUT: |
1217 | RETVAL |
1234 | RETVAL |
1218 | |
1235 | |
1219 | void |
1236 | void |
… | |
… | |
1223 | |
1240 | |
1224 | void |
1241 | void |
1225 | 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) |
1226 | PPCODE: |
1243 | PPCODE: |
1227 | { |
1244 | { |
1228 | if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) |
1245 | if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow)) |
1229 | XSRETURN_EMPTY; |
1246 | XSRETURN_EMPTY; |
1230 | |
1247 | |
1231 | line_t &l = ROW(row_number); |
1248 | line_t &l = ROW(row_number); |
1232 | |
1249 | |
1233 | if (GIMME_V != G_VOID) |
1250 | if (GIMME_V != G_VOID) |
… | |
… | |
1266 | |
1283 | |
1267 | void |
1284 | void |
1268 | 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) |
1269 | PPCODE: |
1286 | PPCODE: |
1270 | { |
1287 | { |
1271 | if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) |
1288 | if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow)) |
1272 | XSRETURN_EMPTY; |
1289 | XSRETURN_EMPTY; |
1273 | |
1290 | |
1274 | line_t &l = ROW(row_number); |
1291 | line_t &l = ROW(row_number); |
1275 | |
1292 | |
1276 | if (GIMME_V != G_VOID) |
1293 | if (GIMME_V != G_VOID) |
… | |
… | |
1306 | |
1323 | |
1307 | int |
1324 | int |
1308 | rxvt_term::ROW_l (int row_number, int new_length = -1) |
1325 | rxvt_term::ROW_l (int row_number, int new_length = -1) |
1309 | CODE: |
1326 | CODE: |
1310 | { |
1327 | { |
1311 | if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) |
1328 | if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow)) |
1312 | XSRETURN_EMPTY; |
1329 | XSRETURN_EMPTY; |
1313 | |
1330 | |
1314 | line_t &l = ROW(row_number); |
1331 | line_t &l = ROW(row_number); |
1315 | RETVAL = l.l; |
1332 | RETVAL = l.l; |
1316 | |
1333 | |
… | |
… | |
1322 | |
1339 | |
1323 | bool |
1340 | bool |
1324 | 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) |
1325 | CODE: |
1342 | CODE: |
1326 | { |
1343 | { |
1327 | if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) |
1344 | if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow)) |
1328 | XSRETURN_EMPTY; |
1345 | XSRETURN_EMPTY; |
1329 | |
1346 | |
1330 | line_t &l = ROW(row_number); |
1347 | line_t &l = ROW(row_number); |
1331 | RETVAL = l.is_longer (); |
1348 | RETVAL = l.is_longer (); |
1332 | |
1349 | |
… | |
… | |
1522 | PUSHs (sv_2mortal (newSViv (rc.col))); |
1539 | PUSHs (sv_2mortal (newSViv (rc.col))); |
1523 | } |
1540 | } |
1524 | |
1541 | |
1525 | if (items == 3) |
1542 | if (items == 3) |
1526 | { |
1543 | { |
1527 | rc.row = clamp (SvIV (ST (1)), -THIS->nsaved, THIS->nrow - 1); |
1544 | rc.row = clamp (SvIV (ST (1)), THIS->top_row, THIS->nrow - 1); |
1528 | rc.col = clamp (SvIV (ST (2)), 0, THIS->ncol - 1); |
1545 | rc.col = clamp (SvIV (ST (2)), 0, THIS->ncol - 1); |
1529 | |
1546 | |
1530 | if (ix) |
1547 | if (ix) |
1531 | THIS->want_refresh = 1; |
1548 | THIS->want_refresh = 1; |
1532 | } |
1549 | } |