about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2012-11-21 22:33:07 +0000
committerJames Booth <boothj5@gmail.com>2012-11-21 22:33:07 +0000
commitcd4465394b65e824123b69f3a97bd1e8be5a03d0 (patch)
tree3a2fbda48c8f7f0f59423e17ad98ef378809a646
parente8b2b7196ca3f291cf68592f517a31bff18c8f83 (diff)
downloadprofani-tty-cd4465394b65e824123b69f3a97bd1e8be5a03d0.tar.gz
Added theme files support with /theme command
-rw-r--r--docs/profanity.150
-rw-r--r--src/command.c28
-rw-r--r--src/theme.c44
-rw-r--r--src/theme.h1
-rw-r--r--src/ui.h1
-rw-r--r--src/windows.c24
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
-<http://www.boothj5.com/profanity.shtml>
+<http://www.profanity.im>
 .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.",
@@ -1078,6 +1092,20 @@ _cmd_prefs(gchar **args, struct cmd_help_t help)
 }
 
 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)
 {
     jabber_conn_status_t conn_status = jabber_get_connection_status();
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