From 6b5b0d8915907259cc5b94f7c7e7368dcf776b85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Tue, 26 May 2026 16:00:13 +0200 Subject: [PATCH] core: add /theme command with list and info subcommands Add the /theme command with two read-only subcommands for now: - /theme (or /theme list): list registered themes; the active theme (matching weechat.look.theme) is marked with "->". - /theme info : show name, description, creation date, WeeChat version and override count of a theme. Both subcommands only consider themes present in the in-memory registry (registered via core/plugins/scripts). User theme files on disk are not yet handled: the file parser and transient file reads land in a later commit together with /theme apply. --- src/core/core-command.c | 111 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/src/core/core-command.c b/src/core/core-command.c index 5d1923597..035d0e3fd 100644 --- a/src/core/core-command.c +++ b/src/core/core-command.c @@ -68,6 +68,7 @@ #include "core-signal.h" #include "core-string.h" #include "core-sys.h" +#include "core-theme.h" #include "core-upgrade.h" #include "core-url.h" #include "core-utf8.h" @@ -7180,6 +7181,95 @@ COMMAND_CALLBACK(sys) COMMAND_ERROR; } +/* + * Callback for command "/theme": list or display details on themes. + */ + +COMMAND_CALLBACK(theme) +{ + struct t_arraylist *list; + struct t_theme *ptr_theme; + const char *ptr_active; + int i, size; + + /* make C compiler happy */ + (void) pointer; + (void) data; + (void) buffer; + (void) argv_eol; + + /* "/theme" or "/theme list": list themes */ + if ((argc == 1) || (string_strcmp (argv[1], "list") == 0)) + { + list = theme_list (); + if (!list || (arraylist_size (list) == 0)) + { + gui_chat_printf (NULL, _("No theme registered")); + arraylist_free (list); + return WEECHAT_RC_OK; + } + ptr_active = CONFIG_STRING(config_look_theme); + gui_chat_printf (NULL, ""); + gui_chat_printf (NULL, _("Themes:")); + size = arraylist_size (list); + for (i = 0; i < size; i++) + { + ptr_theme = (struct t_theme *)arraylist_get (list, i); + gui_chat_printf ( + NULL, + " %s %s%s%s%s%s", + (ptr_active && (strcmp (ptr_active, ptr_theme->name) == 0)) + ? "->" : " ", + GUI_COLOR(GUI_COLOR_CHAT_BUFFER), + ptr_theme->name, + GUI_COLOR(GUI_COLOR_CHAT_DELIMITERS), + (ptr_theme->description && ptr_theme->description[0]) + ? ": " : "", + (ptr_theme->description) ? ptr_theme->description : ""); + } + arraylist_free (list); + return WEECHAT_RC_OK; + } + + /* "/theme info ": show details about a theme */ + if (string_strcmp (argv[1], "info") == 0) + { + COMMAND_MIN_ARGS(3, "info"); + ptr_theme = theme_search (argv[2]); + if (!ptr_theme) + { + gui_chat_printf (NULL, + _("%sTheme \"%s\" not found"), + gui_chat_prefix[GUI_CHAT_PREFIX_ERROR], + argv[2]); + return WEECHAT_RC_ERROR; + } + gui_chat_printf (NULL, ""); + gui_chat_printf (NULL, + _("Theme \"%s%s%s\":"), + GUI_COLOR(GUI_COLOR_CHAT_BUFFER), + ptr_theme->name, + GUI_COLOR(GUI_COLOR_CHAT)); + gui_chat_printf (NULL, + _(" description : %s"), + (ptr_theme->description) ? ptr_theme->description : ""); + gui_chat_printf (NULL, + _(" date : %s"), + (ptr_theme->date) ? ptr_theme->date : ""); + gui_chat_printf (NULL, + _(" WeeChat version: %s"), + (ptr_theme->weechat_version) + ? ptr_theme->weechat_version : ""); + gui_chat_printf (NULL, + _(" overrides : %d"), + (ptr_theme->overrides) + ? ptr_theme->overrides->items_count : 0); + return WEECHAT_RC_OK; + } + + COMMAND_ERROR; +} + /* * Callback for command "/toggle": toggle value of configuration option. */ @@ -9832,6 +9922,27 @@ command_init (void) " || suspend" " || waitpid 1|10|100|1000", &command_sys, NULL, NULL); + hook_command ( + NULL, "theme", + N_("manage color themes"), + /* TRANSLATORS: only text between angle brackets (eg: "") may be translated */ + N_("[list]" + " || info "), + CMD_ARGS_DESC( + N_("raw[list]: list registered themes (default action with no " + "argument); active theme is marked with \"->\""), + N_("raw[info]: display details on a theme (name, description, " + "creation date, WeeChat version, number of option overrides)"), + N_("name: name of a theme"), + "", + N_("Themes are named bundles of color (and other themable) " + "option overrides. Built-in themes are registered in memory " + "by core/plugins/scripts; user themes are read from files " + "in directory \"themes\" inside the WeeChat configuration " + "directory.")), + "list" + " || info", + &command_theme, NULL, NULL); hook_command ( NULL, "toggle", N_("toggle value of a config option"),