diff options
Diffstat (limited to 'src/plugins/scripts/python/weechat-python.c')
-rw-r--r-- | src/plugins/scripts/python/weechat-python.c | 112 |
1 files changed, 102 insertions, 10 deletions
diff --git a/src/plugins/scripts/python/weechat-python.c b/src/plugins/scripts/python/weechat-python.c index 134e5b1ec..02f09bcc1 100644 --- a/src/plugins/scripts/python/weechat-python.c +++ b/src/plugins/scripts/python/weechat-python.c @@ -45,6 +45,20 @@ struct t_plugin_script *python_current_script = NULL; const char *python_current_script_filename = NULL; PyThreadState *python_mainThreadState = NULL; +/* string used to execute action "install": + when signal "python_install_script" is received, name of string + is added to this string, to be installed later by a timer (when nothing is + running in script) +*/ +char *python_action_install_list = NULL; + +/* string used to execute action "remove": + when signal "python_remove_script" is received, name of string + is added to this string, to be removed later by a timer (when nothing is + running in script) +*/ +char *python_action_remove_list = NULL; + char python_buffer_output[128]; @@ -637,8 +651,8 @@ weechat_python_command_cb (void *data, struct t_gui_buffer *buffer, else if (weechat_strcasecmp (argv[1], "load") == 0) { /* load Python script */ - path_script = script_search_full_name (weechat_python_plugin, - argv_eol[2]); + path_script = script_search_path (weechat_python_plugin, + argv_eol[2]); weechat_python_load ((path_script) ? path_script : argv_eol[2]); if (path_script) free (path_script); @@ -705,12 +719,13 @@ weechat_python_infolist_cb (void *data, const char *infolist_name, } /* - * weechat_python_debug_dump_cb: dump Python plugin data in WeeChat log file + * weechat_python_signal_debug_dump_cb: dump Python plugin data in WeeChat log + * file */ int -weechat_python_debug_dump_cb (void *data, const char *signal, - const char *type_data, void *signal_data) +weechat_python_signal_debug_dump_cb (void *data, const char *signal, + const char *type_data, void *signal_data) { /* make C compiler happy */ (void) data; @@ -724,12 +739,14 @@ weechat_python_debug_dump_cb (void *data, const char *signal, } /* - * weechat_python_buffer_closed_cb: callback called when a buffer is closed + * weechat_python_signal_buffer_closed_cb: callback called when a buffer is + * closed */ int -weechat_python_buffer_closed_cb (void *data, const char *signal, - const char *type_data, void *signal_data) +weechat_python_signal_buffer_closed_cb (void *data, const char *signal, + const char *type_data, + void *signal_data) { /* make C compiler happy */ (void) data; @@ -743,6 +760,74 @@ weechat_python_buffer_closed_cb (void *data, const char *signal, } /* + * weechat_python_timer_action_cb: timer for executing actions + */ + +int +weechat_python_timer_action_cb (void *data, int remaining_calls) +{ + /* make C compiler happy */ + (void) remaining_calls; + + if (data) + { + if (data == &python_action_install_list) + { + script_action_install (weechat_python_plugin, + python_scripts, + &weechat_python_unload, + &weechat_python_load, + &python_action_install_list); + } + else if (data == &python_action_remove_list) + { + script_action_remove (weechat_python_plugin, + python_scripts, + &weechat_python_unload, + &python_action_remove_list); + } + } + + return WEECHAT_RC_OK; +} + +/* + * weechat_python_signal_script_action_cb: callback called when a script action + * is asked (install/remove a script) + */ + +int +weechat_python_signal_script_action_cb (void *data, const char *signal, + const char *type_data, + void *signal_data) +{ + /* make C compiler happy */ + (void) data; + + if (strcmp (type_data, WEECHAT_HOOK_SIGNAL_STRING) == 0) + { + if (strcmp (signal, "python_script_install") == 0) + { + script_action_add (&python_action_install_list, + (const char *)signal_data); + weechat_hook_timer (1, 0, 1, + &weechat_python_timer_action_cb, + &python_action_install_list); + } + else if (strcmp (signal, "python_script_remove") == 0) + { + script_action_add (&python_action_remove_list, + (const char *)signal_data); + weechat_hook_timer (1, 0, 1, + &weechat_python_timer_action_cb, + &python_action_remove_list); + } + } + + return WEECHAT_RC_OK; +} + +/* * weechat_plugin_init: initialize Python plugin */ @@ -787,8 +872,9 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[]) &weechat_python_command_cb, &weechat_python_completion_cb, &weechat_python_infolist_cb, - &weechat_python_debug_dump_cb, - &weechat_python_buffer_closed_cb, + &weechat_python_signal_debug_dump_cb, + &weechat_python_signal_buffer_closed_cb, + &weechat_python_signal_script_action_cb, &weechat_python_load_cb); python_quiet = 0; @@ -829,5 +915,11 @@ weechat_plugin_end (struct t_weechat_plugin *plugin) weechat_prefix ("error"), PYTHON_PLUGIN_NAME); } + /* free some data */ + if (python_action_install_list) + free (python_action_install_list); + if (python_action_remove_list) + free (python_action_remove_list); + return WEECHAT_RC_OK; } |