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

Comparing rxvt-unicode/src/rxvtperl.xs (file contents):
Revision 1.57 by root, Thu Jan 12 01:30:53 2006 UTC vs.
Revision 1.67 by root, Sun Jan 15 06:02:41 2006 UTC

29#include "../config.h" 29#include "../config.h"
30 30
31#include <cstddef> 31#include <cstddef>
32#include <cstdarg> 32#include <cstdarg>
33 33
34#include "unistd.h"
35
34#include "iom.h" 36#include "iom.h"
35#include "rxvt.h" 37#include "rxvt.h"
36#include "keyboard.h" 38#include "keyboard.h"
37#include "rxvtutil.h" 39#include "rxvtutil.h"
38#include "rxvtperl.h" 40#include "rxvtperl.h"
47 49
48#undef LINENO 50#undef LINENO
49#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)
50#undef ROW 52#undef ROW
51#define ROW(n) THIS->row_buf [LINENO (n)] 53#define ROW(n) THIS->row_buf [LINENO (n)]
54
55#define ENABLE_PERL_FRILLS 1
52 56
53///////////////////////////////////////////////////////////////////////////// 57/////////////////////////////////////////////////////////////////////////////
54 58
55static SV * 59static SV *
56taint (SV *sv) 60taint (SV *sv)
345 for (int y = ov_h; y--; ) 349 for (int y = ov_h; y--; )
346 { 350 {
347 text_t *t1 = text [y]; 351 text_t *t1 = text [y];
348 rend_t *r1 = rend [y]; 352 rend_t *r1 = rend [y];
349 353
350 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;
351 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;
352 356
353 for (int x = ov_w; x--; ) 357 for (int x = ov_w; x--; )
354 { 358 {
355 text_t t = *t1; *t1++ = *t2; *t2++ = t; 359 text_t t = *t1; *t1++ = *t2; *t2++ = t;
356 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));
393 397
394struct rxvt_perl_interp rxvt_perl; 398struct rxvt_perl_interp rxvt_perl;
395 399
396static PerlInterpreter *perl; 400static PerlInterpreter *perl;
397 401
398rxvt_perl_interp::rxvt_perl_interp ()
399{
400}
401
402rxvt_perl_interp::~rxvt_perl_interp () 402rxvt_perl_interp::~rxvt_perl_interp ()
403{ 403{
404 if (perl) 404 if (perl)
405 { 405 {
406 perl_destruct (perl); 406 perl_destruct (perl);
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
453static void
454swap_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
453bool 467bool
454rxvt_perl_interp::invoke (rxvt_term *term, hook_type htype, ...) 468rxvt_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 (!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
661# include "optinc.h" 671# include "optinc.h"
662# undef nodef 672# undef nodef
663# undef def 673# undef def
664 674
665 HV *stash = gv_stashpv ("urxvt", 1); 675 HV *stash = gv_stashpv ("urxvt", 1);
666# 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 }
667 export_const_iv (DEFAULT_RSTYLE); 681 const_iv (DEFAULT_RSTYLE),
668 export_const_iv (OVERLAY_RSTYLE); 682 const_iv (OVERLAY_RSTYLE),
669 export_const_iv (RS_Bold); 683 const_iv (RS_Bold),
670 export_const_iv (RS_Italic); 684 const_iv (RS_Italic),
671 export_const_iv (RS_Blink); 685 const_iv (RS_Blink),
672 export_const_iv (RS_RVid); 686 const_iv (RS_RVid),
673 export_const_iv (RS_Uline); 687 const_iv (RS_Uline),
674 688
675 export_const_iv (CurrentTime); 689 const_iv (CurrentTime),
676 export_const_iv (ShiftMask); 690 const_iv (ShiftMask),
677 export_const_iv (LockMask); 691 const_iv (LockMask),
678 export_const_iv (ControlMask); 692 const_iv (ControlMask),
679 export_const_iv (Mod1Mask); 693 const_iv (Mod1Mask),
680 export_const_iv (Mod2Mask); 694 const_iv (Mod2Mask),
681 export_const_iv (Mod3Mask); 695 const_iv (Mod3Mask),
682 export_const_iv (Mod4Mask); 696 const_iv (Mod4Mask),
683 export_const_iv (Mod5Mask); 697 const_iv (Mod5Mask),
684 export_const_iv (Button1Mask); 698 const_iv (Button1Mask),
685 export_const_iv (Button2Mask); 699 const_iv (Button2Mask),
686 export_const_iv (Button3Mask); 700 const_iv (Button3Mask),
687 export_const_iv (Button4Mask); 701 const_iv (Button4Mask),
688 export_const_iv (Button5Mask); 702 const_iv (Button5Mask),
689 export_const_iv (AnyModifier); 703 const_iv (AnyModifier),
690 704
691 export_const_iv (EVENT_NONE); 705 const_iv (EVENT_NONE),
692 export_const_iv (EVENT_READ); 706 const_iv (EVENT_READ),
693 export_const_iv (EVENT_WRITE); 707 const_iv (EVENT_WRITE),
694}
695 708
696void 709 const_iv (NoEventMask),
697set_should_invoke (int htype, int value) 710 const_iv (KeyPressMask),
698 CODE: 711 const_iv (KeyReleaseMask),
699 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}
700 775
701void 776void
702warn (const char *msg) 777warn (const char *msg)
703 CODE: 778 CODE:
704 rxvt_warn ("%s", msg); 779 rxvt_warn ("%s", msg);
713 CODE: 788 CODE:
714 RETVAL = newSVsv (sv); 789 RETVAL = newSVsv (sv);
715 SvTAINTED_off (RETVAL); 790 SvTAINTED_off (RETVAL);
716 OUTPUT: 791 OUTPUT:
717 RETVAL 792 RETVAL
793
794void
795_exit (int status)
718 796
719bool 797bool
720safe () 798safe ()
721 CODE: 799 CODE:
722 RETVAL = !rxvt_tainted (); 800 RETVAL = !rxvt_tainted ();
824 OUTPUT: 902 OUTPUT:
825 RETVAL 903 RETVAL
826 904
827void 905void
828rxvt_term::destroy () 906rxvt_term::destroy ()
907
908#if ENABLE_PERL_FRILLS
909
910void
911rxvt_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
924void
925rxvt_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
946void
947rxvt_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
958void
959rxvt_term::XDeleteProperty (U32 window, U32 property)
960 CODE:
961 XDeleteProperty (THIS->display->display, (Window)window, (Atom)property);
962
963U32
964rxvt_term::DefaultRootWindow ()
965 CODE:
966 RETVAL = (U32)THIS->display->root;
967 OUTPUT:
968 RETVAL
969
970U32
971rxvt_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
980void
981rxvt_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
985void
986rxvt_term::XMapWindow (U32 window)
987 CODE:
988 XMapWindow (THIS->display->display, (Window)window);
989
990void
991rxvt_term::XUnmapWindow (U32 window)
992 CODE:
993 XUnmapWindow (THIS->display->display, (Window)window);
994
995#endif
996
997void
998rxvt_term::set_should_invoke (int htype, int inc)
999 CODE:
1000 THIS->perl.should_invoke [htype] += inc;
829 1001
830void 1002void
831rxvt_term::grab_button (int button, U32 modifiers) 1003rxvt_term::grab_button (int button, U32 modifiers)
832 CODE: 1004 CODE:
833 XGrabButton (THIS->display->display, button, modifiers, THIS->vt, 1, 1005 XGrabButton (THIS->display->display, button, modifiers, THIS->vt, 1,
937#define TERM_OFFSET_ncol TERM_OFFSET(ncol) 1109#define TERM_OFFSET_ncol TERM_OFFSET(ncol)
938#define TERM_OFFSET_focus TERM_OFFSET(focus) 1110#define TERM_OFFSET_focus TERM_OFFSET(focus)
939#define TERM_OFFSET_mapped TERM_OFFSET(mapped) 1111#define TERM_OFFSET_mapped TERM_OFFSET(mapped)
940#define TERM_OFFSET_saveLines TERM_OFFSET(saveLines) 1112#define TERM_OFFSET_saveLines TERM_OFFSET(saveLines)
941#define TERM_OFFSET_total_rows TERM_OFFSET(total_rows) 1113#define TERM_OFFSET_total_rows TERM_OFFSET(total_rows)
942#define TERM_OFFSET_nsaved TERM_OFFSET(nsaved) 1114#define TERM_OFFSET_top_row TERM_OFFSET(top_row)
943 1115
944int 1116int
945rxvt_term::width () 1117rxvt_term::width ()
946 ALIAS: 1118 ALIAS:
947 width = TERM_OFFSET_width 1119 width = TERM_OFFSET_width
953 ncol = TERM_OFFSET_ncol 1125 ncol = TERM_OFFSET_ncol
954 focus = TERM_OFFSET_focus 1126 focus = TERM_OFFSET_focus
955 mapped = TERM_OFFSET_mapped 1127 mapped = TERM_OFFSET_mapped
956 saveLines = TERM_OFFSET_saveLines 1128 saveLines = TERM_OFFSET_saveLines
957 total_rows = TERM_OFFSET_total_rows 1129 total_rows = TERM_OFFSET_total_rows
958 nsaved = TERM_OFFSET_nsaved 1130 top_row = TERM_OFFSET_top_row
959 CODE: 1131 CODE:
960 RETVAL = *(int *)((char *)THIS + ix); 1132 RETVAL = *(int *)((char *)THIS + ix);
961 OUTPUT: 1133 OUTPUT:
962 RETVAL 1134 RETVAL
963 1135
1032 CODE: 1204 CODE:
1033 RETVAL = (U32)THIS->vt; 1205 RETVAL = (U32)THIS->vt;
1034 OUTPUT: 1206 OUTPUT:
1035 RETVAL 1207 RETVAL
1036 1208
1209void
1210rxvt_term::vt_emask_add (U32 emask)
1211 CODE:
1212 THIS->vt_emask_perl |= emask;
1213 THIS->vt_select_input ();
1214
1037U32 1215U32
1038rxvt_term::rstyle (U32 new_rstyle = THIS->rstyle) 1216rxvt_term::rstyle (U32 new_rstyle = THIS->rstyle)
1039 CODE: 1217 CODE:
1040{
1041 RETVAL = THIS->rstyle; 1218 RETVAL = THIS->rstyle;
1042 THIS->rstyle = new_rstyle; 1219 THIS->rstyle = new_rstyle;
1043}
1044 OUTPUT: 1220 OUTPUT:
1045 RETVAL 1221 RETVAL
1046 1222
1047int 1223int
1048rxvt_term::view_start (int newval = -1) 1224rxvt_term::view_start (int newval = 1)
1225 PROTOTYPE: $;$
1049 CODE: 1226 CODE:
1050{ 1227{
1051 RETVAL = THIS->view_start; 1228 RETVAL = THIS->view_start;
1052 1229
1053 if (newval >= 0) 1230 if (newval <= 0)
1054 { 1231 THIS->scr_changeview (max (newval, THIS->top_row));
1055 THIS->view_start = min (newval, THIS->nsaved);
1056 THIS->scr_changeview (RETVAL);
1057 }
1058} 1232}
1059 OUTPUT: 1233 OUTPUT:
1060 RETVAL 1234 RETVAL
1061 1235
1062void 1236void
1066 1240
1067void 1241void
1068rxvt_term::ROW_t (int row_number, SV *new_text = 0, int start_col = 0, int start_ofs = 0, int max_len = MAX_COLS) 1242rxvt_term::ROW_t (int row_number, SV *new_text = 0, int start_col = 0, int start_ofs = 0, int max_len = MAX_COLS)
1069 PPCODE: 1243 PPCODE:
1070{ 1244{
1071 if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) 1245 if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow))
1072 XSRETURN_EMPTY; 1246 XSRETURN_EMPTY;
1073 1247
1074 line_t &l = ROW(row_number); 1248 line_t &l = ROW(row_number);
1075 1249
1076 if (GIMME_V != G_VOID) 1250 if (GIMME_V != G_VOID)
1109 1283
1110void 1284void
1111rxvt_term::ROW_r (int row_number, SV *new_rend = 0, int start_col = 0, int start_ofs = 0, int max_len = MAX_COLS) 1285rxvt_term::ROW_r (int row_number, SV *new_rend = 0, int start_col = 0, int start_ofs = 0, int max_len = MAX_COLS)
1112 PPCODE: 1286 PPCODE:
1113{ 1287{
1114 if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) 1288 if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow))
1115 XSRETURN_EMPTY; 1289 XSRETURN_EMPTY;
1116 1290
1117 line_t &l = ROW(row_number); 1291 line_t &l = ROW(row_number);
1118 1292
1119 if (GIMME_V != G_VOID) 1293 if (GIMME_V != G_VOID)
1149 1323
1150int 1324int
1151rxvt_term::ROW_l (int row_number, int new_length = -1) 1325rxvt_term::ROW_l (int row_number, int new_length = -1)
1152 CODE: 1326 CODE:
1153{ 1327{
1154 if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) 1328 if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow))
1155 XSRETURN_EMPTY; 1329 XSRETURN_EMPTY;
1156 1330
1157 line_t &l = ROW(row_number); 1331 line_t &l = ROW(row_number);
1158 RETVAL = l.l; 1332 RETVAL = l.l;
1159 1333
1165 1339
1166bool 1340bool
1167rxvt_term::ROW_is_longer (int row_number, int new_is_longer = -1) 1341rxvt_term::ROW_is_longer (int row_number, int new_is_longer = -1)
1168 CODE: 1342 CODE:
1169{ 1343{
1170 if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) 1344 if (!IN_RANGE_EXC (row_number, THIS->top_row, THIS->nrow))
1171 XSRETURN_EMPTY; 1345 XSRETURN_EMPTY;
1172 1346
1173 line_t &l = ROW(row_number); 1347 line_t &l = ROW(row_number);
1174 RETVAL = l.is_longer (); 1348 RETVAL = l.is_longer ();
1175 1349
1365 PUSHs (sv_2mortal (newSViv (rc.col))); 1539 PUSHs (sv_2mortal (newSViv (rc.col)));
1366 } 1540 }
1367 1541
1368 if (items == 3) 1542 if (items == 3)
1369 { 1543 {
1370 rc.row = clamp (SvIV (ST (1)), -THIS->nsaved, THIS->nrow - 1); 1544 rc.row = clamp (SvIV (ST (1)), THIS->top_row, THIS->nrow - 1);
1371 rc.col = clamp (SvIV (ST (2)), 0, THIS->ncol - 1); 1545 rc.col = clamp (SvIV (ST (2)), 0, THIS->ncol - 1);
1372 1546
1373 if (ix) 1547 if (ix)
1374 THIS->want_refresh = 1; 1548 THIS->want_refresh = 1;
1375 } 1549 }
1379rxvt_term::cur_charset () 1553rxvt_term::cur_charset ()
1380 CODE: 1554 CODE:
1381 RETVAL = THIS->charsets [THIS->screen.charset]; 1555 RETVAL = THIS->charsets [THIS->screen.charset];
1382 OUTPUT: 1556 OUTPUT:
1383 RETVAL 1557 RETVAL
1558
1559#void
1560#rxvt_term::selection_clear ()
1561
1562void
1563rxvt_term::selection_make (U32 eventtime, bool rect = false)
1564 CODE:
1565 THIS->selection.op = SELECTION_CONT;
1566 THIS->selection.rect = rect;
1567 THIS->selection_make (eventtime);
1384 1568
1385int 1569int
1386rxvt_term::selection_grab (U32 eventtime) 1570rxvt_term::selection_grab (U32 eventtime)
1387 1571
1388void 1572void

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines