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.7 by root, Mon Jan 2 22:23:26 2006 UTC

208} 208}
209 209
210bool 210bool
211rxvt_perl_interp::invoke (rxvt_term *term, hook_type htype, ...) 211rxvt_perl_interp::invoke (rxvt_term *term, hook_type htype, ...)
212{ 212{
213 if (!perl) 213 if (!perl
214 || (!should_invoke [htype] && htype != HOOK_INIT && htype != HOOK_DESTROY))
214 return false; 215 return false;
215 216
216 if (htype == HOOK_INIT) // first hook ever called 217 if (htype == HOOK_INIT) // first hook ever called
217 term->self = (void *)newSVptr ((void *)term, "urxvt::term"); 218 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 219
225 if (!should_invoke [htype])
226 return false;
227
228 dSP; 220 dSP;
229 va_list ap; 221 va_list ap;
230 222
231 va_start (ap, htype); 223 va_start (ap, htype);
232 224
249 241
250 case DT_LONG: 242 case DT_LONG:
251 XPUSHs (sv_2mortal (newSViv (va_arg (ap, long)))); 243 XPUSHs (sv_2mortal (newSViv (va_arg (ap, long))));
252 break; 244 break;
253 245
246 case DT_STRING:
247 XPUSHs (sv_2mortal (newSVpv (va_arg (ap, char *), 0)));
248 break;
249
254 case DT_END: 250 case DT_END:
255 { 251 {
256 va_end (ap); 252 va_end (ap);
257 253
258 PUTBACK; 254 PUTBACK;
270 LEAVE; 266 LEAVE;
271 267
272 if (SvTRUE (ERRSV)) 268 if (SvTRUE (ERRSV))
273 rxvt_warn ("perl hook %d evaluation error: %s", htype, SvPV_nolen (ERRSV)); 269 rxvt_warn ("perl hook %d evaluation error: %s", htype, SvPV_nolen (ERRSV));
274 270
271 if (htype == HOOK_DESTROY)
272 {
273 // TODO: clear magic
274 hv_clear ((HV *)SvRV ((SV *)term->self));
275 SvREFCNT_dec ((SV *)term->self);
276 }
277
275 return count; 278 return count;
276 } 279 }
277 280
278 default: 281 default:
279 rxvt_fatal ("FATAL: unable to pass data type %d\n", dt); 282 rxvt_fatal ("FATAL: unable to pass data type %d\n", dt);
289 292
290BOOT: 293BOOT:
291{ 294{
292# define set_hookname(sym) av_store (hookname, PP_CONCAT(HOOK_, sym), newSVpv (PP_STRINGIFY(sym), 0)) 295# define set_hookname(sym) av_store (hookname, PP_CONCAT(HOOK_, sym), newSVpv (PP_STRINGIFY(sym), 0))
293 AV *hookname = get_av ("urxvt::HOOKNAME", 1); 296 AV *hookname = get_av ("urxvt::HOOKNAME", 1);
294 set_hookname (LOAD);
295 set_hookname (INIT); 297 set_hookname (INIT);
296 set_hookname (RESET); 298 set_hookname (RESET);
297 set_hookname (START); 299 set_hookname (START);
298 set_hookname (DESTROY); 300 set_hookname (DESTROY);
299 set_hookname (SEL_BEGIN); 301 set_hookname (SEL_BEGIN);
305 set_hookname (VIEW_CHANGE); 307 set_hookname (VIEW_CHANGE);
306 set_hookname (SCROLL_BACK); 308 set_hookname (SCROLL_BACK);
307 set_hookname (TTY_ACTIVITY); 309 set_hookname (TTY_ACTIVITY);
308 set_hookname (REFRESH_BEGIN); 310 set_hookname (REFRESH_BEGIN);
309 set_hookname (REFRESH_END); 311 set_hookname (REFRESH_END);
312 set_hookname (KEYBOARD_COMMAND);
310 313
311 sv_setpv (get_sv ("urxvt::LIBDIR", 1), LIBDIR); 314 sv_setpv (get_sv ("urxvt::LIBDIR", 1), LIBDIR);
312} 315}
313 316
314void 317void
323 326
324void 327void
325fatal (const char *msg) 328fatal (const char *msg)
326 CODE: 329 CODE:
327 rxvt_fatal ("%s", msg); 330 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 331
340NV 332NV
341NOW () 333NOW ()
342 CODE: 334 CODE:
343 RETVAL = NOW; 335 RETVAL = NOW;
344 OUTPUT: 336 OUTPUT:
345 RETVAL 337 RETVAL
346 338
347MODULE = urxvt PACKAGE = urxvt::term 339MODULE = urxvt PACKAGE = urxvt::term
340
341int
342rxvt_term::strwidth (SV *str)
343 CODE:
344{
345 wchar_t *wstr = sv2wcs (str);
346
347 rxvt_push_locale (THIS->locale);
348 RETVAL = wcswidth (wstr, wcslen (wstr));
349 rxvt_pop_locale ();
350
351 free (wstr);
352}
353 OUTPUT:
354 RETVAL
355
356SV *
357rxvt_term::locale_encode (SV *str)
358 CODE:
359{
360 wchar_t *wstr = sv2wcs (str);
361
362 rxvt_push_locale (THIS->locale);
363 char *mbstr = rxvt_wcstombs (wstr);
364 rxvt_pop_locale ();
365
366 free (wstr);
367
368 RETVAL = newSVpv (mbstr, 0);
369 free (mbstr);
370}
371 OUTPUT:
372 RETVAL
373
374SV *
375rxvt_term::locale_decode (SV *octets)
376 CODE:
377{
378 STRLEN len;
379 char *data = SvPVbyte (octets, len);
380
381 rxvt_push_locale (THIS->locale);
382 wchar_t *wstr = rxvt_mbstowcs (data, len);
383 rxvt_pop_locale ();
384
385 char *str = rxvt_wcstoutf8 (wstr);
386 free (wstr);
387
388 RETVAL = newSVpv (str, 0);
389 SvUTF8_on (RETVAL);
390 free (str);
391}
392 OUTPUT:
393 RETVAL
394
395int
396rxvt_term::nsaved ()
397 CODE:
398 RETVAL = THIS->nsaved;
399 OUTPUT:
400 RETVAL
401
402int
403rxvt_term::view_start (int newval = -1)
404 CODE:
405{
406 RETVAL = THIS->view_start;
407
408 if (newval >= 0)
409 {
410 THIS->view_start = min (newval, THIS->nsaved);
411 THIS->scr_changeview (RETVAL);
412 }
413}
414 OUTPUT:
415 RETVAL
416
417void
418rxvt_term::_resource (char *name, int index, SV *newval = 0)
419 PPCODE:
420{
421 struct resval { const char *name; int value; } rslist [] = {
422# define Rs_def(name) { # name, Rs_ ## name },
423# define Rs_reserve(name,count)
424# include "rsinc.h"
425# undef Rs_def
426# undef Rs_reserve
427 };
428
429 struct resval *rs = rslist + sizeof (rslist) / sizeof (rslist [0]);
430
431 do {
432 if (rs-- == rslist)
433 croak ("no such resource '%s', requested", name);
434 } while (strcmp (name, rs->name));
435
436 index += rs->value;
437
438 if (!IN_RANGE_EXC (index, 0, NUM_RESOURCES))
439 croak ("requested out-of-bound resource %s+%d,", name, index - rs->value);
440
441 if (GIMME_V != G_VOID)
442 XPUSHs (THIS->rs [index] ? sv_2mortal (newSVpv (THIS->rs [index], 0)) : &PL_sv_undef);
443
444 if (newval)
445 {
446 if (SvOK (newval))
447 {
448 char *str = strdup (SvPVbyte_nolen (newval));
449 THIS->rs [index] = str;
450 THIS->allocated.push_back (str);
451 }
452 else
453 THIS->rs [index] = 0;
454 }
455}
348 456
349void 457void
350rxvt_term::selection_mark (...) 458rxvt_term::selection_mark (...)
351 PROTOTYPE: $;$$ 459 PROTOTYPE: $;$$
352 ALIAS: 460 ALIAS:
418 wchar_t *wtext = sv2wcs (text); 526 wchar_t *wtext = sv2wcs (text);
419 THIS->scr_overlay_set (x, y, wtext); 527 THIS->scr_overlay_set (x, y, wtext);
420 free (wtext); 528 free (wtext);
421} 529}
422 530
531void
532rxvt_term::tt_write (SV *octets)
533 INIT:
534 STRLEN len;
535 char *str = SvPVbyte (octets, len);
536 C_ARGS:
537 (unsigned char *)str, len
538
423MODULE = urxvt PACKAGE = urxvt::timer 539MODULE = urxvt PACKAGE = urxvt::timer
424 540
425SV * 541SV *
426timer::new () 542timer::new ()
427 CODE: 543 CODE:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines