mirror of
https://github.com/weechat/weechat.git
synced 2026-06-12 14:14:48 +02:00
d56e46908f
Make individual scripts the unit of ownership for theme contributions
so that loading a script that calls weechat.theme_register(...) and
later unloading it correctly removes the script's overrides.
Plugin API addition (weechat-plugin.h):
- new function pointer t_weechat_plugin.theme_unregister_script
delegates to core's theme_unregister_script.
- new convenience macro weechat_theme_unregister_script(script).
- WEECHAT_PLUGIN_API_VERSION bumped to 20260527-02.
Script API additions (plugin-script-api.{c,h}):
- new plugin_script_api_theme_register (plugin, script, name,
overrides) forwards to the plugin API with the script pointer
as the contribution owner, so contributions are tracked
per-script (not per script-language plugin).
Lifecycle wiring (plugin-script.c):
- new file-local plugin_script_remove_themes (plugin, script)
calls weechat_theme_unregister_script.
- plugin_script_remove now calls it alongside the other
plugin_script_remove_* helpers, so script-unload tears down
everything (configs, bar items, themes, hooks).
Eight language bindings updated to call
plugin_script_api_theme_register instead of weechat_theme_register
directly, so they pass the script pointer as owner:
- python, perl, ruby, lua, tcl, javascript, php, guile.
The behavior change is end-to-end visible only at script unload:
before, an unloaded script's theme overrides lingered in the
registry forever and would be re-applied on the next /theme apply;
after, they vanish when the script unloads. /plugin unload of an
entire script-language plugin already worked via commit 24's hook
in plugin_remove (which drops both plugin-only contributions and
their script-owned children when the language plugin itself goes
away, because the contribution's plugin pointer matches).
No new unit tests in this commit: the underlying theme_unregister_script
function is covered by TEST(CoreTheme, UnregisterByOwner), and the
remaining changes are plumbing.
457 lines
38 KiB
C
457 lines
38 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2003-2026 Sébastien Helleu <flashcode@flashtux.org>
|
|
* SPDX-FileCopyrightText: 2012 Simon Arlott
|
|
*
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
*
|
|
* This file is part of WeeChat, the extensible chat client.
|
|
*
|
|
* WeeChat 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.
|
|
*
|
|
* WeeChat 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 WeeChat. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef WEECHAT_PLUGIN_PLUGIN_SCRIPT_API_H
|
|
#define WEECHAT_PLUGIN_PLUGIN_SCRIPT_API_H
|
|
|
|
#include <time.h>
|
|
|
|
extern void plugin_script_api_charset_set (struct t_plugin_script *script,
|
|
const char *charset);
|
|
extern int plugin_script_api_string_match_list (struct t_weechat_plugin *weechat_plugin,
|
|
const char *string,
|
|
const char *masks,
|
|
int case_sensitive);
|
|
extern struct t_config_file *plugin_script_api_config_new (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *name,
|
|
int (*callback_reload)(const void *pointer,
|
|
void *data,
|
|
struct t_config_file *config_file),
|
|
const char *function,
|
|
const char *data);
|
|
extern int plugin_script_api_config_set_version (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
struct t_config_file *config_file,
|
|
int version,
|
|
struct t_hashtable *(*callback_update)(const void *pointer,
|
|
void *data,
|
|
struct t_config_file *config_file,
|
|
int version_read,
|
|
struct t_hashtable *data_read),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_config_section *plugin_script_api_config_new_section (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
struct t_config_file *config_file,
|
|
const char *name,
|
|
int user_can_add_options,
|
|
int user_can_delete_options,
|
|
int (*callback_read)(const void *pointer,
|
|
void *data,
|
|
struct t_config_file *config_file,
|
|
struct t_config_section *section,
|
|
const char *option_name,
|
|
const char *value),
|
|
const char *function_read,
|
|
const char *data_read,
|
|
int (*callback_write)(const void *pointer,
|
|
void *data,
|
|
struct t_config_file *config_file,
|
|
const char *section_name),
|
|
const char *function_write,
|
|
const char *data_write,
|
|
int (*callback_write_default)(const void *pointer,
|
|
void *data,
|
|
struct t_config_file *config_file,
|
|
const char *section_name),
|
|
const char *function_write_default,
|
|
const char *data_write_default,
|
|
int (*callback_create_option)(const void *pointer,
|
|
void *data,
|
|
struct t_config_file *config_file,
|
|
struct t_config_section *section,
|
|
const char *option_name,
|
|
const char *value),
|
|
const char *function_create_option,
|
|
const char *data_create_option,
|
|
int (*callback_delete_option)(const void *pointer,
|
|
void *data,
|
|
struct t_config_file *config_file,
|
|
struct t_config_section *section,
|
|
struct t_config_option *option),
|
|
const char *function_delete_option,
|
|
const char *data_delete_option);
|
|
extern struct t_config_option *plugin_script_api_config_new_option (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
struct t_config_file *config_file,
|
|
struct t_config_section *section,
|
|
const char *name,
|
|
const char *type,
|
|
const char *description,
|
|
const char *string_values,
|
|
int min, int max,
|
|
const char *default_value,
|
|
const char *value,
|
|
int null_value_allowed,
|
|
int (*callback_check_value)(const void *pointer,
|
|
void *data,
|
|
struct t_config_option *option,
|
|
const char *value),
|
|
const char *function_check_value,
|
|
const char *data_check_value,
|
|
void (*callback_change)(const void *pointer,
|
|
void *data,
|
|
struct t_config_option *option),
|
|
const char *function_change,
|
|
const char *data_change,
|
|
void (*callback_delete)(const void *pointer,
|
|
void *data,
|
|
struct t_config_option *option),
|
|
const char *function_delete,
|
|
const char *data_delete);
|
|
extern void plugin_script_api_printf (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
struct t_gui_buffer *buffer,
|
|
const char *format, ...);
|
|
extern void plugin_script_api_printf_date_tags (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
struct t_gui_buffer *buffer,
|
|
time_t date, const char *tags,
|
|
const char *format, ...);
|
|
extern void plugin_script_api_printf_datetime_tags (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
struct t_gui_buffer *buffer,
|
|
time_t date, int date_usec,
|
|
const char *tags,
|
|
const char *format, ...);
|
|
extern void plugin_script_api_printf_y (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
struct t_gui_buffer *buffer,
|
|
int y, const char *format, ...);
|
|
extern void plugin_script_api_printf_y_date_tags (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
struct t_gui_buffer *buffer,
|
|
int y, time_t date,
|
|
const char *tags,
|
|
const char *format, ...);
|
|
extern void plugin_script_api_printf_y_datetime_tags (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
struct t_gui_buffer *buffer,
|
|
int y,
|
|
time_t date, int date_usec,
|
|
const char *tags,
|
|
const char *format, ...);
|
|
extern void plugin_script_api_log_printf (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *format, ...);
|
|
extern struct t_hook *plugin_script_api_hook_command (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *command, const char *description,
|
|
const char *args, const char *args_description,
|
|
const char *completion,
|
|
int (*callback)(const void *pointer,
|
|
void *data,
|
|
struct t_gui_buffer *buffer,
|
|
int argc, char **argv,
|
|
char **argv_eol),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_command_run (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *command,
|
|
int (*callback)(const void *pointer,
|
|
void *data,
|
|
struct t_gui_buffer *buffer,
|
|
const char *command),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_timer (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
long interval, int align_second,
|
|
int max_calls,
|
|
int (*callback)(const void *pointer,
|
|
void *data,
|
|
int remaining_calls),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_fd (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
int fd, int flag_read,
|
|
int flag_write, int flag_exception,
|
|
int (*callback)(const void *pointer,
|
|
void *data,
|
|
int fd),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_process_hashtable (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *command,
|
|
struct t_hashtable *options,
|
|
int timeout,
|
|
int (*callback)(const void *pointer,
|
|
void *data,
|
|
const char *command,
|
|
int return_code,
|
|
const char *out,
|
|
const char *err),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_process (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *command,
|
|
int timeout,
|
|
int (*callback)(const void *pointer,
|
|
void *data,
|
|
const char *command,
|
|
int return_code,
|
|
const char *out,
|
|
const char *err),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_url (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *url,
|
|
struct t_hashtable *options,
|
|
int timeout,
|
|
int (*callback)(const void *pointer,
|
|
void *data,
|
|
const char *url,
|
|
struct t_hashtable *options,
|
|
struct t_hashtable *output),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_connect (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *proxy,
|
|
const char *address,
|
|
int port,
|
|
int ipv6,
|
|
int retry,
|
|
void *gnutls_sess,
|
|
void *gnutls_cb,
|
|
int gnutls_dhkey_size,
|
|
const char *gnutls_priorities,
|
|
const char *local_hostname,
|
|
int (*callback)(const void *pointer,
|
|
void *data,
|
|
int status,
|
|
int gnutls_rc,
|
|
int sock,
|
|
const char *error,
|
|
const char *ip_address),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_line (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *buffer_type,
|
|
const char *buffer_name,
|
|
const char *tags,
|
|
struct t_hashtable *(*callback)(const void *pointer,
|
|
void *data,
|
|
struct t_hashtable *line),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_print (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
struct t_gui_buffer *buffer,
|
|
const char *tags,
|
|
const char *message,
|
|
int strip_colors,
|
|
int (*callback)(const void *pointer,
|
|
void *data,
|
|
struct t_gui_buffer *buffer,
|
|
time_t date,
|
|
int date_usec,
|
|
int tags_count,
|
|
const char **tags,
|
|
int displayed,
|
|
int highlight,
|
|
const char *prefix,
|
|
const char *message),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_signal (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *signal,
|
|
int (*callback)(const void *pointer,
|
|
void *data,
|
|
const char *signal,
|
|
const char *type_data,
|
|
void *signal_data),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_hsignal (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *signal,
|
|
int (*callback)(const void *pointer,
|
|
void *data,
|
|
const char *signal,
|
|
struct t_hashtable *hashtable),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_config (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *option,
|
|
int (*callback)(const void *pointer,
|
|
void *data,
|
|
const char *option,
|
|
const char *value),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_completion (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *completion,
|
|
const char *description,
|
|
int (*callback)(const void *pointer,
|
|
void *data,
|
|
const char *completion_item,
|
|
struct t_gui_buffer *buffer,
|
|
struct t_gui_completion *completion),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_modifier (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *modifier,
|
|
char *(*callback)(const void *pointer,
|
|
void *data,
|
|
const char *modifier,
|
|
const char *modifier_data,
|
|
const char *string),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_info (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *info_name,
|
|
const char *description,
|
|
const char *args_description,
|
|
char *(*callback)(const void *pointer,
|
|
void *data,
|
|
const char *info_name,
|
|
const char *arguments),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_info_hashtable (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *info_name,
|
|
const char *description,
|
|
const char *args_description,
|
|
const char *output_description,
|
|
struct t_hashtable *(*callback)(const void *pointer,
|
|
void *data,
|
|
const char *info_name,
|
|
struct t_hashtable *hashtable),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_infolist (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *infolist_name,
|
|
const char *description,
|
|
const char *pointer_description,
|
|
const char *args_description,
|
|
struct t_infolist *(*callback)(const void *pointer,
|
|
void *data,
|
|
const char *infolist_name,
|
|
void *obj_pointer,
|
|
const char *arguments),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_hook *plugin_script_api_hook_focus (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *area,
|
|
struct t_hashtable *(*callback)(const void *pointer,
|
|
void *data,
|
|
struct t_hashtable *info),
|
|
const char *function,
|
|
const char *data);
|
|
extern struct t_gui_buffer *plugin_script_api_buffer_new_props (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *name,
|
|
struct t_hashtable *properties,
|
|
int (*input_callback)(const void *pointer,
|
|
void *data,
|
|
struct t_gui_buffer *buffer,
|
|
const char *input_data),
|
|
const char *function_input,
|
|
const char *data_input,
|
|
int (*close_callback)(const void *pointer,
|
|
void *data,
|
|
struct t_gui_buffer *buffer),
|
|
const char *function_close,
|
|
const char *data_close);
|
|
extern struct t_gui_buffer *plugin_script_api_buffer_new (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *name,
|
|
int (*input_callback)(const void *pointer,
|
|
void *data,
|
|
struct t_gui_buffer *buffer,
|
|
const char *input_data),
|
|
const char *function_input,
|
|
const char *data_input,
|
|
int (*close_callback)(const void *pointer,
|
|
void *data,
|
|
struct t_gui_buffer *buffer),
|
|
const char *function_close,
|
|
const char *data_close);
|
|
extern struct t_gui_bar_item *plugin_script_api_bar_item_new (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *name,
|
|
char *(*build_callback)(const void *pointer,
|
|
void *data,
|
|
struct t_gui_bar_item *item,
|
|
struct t_gui_window *window,
|
|
struct t_gui_buffer *buffer,
|
|
struct t_hashtable *extra_info),
|
|
const char *function,
|
|
const char *data);
|
|
extern int plugin_script_api_command_options (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
struct t_gui_buffer *buffer,
|
|
const char *command,
|
|
struct t_hashtable *options);
|
|
extern int plugin_script_api_command (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
struct t_gui_buffer *buffer,
|
|
const char *command);
|
|
extern const char *plugin_script_api_config_get_plugin (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *option);
|
|
extern int plugin_script_api_config_is_set_plugin (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *option);
|
|
extern int plugin_script_api_config_set_plugin (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *option, const char *value);
|
|
extern void plugin_script_api_config_set_desc_plugin (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *option,
|
|
const char *description);
|
|
extern int plugin_script_api_config_unset_plugin (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *option);
|
|
extern struct t_theme *plugin_script_api_theme_register (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *name,
|
|
struct t_hashtable *overrides);
|
|
extern struct t_upgrade_file *plugin_script_api_upgrade_new (struct t_weechat_plugin *weechat_plugin,
|
|
struct t_plugin_script *script,
|
|
const char *filename,
|
|
int (*callback_read)(const void *pointer,
|
|
void *data,
|
|
struct t_upgrade_file *upgrade_file,
|
|
int object_id,
|
|
struct t_infolist *infolist),
|
|
const char *function,
|
|
const char *data);
|
|
|
|
#endif /* WEECHAT_PLUGIN_PLUGIN_SCRIPT_API_H */
|