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.3 by root, Mon Jan 2 18:20:23 2006 UTC vs.
Revision 1.9 by root, Tue Jan 3 01:15:00 2006 UTC

35#include "rxvtutil.h" 35#include "rxvtutil.h"
36#include "rxvtperl.h" 36#include "rxvtperl.h"
37 37
38#include "perlxsi.c" 38#include "perlxsi.c"
39 39
40#undef LINENO
41#define LINENO(n) MOD (THIS->term_start + int(n), THIS->total_rows)
42#undef ROW
43#define ROW(n) THIS->row_buf [LINENO (n)]
44
40///////////////////////////////////////////////////////////////////////////// 45/////////////////////////////////////////////////////////////////////////////
41 46
42static wchar_t * 47static wchar_t *
43sv2wcs (SV *sv) 48sv2wcs (SV *sv)
44{ 49{
208} 213}
209 214
210bool 215bool
211rxvt_perl_interp::invoke (rxvt_term *term, hook_type htype, ...) 216rxvt_perl_interp::invoke (rxvt_term *term, hook_type htype, ...)
212{ 217{
213 if (!perl) 218 if (!perl
219 || (!should_invoke [htype] && htype != HOOK_INIT && htype != HOOK_DESTROY))
214 return false; 220 return false;
215 221
216 if (htype == HOOK_INIT) // first hook ever called 222 if (htype == HOOK_INIT) // first hook ever called
217 term->self = (void *)newSVptr ((void *)term, "urxvt::term"); 223 term->self = (void *)newSVptr ((void *)term, "urxvt::term");
218 else if (htype == HOOK_DESTROY)
219 {
220 // TODO: clear magic
221 hv_clear ((HV *)SvRV ((SV *)term->self));
222 SvREFCNT_dec ((SV *)term->self);
223 }
224 224
225 if (!should_invoke [htype])
226 return false;
227
228 dSP; 225 dSP;
229 va_list ap; 226 va_list ap;
230 227
231 va_start (ap, htype); 228 va_start (ap, htype);
232 229
249 246
250 case DT_LONG: 247 case DT_LONG:
251 XPUSHs (sv_2mortal (newSViv (va_arg (ap, long)))); 248 XPUSHs (sv_2mortal (newSViv (va_arg (ap, long))));
252 break; 249 break;
253 250
251 case DT_STRING:
252 XPUSHs (sv_2mortal (newSVpv (va_arg (ap, char *), 0)));
253 break;
254
254 case DT_END: 255 case DT_END:
255 { 256 {
256 va_end (ap); 257 va_end (ap);
257 258
258 PUTBACK; 259 PUTBACK;
270 LEAVE; 271 LEAVE;
271 272
272 if (SvTRUE (ERRSV)) 273 if (SvTRUE (ERRSV))
273 rxvt_warn ("perl hook %d evaluation error: %s", htype, SvPV_nolen (ERRSV)); 274 rxvt_warn ("perl hook %d evaluation error: %s", htype, SvPV_nolen (ERRSV));
274 275
276 if (htype == HOOK_DESTROY)
277 {
278 // TODO: clear magic
279 hv_clear ((HV *)SvRV ((SV *)term->self));
280 SvREFCNT_dec ((SV *)term->self);
281 }
282
275 return count; 283 return count;
276 } 284 }
277 285
278 default: 286 default:
279 rxvt_fatal ("FATAL: unable to pass data type %d\n", dt); 287 rxvt_fatal ("FATAL: unable to pass data type %d\n", dt);
289 297
290BOOT: 298BOOT:
291{ 299{
292# define set_hookname(sym) av_store (hookname, PP_CONCAT(HOOK_, sym), newSVpv (PP_STRINGIFY(sym), 0)) 300# define set_hookname(sym) av_store (hookname, PP_CONCAT(HOOK_, sym), newSVpv (PP_STRINGIFY(sym), 0))
293 AV *hookname = get_av ("urxvt::HOOKNAME", 1); 301 AV *hookname = get_av ("urxvt::HOOKNAME", 1);
294 set_hookname (LOAD);
295 set_hookname (INIT); 302 set_hookname (INIT);
296 set_hookname (RESET); 303 set_hookname (RESET);
297 set_hookname (START); 304 set_hookname (START);
298 set_hookname (DESTROY); 305 set_hookname (DESTROY);
299 set_hookname (SEL_BEGIN); 306 set_hookname (SEL_BEGIN);
305 set_hookname (VIEW_CHANGE); 312 set_hookname (VIEW_CHANGE);
306 set_hookname (SCROLL_BACK); 313 set_hookname (SCROLL_BACK);
307 set_hookname (TTY_ACTIVITY); 314 set_hookname (TTY_ACTIVITY);
308 set_hookname (REFRESH_BEGIN); 315 set_hookname (REFRESH_BEGIN);
309 set_hookname (REFRESH_END); 316 set_hookname (REFRESH_END);
317 set_hookname (KEYBOARD_COMMAND);
318
319 newCONSTSUB (gv_stashpv ("urxvt", 1), "DEFAULT_RSTYLE", newSViv (DEFAULT_RSTYLE));
310 320
311 sv_setpv (get_sv ("urxvt::LIBDIR", 1), LIBDIR); 321 sv_setpv (get_sv ("urxvt::LIBDIR", 1), LIBDIR);
312} 322}
313 323
314void 324void
386 SvUTF8_on (RETVAL); 396 SvUTF8_on (RETVAL);
387 free (str); 397 free (str);
388} 398}
389 OUTPUT: 399 OUTPUT:
390 RETVAL 400 RETVAL
401
402int
403rxvt_term::nsaved ()
404 CODE:
405 RETVAL = THIS->nsaved;
406 OUTPUT:
407 RETVAL
408
409int
410rxvt_term::view_start (int newval = -1)
411 CODE:
412{
413 RETVAL = THIS->view_start;
414
415 if (newval >= 0)
416 {
417 THIS->view_start = min (newval, THIS->nsaved);
418 THIS->scr_changeview (RETVAL);
419 }
420}
421 OUTPUT:
422 RETVAL
423
424int
425rxvt_term::nrow ()
426 CODE:
427 RETVAL = THIS->nrow;
428 OUTPUT:
429 RETVAL
430
431int
432rxvt_term::ncol ()
433 CODE:
434 RETVAL = THIS->ncol;
435 OUTPUT:
436 RETVAL
437
438void
439rxvt_term::want_refresh ()
440 CODE:
441 THIS->want_refresh = 1;
442
443void
444rxvt_term::ROW_t (int row_number, SV *new_text = 0, int start_col = 0)
445 PPCODE:
446{
447 if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow))
448 croak ("row_number number of out range");
449
450 line_t &l = ROW(row_number);
451
452 if (GIMME_V != G_VOID)
453 {
454 wchar_t *wstr = new wchar_t [THIS->ncol];
455
456 for (int col = 0; col <THIS->ncol; col++)
457 wstr [col] = l.t [col];
458
459 char *str = rxvt_wcstoutf8 (wstr, THIS->ncol);
460 free (wstr);
461
462 SV *sv = newSVpv (str, 0);
463 SvUTF8_on (sv);
464 XPUSHs (sv_2mortal (sv));
465 free (str);
466 }
467
468 if (new_text)
469 {
470 STRLEN slen;
471 char *str = SvPVutf8 (new_text, slen);
472 wchar_t *wstr = rxvt_utf8towcs (str, slen);
473
474 int len = wcslen (wstr);
475
476 if (start_col + len > THIS->ncol)
477 {
478 free (wstr);
479 croak ("new_text extends beyond right margin");
480 }
481
482 for (int col = start_col; col < start_col + len; col++)
483 {
484 l.t [col] = wstr [col - start_col];
485 l.r [col] = SET_FONT (l.r [col], THIS->fontset [GET_STYLE (l.r [col])]->find_font (l.t [col]));
486 }
487
488 free (wstr);
489 }
490}
491
492void
493rxvt_term::ROW_r (int row_number, SV *new_rend = 0, int start_col = 0)
494 PPCODE:
495{
496 if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow))
497 croak ("row_number number of out range");
498
499 line_t &l = ROW(row_number);
500
501 if (GIMME_V != G_VOID)
502 {
503 AV *av = newAV ();
504
505 av_extend (av, THIS->ncol - 1);
506 for (int col = 0; col < THIS->ncol; col++)
507 av_store (av, col, newSViv (l.r [col]));
508
509 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av)));
510 }
511
512 if (new_rend)
513 {
514 if (!SvROK (new_rend) || SvTYPE (SvRV (new_rend)) != SVt_PVAV)
515 croak ("new_rend must be arrayref");
516
517 AV *av = (AV *)SvRV (new_rend);
518 int len = av_len (av) + 1;
519
520 if (start_col + len > THIS->ncol)
521 croak ("new_rend array extends beyond right margin");
522
523 for (int col = start_col; col < start_col + len; col++)
524 {
525 rend_t r = SvIV (*av_fetch (av, col - start_col, 1)) & ~RS_fontMask;
526
527 l.r [col] = SET_FONT (r, THIS->fontset [GET_STYLE (r)]->find_font (l.t [col]));
528 }
529 }
530}
531
532int
533rxvt_term::ROW_l (int row_number, int new_length = -2)
534 CODE:
535{
536 if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow))
537 croak ("row_number number of out range");
538
539 line_t &l = ROW(row_number);
540 RETVAL = l.l;
541
542 if (new_length >= -1)
543 l.l = new_length;
544}
545 OUTPUT:
546 RETVAL
547
548SV *
549rxvt_term::special_encode (SV *str)
550 CODE:
551 abort ();//TODO
552
553SV *
554rxvt_term::special_decode (SV *str)
555 CODE:
556 abort ();//TODO
391 557
392void 558void
393rxvt_term::_resource (char *name, int index, SV *newval = 0) 559rxvt_term::_resource (char *name, int index, SV *newval = 0)
394 PPCODE: 560 PPCODE:
395{ 561{

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines