… | |
… | |
208 | } |
208 | } |
209 | |
209 | |
210 | bool |
210 | bool |
211 | rxvt_perl_interp::invoke (rxvt_term *term, hook_type htype, ...) |
211 | rxvt_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 | |
… | |
… | |
270 | LEAVE; |
262 | LEAVE; |
271 | |
263 | |
272 | if (SvTRUE (ERRSV)) |
264 | if (SvTRUE (ERRSV)) |
273 | rxvt_warn ("perl hook %d evaluation error: %s", htype, SvPV_nolen (ERRSV)); |
265 | rxvt_warn ("perl hook %d evaluation error: %s", htype, SvPV_nolen (ERRSV)); |
274 | |
266 | |
|
|
267 | if (htype == HOOK_DESTROY) |
|
|
268 | { |
|
|
269 | // TODO: clear magic |
|
|
270 | hv_clear ((HV *)SvRV ((SV *)term->self)); |
|
|
271 | SvREFCNT_dec ((SV *)term->self); |
|
|
272 | } |
|
|
273 | |
275 | return count; |
274 | return count; |
276 | } |
275 | } |
277 | |
276 | |
278 | default: |
277 | default: |
279 | rxvt_fatal ("FATAL: unable to pass data type %d\n", dt); |
278 | rxvt_fatal ("FATAL: unable to pass data type %d\n", dt); |
… | |
… | |
289 | |
288 | |
290 | BOOT: |
289 | BOOT: |
291 | { |
290 | { |
292 | # define set_hookname(sym) av_store (hookname, PP_CONCAT(HOOK_, sym), newSVpv (PP_STRINGIFY(sym), 0)) |
291 | # define set_hookname(sym) av_store (hookname, PP_CONCAT(HOOK_, sym), newSVpv (PP_STRINGIFY(sym), 0)) |
293 | AV *hookname = get_av ("urxvt::HOOKNAME", 1); |
292 | AV *hookname = get_av ("urxvt::HOOKNAME", 1); |
294 | set_hookname (LOAD); |
|
|
295 | set_hookname (INIT); |
293 | set_hookname (INIT); |
296 | set_hookname (RESET); |
294 | set_hookname (RESET); |
297 | set_hookname (START); |
295 | set_hookname (START); |
298 | set_hookname (DESTROY); |
296 | set_hookname (DESTROY); |
299 | set_hookname (SEL_BEGIN); |
297 | set_hookname (SEL_BEGIN); |