… | |
… | |
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 | |
… | |
… | |
1099 | #define TERM_OFFSET_ncol TERM_OFFSET(ncol) |
1109 | #define TERM_OFFSET_ncol TERM_OFFSET(ncol) |
1100 | #define TERM_OFFSET_focus TERM_OFFSET(focus) |
1110 | #define TERM_OFFSET_focus TERM_OFFSET(focus) |
1101 | #define TERM_OFFSET_mapped TERM_OFFSET(mapped) |
1111 | #define TERM_OFFSET_mapped TERM_OFFSET(mapped) |
1102 | #define TERM_OFFSET_saveLines TERM_OFFSET(saveLines) |
1112 | #define TERM_OFFSET_saveLines TERM_OFFSET(saveLines) |
1103 | #define TERM_OFFSET_total_rows TERM_OFFSET(total_rows) |
1113 | #define TERM_OFFSET_total_rows TERM_OFFSET(total_rows) |
1104 | #define TERM_OFFSET_nsaved TERM_OFFSET(nsaved) |
1114 | #define TERM_OFFSET_top_row TERM_OFFSET(top_row) |
1105 | |
1115 | |
1106 | int |
1116 | int |
1107 | rxvt_term::width () |
1117 | rxvt_term::width () |
1108 | ALIAS: |
1118 | ALIAS: |
1109 | width = TERM_OFFSET_width |
1119 | width = TERM_OFFSET_width |
… | |
… | |
1115 | ncol = TERM_OFFSET_ncol |
1125 | ncol = TERM_OFFSET_ncol |
1116 | focus = TERM_OFFSET_focus |
1126 | focus = TERM_OFFSET_focus |
1117 | mapped = TERM_OFFSET_mapped |
1127 | mapped = TERM_OFFSET_mapped |
1118 | saveLines = TERM_OFFSET_saveLines |
1128 | saveLines = TERM_OFFSET_saveLines |
1119 | total_rows = TERM_OFFSET_total_rows |
1129 | total_rows = TERM_OFFSET_total_rows |
1120 | nsaved = TERM_OFFSET_nsaved |
1130 | top_row = TERM_OFFSET_top_row |
1121 | CODE: |
1131 | CODE: |
1122 | RETVAL = *(int *)((char *)THIS + ix); |
1132 | RETVAL = *(int *)((char *)THIS + ix); |
1123 | OUTPUT: |
1133 | OUTPUT: |
1124 | RETVAL |
1134 | RETVAL |
1125 | |
1135 | |
… | |
… | |
1209 | THIS->rstyle = new_rstyle; |
1219 | THIS->rstyle = new_rstyle; |
1210 | OUTPUT: |
1220 | OUTPUT: |
1211 | RETVAL |
1221 | RETVAL |
1212 | |
1222 | |
1213 | int |
1223 | int |
1214 | rxvt_term::view_start (int newval = -1) |
1224 | rxvt_term::view_start (int newval = 1) |
1215 | PROTOTYPE: $;$ |
1225 | PROTOTYPE: $;$ |
1216 | CODE: |
1226 | CODE: |
1217 | { |
1227 | { |
1218 | RETVAL = THIS->view_start; |
1228 | RETVAL = THIS->view_start; |
1219 | |
1229 | |
1220 | if (newval >= 0) |
1230 | if (newval <= 0) |
1221 | { |
1231 | THIS->scr_changeview (max (newval, THIS->top_row)); |
1222 | THIS->view_start = min (newval, THIS->nsaved); |
|
|
1223 | THIS->scr_changeview (RETVAL); |
|
|
1224 | } |
|
|
1225 | } |
1232 | } |
1226 | OUTPUT: |
1233 | OUTPUT: |
1227 | RETVAL |
1234 | RETVAL |
1228 | |
1235 | |
1229 | void |
1236 | void |
… | |
… | |
1233 | |
1240 | |
1234 | void |
1241 | void |
1235 | 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) |
1236 | PPCODE: |
1243 | PPCODE: |
1237 | { |
1244 | { |
1238 | if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) |
1245 | if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow)) |
1239 | XSRETURN_EMPTY; |
1246 | XSRETURN_EMPTY; |
1240 | |
1247 | |
1241 | line_t &l = ROW(row_number); |
1248 | line_t &l = ROW(row_number); |
1242 | |
1249 | |
1243 | if (GIMME_V != G_VOID) |
1250 | if (GIMME_V != G_VOID) |
… | |
… | |
1276 | |
1283 | |
1277 | void |
1284 | void |
1278 | 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) |
1279 | PPCODE: |
1286 | PPCODE: |
1280 | { |
1287 | { |
1281 | if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) |
1288 | if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow)) |
1282 | XSRETURN_EMPTY; |
1289 | XSRETURN_EMPTY; |
1283 | |
1290 | |
1284 | line_t &l = ROW(row_number); |
1291 | line_t &l = ROW(row_number); |
1285 | |
1292 | |
1286 | if (GIMME_V != G_VOID) |
1293 | if (GIMME_V != G_VOID) |
… | |
… | |
1316 | |
1323 | |
1317 | int |
1324 | int |
1318 | rxvt_term::ROW_l (int row_number, int new_length = -1) |
1325 | rxvt_term::ROW_l (int row_number, int new_length = -1) |
1319 | CODE: |
1326 | CODE: |
1320 | { |
1327 | { |
1321 | if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) |
1328 | if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow)) |
1322 | XSRETURN_EMPTY; |
1329 | XSRETURN_EMPTY; |
1323 | |
1330 | |
1324 | line_t &l = ROW(row_number); |
1331 | line_t &l = ROW(row_number); |
1325 | RETVAL = l.l; |
1332 | RETVAL = l.l; |
1326 | |
1333 | |
… | |
… | |
1332 | |
1339 | |
1333 | bool |
1340 | bool |
1334 | 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) |
1335 | CODE: |
1342 | CODE: |
1336 | { |
1343 | { |
1337 | if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) |
1344 | if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow)) |
1338 | XSRETURN_EMPTY; |
1345 | XSRETURN_EMPTY; |
1339 | |
1346 | |
1340 | line_t &l = ROW(row_number); |
1347 | line_t &l = ROW(row_number); |
1341 | RETVAL = l.is_longer (); |
1348 | RETVAL = l.is_longer (); |
1342 | |
1349 | |
… | |
… | |
1532 | PUSHs (sv_2mortal (newSViv (rc.col))); |
1539 | PUSHs (sv_2mortal (newSViv (rc.col))); |
1533 | } |
1540 | } |
1534 | |
1541 | |
1535 | if (items == 3) |
1542 | if (items == 3) |
1536 | { |
1543 | { |
1537 | rc.row = clamp (SvIV (ST (1)), -THIS->nsaved, THIS->nrow - 1); |
1544 | rc.row = clamp (SvIV (ST (1)), THIS->top_row, THIS->nrow - 1); |
1538 | rc.col = clamp (SvIV (ST (2)), 0, THIS->ncol - 1); |
1545 | rc.col = clamp (SvIV (ST (2)), 0, THIS->ncol - 1); |
1539 | |
1546 | |
1540 | if (ix) |
1547 | if (ix) |
1541 | THIS->want_refresh = 1; |
1548 | THIS->want_refresh = 1; |
1542 | } |
1549 | } |