@@ -54,7 +54,7 @@ enum hook_type
5454 HOOK_PRINT ,
5555 HOOK_SERVER ,
5656 HOOK_TIMER ,
57- HOOK_UNHOOK
57+ HOOK_UNLOAD
5858};
5959
6060typedef struct
@@ -899,6 +899,24 @@ hjs_hooktimer (JSContext *context, unsigned argc, jsval *vp)
899899 return JS_TRUE ;
900900}
901901
902+ static JSBool
903+ hjs_hookunload (JSContext *context, unsigned argc, jsval *vp)
904+ {
905+ JSObject* funcobj;
906+ JSObject* userdata = NULL ;
907+ script_hook* hook = new script_hook;
908+ js_script* script = hjs_script_find (context);
909+
910+ if (!JS_ConvertArguments (context, argc, JS_ARGV (context, vp), " o/o" , &funcobj, &userdata))
911+ return JS_FALSE ;
912+
913+ script->add_hook (hook, HOOK_UNLOAD , context, funcobj, userdata, NULL );
914+
915+ JS_SET_RVAL (context, vp, JSVAL_VOID );
916+
917+ return JS_TRUE ;
918+ }
919+
902920static JSBool
903921hjs_unhook (JSContext *context, unsigned argc, jsval *vp)
904922{
@@ -1067,7 +1085,7 @@ static JSFunctionSpec hexchat_functions[] = {
10671085 {" hook_server" , hjs_hookserver, 4 , JSPROP_READONLY |JSPROP_PERMANENT },
10681086 {" hook_timer" , hjs_hooktimer, 3 , JSPROP_READONLY |JSPROP_PERMANENT },
10691087 {" hook_print" , hjs_hookprint, 5 , JSPROP_READONLY |JSPROP_PERMANENT },
1070- // {"hook_unhook ", hjs_hookunhook, 3 , JSPROP_READONLY|JSPROP_PERMANENT},
1088+ { " hook_unload " , hjs_hookunload, 2 , JSPROP_READONLY |JSPROP_PERMANENT },
10711089 {" unhook" , hjs_unhook, 1 , JSPROP_READONLY |JSPROP_PERMANENT },
10721090 {" get_list" , hjs_getlist, 1 , JSPROP_READONLY |JSPROP_PERMANENT },
10731091 {" find_context" , hjs_findcontext, 2 , JSPROP_READONLY |JSPROP_PERMANENT },
@@ -1184,7 +1202,19 @@ js_script::~js_script ()
11841202{
11851203 for (script_hook* hook : hooks)
11861204 {
1187- hexchat_unhook (ph, hook->hook );
1205+ if (hook->type == HOOK_UNLOAD )
1206+ {
1207+ JSFunction* fun = JS_ValueToFunction (hook->context , OBJECT_TO_JSVAL (hook->callback ));
1208+ jsval argv[] = { OBJECT_TO_JSVAL (hook->userdata ) };
1209+ jsval rval;
1210+
1211+ JS_CallFunction (hook->context , JS_GetGlobalForScopeChain (hook->context ), fun, 1 , argv, &rval);
1212+ }
1213+ else
1214+ {
1215+ hexchat_unhook (ph, hook->hook );
1216+ }
1217+
11881218 delete hook;
11891219 }
11901220
0 commit comments