summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2013-02-25 08:46:41 +0100
committerSebastien Helleu <flashcode@flashtux.org>2013-02-25 08:46:41 +0100
commitb60aec975ba13d347edd3a110cbfef7699bc3cfb (patch)
tree99945fce576fe848714bdeb9486f6fdbab974c2d /src
parent87b50969722b894bebe791211b232da5ffd82082 (diff)
downloadweechat-b60aec975ba13d347edd3a110cbfef7699bc3cfb.zip
script: add control of autoload (enable/disable/toggle) (task #12393)
New option script.scripts.autoload, new options autoload/noautoload/toggleautoload for command /script, new action "A" (meta-A) on script buffer (toggle autoload).
Diffstat (limited to 'src')
-rw-r--r--src/plugins/guile/weechat-guile.c28
-rw-r--r--src/plugins/lua/weechat-lua.c34
-rw-r--r--src/plugins/perl/weechat-perl.c34
-rw-r--r--src/plugins/plugin-script.c188
-rw-r--r--src/plugins/plugin-script.h3
-rw-r--r--src/plugins/python/weechat-python.c31
-rw-r--r--src/plugins/ruby/weechat-ruby.c34
-rw-r--r--src/plugins/script/script-action.c99
-rw-r--r--src/plugins/script/script-buffer.c44
-rw-r--r--src/plugins/script/script-command.c42
-rw-r--r--src/plugins/script/script-config.c8
-rw-r--r--src/plugins/script/script-config.h1
-rw-r--r--src/plugins/tcl/weechat-tcl.c34
13 files changed, 492 insertions, 88 deletions
diff --git a/src/plugins/guile/weechat-guile.c b/src/plugins/guile/weechat-guile.c
index 154bcba73..ba4a13373 100644
--- a/src/plugins/guile/weechat-guile.c
+++ b/src/plugins/guile/weechat-guile.c
@@ -60,7 +60,7 @@ struct t_guile_function
/*
* string used to execute action "install":
- * when signal "guile_install_script" is received, name of string
+ * when signal "guile_script_install" is received, name of string
* is added to this string, to be installed later by a timer (when nothing is
* running in script)
*/
@@ -68,12 +68,20 @@ char *guile_action_install_list = NULL;
/*
* string used to execute action "remove":
- * when signal "guile_remove_script" is received, name of string
+ * when signal "guile_script_remove" is received, name of string
* is added to this string, to be removed later by a timer (when nothing is
* running in script)
*/
char *guile_action_remove_list = NULL;
+/*
+ * string used to execute action "autoload":
+ * when signal "guile_script_autoload" is received, name of string
+ * is added to this string, to autoload or disable autoload later by a timer
+ * (when nothing is running in script)
+ */
+char *guile_action_autoload_list = NULL;
+
/*
* Flushes stdout.
@@ -815,6 +823,12 @@ weechat_guile_timer_action_cb (void *data, int remaining_calls)
&guile_quiet,
&guile_action_remove_list);
}
+ else if (data == &guile_action_autoload_list)
+ {
+ plugin_script_action_autoload (weechat_guile_plugin,
+ &guile_quiet,
+ &guile_action_autoload_list);
+ }
}
return WEECHAT_RC_OK;
@@ -850,6 +864,14 @@ weechat_guile_signal_script_action_cb (void *data, const char *signal,
&weechat_guile_timer_action_cb,
&guile_action_remove_list);
}
+ else if (strcmp (signal, "guile_script_autoload") == 0)
+ {
+ plugin_script_action_add (&guile_action_autoload_list,
+ (const char *)signal_data);
+ weechat_hook_timer (1, 0, 1,
+ &weechat_guile_timer_action_cb,
+ &guile_action_autoload_list);
+ }
}
return WEECHAT_RC_OK;
@@ -971,6 +993,8 @@ weechat_plugin_end (struct t_weechat_plugin *plugin)
free (guile_action_install_list);
if (guile_action_remove_list)
free (guile_action_remove_list);
+ if (guile_action_autoload_list)
+ free (guile_action_autoload_list);
return WEECHAT_RC_OK;
}
diff --git a/src/plugins/lua/weechat-lua.c b/src/plugins/lua/weechat-lua.c
index 824ec2d48..cdd4990e4 100644
--- a/src/plugins/lua/weechat-lua.c
+++ b/src/plugins/lua/weechat-lua.c
@@ -52,7 +52,7 @@ lua_State *lua_current_interpreter = NULL;
/*
* string used to execute action "install":
- * when signal "lua_install_script" is received, name of string
+ * when signal "lua_script_install" is received, name of string
* is added to this string, to be installed later by a timer (when nothing is
* running in script)
*/
@@ -60,12 +60,20 @@ char *lua_action_install_list = NULL;
/*
* string used to execute action "remove":
- * when signal "lua_remove_script" is received, name of string
+ * when signal "lua_script_remove" is received, name of string
* is added to this string, to be removed later by a timer (when nothing is
* running in script)
*/
char *lua_action_remove_list = NULL;
+/*
+ * string used to execute action "autoload":
+ * when signal "lua_script_autoload" is received, name of string
+ * is added to this string, to autoload or disable autoload later by a timer
+ * (when nothing is running in script)
+ */
+char *lua_action_autoload_list = NULL;
+
/*
* Callback called for each key/value in a hashtable.
@@ -769,6 +777,12 @@ weechat_lua_timer_action_cb (void *data, int remaining_calls)
&lua_quiet,
&lua_action_remove_list);
}
+ else if (data == &lua_action_autoload_list)
+ {
+ plugin_script_action_autoload (weechat_lua_plugin,
+ &lua_quiet,
+ &lua_action_autoload_list);
+ }
}
return WEECHAT_RC_OK;
@@ -804,6 +818,14 @@ weechat_lua_signal_script_action_cb (void *data, const char *signal,
&weechat_lua_timer_action_cb,
&lua_action_remove_list);
}
+ else if (strcmp (signal, "lua_script_autoload") == 0)
+ {
+ plugin_script_action_add (&lua_action_autoload_list,
+ (const char *)signal_data);
+ weechat_hook_timer (1, 0, 1,
+ &weechat_lua_timer_action_cb,
+ &lua_action_autoload_list);
+ }
}
return WEECHAT_RC_OK;
@@ -852,5 +874,13 @@ weechat_plugin_end (struct t_weechat_plugin *plugin)
plugin_script_end (plugin, &lua_scripts, &weechat_lua_unload_all);
lua_quiet = 0;
+ /* free some data */
+ if (lua_action_install_list)
+ free (lua_action_install_list);
+ if (lua_action_remove_list)
+ free (lua_action_remove_list);
+ if (lua_action_autoload_list)
+ free (lua_action_autoload_list);
+
return WEECHAT_RC_OK;
}
diff --git a/src/plugins/perl/weechat-perl.c b/src/plugins/perl/weechat-perl.c
index 785733aeb..9c61950a1 100644
--- a/src/plugins/perl/weechat-perl.c
+++ b/src/plugins/perl/weechat-perl.c
@@ -50,7 +50,7 @@ int perl_quit_or_upgrade = 0;
/*
* string used to execute action "install":
- * when signal "perl_install_script" is received, name of string
+ * when signal "perl_script_install" is received, name of string
* is added to this string, to be installed later by a timer (when nothing is
* running in script)
*/
@@ -58,12 +58,20 @@ char *perl_action_install_list = NULL;
/*
* string used to execute action "remove":
- * when signal "perl_remove_script" is received, name of string
+ * when signal "perl_script_remove" is received, name of string
* is added to this string, to be removed later by a timer (when nothing is
* running in script)
*/
char *perl_action_remove_list = NULL;
+/*
+ * string used to execute action "autoload":
+ * when signal "perl_script_autoload" is received, name of string
+ * is added to this string, to autoload or disable autoload later by a timer
+ * (when nothing is running in script)
+ */
+char *perl_action_autoload_list = NULL;
+
#ifdef NO_PERL_MULTIPLICITY
#undef MULTIPLICITY
#endif
@@ -850,6 +858,12 @@ weechat_perl_timer_action_cb (void *data, int remaining_calls)
&perl_quiet,
&perl_action_remove_list);
}
+ else if (data == &perl_action_autoload_list)
+ {
+ plugin_script_action_autoload (weechat_perl_plugin,
+ &perl_quiet,
+ &perl_action_autoload_list);
+ }
}
return WEECHAT_RC_OK;
@@ -885,6 +899,14 @@ weechat_perl_signal_script_action_cb (void *data, const char *signal,
&weechat_perl_timer_action_cb,
&perl_action_remove_list);
}
+ else if (strcmp (signal, "perl_script_autoload") == 0)
+ {
+ plugin_script_action_add (&perl_action_autoload_list,
+ (const char *)signal_data);
+ weechat_hook_timer (1, 0, 1,
+ &weechat_perl_timer_action_cb,
+ &perl_action_autoload_list);
+ }
}
return WEECHAT_RC_OK;
@@ -1003,5 +1025,13 @@ weechat_plugin_end (struct t_weechat_plugin *plugin)
PERL_SYS_TERM ();
#endif
+ /* free some data */
+ if (perl_action_install_list)
+ free (perl_action_install_list);
+ if (perl_action_remove_list)
+ free (perl_action_remove_list);
+ if (perl_action_autoload_list)
+ free (perl_action_autoload_list);
+
return WEECHAT_RC_OK;
}
diff --git a/src/plugins/plugin-script.c b/src/plugins/plugin-script.c
index 169172f07..3f311cccc 100644
--- a/src/plugins/plugin-script.c
+++ b/src/plugins/plugin-script.c
@@ -93,8 +93,8 @@ plugin_script_init (struct t_weechat_plugin *weechat_plugin,
int argc, char *argv[],
struct t_plugin_script_init *init)
{
- char *string, *completion;
- char signal_name[128];
+ char *string, *completion, signal_name[128];
+ char *action_signals[] = { "install", "remove", "autoload", NULL };
int length, i, auto_load_scripts;
/* read script configuration */
@@ -192,15 +192,15 @@ plugin_script_init (struct t_weechat_plugin *weechat_plugin,
weechat_hook_signal ("buffer_closed",
init->callback_signal_buffer_closed, NULL);
- /* add signal for a script action (install/remove) */
- snprintf (signal_name, sizeof (signal_name), "%s_script_install",
- weechat_plugin->name);
- weechat_hook_signal (signal_name,
- init->callback_signal_script_action, NULL);
- snprintf (signal_name, sizeof (signal_name), "%s_script_remove",
- weechat_plugin->name);
- weechat_hook_signal (signal_name,
- init->callback_signal_script_action, NULL);
+ /* add signals for script actions (install/remove/autoload) */
+ for (i = 0; action_signals[i]; i++)
+ {
+ snprintf (signal_name, sizeof (signal_name), "%s_script_%s",
+ weechat_plugin->name,
+ action_signals[i]);
+ weechat_hook_signal (signal_name,
+ init->callback_signal_script_action, NULL);
+ }
/* parse arguments */
auto_load_scripts = 1;
@@ -931,7 +931,7 @@ plugin_script_remove_file (struct t_weechat_plugin *weechat_plugin,
* 1. unloads script (if script is loaded)
* 2. removes script file(s)
* 3. moves script file from "install" dir to language dir
- * 4. makes link in autoload dir
+ * 4. makes link in autoload dir (if option "-a" is given)
* 5. loads script.
*/
@@ -946,18 +946,33 @@ plugin_script_action_install (struct t_weechat_plugin *weechat_plugin,
char **argv, *name, *ptr_base_name, *base_name, *new_path, *autoload_path;
char *symlink_path, str_signal[128], *ptr_list;
const char *dir_home, *dir_separator;
- int argc, i, length, rc;
+ int argc, i, length, rc, autoload;
struct t_plugin_script *ptr_script;
if (!*list)
return;
ptr_list = *list;
+ autoload = 0;
*quiet = 0;
- if (strncmp (ptr_list, "-q ", 3) == 0)
+
+ while ((ptr_list[0] == ' ') || (ptr_list[0] == '-'))
{
- *quiet = 1;
- ptr_list += 3;
+ if (ptr_list[0] == ' ')
+ ptr_list++;
+ else
+ {
+ switch (ptr_list[1])
+ {
+ case 'a': /* no autoload */
+ autoload = 1;
+ break;
+ case 'q': /* quiet mode */
+ *quiet = 1;
+ break;
+ }
+ ptr_list += 2;
+ }
}
argv = weechat_string_split (ptr_list, ",", 0, 0, &argc);
@@ -994,29 +1009,32 @@ plugin_script_action_install (struct t_weechat_plugin *weechat_plugin,
if (rename (name, new_path) == 0)
{
/* make link in autoload dir */
- length = strlen (dir_home) +
- strlen (weechat_plugin->name) + 8 +
- strlen (base_name) + 16;
- autoload_path = malloc (length);
- if (autoload_path)
+ if (autoload)
{
- snprintf (autoload_path, length,
- "%s/%s/autoload/%s",
- dir_home, weechat_plugin->name,
- base_name);
- dir_separator = weechat_info_get ("dir_separator", "");
- length = 2 + strlen (dir_separator) +
- strlen (base_name) + 1;
- symlink_path = malloc (length);
- if (symlink_path)
+ length = strlen (dir_home) +
+ strlen (weechat_plugin->name) + 8 +
+ strlen (base_name) + 16;
+ autoload_path = malloc (length);
+ if (autoload_path)
{
- snprintf (symlink_path, length, "..%s%s",
- dir_separator, base_name);
- rc = symlink (symlink_path, autoload_path);
- (void) rc;
- free (symlink_path);
+ snprintf (autoload_path, length,
+ "%s/%s/autoload/%s",
+ dir_home, weechat_plugin->name,
+ base_name);
+ dir_separator = weechat_info_get ("dir_separator", "");
+ length = 2 + strlen (dir_separator) +
+ strlen (base_name) + 1;
+ symlink_path = malloc (length);
+ if (symlink_path)
+ {
+ snprintf (symlink_path, length, "..%s%s",
+ dir_separator, base_name);
+ rc = symlink (symlink_path, autoload_path);
+ (void) rc;
+ free (symlink_path);
+ }
+ free (autoload_path);
}
- free (autoload_path);
}
/* load script */
@@ -1112,6 +1130,104 @@ plugin_script_action_remove (struct t_weechat_plugin *weechat_plugin,
}
/*
+ * Enables/disables autoload for some scripts (using comma separated list).
+ */
+
+void
+plugin_script_action_autoload (struct t_weechat_plugin *weechat_plugin,
+ int *quiet,
+ char **list)
+{
+ char **argv, *name, *ptr_base_name, *base_name, *autoload_path;
+ char *symlink_path, *ptr_list;
+ const char *dir_home, *dir_separator;
+ int argc, i, length, rc, autoload;
+
+ if (!*list)
+ return;
+
+ ptr_list = *list;
+ autoload = 0;
+ *quiet = 0;
+
+ while ((ptr_list[0] == ' ') || (ptr_list[0] == '-'))
+ {
+ if (ptr_list[0] == ' ')
+ ptr_list++;
+ else
+ {
+ switch (ptr_list[1])
+ {
+ case 'a': /* no autoload */
+ autoload = 1;
+ break;
+ case 'q': /* quiet mode */
+ *quiet = 1;
+ break;
+ }
+ ptr_list += 2;
+ }
+ }
+
+ argv = weechat_string_split (ptr_list, ",", 0, 0, &argc);
+ if (argv)
+ {
+ for (i = 0; i < argc; i++)
+ {
+ name = strdup (argv[i]);
+ if (name)
+ {
+ ptr_base_name = basename (name);
+ base_name = strdup (ptr_base_name);
+ if (base_name)
+ {
+ dir_home = weechat_info_get ("weechat_dir", "");
+ length = strlen (dir_home) +
+ strlen (weechat_plugin->name) + 8 +
+ strlen (base_name) + 16;
+ autoload_path = malloc (length);
+ if (autoload_path)
+ {
+ snprintf (autoload_path, length,
+ "%s/%s/autoload/%s",
+ dir_home, weechat_plugin->name,
+ base_name);
+ if (autoload)
+ {
+ dir_separator = weechat_info_get ("dir_separator", "");
+ length = 2 + strlen (dir_separator) +
+ strlen (base_name) + 1;
+ symlink_path = malloc (length);
+ if (symlink_path)
+ {
+ snprintf (symlink_path, length, "..%s%s",
+ dir_separator, base_name);
+ rc = symlink (symlink_path, autoload_path);
+ (void) rc;
+ free (symlink_path);
+ }
+ }
+ else
+ {
+ unlink (autoload_path);
+ }
+ free (autoload_path);
+ }
+ free (base_name);
+ }
+ free (name);
+ }
+ }
+ weechat_string_free_split (argv);
+ }
+
+ *quiet = 0;
+
+ free (*list);
+ *list = NULL;
+}
+
+/*
* Displays list of scripts.
*/
diff --git a/src/plugins/plugin-script.h b/src/plugins/plugin-script.h
index 0a4c29323..aaf770148 100644
--- a/src/plugins/plugin-script.h
+++ b/src/plugins/plugin-script.h
@@ -145,6 +145,9 @@ extern void plugin_script_action_remove (struct t_weechat_plugin *weechat_plugin
void (*script_unload)(struct t_plugin_script *script),
int *quiet,
char **list);
+extern void plugin_script_action_autoload (struct t_weechat_plugin *weechat_plugin,
+ int *quiet,
+ char **list);
extern void plugin_script_display_list (struct t_weechat_plugin *weechat_plugin,
struct t_plugin_script *scripts,
const char *name, int full);
diff --git a/src/plugins/python/weechat-python.c b/src/plugins/python/weechat-python.c
index f5f6fde23..72304b4a7 100644
--- a/src/plugins/python/weechat-python.c
+++ b/src/plugins/python/weechat-python.c
@@ -86,7 +86,7 @@ static struct PyModuleDef moduleDefOutputs = {
/*
* string used to execute action "install":
- * when signal "python_install_script" is received, name of string
+ * when signal "python_script_install" is received, name of string
* is added to this string, to be installed later by a timer (when nothing is
* running in script)
*/
@@ -94,12 +94,20 @@ char *python_action_install_list = NULL;
/*
* string used to execute action "remove":
- * when signal "python_remove_script" is received, name of string
+ * when signal "python_script_remove" 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;
+/*
+ * string used to execute action "autoload":
+ * when signal "python_script_autoload" is received, name of string
+ * is added to this string, to autoload or disable autoload later by a timer
+ * (when nothing is running in script)
+ */
+char *python_action_autoload_list = NULL;
+
char python_buffer_output[128];
@@ -1167,13 +1175,20 @@ weechat_python_timer_action_cb (void *data, int remaining_calls)
&python_quiet,
&python_action_remove_list);
}
+ else if (data == &python_action_autoload_list)
+ {
+ plugin_script_action_autoload (weechat_python_plugin,
+ &python_quiet,
+ &python_action_autoload_list);
+ }
}
return WEECHAT_RC_OK;
}
/*
- * Callback called when a script action is asked (install/remove a script).
+ * Callback called when a script action is asked (install/remove/autoload a
+ * script).
*/
int
@@ -1202,6 +1217,14 @@ weechat_python_signal_script_action_cb (void *data, const char *signal,
&weechat_python_timer_action_cb,
&python_action_remove_list);
}
+ else if (strcmp (signal, "python_script_autoload") == 0)
+ {
+ plugin_script_action_add (&python_action_autoload_list,
+ (const char *)signal_data);
+ weechat_hook_timer (1, 0, 1,
+ &weechat_python_timer_action_cb,
+ &python_action_autoload_list);
+ }
}
return WEECHAT_RC_OK;
@@ -1314,6 +1337,8 @@ weechat_plugin_end (struct t_weechat_plugin *plugin)
free (python_action_install_list);
if (python_action_remove_list)
free (python_action_remove_list);
+ if (python_action_autoload_list)
+ free (python_action_autoload_list);
return WEECHAT_RC_OK;
}
diff --git a/src/plugins/ruby/weechat-ruby.c b/src/plugins/ruby/weechat-ruby.c
index 18fc0f914..0e2ec75e1 100644
--- a/src/plugins/ruby/weechat-ruby.c
+++ b/src/plugins/ruby/weechat-ruby.c
@@ -71,7 +71,7 @@ const char *ruby_current_script_filename = NULL;
/*
* string used to execute action "install":
- * when signal "ruby_install_script" is received, name of string
+ * when signal "ruby_script_install" is received, name of string
* is added to this string, to be installed later by a timer (when nothing is
* running in script)
*/
@@ -79,12 +79,20 @@ char *ruby_action_install_list = NULL;
/*
* string used to execute action "remove":
- * when signal "ruby_remove_script" is received, name of string
+ * when signal "ruby_script_remove" is received, name of string
* is added to this string, to be removed later by a timer (when nothing is
* running in script)
*/
char *ruby_action_remove_list = NULL;
+/*
+ * string used to execute action "autoload":
+ * when signal "ruby_script_autoload" is received, name of string
+ * is added to this string, to autoload or disable autoload later by a timer
+ * (when nothing is running in script)
+ */
+char *ruby_action_autoload_list = NULL;
+
VALUE ruby_mWeechat, ruby_mWeechatOutputs;
#define MOD_NAME_PREFIX "WeechatRubyModule"
@@ -987,6 +995,12 @@ weechat_ruby_timer_action_cb (void *data, int remaining_calls)
&ruby_quiet,
&ruby_action_remove_list);
}
+ else if (data == &ruby_action_autoload_list)
+ {
+ plugin_script_action_autoload (weechat_ruby_plugin,
+ &ruby_quiet,
+ &ruby_action_autoload_list);
+ }
}
return WEECHAT_RC_OK;
@@ -1022,6 +1036,14 @@ weechat_ruby_signal_script_action_cb (void *data, const char *signal,
&weechat_ruby_timer_action_cb,
&ruby_action_remove_list);
}
+ else if (strcmp (signal, "ruby_script_autoload") == 0)
+ {
+ plugin_script_action_add (&ruby_action_autoload_list,
+ (const char *)signal_data);
+ weechat_hook_timer (1, 0, 1,
+ &weechat_ruby_timer_action_cb,
+ &ruby_action_autoload_list);
+ }
}
return WEECHAT_RC_OK;
@@ -1175,5 +1197,13 @@ weechat_plugin_end (struct t_weechat_plugin *plugin)
*/
/*ruby_cleanup (0);*/
+ /* free some data */
+ if (ruby_action_install_list)
+ free (ruby_action_install_list);
+ if (ruby_action_remove_list)
+ free (ruby_action_remove_list);
+ if (ruby_action_autoload_list)
+ free (ruby_action_autoload_list);
+
return WEECHAT_RC_OK;
}
diff --git a/src/plugins/script/script-action.c b/src/plugins/script/script-action.c
index c00f5fa13..8c5a7c323 100644
--- a/src/plugins/script/script-action.c
+++ b/src/plugins/script/script-action.c
@@ -408,6 +408,79 @@ script_action_reload (const char *name, int quiet)
}
/*
+ * Enables/disables autoload for a script.
+ *
+ * Argument "autoload" can be:
+ * 0: disables autoload
+ * 1: enables autoload
+ * -1: toggles autoload
+ */
+
+void
+script_action_autoload (const char *name, int quiet, int autoload)
+{
+ struct t_script_repo *ptr_script;
+ char str_signal[256], *filename;
+ int length;
+
+ ptr_script = script_repo_search_by_name_ext (name);
+ if (!ptr_script)
+ {
+ if (!quiet)
+ {
+ weechat_printf (NULL,
+ _("%s: script \"%s\" not found"),
+ SCRIPT_PLUGIN_NAME, name);
+ }
+ return;
+ }
+
+ /* check that script is installed */
+ if (!(ptr_script->status & SCRIPT_STATUS_INSTALLED))
+ {
+ if (!quiet)
+ {
+ weechat_printf (NULL,
+ _("%s: script \"%s\" is not installed"),
+ SCRIPT_PLUGIN_NAME, name);
+ }
+ return;
+ }
+
+ /* toggle autoload if value is -1 */
+ if (autoload < 0)
+ autoload = (ptr_script->status & SCRIPT_STATUS_AUTOLOADED) ? 0 : 1;
+
+ /* ask plugin to autoload (or not) script */
+ length = 16 + strlen (ptr_script->name_with_extension) + 1;
+ filename = malloc (length);
+ if (filename)
+ {
+ snprintf (filename, length,
+ "%s%s%s",
+ (quiet && weechat_config_boolean (script_config_look_quiet_actions)) ? "-q " : "",
+ (autoload) ? "-a " : "",
+ ptr_script->name_with_extension);
+ snprintf (str_signal, sizeof (str_signal),
+ "%s_script_autoload",
+ script_language[ptr_script->language]);
+ weechat_hook_signal_send (str_signal,
+ WEECHAT_HOOK_SIGNAL_STRING,
+ filename);
+ free (filename);
+ }
+ if (!quiet)
+ {
+ weechat_printf (NULL,
+ (autoload) ?
+ _("%s: autoload enabled for script \"%s\"") :
+ _("%s: autoload disabled for script \"%s\""),
+ SCRIPT_PLUGIN_NAME, name);
+ }
+ script_repo_update_status (ptr_script);
+}
+
+/*
* Installs next script.
*/
@@ -461,13 +534,14 @@ script_action_install_process_cb (void *data, const char *command,
NULL);
if (filename)
{
- length = 3 + strlen (filename) + 1;
+ length = 16 + strlen (filename) + 1;
filename2 = malloc (length);
if (filename2)
{
snprintf (filename2, length,
- "%s%s",
+ "%s%s%s",
(quiet && weechat_config_boolean (script_config_look_quiet_actions)) ? "-q " : "",
+ (weechat_config_boolean (script_config_scripts_autoload)) ? "-a " : "",
filename);
snprintf (str_signal, sizeof (str_signal),
"%s_script_install",
@@ -1157,6 +1231,27 @@ script_action_run ()
script_action_reload (argv[j], quiet);
}
}
+ else if (weechat_strcasecmp (argv[0], "autoload") == 0)
+ {
+ for (j = 1; j < argc; j++)
+ {
+ script_action_autoload (argv[j], quiet, 1);
+ }
+ }
+ else if (weechat_strcasecmp (argv[0], "noautoload") == 0)
+ {
+ for (j = 1; j < argc; j++)
+ {
+ script_action_autoload (argv[j], quiet, 0);
+ }
+ }
+ else if (weechat_strcasecmp (argv[0], "toggleautoload") == 0)
+ {
+ for (j = 1; j < argc; j++)
+ {
+ script_action_autoload (argv[j], quiet, -1);
+ }
+ }
else if (weechat_strcasecmp (argv[0], "install") == 0)
{
script_found = 0;
diff --git a/src/plugins/script/script-buffer.c b/src/plugins/script/script-buffer.c
index 536d07f3f..65d5d09d1 100644
--- a/src/plugins/script/script-buffer.c
+++ b/src/plugins/script/script-buffer.c
@@ -510,9 +510,9 @@ script_buffer_refresh (int clear)
snprintf (str_title, sizeof (str_title),
_("%d/%d scripts (filter: %s) | Sort: %s | "
"Alt+key/input: i=install r=remove l=load L=reload "
- "u=unload h=(un)hold v=view script | Input: q=close "
- "$=refresh s:x,y=sort words=filter *=reset filter | "
- "Mouse: left=select right=install/remove"),
+ "u=unload A=autoload h=(un)hold v=view script | "
+ "Input: q=close $=refresh s:x,y=sort words=filter "
+ "*=reset filter | Mouse: left=select right=install/remove"),
script_repo_count_displayed,
script_repo_count,
(script_repo_filter) ? script_repo_filter : "*",
@@ -706,15 +706,16 @@ int
script_buffer_input_cb (void *data, struct t_gui_buffer *buffer,
const char *input_data)
{
- char *actions[][2] = { { "l", "load" },
- { "u", "unload" },
- { "L", "reload" },
- { "i", "install" },
- { "r", "remove" },
- { "h", "hold" },
- { "v", "show" },
- { "d", "showdiff" },
- { NULL, NULL } };
+ char *actions[][2] = { { "A", "toggleautoload" },
+ { "l", "load" },
+ { "u", "unload" },
+ { "L", "reload" },
+ { "i", "install" },
+ { "r", "remove" },
+ { "h", "hold" },
+ { "v", "show" },
+ { "d", "showdiff" },
+ { NULL, NULL } };
char str_command[64];
int i;
@@ -814,15 +815,16 @@ script_buffer_set_callbacks ()
void
script_buffer_set_keys ()
{
- char *keys[][2] = { { "meta-l", "load" },
- { "meta-u", "unload" },
- { "meta-L", "reload" },
- { "meta-i", "install" },
- { "meta-r", "remove" },
- { "meta-h", "hold" },
- { "meta-v", "show" },
- { "meta-d", "showdiff" },
- { NULL, NULL } };
+ char *keys[][2] = { { "meta-A", "toggleautoload" },
+ { "meta-l", "load" },
+ { "meta-u", "unload" },
+ { "meta-L", "reload" },
+ { "meta-i", "install" },
+ { "meta-r", "remove" },
+ { "meta-h", "hold" },
+ { "meta-v", "show" },
+ { "meta-d", "showdiff" },
+ { NULL, NULL } };
char str_key[64], str_command[64];
int i;
diff --git a/src/plugins/script/script-command.c b/src/plugins/script/script-command.c
index 012482465..7f2e1944f 100644
--- a/src/plugins/script/script-command.c
+++ b/src/plugins/script/script-command.c
@@ -169,7 +169,10 @@ script_command_script (void *data, struct t_gui_buffer *buffer, int argc,
if ((weechat_strcasecmp (argv[1], "load") == 0)
|| (weechat_strcasecmp (argv[1], "unload") == 0)
- || (weechat_strcasecmp (argv[1], "reload") == 0))
+ || (weechat_strcasecmp (argv[1], "reload") == 0)
+ || (weechat_strcasecmp (argv[1], "autoload") == 0)
+ || (weechat_strcasecmp (argv[1], "noautoload") == 0)
+ || (weechat_strcasecmp (argv[1], "toggleautoload") == 0))
{
script_command_action (buffer,
argv[1],
@@ -264,29 +267,33 @@ script_command_init ()
N_("WeeChat scripts manager"),
N_("list [-o|-i] || search <text> || show <script>"
" || load|unload|reload <script> [<script>...]"
+ " || autoload|noautoload|toggleautoload <script> [<script>...]"
" || install|remove|installremove|hold [-q] <script> [<script>...]"
" || upgrade || update"),
- N_(" list: list loaded scripts (all languages)\n"
- " -o: send list of loaded scripts to buffer\n"
- " -i: copy list of loaded scripts in "
+ N_(" list: list loaded scripts (all languages)\n"
+ " -o: send list of loaded scripts to buffer\n"
+ " -i: copy list of loaded scripts in "
"command line (for sending to buffer)\n"
- " search: search scripts by tags or text and "
+ " search: search scripts by tags or text and "
"display result on scripts buffer\n"
- " show: show detailed info about a script\n"
- " load: load script(s)\n"
- " unload: unload script(s)\n"
- " reload: reload script(s)\n"
- " install: install/upgrade script(s)\n"
- " remove: remove script(s)\n"
- "installremove: install or remove script(s), "
+ " show: show detailed info about a script\n"
+ " load: load script(s)\n"
+ " unload: unload script(s)\n"
+ " reload: reload script(s)\n"
+ " autoload: autoload the script\n"
+ " noautoload: do not autoload the script\n"
+ "toggleautoload: toggle autoload\n"
+ " install: install/upgrade script(s)\n"
+ " remove: remove script(s)\n"
+ " installremove: install or remove script(s), "
"depending on current state\n"
- " hold: hold/unhold script(s) (a script held "
+ " hold: hold/unhold script(s) (a script held "
"will not be upgraded any more and cannot be "
"removed)\n"
- " -q: quiet mode: do not display messages\n"
- " upgrade: upgrade all installed scripts which "
+ " -q: quiet mode: do not display messages\n"
+ " upgrade: upgrade all installed scripts which "
"are obsolete (new version available)\n"
- " update: update local scripts cache\n\n"
+ " update: update local scripts cache\n\n"
"Without argument, this command opens a buffer "
"with list of scripts.\n\n"
"On script buffer, the possible status for each "
@@ -338,6 +345,9 @@ script_command_init ()
" || reload %(python_script)|%(perl_script)|"
"%(ruby_script)|%(tcl_script)|%(lua_script)|"
"%(guile_script)|%*"
+ " || autoload %(script_scripts_installed)|%*"
+ " || noautoload %(script_scripts_installed)|%*"
+ " || toggleautoload %(script_scripts_installed)|%*"
" || install %(script_scripts)|%*"
" || remove %(script_scripts_installed)|%*"
" || installremove %(script_scripts)|%*"
diff --git a/src/plugins/script/script-config.c b/src/plugins/script/script-config.c
index 186e9dc88..5f29dd2a5 100644
--- a/src/plugins/script/script-config.c
+++ b/src/plugins/script/script-config.c
@@ -80,6 +80,7 @@ struct t_config_option *script_config_color_text_bg_selected;
/* script config, scripts section */
+struct t_config_option *script_config_scripts_autoload;
struct t_config_option *script_config_scripts_cache_expire;
struct t_config_option *script_config_scripts_dir;
struct t_config_option *script_config_scripts_hold;
@@ -670,6 +671,13 @@ script_config_init ()
return 0;
}
+ script_config_scripts_autoload = weechat_config_new_option (
+ script_config_file, ptr_section,
+ "autoload", "boolean",
+ N_("autoload scripts installed (make a link in \"autoload\" directory "
+ "to script in parent directory"),
+ NULL, 0, 0, "on", NULL, 0,
+ NULL, NULL, NULL, NULL, NULL, NULL);
script_config_scripts_cache_expire = weechat_config_new_option (
script_config_file, ptr_section,
"cache_expire", "integer",
diff --git a/src/plugins/script/script-config.h b/src/plugins/script/script-config.h
index caf00eabc..cead7f3ee 100644
--- a/src/plugins/script/script-config.h
+++ b/src/plugins/script/script-config.h
@@ -60,6 +60,7 @@ extern struct t_config_option *script_config_color_text_version_selected;
extern struct t_config_option *script_config_color_text_version_loaded_selected;
extern struct t_config_option *script_config_color_text_bg_selected;
+extern struct t_config_option *script_config_scripts_autoload;
extern struct t_config_option *script_config_scripts_cache_expire;
extern struct t_config_option *script_config_scripts_dir;
extern struct t_config_option *script_config_scripts_hold;
diff --git a/src/plugins/tcl/weechat-tcl.c b/src/plugins/tcl/weechat-tcl.c
index d379c0133..733af1c45 100644
--- a/src/plugins/tcl/weechat-tcl.c
+++ b/src/plugins/tcl/weechat-tcl.c
@@ -52,7 +52,7 @@ const char *tcl_current_script_filename = NULL;
/*
* string used to execute action "install":
- * when signal "tcl_install_script" is received, name of string
+ * when signal "tcl_script_install" is received, name of string
* is added to this string, to be installed later by a timer (when nothing is
* running in script)
*/
@@ -60,12 +60,20 @@ char *tcl_action_install_list = NULL;
/*
* string used to execute action "remove":
- * when signal "tcl_remove_script" is received, name of string
+ * when signal "tcl_script_remove" is received, name of string
* is added to this string, to be removed later by a timer (when nothing is
* running in script)
*/
char *tcl_action_remove_list = NULL;
+/*
+ * string used to execute action "autoload":
+ * when signal "tcl_script_autoload" is received, name of string
+ * is added to this string, to autoload or disable autoload later by a timer
+ * (when nothing is running in script)
+ */
+char *tcl_action_autoload_list = NULL;
+
Tcl_Interp* cinterp;
@@ -728,6 +736,12 @@ weechat_tcl_timer_action_cb (void *data, int remaining_calls)
&tcl_quiet,
&tcl_action_remove_list);
}
+ else if (data == &tcl_action_autoload_list)
+ {
+ plugin_script_action_autoload (weechat_tcl_plugin,
+ &tcl_quiet,
+ &tcl_action_autoload_list);
+ }
}
return WEECHAT_RC_OK;
@@ -763,6 +777,14 @@ weechat_tcl_signal_script_action_cb (void *data, const char *signal,
&weechat_tcl_timer_action_cb,
&tcl_action_remove_list);
}
+ else if (strcmp (signal, "tcl_script_autoload") == 0)
+ {
+ plugin_script_action_add (&tcl_action_autoload_list,
+ (const char *)signal_data);
+ weechat_hook_timer (1, 0, 1,
+ &weechat_tcl_timer_action_cb,
+ &tcl_action_autoload_list);
+ }
}
return WEECHAT_RC_OK;
@@ -811,5 +833,13 @@ weechat_plugin_end (struct t_weechat_plugin *plugin)
plugin_script_end (plugin, &tcl_scripts, &weechat_tcl_unload_all);
tcl_quiet = 0;
+ /* free some data */
+ if (tcl_action_install_list)
+ free (tcl_action_install_list);
+ if (tcl_action_remove_list)
+ free (tcl_action_remove_list);
+ if (tcl_action_autoload_list)
+ free (tcl_action_autoload_list);
+
return WEECHAT_RC_OK;
}