From cd4465394b65e824123b69f3a97bd1e8be5a03d0 Mon Sep 17 00:00:00 2001 From: James Booth Date: Wed, 21 Nov 2012 22:33:07 +0000 Subject: [PATCH] Added theme files support with /theme command --- docs/profanity.1 | 50 ++++++++++++++++++++++++++++++++++++------------ src/command.c | 28 +++++++++++++++++++++++++++ src/theme.c | 44 +++++++++++++++++++++++++++++++++--------- src/theme.h | 1 + src/ui.h | 1 + src/windows.c | 24 ++++++++++++++--------- 6 files changed, 118 insertions(+), 30 deletions(-) diff --git a/docs/profanity.1 b/docs/profanity.1 index 552613c5..a1ad39ca 100644 --- a/docs/profanity.1 +++ b/docs/profanity.1 @@ -1,17 +1,17 @@ .TH Profanity 1 "August 2012" "Profanity XMPP client" .SH NAME -Profanity \- a simple console based XMPP chat client for Linux. +Profanity \- a simple console based XMPP chat client. .SH SYNOPSIS .B profanity [-vhd] [-l level] .SH DESCRIPTION .B Profanity is a simple lightweight console based XMPP chat client. It's emphasis is -on having a simple and configurable UI, see the homepage +on having a simple and configurable command driven UI, see the homepage at: .br .PP - + .SH OPTIONS .TP .BI "\-v, \-\-version" @@ -66,6 +66,8 @@ beep=false .br flash=false .br +theme=mytheme +.br showsplash=false .br notify=true @@ -81,6 +83,26 @@ remind=15 vercheck=true .br .PP +[connections] +.br +logins=user1@server1.org;myuser@server2.com; +.PP +.RE +The [ui] section contains basic preferences, you can find more help on these +settings by typing "/help beep" for example in Profanity. +.PP +The [connections] section is the list of users that will appear in tab +completion for the /connect command. This list is automatically populated +when you successfully log in as a user. +.SH THEMES +Themes files for +.B Profanity +are stored in +.I ~/.profanity/themes +, see the following example: +.br +.RS +.PP [colours] .br bkgnd=default @@ -117,23 +139,27 @@ xa=cyan .br offline=red .br -.PP -[connections] +typing=yellow +.br +gone=red +.br +error=red +.br +incoming=yellow +.br +roominfo=yellow +.br +me=yellow +.br +them=green .br -logins=user1@server1.org;myuser@server2.com; .PP .RE -The [ui] section contains basic preferences, you can find more help on these -settings by typing "/help beep" for example in Profanity. -.PP The [colours] section allows you to tailor the colours used in Profanity to suit your terminal preferences. Available colours are black, white, red, green, blue, yellow, cyan, magenta and default, where default is the default forground or background colour on your terminal. .PP -The [connections] section is the list of users that will appear in tab -completion for the /connect command. This list is automatically populated -when you successfully log in as a user. .SH BUGS Bugs can either be reported by sending a mail directly to: .br diff --git a/src/command.c b/src/command.c index 715ad0ee..52f7fac9 100644 --- a/src/command.c +++ b/src/command.c @@ -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) { diff --git a/src/theme.c b/src/theme.c index 267a88fb..0792222a 100644 --- a/src/theme.c +++ b/src/theme.c @@ -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() diff --git a/src/theme.h b/src/theme.h index f045f09a..37b49c0b 100644 --- a/src/theme.h +++ b/src/theme.h @@ -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(); diff --git a/src/ui.h b/src/ui.h index 3e30fd1a..2d441abf 100644 --- a/src/ui.h +++ b/src/ui.h @@ -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); diff --git a/src/windows.c b/src/windows.c index 8438a3ec..58b8b80d 100644 --- a/src/windows.c +++ b/src/windows.c @@ -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