Added theme files support with /theme command

This commit is contained in:
James Booth
2012-11-21 22:33:07 +00:00
parent e8b2b7196c
commit cd4465394b
6 changed files with 118 additions and 30 deletions

View File

@@ -40,6 +40,7 @@
#include "preferences.h"
#include "prof_autocomplete.h"
#include "profanity.h"
#include "theme.h"
#include "tinyurl.h"
#include "ui.h"
@@ -124,6 +125,7 @@ static gboolean _cmd_xa(gchar **args, struct cmd_help_t help);
static gboolean _cmd_info(gchar **args, struct cmd_help_t help);
static gboolean _cmd_wins(gchar **args, struct cmd_help_t help);
static gboolean _cmd_nick(gchar **args, struct cmd_help_t help);
static gboolean _cmd_theme(gchar **args, struct cmd_help_t help);
/*
* The commands are broken down into three groups:
@@ -191,6 +193,18 @@ static struct cmd_t main_commands[] =
"you will need to restart Profanity for config file edits to take effect.",
NULL } } },
{ "/theme",
_cmd_theme, parse_args, 1, 1,
{ "/theme [theme-name]", "Change colour theme.",
{ "/theme [theme-name]",
"--------------",
"Change the colour setting as defined in:",
"",
" ~/.profanity/themes/theme-name",
"",
"Using \"default\" as the theme name will reset to the default colours.",
NULL } } },
{ "/msg",
_cmd_msg, parse_args_with_freetext, 2, 2,
{ "/msg user@host mesg", "Send mesg to user.",
@@ -1077,6 +1091,20 @@ _cmd_prefs(gchar **args, struct cmd_help_t help)
return TRUE;
}
static gboolean
_cmd_theme(gchar **args, struct cmd_help_t help)
{
if (theme_change(args[0])) {
win_load_colours();
prefs_set_theme(args[0]);
cons_show("Loaded theme: %s", args[0]);
} else {
cons_show("Couldn't find theme: %s", args[0]);
}
return TRUE;
}
static gboolean
_cmd_who(gchar **args, struct cmd_help_t help)
{

View File

@@ -106,6 +106,41 @@ theme_load(const char * const theme_name)
_load_colours();
}
gboolean
theme_change(const char * const theme_name)
{
// use default theme
if (strcmp(theme_name, "default") == 0) {
g_key_file_free(theme);
theme = g_key_file_new();
_load_colours();
return TRUE;
} else {
GString *new_theme_file = g_string_new(getenv("HOME"));
g_string_append(new_theme_file, "/.profanity/themes/");
g_string_append(new_theme_file, theme_name);
// no theme file found
if (!g_file_test(new_theme_file->str, G_FILE_TEST_EXISTS)) {
log_info("Theme does not exist \"%s\"", theme_name);
g_string_free(new_theme_file, TRUE);
return FALSE;
// load from theme file
} else {
g_string_free(theme_loc, TRUE);
theme_loc = new_theme_file;
log_info("Changing theme to \"%s\"", theme_name);
g_key_file_free(theme);
theme = g_key_file_new();
g_key_file_load_from_file(theme, theme_loc->str, G_KEY_FILE_KEEP_COMMENTS,
NULL);
_load_colours();
return TRUE;
}
}
}
void
theme_close(void)
{
@@ -216,15 +251,6 @@ _load_colours(void)
gchar *them_val = g_key_file_get_string(theme, "colours", "them", NULL);
_set_colour(them_val, &colour_prefs.them, COLOR_GREEN);
}
/*
static void
_save_prefs(void)
{
gsize g_data_size;
char *g_prefs_data = g_key_file_to_data(prefs, &g_data_size, NULL);
g_file_set_contents(prefs_loc->str, g_prefs_data, g_data_size, NULL);
}
*/
NCURSES_COLOR_T
theme_get_bkgnd()

View File

@@ -35,6 +35,7 @@
#endif
void theme_load(const char * const theme_name);
gboolean theme_change(const char * const theme_name);
void theme_close(void);
NCURSES_COLOR_T theme_get_bkgnd();

View File

@@ -147,6 +147,7 @@ void win_show_room_member_nick_change(const char * const room,
void win_show_room_nick_change(const char * const room, const char * const nick);
void win_show_room_member_presence(const char * const room,
const char * const nick, const char * const show, const char * const status);
void win_load_colours(void);
// console window actions
void cons_about(void);

View File

@@ -109,6 +109,21 @@ gui_init(void)
cbreak();
keypad(stdscr, TRUE);
win_load_colours();
refresh();
create_title_bar();
create_status_bar();
create_input_window();
_create_windows();
dirty = TRUE;
}
void
win_load_colours(void)
{
if (has_colors()) {
use_default_colors();
start_color();
@@ -148,15 +163,6 @@ gui_init(void)
init_pair(60, theme_get_typing(), theme_get_bkgnd());
init_pair(61, theme_get_gone(), theme_get_bkgnd());
}
refresh();
create_title_bar();
create_status_bar();
create_input_window();
_create_windows();
dirty = TRUE;
}
void