mirror of
https://github.com/weechat/weechat.git
synced 2026-06-12 14:14:48 +02:00
core: add /theme reset to restore original themable defaults
This commit is contained in:
+1
-1
@@ -16,7 +16,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
### Added
|
||||
|
||||
- core: add `/theme` command with subcommands `list`, `apply`, `save`, `delete`, `info`, automatic backup of current themable options before apply, and built-in "light" theme
|
||||
- core: add `/theme` command with subcommands `list`, `apply`, `reset`, `save`, `delete`, `info`, automatic backup of current themable options before apply, and built-in "light" theme
|
||||
- core: add `themable` flag on configuration options (auto-set for color options; explicit opt-in for string options containing `${color:...}` references via the `type|themable` syntax)
|
||||
- core: add option weechat.look.theme (informational, set by `/theme apply`)
|
||||
- core: add option weechat.look.theme_backup (boolean, default `on`)
|
||||
|
||||
@@ -2248,6 +2248,20 @@ is aborted before any option is changed.
|
||||
The name of the last applied theme is stored in
|
||||
`+weechat.look.theme+` (informational only; not re-applied at startup).
|
||||
|
||||
[[themes_reset]]
|
||||
==== Resetting to defaults
|
||||
|
||||
To restore the look shipped with WeeChat, reset every themable option
|
||||
to its default value:
|
||||
|
||||
----
|
||||
/theme reset
|
||||
----
|
||||
|
||||
A backup is written first (same gate as `+/theme apply+`); on backup
|
||||
failure the reset is aborted before any option is changed.
|
||||
`+weechat.look.theme+` is cleared too.
|
||||
|
||||
[[themes_save_delete]]
|
||||
==== Saving and deleting user themes
|
||||
|
||||
|
||||
@@ -2235,6 +2235,20 @@ is aborted before any option is changed.
|
||||
The name of the last applied theme is stored in
|
||||
`+weechat.look.theme+` (informational only; not re-applied at startup).
|
||||
|
||||
[[themes_reset]]
|
||||
==== Resetting to defaults
|
||||
|
||||
To restore the look shipped with WeeChat, reset every themable option
|
||||
to its default value:
|
||||
|
||||
----
|
||||
/theme reset
|
||||
----
|
||||
|
||||
A backup is written first (same gate as `+/theme apply+`); on backup
|
||||
failure the reset is aborted before any option is changed.
|
||||
`+weechat.look.theme+` is cleared too.
|
||||
|
||||
[[themes_save_delete]]
|
||||
==== Saving and deleting user themes
|
||||
|
||||
|
||||
@@ -2282,6 +2282,21 @@ Le nom du dernier thème appliqué est conservé dans
|
||||
`+weechat.look.theme+` (à titre informatif uniquement ; il n'est pas
|
||||
ré-appliqué au démarrage).
|
||||
|
||||
[[themes_reset]]
|
||||
==== Réinitialiser aux valeurs par défaut
|
||||
|
||||
Pour rétablir l'apparence d'origine livrée avec WeeChat, réinitialiser
|
||||
toutes les options modifiables à leur valeur par défaut :
|
||||
|
||||
----
|
||||
/theme reset
|
||||
----
|
||||
|
||||
Une sauvegarde est écrite au préalable (même garde-fou que
|
||||
`+/theme apply+`) ; si la sauvegarde échoue, la réinitialisation est
|
||||
annulée avant qu'aucune option ne soit modifiée. L'option
|
||||
`+weechat.look.theme+` est également remise à vide.
|
||||
|
||||
[[themes_save_delete]]
|
||||
==== Sauvegarder et supprimer des thèmes utilisateur
|
||||
|
||||
|
||||
@@ -2490,6 +2490,20 @@ is aborted before any option is changed.
|
||||
The name of the last applied theme is stored in
|
||||
`+weechat.look.theme+` (informational only; not re-applied at startup).
|
||||
|
||||
[[themes_reset]]
|
||||
==== Resetting to defaults
|
||||
|
||||
To restore the look shipped with WeeChat, reset every themable option
|
||||
to its default value:
|
||||
|
||||
----
|
||||
/theme reset
|
||||
----
|
||||
|
||||
A backup is written first (same gate as `+/theme apply+`); on backup
|
||||
failure the reset is aborted before any option is changed.
|
||||
`+weechat.look.theme+` is cleared too.
|
||||
|
||||
[[themes_save_delete]]
|
||||
==== Saving and deleting user themes
|
||||
|
||||
|
||||
@@ -2426,6 +2426,20 @@ is aborted before any option is changed.
|
||||
The name of the last applied theme is stored in
|
||||
`+weechat.look.theme+` (informational only; not re-applied at startup).
|
||||
|
||||
[[themes_reset]]
|
||||
==== Resetting to defaults
|
||||
|
||||
To restore the look shipped with WeeChat, reset every themable option
|
||||
to its default value:
|
||||
|
||||
----
|
||||
/theme reset
|
||||
----
|
||||
|
||||
A backup is written first (same gate as `+/theme apply+`); on backup
|
||||
failure the reset is aborted before any option is changed.
|
||||
`+weechat.look.theme+` is cleared too.
|
||||
|
||||
[[themes_save_delete]]
|
||||
==== Saving and deleting user themes
|
||||
|
||||
|
||||
@@ -2242,6 +2242,20 @@ is aborted before any option is changed.
|
||||
The name of the last applied theme is stored in
|
||||
`+weechat.look.theme+` (informational only; not re-applied at startup).
|
||||
|
||||
[[themes_reset]]
|
||||
==== Resetting to defaults
|
||||
|
||||
To restore the look shipped with WeeChat, reset every themable option
|
||||
to its default value:
|
||||
|
||||
----
|
||||
/theme reset
|
||||
----
|
||||
|
||||
A backup is written first (same gate as `+/theme apply+`); on backup
|
||||
failure the reset is aborted before any option is changed.
|
||||
`+weechat.look.theme+` is cleared too.
|
||||
|
||||
[[themes_save_delete]]
|
||||
==== Saving and deleting user themes
|
||||
|
||||
|
||||
@@ -2144,6 +2144,20 @@ is aborted before any option is changed.
|
||||
The name of the last applied theme is stored in
|
||||
`+weechat.look.theme+` (informational only; not re-applied at startup).
|
||||
|
||||
[[themes_reset]]
|
||||
==== Resetting to defaults
|
||||
|
||||
To restore the look shipped with WeeChat, reset every themable option
|
||||
to its default value:
|
||||
|
||||
----
|
||||
/theme reset
|
||||
----
|
||||
|
||||
A backup is written first (same gate as `+/theme apply+`); on backup
|
||||
failure the reset is aborted before any option is changed.
|
||||
`+weechat.look.theme+` is cleared too.
|
||||
|
||||
[[themes_save_delete]]
|
||||
==== Saving and deleting user themes
|
||||
|
||||
|
||||
@@ -7333,6 +7333,12 @@ COMMAND_CALLBACK(theme)
|
||||
return theme_apply (argv[2]);
|
||||
}
|
||||
|
||||
/* "/theme reset": reset every themable option to its default value */
|
||||
if (string_strcmp (argv[1], "reset") == 0)
|
||||
{
|
||||
return theme_reset ();
|
||||
}
|
||||
|
||||
/* "/theme save <name> [-full]": write a user theme file */
|
||||
if (string_strcmp (argv[1], "save") == 0)
|
||||
{
|
||||
@@ -10073,6 +10079,7 @@ command_init (void)
|
||||
/* TRANSLATORS: only text between angle brackets (eg: "<name>") may be translated */
|
||||
N_("[list [-backups]]"
|
||||
" || apply <name>"
|
||||
" || reset"
|
||||
" || save <name> [-full]"
|
||||
" || delete <name>"
|
||||
" || info <name>"),
|
||||
@@ -10086,6 +10093,8 @@ command_init (void)
|
||||
"value from the theme); if a file named <name>.theme "
|
||||
"exists in directory \"themes\" it shadows any built-in "
|
||||
"theme of the same name"),
|
||||
N_("raw[reset]: reset every themable option to its default "
|
||||
"value (restores the original look shipped with WeeChat)"),
|
||||
N_("raw[save]: save current themable options to a file "
|
||||
"<name>.theme in directory \"themes\"; by default only "
|
||||
"options whose value differs from their default are "
|
||||
@@ -10112,6 +10121,7 @@ command_init (void)
|
||||
"weechat.look.theme_backup.")),
|
||||
"list -backups"
|
||||
" || apply %(theme_themes_all)"
|
||||
" || reset"
|
||||
" || save %(theme_themes_user) -full"
|
||||
" || delete %(theme_themes_user)"
|
||||
" || info %(theme_themes_all)",
|
||||
|
||||
@@ -1025,6 +1025,84 @@ theme_apply (const char *name)
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Resets every themable option to its default value.
|
||||
*
|
||||
* Same backup-first safety as theme_apply: if weechat.look.theme_backup
|
||||
* is on, a backup file is written before any option is touched, and the
|
||||
* reset is aborted if the backup cannot be written. The active-theme
|
||||
* label (weechat.look.theme) is reset to its default (empty string).
|
||||
*
|
||||
* Returns WEECHAT_RC_OK on success, WEECHAT_RC_ERROR if the backup is
|
||||
* required but failed.
|
||||
*/
|
||||
|
||||
int
|
||||
theme_reset (void)
|
||||
{
|
||||
struct t_config_file *ptr_config;
|
||||
struct t_config_section *ptr_section;
|
||||
struct t_config_option *ptr_option;
|
||||
char *backup_name = NULL;
|
||||
|
||||
if (CONFIG_BOOLEAN(config_look_theme_backup))
|
||||
{
|
||||
backup_name = theme_make_backup ();
|
||||
if (!backup_name)
|
||||
{
|
||||
gui_chat_printf (
|
||||
NULL,
|
||||
_("%sUnable to create theme backup; aborting reset "
|
||||
"(disable option weechat.look.theme_backup to force)"),
|
||||
gui_chat_prefix[GUI_CHAT_PREFIX_ERROR]);
|
||||
return WEECHAT_RC_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
/* reset every themable option to its default value; per-option gui
|
||||
refreshes are suppressed via theme_applying */
|
||||
theme_applying = 1;
|
||||
for (ptr_config = config_files; ptr_config;
|
||||
ptr_config = ptr_config->next_config)
|
||||
{
|
||||
for (ptr_section = ptr_config->sections; ptr_section;
|
||||
ptr_section = ptr_section->next_section)
|
||||
{
|
||||
for (ptr_option = ptr_section->options; ptr_option;
|
||||
ptr_option = ptr_option->next_option)
|
||||
{
|
||||
if (ptr_option->themable)
|
||||
config_file_option_reset (ptr_option, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
theme_applying = 0;
|
||||
|
||||
if (gui_init_ok)
|
||||
{
|
||||
gui_color_init_weechat ();
|
||||
gui_window_ask_refresh (1);
|
||||
}
|
||||
|
||||
/* clear active-theme label */
|
||||
config_file_option_reset (config_look_theme, 1);
|
||||
|
||||
if (backup_name)
|
||||
{
|
||||
gui_chat_printf (
|
||||
NULL,
|
||||
_("Previous state saved as theme \"%s\"; to restore: "
|
||||
"/theme apply %s"),
|
||||
backup_name, backup_name);
|
||||
free (backup_name);
|
||||
}
|
||||
|
||||
hook_signal_send ("theme_applied",
|
||||
WEECHAT_HOOK_SIGNAL_STRING, (char *)"");
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Saves the current themable options to a user theme file.
|
||||
*
|
||||
|
||||
@@ -69,6 +69,7 @@ extern const char *theme_get_override (struct t_theme *theme,
|
||||
const char *option_name);
|
||||
extern struct t_arraylist *theme_list (void);
|
||||
extern int theme_apply (const char *name);
|
||||
extern int theme_reset (void);
|
||||
extern int theme_save (const char *name, int full);
|
||||
extern int theme_delete (const char *name);
|
||||
extern char *theme_make_backup (void);
|
||||
|
||||
@@ -664,6 +664,56 @@ TEST(CoreTheme, ApplyMergeAcrossContributions)
|
||||
free (saved_value);
|
||||
}
|
||||
|
||||
/*
|
||||
* Test functions:
|
||||
* theme_reset
|
||||
*/
|
||||
|
||||
TEST(CoreTheme, Reset)
|
||||
{
|
||||
struct t_hashtable *overrides;
|
||||
struct t_config_option *opt_prefix_error;
|
||||
char *saved_prefix_error, *saved_theme_label, *default_prefix_error;
|
||||
int saved_backup;
|
||||
|
||||
opt_prefix_error = NULL;
|
||||
config_file_search_with_string ("weechat.look.prefix_error",
|
||||
NULL, NULL, &opt_prefix_error, NULL);
|
||||
CHECK(opt_prefix_error != NULL);
|
||||
saved_prefix_error = strdup (CONFIG_STRING(opt_prefix_error));
|
||||
saved_theme_label = strdup (CONFIG_STRING(config_look_theme));
|
||||
saved_backup = CONFIG_BOOLEAN(config_look_theme_backup);
|
||||
default_prefix_error = strdup (CONFIG_STRING_DEFAULT(opt_prefix_error));
|
||||
|
||||
config_file_option_set (config_look_theme_backup, "off", 1);
|
||||
|
||||
/* set up a non-default state: apply a theme that flips one option
|
||||
and sets weechat.look.theme as a side effect */
|
||||
overrides = make_overrides ("weechat.look.prefix_error", "RESET_ME!",
|
||||
NULL, NULL);
|
||||
theme_register (NULL, NULL, "reset_test", overrides);
|
||||
hashtable_free (overrides);
|
||||
LONGS_EQUAL(WEECHAT_RC_OK, theme_apply ("reset_test"));
|
||||
STRCMP_EQUAL("RESET_ME!", CONFIG_STRING(opt_prefix_error));
|
||||
STRCMP_EQUAL("reset_test", CONFIG_STRING(config_look_theme));
|
||||
|
||||
/* reset: themable option goes back to its default, label is cleared */
|
||||
LONGS_EQUAL(WEECHAT_RC_OK, theme_reset ());
|
||||
STRCMP_EQUAL(default_prefix_error, CONFIG_STRING(opt_prefix_error));
|
||||
STRCMP_EQUAL(CONFIG_STRING_DEFAULT(config_look_theme),
|
||||
CONFIG_STRING(config_look_theme));
|
||||
|
||||
/* restore */
|
||||
config_file_option_set (opt_prefix_error, saved_prefix_error, 1);
|
||||
config_file_option_set (config_look_theme, saved_theme_label, 1);
|
||||
config_file_option_set (config_look_theme_backup,
|
||||
(saved_backup) ? "on" : "off", 1);
|
||||
|
||||
free (saved_prefix_error);
|
||||
free (saved_theme_label);
|
||||
free (default_prefix_error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Test functions:
|
||||
* theme_file_strip_quotes
|
||||
|
||||
Reference in New Issue
Block a user