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.1 by root, Mon Jan 2 15:35:43 2006 UTC vs.
Revision 1.8 by root, Tue Jan 3 00:06:57 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);
310 318
311 sv_setpv (get_sv ("urxvt::LIBDIR", 1), LIBDIR); 319 sv_setpv (get_sv ("urxvt::LIBDIR", 1), LIBDIR);
312} 320}
313 321
314void 322void
323 331
324void 332void
325fatal (const char *msg) 333fatal (const char *msg)
326 CODE: 334 CODE:
327 rxvt_fatal ("%s", msg); 335 rxvt_fatal ("%s", msg);
328
329int
330wcswidth (SV *str)
331 CODE:
332{
333 wchar_t *wstr = sv2wcs (str);
334 RETVAL = wcswidth (wstr, wcslen (wstr));
335 free (wstr);
336}
337 OUTPUT:
338 RETVAL
339 336
340NV 337NV
341NOW () 338NOW ()
342 CODE: 339 CODE:
343 RETVAL = NOW; 340 RETVAL = NOW;
344 OUTPUT: 341 OUTPUT:
345 RETVAL 342 RETVAL
346 343
347MODULE = urxvt PACKAGE = urxvt::term 344MODULE = urxvt PACKAGE = urxvt::term
345
346int
347rxvt_term::strwidth (SV *str)
348 CODE:
349{
350 wchar_t *wstr = sv2wcs (str);
351
352 rxvt_push_locale (THIS->locale);
353 RETVAL = wcswidth (wstr, wcslen (wstr));
354 rxvt_pop_locale ();
355
356 free (wstr);
357}
358 OUTPUT:
359 RETVAL
360
361SV *
362rxvt_term::locale_encode (SV *str)
363 CODE:
364{
365 wchar_t *wstr = sv2wcs (str);
366
367 rxvt_push_locale (THIS->locale);
368 char *mbstr = rxvt_wcstombs (wstr);
369 rxvt_pop_locale ();
370
371 free (wstr);
372
373 RETVAL = newSVpv (mbstr, 0);
374 free (mbstr);
375}
376 OUTPUT:
377 RETVAL
378
379SV *
380rxvt_term::locale_decode (SV *octets)
381 CODE:
382{
383 STRLEN len;
384 char *data = SvPVbyte (octets, len);
385
386 rxvt_push_locale (THIS->locale);
387 wchar_t *wstr = rxvt_mbstowcs (data, len);
388 rxvt_pop_locale ();
389
390 char *str = rxvt_wcstoutf8 (wstr);
391 free (wstr);
392
393 RETVAL = newSVpv (str, 0);
394 SvUTF8_on (RETVAL);
395 free (str);
396}
397 OUTPUT:
398 RETVAL
399
400int
401rxvt_term::nsaved ()
402 CODE:
403 RETVAL = THIS->nsaved;
404 OUTPUT:
405 RETVAL
406
407int
408rxvt_term::view_start (int newval = -1)
409 CODE:
410{
411 RETVAL = THIS->view_start;
412
413 if (newval >= 0)
414 {
415 THIS->view_start = min (newval, THIS->nsaved);
416 THIS->scr_changeview (RETVAL);
417 }
418}
419 OUTPUT:
420 RETVAL
421
422int
423rxvt_term::nrow ()
424 CODE:
425 RETVAL = THIS->nrow;
426 OUTPUT:
427 RETVAL
428
429int
430rxvt_term::ncol ()
431 CODE:
432 RETVAL = THIS->ncol;
433 OUTPUT:
434 RETVAL
435
436void
437rxvt_term::ROW_t (int row_number, SV *new_text = 0, int start_col = 0)
438 PPCODE:
439{
440 if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow))
441 croak ("row_number number of out range");
442
443 line_t &l = ROW(row_number);
444
445 if (GIMME_V != G_VOID)
446 {
447 wchar_t *wstr = new wchar_t [THIS->ncol];
448
449 for (int col = 0; col <THIS->ncol; col++)
450 wstr [col] = l.t [col];
451
452 char *str = rxvt_wcstoutf8 (wstr, THIS->ncol);
453 free (wstr);
454
455 SV *sv = newSVpv (str, 0);
456 SvUTF8_on (sv);
457 XPUSHs (sv_2mortal (sv));
458 free (str);
459 }
460
461 if (new_text)
462 {
463 STRLEN slen;
464 char *str = SvPVutf8 (new_text, slen);
465 wchar_t *wstr = rxvt_utf8towcs (str, slen);
466
467 int len = wcslen (wstr);
468
469 if (start_col + len > THIS->ncol)
470 {
471 free (wstr);
472 croak ("new_text extends beyond right margin");
473 }
474
475 for (int col = start_col; col < start_col + len; col++)
476 {
477 l.t [col] = wstr [col];
478 l.r [col] = SET_FONT (l.r [col], THIS->fontset [GET_STYLE (l.r [col])]->find_font (l.t [col]));
479 }
480 }
481}
482
483void
484rxvt_term::ROW_r (int row_number, SV *new_rend = 0, int start_col = 0)
485 PPCODE:
486{
487 if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow))
488 croak ("row_number number of out range");
489
490 line_t &l = ROW(row_number);
491
492 if (GIMME_V != G_VOID)
493 {
494 AV *av = newAV ();
495
496 av_extend (av, THIS->ncol - 1);
497 for (int col = 0; col < THIS->ncol; col++)
498 av_store (av, col, newSViv (l.r [col]));
499
500 XPUSHs (sv_2mortal (newRV_noinc ((SV *)av)));
501 }
502
503 if (new_rend)
504 {
505 if (!SvROK (new_rend) || SvTYPE (SvRV (new_rend)) != SVt_PVAV)
506 croak ("new_rend must be arrayref");
507
508 AV *av = (AV *)SvRV (new_rend);
509 int len = av_len (av) + 1;
510
511 if (start_col + len > THIS->ncol)
512 croak ("new_rend array extends beyond right margin");
513
514 for (int col = start_col; col < start_col + len; col++)
515 {
516 rend_t r = SvIV (*av_fetch (av, col, 1)) & ~RS_fontMask;
517
518 l.r [col] = SET_FONT (r, THIS->fontset [GET_STYLE (r)]->find_font (l.t [col]));
519 }
520 }
521}
522
523int
524rxvt_term::ROW_l (int row_number, int new_length = -2)
525 CODE:
526{
527 if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow))
528 croak ("row_number number of out range");
529
530 line_t &l = ROW(row_number);
531 RETVAL = l.l;
532
533 if (new_length >= -1)
534 l.l = new_length;
535}
536 OUTPUT:
537 RETVAL
538
539SV *
540rxvt_term::special_encode (SV *str)
541 CODE:
542 abort ();//TODO
543
544SV *
545rxvt_term::special_decode (SV *str)
546 CODE:
547 abort ();//TODO
548
549void
550rxvt_term::_resource (char *name, int index, SV *newval = 0)
551 PPCODE:
552{
553 struct resval { const char *name; int value; } rslist [] = {
554# define Rs_def(name) { # name, Rs_ ## name },
555# define Rs_reserve(name,count)
556# include "rsinc.h"
557# undef Rs_def
558# undef Rs_reserve
559 };
560
561 struct resval *rs = rslist + sizeof (rslist) / sizeof (rslist [0]);
562
563 do {
564 if (rs-- == rslist)
565 croak ("no such resource '%s', requested", name);
566 } while (strcmp (name, rs->name));
567
568 index += rs->value;
569
570 if (!IN_RANGE_EXC (index, 0, NUM_RESOURCES))
571 croak ("requested out-of-bound resource %s+%d,", name, index - rs->value);
572
573 if (GIMME_V != G_VOID)
574 XPUSHs (THIS->rs [index] ? sv_2mortal (newSVpv (THIS->rs [index], 0)) : &PL_sv_undef);
575
576 if (newval)
577 {
578 if (SvOK (newval))
579 {
580 char *str = strdup (SvPVbyte_nolen (newval));
581 THIS->rs [index] = str;
582 THIS->allocated.push_back (str);
583 }
584 else
585 THIS->rs [index] = 0;
586 }
587}
348 588
349void 589void
350rxvt_term::selection_mark (...) 590rxvt_term::selection_mark (...)
351 PROTOTYPE: $;$$ 591 PROTOTYPE: $;$$
352 ALIAS: 592 ALIAS:
418 wchar_t *wtext = sv2wcs (text); 658 wchar_t *wtext = sv2wcs (text);
419 THIS->scr_overlay_set (x, y, wtext); 659 THIS->scr_overlay_set (x, y, wtext);
420 free (wtext); 660 free (wtext);
421} 661}
422 662
663void
664rxvt_term::tt_write (SV *octets)
665 INIT:
666 STRLEN len;
667 char *str = SvPVbyte (octets, len);
668 C_ARGS:
669 (unsigned char *)str, len
670
423MODULE = urxvt PACKAGE = urxvt::timer 671MODULE = urxvt PACKAGE = urxvt::timer
424 672
425SV * 673SV *
426timer::new () 674timer::new ()
427 CODE: 675 CODE:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines