summaryrefslogtreecommitdiff
path: root/src/plugins/alias/alias-config.c
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2010-03-21 18:30:51 +0100
committerSebastien Helleu <flashcode@flashtux.org>2010-03-21 18:30:51 +0100
commitb40ea94a497b0b6bd76e3b069c49c4f0a7a5f2d2 (patch)
treef57f0c79a2ad31a6b657a62b13a071d86c5d419c /src/plugins/alias/alias-config.c
parent7d65014efdd466484867d46a83cee61918d309eb (diff)
downloadweechat-b40ea94a497b0b6bd76e3b069c49c4f0a7a5f2d2.zip
Add custom completion for aliases (task #9479)
Diffstat (limited to 'src/plugins/alias/alias-config.c')
-rw-r--r--src/plugins/alias/alias-config.c368
1 files changed, 368 insertions, 0 deletions
diff --git a/src/plugins/alias/alias-config.c b/src/plugins/alias/alias-config.c
new file mode 100644
index 000000000..4657a7d1c
--- /dev/null
+++ b/src/plugins/alias/alias-config.c
@@ -0,0 +1,368 @@
+/*
+ * Copyright (c) 2003-2010 by FlashCode <flashcode@flashtux.org>
+ * See README for License detail, AUTHORS for developers list.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* alias-config.c: alias configuration options */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "../weechat-plugin.h"
+#include "alias.h"
+
+
+struct t_config_file *alias_config_file = NULL;
+struct t_config_section *alias_config_section_cmd = NULL;
+struct t_config_section *alias_config_section_completion = NULL;
+
+
+/*
+ * alias_config_cmd_change_cb: callback called when alias option is modified
+ * in section "cmd" (command)
+ */
+
+void
+alias_config_cmd_change_cb (void *data, struct t_config_option *option)
+{
+ struct t_config_option *ptr_option_completion;
+
+ /* make C compiler happy */
+ (void) data;
+
+ ptr_option_completion = weechat_config_search_option (alias_config_file,
+ alias_config_section_completion,
+ weechat_config_option_get_pointer (option, "name"));
+
+ alias_new (weechat_config_option_get_pointer (option, "name"),
+ weechat_config_option_get_pointer (option, "value"),
+ (ptr_option_completion) ?
+ weechat_config_option_get_pointer (ptr_option_completion, "value") : NULL);
+}
+
+/*
+ * alias_config_cmd_delete_cb: callback called when alias option is deleted
+ * in section "cmd" (command)
+ */
+
+void
+alias_config_cmd_delete_cb (void *data, struct t_config_option *option)
+{
+ struct t_config_option *ptr_option_completion;
+ struct t_alias *ptr_alias;
+
+ /* make C compiler happy */
+ (void) data;
+
+ ptr_option_completion = weechat_config_search_option (alias_config_file,
+ alias_config_section_completion,
+ weechat_config_option_get_pointer (option, "name"));
+
+ ptr_alias = alias_search (weechat_config_option_get_pointer (option, "name"));
+ if (ptr_alias)
+ alias_free (ptr_alias);
+
+ if (ptr_option_completion)
+ weechat_config_option_free (ptr_option_completion);
+}
+
+/*
+ * alias_config_completion_change_cb: callback called when alias completion is
+ * modified in section "completion"
+ */
+
+void
+alias_config_completion_change_cb (void *data, struct t_config_option *option)
+{
+ struct t_alias *ptr_alias;
+
+ /* make C compiler happy */
+ (void) data;
+
+ ptr_alias = alias_search (weechat_config_option_get_pointer (option, "name"));
+ if (ptr_alias && ptr_alias->hook)
+ {
+ alias_update_completion (ptr_alias,
+ weechat_config_option_get_pointer (option, "value"));
+ }
+}
+
+/*
+ * alias_config_completion_delete_cb: callback called when alias completion is
+ * deleted in section "completion"
+ */
+
+void
+alias_config_completion_delete_cb (void *data, struct t_config_option *option)
+{
+ struct t_alias *ptr_alias;
+
+ /* make C compiler happy */
+ (void) data;
+
+ ptr_alias = alias_search (weechat_config_option_get_pointer (option, "name"));
+ if (ptr_alias && ptr_alias->hook && ptr_alias->completion)
+ {
+ alias_update_completion (ptr_alias, NULL);
+ }
+}
+
+/*
+ * alias_config_reload: reload alias configuration file
+ */
+
+int
+alias_config_reload (void *data, struct t_config_file *config_file)
+{
+ /* make C compiler happy */
+ (void) data;
+
+ weechat_config_section_free_options (alias_config_section_cmd);
+ weechat_config_section_free_options (alias_config_section_completion);
+ alias_free_all ();
+
+ return weechat_config_reload (config_file);
+}
+
+/*
+ * alias_config_cmd_write_default_cb: write default aliases in configuration
+ * file in section "cmd" (command)
+ */
+
+void
+alias_config_cmd_write_default_cb (void *data,
+ struct t_config_file *config_file,
+ const char *section_name)
+{
+ /* make C compiler happy */
+ (void) data;
+
+ weechat_config_write_line (config_file, section_name, NULL);
+
+ weechat_config_write_line (config_file, "AAWAY", "%s", "\"allserv /away\"");
+ weechat_config_write_line (config_file, "AME", "%s", "\"allchan /me\"");
+ weechat_config_write_line (config_file, "AMSG", "%s", "\"allchan /msg *\"");
+ weechat_config_write_line (config_file, "ANICK", "%s", "\"allserv /nick\"");
+ weechat_config_write_line (config_file, "BYE", "%s", "\"quit\"");
+ weechat_config_write_line (config_file, "C", "%s", "\"buffer clear\"");
+ weechat_config_write_line (config_file, "CL", "%s", "\"buffer clear\"");
+ weechat_config_write_line (config_file, "CLOSE", "%s", "\"buffer close\"");
+ weechat_config_write_line (config_file, "CHAT", "%s", "\"dcc chat\"");
+ weechat_config_write_line (config_file, "EXIT", "%s", "\"quit\"");
+ weechat_config_write_line (config_file, "IG", "%s", "\"ignore\"");
+ weechat_config_write_line (config_file, "J", "%s", "\"join\"");
+ weechat_config_write_line (config_file, "K", "%s", "\"kick\"");
+ weechat_config_write_line (config_file, "KB", "%s", "\"kickban\"");
+ weechat_config_write_line (config_file, "LEAVE", "%s", "\"part\"");
+ weechat_config_write_line (config_file, "M", "%s", "\"msg\"");
+ weechat_config_write_line (config_file, "MUB", "%s", "\"unban *\"");
+ weechat_config_write_line (config_file, "N", "%s", "\"names\"");
+ weechat_config_write_line (config_file, "Q", "%s", "\"query\"");
+ weechat_config_write_line (config_file, "REDRAW", "%s", "\"window refresh\"");
+ weechat_config_write_line (config_file, "SAY", "%s", "\"msg *\"");
+ weechat_config_write_line (config_file, "SIGNOFF", "%s", "\"quit\"");
+ weechat_config_write_line (config_file, "T", "%s", "\"topic\"");
+ weechat_config_write_line (config_file, "UB", "%s", "\"unban\"");
+ weechat_config_write_line (config_file, "V", "%s", "\"command core version\"");
+ weechat_config_write_line (config_file, "W", "%s", "\"who\"");
+ weechat_config_write_line (config_file, "WC", "%s", "\"window merge\"");
+ weechat_config_write_line (config_file, "WI", "%s", "\"whois\"");
+ weechat_config_write_line (config_file, "WII", "%s", "\"whois $1 $1\"");
+ weechat_config_write_line (config_file, "WW", "%s", "\"whowas\"");
+}
+
+/*
+ * alias_config_cmd_new_option: create new option in section "cmd" (command)
+ */
+
+void
+alias_config_cmd_new_option (const char *name, const char *command)
+{
+ weechat_config_new_option (alias_config_file, alias_config_section_cmd,
+ name, "string", NULL,
+ NULL, 0, 0, "", command, 0,
+ NULL, NULL,
+ &alias_config_cmd_change_cb, NULL,
+ &alias_config_cmd_delete_cb, NULL);
+}
+
+/*
+ * alias_config_cmd_create_option_cb: create an alias in section "cmd"
+ * (command)
+ */
+
+int
+alias_config_cmd_create_option_cb (void *data,
+ struct t_config_file *config_file,
+ struct t_config_section *section,
+ const char *option_name, const char *value)
+{
+ struct t_alias *ptr_alias;
+ int rc;
+
+ /* make C compiler happy */
+ (void) data;
+ (void) config_file;
+ (void) section;
+
+ rc = WEECHAT_CONFIG_OPTION_SET_ERROR;
+
+ /* create config option */
+ alias_config_cmd_new_option (option_name, value);
+
+ /* create alias */
+ ptr_alias = alias_search (option_name);
+ if (ptr_alias)
+ alias_free (ptr_alias);
+ if (value && value[0])
+ rc = (alias_new (option_name, value, NULL)) ?
+ WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE : WEECHAT_CONFIG_OPTION_SET_ERROR;
+ else
+ rc = WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE;
+
+ if (rc == WEECHAT_CONFIG_OPTION_SET_ERROR)
+ {
+ weechat_printf (NULL,
+ _("%s%s: error creating alias \"%s\" => \"%s\""),
+ weechat_prefix ("error"), ALIAS_PLUGIN_NAME,
+ option_name, value);
+ }
+
+ return rc;
+}
+
+/*
+ * alias_config_completion_new_option: create new option in section "completion"
+ */
+
+void
+alias_config_completion_new_option (const char *name, const char *completion)
+{
+ weechat_config_new_option (alias_config_file,
+ alias_config_section_completion,
+ name, "string", NULL,
+ NULL, 0, 0, "", completion, 0,
+ NULL, NULL,
+ &alias_config_completion_change_cb, NULL,
+ &alias_config_completion_delete_cb, NULL);
+}
+
+/*
+ * alias_config_completion_create_option_cb: create a completion for an alias
+ * in section "completion"
+ */
+
+int
+alias_config_completion_create_option_cb (void *data,
+ struct t_config_file *config_file,
+ struct t_config_section *section,
+ const char *option_name,
+ const char *value)
+{
+ struct t_alias *ptr_alias;
+
+ /* make C compiler happy */
+ (void) data;
+ (void) config_file;
+ (void) section;
+
+ ptr_alias = alias_search (option_name);
+ if (!ptr_alias)
+ {
+ weechat_printf (NULL,
+ _("%s%s: error creating completion for alias \"%s\": "
+ "alias not found"),
+ weechat_prefix ("error"), ALIAS_PLUGIN_NAME,
+ option_name);
+ return WEECHAT_CONFIG_OPTION_SET_ERROR;
+ }
+
+ /* create config option */
+ alias_config_completion_new_option (option_name, value);
+
+ /* create/update completion in alias */
+ alias_update_completion (ptr_alias, value);
+
+ return WEECHAT_CONFIG_OPTION_SET_OK_SAME_VALUE;
+}
+
+/*
+ * alias_config_init: init alias configuration file
+ * return: 1 if ok, 0 if error
+ */
+
+int
+alias_config_init ()
+{
+ struct t_config_section *ptr_section;
+
+ alias_config_file = weechat_config_new (ALIAS_CONFIG_NAME,
+ &alias_config_reload, NULL);
+ if (!alias_config_file)
+ return 0;
+
+ ptr_section = weechat_config_new_section (alias_config_file, "cmd",
+ 1, 1,
+ NULL, NULL,
+ NULL, NULL,
+ &alias_config_cmd_write_default_cb, NULL,
+ &alias_config_cmd_create_option_cb, NULL,
+ NULL, NULL);
+ if (!ptr_section)
+ {
+ weechat_config_free (alias_config_file);
+ return 0;
+ }
+ alias_config_section_cmd = ptr_section;
+
+ ptr_section = weechat_config_new_section (alias_config_file, "completion",
+ 1, 1,
+ NULL, NULL,
+ NULL, NULL,
+ NULL, NULL,
+ &alias_config_completion_create_option_cb, NULL,
+ NULL, NULL);
+ if (!ptr_section)
+ {
+ weechat_config_free (alias_config_file);
+ return 0;
+ }
+ alias_config_section_completion = ptr_section;
+
+ return 1;
+}
+
+/*
+ * alias_config_read: read alias configuration file
+ */
+
+int
+alias_config_read ()
+{
+ return weechat_config_read (alias_config_file);
+}
+
+/*
+ * alias_config_write: write alias configuration file
+ */
+
+int
+alias_config_write ()
+{
+ return weechat_config_write (alias_config_file);
+}