about summary refs log tree commit diff stats
path: root/src/ui/console.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/console.c')
-rw-r--r--src/ui/console.c502
1 files changed, 268 insertions, 234 deletions
diff --git a/src/ui/console.c b/src/ui/console.c
index 689f218c..895efda4 100644
--- a/src/ui/console.c
+++ b/src/ui/console.c
@@ -1,7 +1,7 @@
 /*
  * console.c
  *
- * Copyright (C) 2012 - 2014 James Booth <boothj5@gmail.com>
+ * Copyright (C) 2012 - 2015 James Booth <boothj5@gmail.com>
  *
  * This file is part of Profanity.
  *
@@ -67,14 +67,14 @@ void
 cons_show_time(void)
 {
     ProfWin *console = wins_get_console();
-    win_save_print(console, '-', NULL, NO_EOL, 0, "", "");
+    win_print(console, '-', NULL, NO_EOL, 0, "", "");
 }
 
 void
 cons_show_word(const char * const word)
 {
     ProfWin *console = wins_get_console();
-    win_save_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", word);
+    win_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", word);
 }
 
 void
@@ -86,7 +86,7 @@ cons_debug(const char * const msg, ...)
         va_start(arg, msg);
         GString *fmt_msg = g_string_new(NULL);
         g_string_vprintf(fmt_msg, msg, arg);
-        win_save_println(console, fmt_msg->str);
+        win_println(console, fmt_msg->str);
         g_string_free(fmt_msg, TRUE);
         va_end(arg);
     }
@@ -100,7 +100,7 @@ cons_show(const char * const msg, ...)
     va_start(arg, msg);
     GString *fmt_msg = g_string_new(NULL);
     g_string_vprintf(fmt_msg, msg, arg);
-    win_save_println(console, fmt_msg->str);
+    win_println(console, fmt_msg->str);
     g_string_free(fmt_msg, TRUE);
     va_end(arg);
 }
@@ -113,7 +113,7 @@ cons_show_error(const char * const msg, ...)
     va_start(arg, msg);
     GString *fmt_msg = g_string_new(NULL);
     g_string_vprintf(fmt_msg, msg, arg);
-    win_save_print(console, '-', NULL, 0, THEME_ERROR, "", fmt_msg->str);
+    win_print(console, '-', NULL, 0, THEME_ERROR, "", fmt_msg->str);
     g_string_free(fmt_msg, TRUE);
     va_end(arg);
 
@@ -126,8 +126,8 @@ cons_show_typing(const char * const barejid)
     ProfWin *console = wins_get_console();
     const char * display_usr = NULL;
     PContact contact = roster_get_contact(barejid);
-    if (contact != NULL) {
-        if (p_contact_name(contact) != NULL) {
+    if (contact) {
+        if (p_contact_name(contact)) {
             display_usr = p_contact_name(contact);
         } else {
             display_usr = barejid;
@@ -136,7 +136,7 @@ cons_show_typing(const char * const barejid)
         display_usr = barejid;
     }
 
-    win_save_vprint(console, '-', NULL, 0, THEME_TYPING, "", "!! %s is typing a message...", display_usr);
+    win_vprint(console, '-', NULL, 0, THEME_TYPING, "", "!! %s is typing a message...", display_usr);
     cons_alert();
 }
 
@@ -149,7 +149,7 @@ cons_show_incoming_message(const char * const short_from, const int win_index)
     if (ui_index == 10) {
         ui_index = 0;
     }
-    win_save_vprint(console, '-', NULL, 0, THEME_INCOMING, "", "<< incoming from %s (%d)", short_from, ui_index);
+    win_vprint(console, '-', NULL, 0, THEME_INCOMING, "", "<< incoming from %s (%d)", short_from, ui_index);
 
     cons_alert();
 }
@@ -167,23 +167,23 @@ cons_about(void)
 
         if (strcmp(PACKAGE_STATUS, "development") == 0) {
 #ifdef HAVE_GIT_VERSION
-            win_save_vprint(console, '-', NULL, 0, 0, "", "Welcome to Profanity, version %sdev.%s.%s", PACKAGE_VERSION, PROF_GIT_BRANCH, PROF_GIT_REVISION);
+            win_vprint(console, '-', NULL, 0, 0, "", "Welcome to Profanity, version %sdev.%s.%s", PACKAGE_VERSION, PROF_GIT_BRANCH, PROF_GIT_REVISION);
 #else
-            win_save_vprint(console, '-', NULL, 0, 0, "", "Welcome to Profanity, version %sdev", PACKAGE_VERSION);
+            win_vprint(console, '-', NULL, 0, 0, "", "Welcome to Profanity, version %sdev", PACKAGE_VERSION);
 #endif
         } else {
-            win_save_vprint(console, '-', NULL, 0, 0, "", "Welcome to Profanity, version %s", PACKAGE_VERSION);
+            win_vprint(console, '-', NULL, 0, 0, "", "Welcome to Profanity, version %s", PACKAGE_VERSION);
         }
     }
 
-    win_save_vprint(console, '-', NULL, 0, 0, "", "Copyright (C) 2012 - 2014 James Booth <%s>.", PACKAGE_BUGREPORT);
-    win_save_println(console, "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>");
-    win_save_println(console, "");
-    win_save_println(console, "This is free software; you are free to change and redistribute it.");
-    win_save_println(console, "There is NO WARRANTY, to the extent permitted by law.");
-    win_save_println(console, "");
-    win_save_println(console, "Type '/help' to show complete help.");
-    win_save_println(console, "");
+    win_vprint(console, '-', NULL, 0, 0, "", "Copyright (C) 2012 - 2015 James Booth <%s>.", PACKAGE_BUGREPORT);
+    win_println(console, "License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>");
+    win_println(console, "");
+    win_println(console, "This is free software; you are free to change and redistribute it.");
+    win_println(console, "There is NO WARRANTY, to the extent permitted by law.");
+    win_println(console, "");
+    win_println(console, "Type '/help' to show complete help.");
+    win_println(console, "");
 
     if (prefs_get_boolean(PREF_VERCHECK)) {
         cons_check_version(FALSE);
@@ -200,18 +200,18 @@ cons_check_version(gboolean not_available_msg)
     ProfWin *console = wins_get_console();
     char *latest_release = release_get_latest();
 
-    if (latest_release != NULL) {
+    if (latest_release) {
         gboolean relase_valid = g_regex_match_simple("^\\d+\\.\\d+\\.\\d+$", latest_release, 0, 0);
 
         if (relase_valid) {
             if (release_is_new(latest_release)) {
-                win_save_vprint(console, '-', NULL, 0, 0, "", "A new version of Profanity is available: %s", latest_release);
-                win_save_println(console, "Check <http://www.profanity.im> for details.");
-                win_save_println(console, "");
+                win_vprint(console, '-', NULL, 0, 0, "", "A new version of Profanity is available: %s", latest_release);
+                win_println(console, "Check <http://www.profanity.im> for details.");
+                win_println(console, "");
             } else {
                 if (not_available_msg) {
-                    win_save_println(console, "No new version available.");
-                    win_save_println(console, "");
+                    win_println(console, "No new version available.");
+                    win_println(console, "");
                 }
             }
 
@@ -225,16 +225,16 @@ void
 cons_show_login_success(ProfAccount *account)
 {
     ProfWin *console = wins_get_console();
-    win_save_vprint(console, '-', NULL, NO_EOL, 0, "", "%s logged in successfully, ", account->jid);
+    win_vprint(console, '-', NULL, NO_EOL, 0, "", "%s logged in successfully, ", account->jid);
 
     resource_presence_t presence = accounts_get_login_presence(account->name);
     const char *presence_str = string_from_resource_presence(presence);
 
     theme_item_t presence_colour = theme_main_presence_attrs(presence_str);
-    win_save_vprint(console, '-', NULL, NO_DATE | NO_EOL, presence_colour, "", "%s", presence_str);
-    win_save_vprint(console, '-', NULL, NO_DATE | NO_EOL, 0, "", " (priority %d)",
+    win_vprint(console, '-', NULL, NO_DATE | NO_EOL, presence_colour, "", "%s", presence_str);
+    win_vprint(console, '-', NULL, NO_DATE | NO_EOL, 0, "", " (priority %d)",
         accounts_get_priority_for_presence_type(account->name, presence));
-    win_save_print(console, '-', NULL, NO_DATE, 0, "", ".");
+    win_print(console, '-', NULL, NO_DATE, 0, "", ".");
     cons_alert();
 }
 
@@ -247,10 +247,11 @@ cons_show_wins(void)
     GSList *window_strings = wins_create_summary();
 
     GSList *curr = window_strings;
-    while (curr != NULL) {
-        win_save_println(console, curr->data);
+    while (curr) {
+        win_println(console, curr->data);
         curr = g_slist_next(curr);
     }
+    g_slist_free_full(window_strings, free);
 
     cons_show("");
     cons_alert();
@@ -264,7 +265,7 @@ cons_show_room_invites(GSList *invites)
         cons_show("No outstanding chat room invites.");
     } else {
         cons_show("Chat room invites, use /join or /decline commands:");
-        while (invites != NULL) {
+        while (invites) {
             cons_show("  %s", invites->data);
             invites = g_slist_next(invites);
         }
@@ -293,53 +294,53 @@ cons_show_caps(const char * const fulljid, resource_presence_t presence)
         const char *resource_presence = string_from_resource_presence(presence);
 
         theme_item_t presence_colour = theme_main_presence_attrs(resource_presence);
-        win_save_vprint(console, '-', NULL, NO_EOL, presence_colour, "", "%s", fulljid);
-        win_save_print(console, '-', NULL, NO_DATE, 0, "", ":");
+        win_vprint(console, '-', NULL, NO_EOL, presence_colour, "", "%s", fulljid);
+        win_print(console, '-', NULL, NO_DATE, 0, "", ":");
 
         // show identity
-        if ((caps->category != NULL) || (caps->type != NULL) || (caps->name != NULL)) {
-            win_save_print(console, '-', NULL, NO_EOL, 0, "", "Identity: ");
-            if (caps->name != NULL) {
-                win_save_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", caps->name);
-                if ((caps->category != NULL) || (caps->type != NULL)) {
-                    win_save_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", " ");
+        if (caps->category || caps->type || caps->name) {
+            win_print(console, '-', NULL, NO_EOL, 0, "", "Identity: ");
+            if (caps->name) {
+                win_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", caps->name);
+                if (caps->category || caps->type) {
+                    win_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", " ");
                 }
             }
-            if (caps->type != NULL) {
-                win_save_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", caps->type);
-                if (caps->category != NULL) {
-                    win_save_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", " ");
+            if (caps->type) {
+                win_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", caps->type);
+                if (caps->category) {
+                    win_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", " ");
                 }
             }
-            if (caps->category != NULL) {
-                win_save_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", caps->category);
+            if (caps->category) {
+                win_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", caps->category);
             }
-            win_save_newline(console);
+            win_newline(console);
         }
-        if (caps->software != NULL) {
-            win_save_vprint(console, '-', NULL, NO_EOL, 0, "", "Software: %s", caps->software);
+        if (caps->software) {
+            win_vprint(console, '-', NULL, NO_EOL, 0, "", "Software: %s", caps->software);
         }
-        if (caps->software_version != NULL) {
-            win_save_vprint(console, '-', NULL, NO_DATE | NO_EOL, 0, "", ", %s", caps->software_version);
+        if (caps->software_version) {
+            win_vprint(console, '-', NULL, NO_DATE | NO_EOL, 0, "", ", %s", caps->software_version);
         }
-        if ((caps->software != NULL) || (caps->software_version != NULL)) {
-            win_save_newline(console);
+        if (caps->software || caps->software_version) {
+            win_newline(console);
         }
-        if (caps->os != NULL) {
-            win_save_vprint(console, '-', NULL, NO_EOL, 0, "", "OS: %s", caps->os);
+        if (caps->os) {
+            win_vprint(console, '-', NULL, NO_EOL, 0, "", "OS: %s", caps->os);
         }
-        if (caps->os_version != NULL) {
-            win_save_vprint(console, '-', NULL, NO_DATE | NO_EOL, 0, "", ", %s", caps->os_version);
+        if (caps->os_version) {
+            win_vprint(console, '-', NULL, NO_DATE | NO_EOL, 0, "", ", %s", caps->os_version);
         }
-        if ((caps->os != NULL) || (caps->os_version != NULL)) {
-            win_save_newline(console);
+        if (caps->os || caps->os_version) {
+            win_newline(console);
         }
 
-        if (caps->features != NULL) {
-            win_save_println(console, "Features:");
+        if (caps->features) {
+            win_println(console, "Features:");
             GSList *feature = caps->features;
-            while (feature != NULL) {
-                win_save_vprint(console, '-', NULL, 0, 0, "", " %s", feature->data);
+            while (feature) {
+                win_vprint(console, '-', NULL, 0, 0, "", " %s", feature->data);
                 feature = g_slist_next(feature);
             }
         }
@@ -357,19 +358,19 @@ cons_show_software_version(const char * const jid, const char * const  presence,
     const char * const name, const char * const version, const char * const os)
 {
     ProfWin *console = wins_get_console();
-    if ((name != NULL) || (version != NULL) || (os != NULL)) {
+    if (name || version || os) {
         cons_show("");
         theme_item_t presence_colour = theme_main_presence_attrs(presence);
-        win_save_vprint(console, '-', NULL, NO_EOL, presence_colour, "", "%s", jid);
-        win_save_print(console, '-', NULL, NO_DATE, 0, "", ":");
+        win_vprint(console, '-', NULL, NO_EOL, presence_colour, "", "%s", jid);
+        win_print(console, '-', NULL, NO_DATE, 0, "", ":");
     }
-    if (name != NULL) {
+    if (name) {
         cons_show("Name    : %s", name);
     }
-    if (version != NULL) {
+    if (version) {
         cons_show("Version : %s", version);
     }
-    if (os != NULL) {
+    if (os) {
         cons_show("OS      : %s", os);
     }
 
@@ -385,7 +386,7 @@ cons_show_received_subs(void)
     } else {
         cons_show("Outstanding subscription requests from:",
             g_slist_length(received));
-        while (received != NULL) {
+        while (received) {
             cons_show("  %s", received->data);
             received = g_slist_next(received);
         }
@@ -402,17 +403,18 @@ cons_show_sent_subs(void)
         GSList *contacts = roster_get_contacts();
         PContact contact = NULL;
         cons_show("Awaiting subscription responses from:");
-        while (contacts != NULL) {
-            contact = (PContact) contacts->data;
+        GSList *curr = contacts;
+        while (curr) {
+            contact = (PContact) curr->data;
             if (p_contact_pending_out(contact)) {
                 cons_show("  %s", p_contact_barejid(contact));
             }
-            contacts = g_slist_next(contacts);
+            curr = g_slist_next(curr);
         }
+        g_slist_free(contacts);
     } else {
         cons_show("No pending requests sent.");
     }
-
     cons_alert();
 }
 
@@ -420,15 +422,15 @@ void
 cons_show_room_list(GSList *rooms, const char * const conference_node)
 {
     ProfWin *console = wins_get_console();
-    if ((rooms != NULL) && (g_slist_length(rooms) > 0)) {
+    if (rooms && (g_slist_length(rooms) > 0)) {
         cons_show("Chat rooms at %s:", conference_node);
-        while (rooms != NULL) {
+        while (rooms) {
             DiscoItem *room = rooms->data;
-            win_save_vprint(console, '-', NULL, NO_EOL, 0, "", "  %s", room->jid);
-            if (room->name != NULL) {
-                win_save_vprint(console, '-', NULL, NO_DATE | NO_EOL, 0, "", ", (%s)", room->name);
+            win_vprint(console, '-', NULL, NO_EOL, 0, "", "  %s", room->jid);
+            if (room->name) {
+                win_vprint(console, '-', NULL, NO_DATE | NO_EOL, 0, "", ", (%s)", room->name);
             }
-            win_save_newline(console);
+            win_newline(console);
             rooms = g_slist_next(rooms);
         }
     } else {
@@ -450,7 +452,7 @@ cons_show_bookmarks(const GList *list)
         cons_show("");
         cons_show("Bookmarks:");
 
-        while (list != NULL) {
+        while (list) {
             Bookmark *item = list->data;
 
             theme_item_t presence_colour = THEME_TEXT;
@@ -458,24 +460,24 @@ cons_show_bookmarks(const GList *list)
             if (muc_active(item->jid)) {
                 presence_colour = THEME_ONLINE;
             }
-            win_save_vprint(console, '-', NULL, NO_EOL, presence_colour, "", "  %s", item->jid);
-            if (item->nick != NULL) {
-                win_save_vprint(console, '-', NULL, NO_DATE | NO_EOL, presence_colour, "", "/%s", item->nick);
+            win_vprint(console, '-', NULL, NO_EOL, presence_colour, "", "  %s", item->jid);
+            if (item->nick) {
+                win_vprint(console, '-', NULL, NO_DATE | NO_EOL, presence_colour, "", "/%s", item->nick);
             }
             if (item->autojoin) {
-                win_save_print(console, '-', NULL, NO_DATE | NO_EOL, presence_colour, "", " (autojoin)");
+                win_print(console, '-', NULL, NO_DATE | NO_EOL, presence_colour, "", " (autojoin)");
             }
-            if (item->password != NULL) {
-                win_save_print(console, '-', NULL, NO_DATE | NO_EOL, presence_colour, "", " (private)");
+            if (item->password) {
+                win_print(console, '-', NULL, NO_DATE | NO_EOL, presence_colour, "", " (private)");
             }
             if (muc_active(item->jid)) {
                 ProfWin *roomwin = (ProfWin*)wins_get_muc(item->jid);
-                if (roomwin != NULL) {
+                if (roomwin) {
                     int num = wins_get_num(roomwin);
-                    win_save_vprint(console, '-', NULL, NO_DATE | NO_EOL, presence_colour, "", " (%d)", num);
+                    win_vprint(console, '-', NULL, NO_DATE | NO_EOL, presence_colour, "", " (%d)", num);
                 }
             }
-            win_save_newline(console);
+            win_newline(console);
             list = g_list_next(list);
         }
     }
@@ -485,26 +487,26 @@ cons_show_bookmarks(const GList *list)
 void
 cons_show_disco_info(const char *jid, GSList *identities, GSList *features)
 {
-    if (((identities != NULL) && (g_slist_length(identities) > 0)) ||
-        ((features != NULL) && (g_slist_length(features) > 0))) {
+    if ((identities && (g_slist_length(identities) > 0)) ||
+        (features && (g_slist_length(features) > 0))) {
         cons_show("");
         cons_show("Service disovery info for %s", jid);
 
-        if (identities != NULL) {
+        if (identities) {
             cons_show("  Identities");
         }
-        while (identities != NULL) {
+        while (identities) {
             DiscoIdentity *identity = identities->data;  // anme trpe, cat
             GString *identity_str = g_string_new("    ");
-            if (identity->name != NULL) {
+            if (identity->name) {
                 identity_str = g_string_append(identity_str, identity->name);
                 identity_str = g_string_append(identity_str, " ");
             }
-            if (identity->type != NULL) {
+            if (identity->type) {
                 identity_str = g_string_append(identity_str, identity->type);
                 identity_str = g_string_append(identity_str, " ");
             }
-            if (identity->category != NULL) {
+            if (identity->category) {
                 identity_str = g_string_append(identity_str, identity->category);
             }
             cons_show(identity_str->str);
@@ -512,10 +514,10 @@ cons_show_disco_info(const char *jid, GSList *identities, GSList *features)
             identities = g_slist_next(identities);
         }
 
-        if (features != NULL) {
+        if (features) {
             cons_show("  Features:");
         }
-        while (features != NULL) {
+        while (features) {
             cons_show("    %s", features->data);
             features = g_slist_next(features);
         }
@@ -528,16 +530,16 @@ void
 cons_show_disco_items(GSList *items, const char * const jid)
 {
     ProfWin *console = wins_get_console();
-    if ((items != NULL) && (g_slist_length(items) > 0)) {
+    if (items && (g_slist_length(items) > 0)) {
         cons_show("");
         cons_show("Service discovery items for %s:", jid);
-        while (items != NULL) {
+        while (items) {
             DiscoItem *item = items->data;
-            win_save_vprint(console, '-', NULL, NO_EOL, 0, "", "  %s", item->jid);
-            if (item->name != NULL) {
-                win_save_vprint(console, '-', NULL, NO_DATE | NO_EOL, 0, "", ", (%s)", item->name);
+            win_vprint(console, '-', NULL, NO_EOL, 0, "", "  %s", item->jid);
+            if (item->name) {
+                win_vprint(console, '-', NULL, NO_DATE | NO_EOL, 0, "", ", (%s)", item->name);
             }
-            win_save_vprint(console, '-', NULL, NO_DATE, 0, "", "");
+            win_vprint(console, '-', NULL, NO_DATE, 0, "", "");
             items = g_slist_next(items);
         }
     } else {
@@ -554,7 +556,7 @@ cons_show_status(const char * const barejid)
     ProfWin *console = wins_get_console();
     PContact pcontact = roster_get_contact(barejid);
 
-    if (pcontact != NULL) {
+    if (pcontact) {
         win_show_contact(console, pcontact);
     } else {
         cons_show("No such contact \"%s\" in roster.", barejid);
@@ -569,8 +571,8 @@ cons_show_room_invite(const char * const invitor, const char * const room,
 {
     char *display_from = NULL;
     PContact contact = roster_get_contact(invitor);
-    if (contact != NULL) {
-        if (p_contact_name(contact) != NULL) {
+    if (contact) {
+        if (p_contact_name(contact)) {
             display_from = strdup(p_contact_name(contact));
         } else {
             display_from = strdup(invitor);
@@ -584,7 +586,7 @@ cons_show_room_invite(const char * const invitor, const char * const room,
     cons_show("  From   : %s", display_from);
     cons_show("  Room   : %s", room);
 
-    if (reason != NULL) {
+    if (reason) {
         cons_show("  Message: %s", reason);
     }
 
@@ -612,7 +614,7 @@ cons_show_account_list(gchar **accounts)
                     (g_strcmp0(jabber_get_account_name(), accounts[i]) == 0)) {
                 resource_presence_t presence = accounts_get_last_presence(accounts[i]);
                 theme_item_t presence_colour = theme_main_presence_attrs(string_from_resource_presence(presence));
-                win_save_vprint(console, '-', NULL, 0, presence_colour, "", "%s", accounts[i]);
+                win_vprint(console, '-', NULL, 0, presence_colour, "", "%s", accounts[i]);
             } else {
                 cons_show(accounts[i]);
             }
@@ -671,9 +673,9 @@ cons_show_account(ProfAccount *account)
     if (g_list_length(account->otr_manual) > 0) {
         GString *manual = g_string_new("OTR manual        : ");
         GList *curr = account->otr_manual;
-        while (curr != NULL) {
+        while (curr) {
             g_string_append(manual, curr->data);
-            if (curr->next != NULL) {
+            if (curr->next) {
                 g_string_append(manual, ", ");
             }
             curr = curr->next;
@@ -684,9 +686,9 @@ cons_show_account(ProfAccount *account)
     if (g_list_length(account->otr_opportunistic) > 0) {
         GString *opportunistic = g_string_new("OTR opportunistic : ");
         GList *curr = account->otr_opportunistic;
-        while (curr != NULL) {
+        while (curr) {
             g_string_append(opportunistic, curr->data);
-            if (curr->next != NULL) {
+            if (curr->next) {
                 g_string_append(opportunistic, ", ");
             }
             curr = curr->next;
@@ -697,9 +699,9 @@ cons_show_account(ProfAccount *account)
     if (g_list_length(account->otr_always) > 0) {
         GString *always = g_string_new("OTR always        : ");
         GList *curr = account->otr_always;
-        while (curr != NULL) {
+        while (curr) {
             g_string_append(always, curr->data);
-            if (curr->next != NULL) {
+            if (curr->next) {
                 g_string_append(always, ", ");
             }
             curr = curr->next;
@@ -717,76 +719,81 @@ cons_show_account(ProfAccount *account)
         GList *resources = jabber_get_available_resources();
         GList *ordered_resources = NULL;
 
-        if (resources != NULL) {
-            win_save_println(console, "Resources:");
+        GList *curr = resources;
+        if (curr) {
+            win_println(console, "Resources:");
 
-            // sort in order of availabiltiy
-            while (resources != NULL) {
-                Resource *resource = resources->data;
+            // sort in order of availability
+            while (curr) {
+                Resource *resource = curr->data;
                 ordered_resources = g_list_insert_sorted(ordered_resources,
                     resource, (GCompareFunc)resource_compare_availability);
-                resources = g_list_next(resources);
+                curr = g_list_next(curr);
             }
         }
 
-        while (ordered_resources != NULL) {
-            Resource *resource = ordered_resources->data;
+        g_list_free(resources);
+
+        curr = ordered_resources;
+        while (curr) {
+            Resource *resource = curr->data;
             const char *resource_presence = string_from_resource_presence(resource->presence);
             theme_item_t presence_colour = theme_main_presence_attrs(resource_presence);
-            win_save_vprint(console, '-', NULL, NO_EOL, presence_colour, "", "  %s (%d), %s", resource->name, resource->priority, resource_presence);
+            win_vprint(console, '-', NULL, NO_EOL, presence_colour, "", "  %s (%d), %s", resource->name, resource->priority, resource_presence);
 
-            if (resource->status != NULL) {
-                win_save_vprint(console, '-', NULL, NO_DATE | NO_EOL, presence_colour, "", ", \"%s\"", resource->status);
+            if (resource->status) {
+                win_vprint(console, '-', NULL, NO_DATE | NO_EOL, presence_colour, "", ", \"%s\"", resource->status);
             }
-            win_save_vprint(console, '-', NULL, NO_DATE, 0, "", "");
+            win_vprint(console, '-', NULL, NO_DATE, 0, "", "");
             Jid *jidp = jid_create_from_bare_and_resource(account->jid, resource->name);
             Capabilities *caps = caps_lookup(jidp->fulljid);
             jid_destroy(jidp);
 
-            if (caps != NULL) {
+            if (caps) {
                 // show identity
-                if ((caps->category != NULL) || (caps->type != NULL) || (caps->name != NULL)) {
-                    win_save_print(console, '-', NULL, NO_EOL, 0, "", "    Identity: ");
-                    if (caps->name != NULL) {
-                        win_save_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", caps->name);
-                        if ((caps->category != NULL) || (caps->type != NULL)) {
-                            win_save_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", " ");
+                if (caps->category || caps->type || caps->name) {
+                    win_print(console, '-', NULL, NO_EOL, 0, "", "    Identity: ");
+                    if (caps->name) {
+                        win_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", caps->name);
+                        if (caps->category || caps->type) {
+                            win_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", " ");
                         }
                     }
-                    if (caps->type != NULL) {
-                        win_save_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", caps->type);
-                        if (caps->category != NULL) {
-                            win_save_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", " ");
+                    if (caps->type) {
+                        win_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", caps->type);
+                        if (caps->category) {
+                            win_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", " ");
                         }
                     }
-                    if (caps->category != NULL) {
-                        win_save_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", caps->category);
+                    if (caps->category) {
+                        win_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", caps->category);
                     }
-                    win_save_newline(console);
+                    win_newline(console);
                 }
-                if (caps->software != NULL) {
-                    win_save_vprint(console, '-', NULL, NO_EOL, 0, "", "    Software: %s", caps->software);
+                if (caps->software) {
+                    win_vprint(console, '-', NULL, NO_EOL, 0, "", "    Software: %s", caps->software);
                 }
-                if (caps->software_version != NULL) {
-                    win_save_vprint(console, '-', NULL, NO_DATE | NO_EOL, 0, "", ", %s", caps->software_version);
+                if (caps->software_version) {
+                    win_vprint(console, '-', NULL, NO_DATE | NO_EOL, 0, "", ", %s", caps->software_version);
                 }
-                if ((caps->software != NULL) || (caps->software_version != NULL)) {
-                    win_save_newline(console);
+                if (caps->software || caps->software_version) {
+                    win_newline(console);
                 }
-                if (caps->os != NULL) {
-                    win_save_vprint(console, '-', NULL, NO_EOL, 0, "", "    OS: %s", caps->os);
+                if (caps->os) {
+                    win_vprint(console, '-', NULL, NO_EOL, 0, "", "    OS: %s", caps->os);
                 }
-                if (caps->os_version != NULL) {
-                    win_save_vprint(console, '-', NULL, NO_DATE | NO_EOL, 0, "", ", %s", caps->os_version);
+                if (caps->os_version) {
+                    win_vprint(console, '-', NULL, NO_DATE | NO_EOL, 0, "", ", %s", caps->os_version);
                 }
-                if ((caps->os != NULL) || (caps->os_version != NULL)) {
-                    win_save_newline(console);
+                if (caps->os || caps->os_version) {
+                    win_newline(console);
                 }
                 caps_destroy(caps);
             }
 
-            ordered_resources = g_list_next(ordered_resources);
+            curr = g_list_next(curr);
         }
+        g_list_free(ordered_resources);
     }
 
     cons_alert();
@@ -801,10 +808,10 @@ cons_show_aliases(GList *aliases)
     }
 
     GList *curr = aliases;
-    if (curr != NULL) {
+    if (curr) {
         cons_show("Command aliases:");
     }
-    while (curr != NULL) {
+    while (curr) {
         ProfAlias *alias = curr->data;
         cons_show("  /%s -> %s", alias->name, alias->value);
         curr = g_list_next(curr);
@@ -850,9 +857,9 @@ cons_resource_setting(void)
     else
         cons_show("Resource title (/resource)    : OFF");
     if (prefs_get_boolean(PREF_RESOURCE_MESSAGE))
-        cons_show("Message title (/resource)     : ON");
+        cons_show("Resource message (/resource)  : ON");
     else
-        cons_show("Message title (/resource)     : OFF");
+        cons_show("Resource message (/resource)  : OFF");
 }
 
 void
@@ -899,6 +906,11 @@ cons_occupants_setting(void)
     else
         cons_show("Occupants (/occupants)        : hide");
 
+    if (prefs_get_boolean(PREF_OCCUPANTS_JID))
+        cons_show("Occupant jids (/occupants)    : show");
+    else
+        cons_show("Occupant jids (/occupants)    : hide");
+
     int size = prefs_get_occupants_size();
     cons_show("Occupants size (/occupants)   : %d", size);
 }
@@ -907,7 +919,7 @@ void
 cons_autoconnect_setting(void)
 {
     char *pref_connect_account = prefs_get_string(PREF_CONNECT_ACCOUNT);
-    if (pref_connect_account != NULL)
+    if (pref_connect_account)
         cons_show("Autoconnect (/autoconnect)      : %s", pref_connect_account);
     else
         cons_show("Autoconnect (/autoconnect)      : OFF");
@@ -925,6 +937,16 @@ cons_time_setting(void)
         cons_show("Time (/time)                  : %s", pref_time);
 
     prefs_free_string(pref_time);
+
+    char *pref_time_statusbar = prefs_get_string(PREF_TIME_STATUSBAR);
+    if (g_strcmp0(pref_time_statusbar, "minutes") == 0)
+        cons_show("Time statusbar (/time)        : minutes");
+    else if (g_strcmp0(pref_time_statusbar, "off") == 0)
+        cons_show("Time statusbar (/time)        : OFF");
+    else
+        cons_show("Time statusbar (/time)        : seconds");
+
+    prefs_free_string(pref_time_statusbar);
 }
 
 void
@@ -994,6 +1016,9 @@ cons_roster_setting(void)
     else
         cons_show("Roster resource (/roster)     : hide");
 
+    char *by = prefs_get_string(PREF_ROSTER_BY);
+    cons_show("Roster by (/roster)           : %s", by);
+
     int size = prefs_get_roster_size();
     cons_show("Roster size (/roster)         : %d", size);
 }
@@ -1120,27 +1145,27 @@ void
 cons_states_setting(void)
 {
     if (prefs_get_boolean(PREF_STATES))
-        cons_show("Send chat states (/states) : ON");
+        cons_show("Send chat states (/states)    : ON");
     else
-        cons_show("Send chat states (/states) : OFF");
+        cons_show("Send chat states (/states)    : OFF");
 }
 
 void
 cons_outtype_setting(void)
 {
     if (prefs_get_boolean(PREF_OUTTYPE))
-        cons_show("Send composing (/outtype)  : ON");
+        cons_show("Send composing (/outtype)     : ON");
     else
-        cons_show("Send composing (/outtype)  : OFF");
+        cons_show("Send composing (/outtype)     : OFF");
 }
 
 void
 cons_intype_setting(void)
 {
     if (prefs_get_boolean(PREF_INTYPE))
-        cons_show("Show typing (/intype)      : ON");
+        cons_show("Show typing (/intype)         : ON");
     else
-        cons_show("Show typing (/intype)      : OFF");
+        cons_show("Show typing (/intype)         : OFF");
 }
 
 void
@@ -1148,11 +1173,11 @@ cons_gone_setting(void)
 {
     gint gone_time = prefs_get_gone();
     if (gone_time == 0) {
-        cons_show("Leave conversation (/gone) : OFF");
+        cons_show("Leave conversation (/gone)    : OFF");
     } else if (gone_time == 1) {
-        cons_show("Leave conversation (/gone) : 1 minute");
+        cons_show("Leave conversation (/gone)    : 1 minute");
     } else {
-        cons_show("Leave conversation (/gone) : %d minutes", gone_time);
+        cons_show("Leave conversation (/gone)    : %d minutes", gone_time);
     }
 }
 
@@ -1160,9 +1185,33 @@ void
 cons_history_setting(void)
 {
     if (prefs_get_boolean(PREF_HISTORY))
-        cons_show("Chat history (/history)    : ON");
+        cons_show("Chat history (/history)       : ON");
     else
-        cons_show("Chat history (/history)    : OFF");
+        cons_show("Chat history (/history)       : OFF");
+}
+
+void
+cons_carbons_setting(void)
+{
+    if (prefs_get_boolean(PREF_CARBONS))
+        cons_show("Message carbons (/carbons)    : ON");
+    else
+        cons_show("Message carbons (/carbons)    : OFF");
+}
+
+void
+cons_receipts_setting(void)
+{
+    if (prefs_get_boolean(PREF_RECEIPTS_REQUEST))
+        cons_show("Request receipts (/receipts)  : ON");
+    else
+        cons_show("Request receipts (/receipts)  : OFF");
+
+    if (prefs_get_boolean(PREF_RECEIPTS_SEND))
+        cons_show("Send receipts (/receipts)     : ON");
+    else
+        cons_show("Send receipts (/receipts)     : OFF");
+
 }
 
 void
@@ -1175,6 +1224,8 @@ cons_show_chat_prefs(void)
     cons_intype_setting();
     cons_gone_setting();
     cons_history_setting();
+    cons_carbons_setting();
+    cons_receipts_setting();
 
     cons_alert();
 }
@@ -1359,7 +1410,7 @@ cons_show_themes(GSList *themes)
         cons_show("No available themes.");
     } else {
         cons_show("Available themes:");
-        while (themes != NULL) {
+        while (themes) {
             cons_show(themes->data);
             themes = g_slist_next(themes);
         }
@@ -1400,7 +1451,7 @@ cons_help(void)
     cons_show("/help basic      - List basic commands for getting started.");
     cons_show("/help chatting   - List chat commands.");
     cons_show("/help groupchat  - List groupchat commands.");
-    cons_show("/help presence   - List commands to change presence.");
+    cons_show("/help presences  - List commands to change presence.");
     cons_show("/help contacts   - List commands for manipulating your roster.");
     cons_show("/help service    - List service discovery commands.");
     cons_show("/help settings   - List commands for changing settings.");
@@ -1417,27 +1468,10 @@ cons_navigation_help(void)
     cons_show("");
     cons_show("Navigation:");
     cons_show("");
-    cons_show("Alt-1                            : This console window.");
-    cons_show("F1                               : This console window.");
-    cons_show("Alt-2..Alt-0                     : Chat windows.");
-    cons_show("F2..F10                          : Chat windows.");
+    cons_show("Alt-1..Alt-0, F1..F10            : Choose window.");
     cons_show("Alt-LEFT, Alt-RIGHT              : Previous/next chat window");
-    cons_show("UP, DOWN                         : Navigate input history.");
-    cons_show("Ctrl-n, Ctrl-p                   : Navigate input history.");
-    cons_show("LEFT, RIGHT, HOME, END           : Move cursor.");
-    cons_show("Ctrl-b, Ctrl-f, Ctrl-a, Ctrl-e   : Move cursor.");
-    cons_show("Ctrl-LEFT, Ctrl-RIGHT            : Jump word.");
-    cons_show("Ctrl-w                           : Delete previous word.");
-    cons_show("Alt-Backspace                    : Delete previous word.");
-    cons_show("Backspace                        : Delete previous character.");
-    cons_show("DEL                              : Delete next character.");
-    cons_show("Ctrl-d                           : Delete next character.");
-    cons_show("ESC                              : Clear current input.");
-    cons_show("Ctrl-u                           : Delete all previous characters.");
-    cons_show("TAB                              : Autocomplete.");
-    cons_show("PAGE UP, PAGE DOWN               : Page the main window.");
-    cons_show("Shift-UP, Shift-DOWN             : Page occupants/roster panel.");
-    cons_show("Ctrl-UP, Ctrl-DOWN               : Page occupants/roster panel.");
+    cons_show("PAGEUP, PAGEDOWN                 : Page the main window.");
+    cons_show("Alt-PAGEUP, Alt-PAGEDOWN         : Page occupants/roster panel.");
     cons_show("");
 
     cons_alert();
@@ -1448,7 +1482,7 @@ cons_show_roster_group(const char * const group, GSList *list)
 {
     cons_show("");
 
-    if (list != NULL) {
+    if (list) {
         cons_show("%s:", group);
     } else {
         cons_show("No group named %s exists.", group);
@@ -1537,22 +1571,22 @@ cons_theme_colours(void)
 
     ProfWin *console = wins_get_console();
     cons_show("Theme colours:");
-    win_save_print(console, '-', NULL, NO_EOL, THEME_WHITE, "",         " white   ");
-    win_save_print(console, '-', NULL, NO_DATE, THEME_WHITE_BOLD, "",   " bold_white");
-    win_save_print(console, '-', NULL, NO_EOL, THEME_GREEN, "",         " green   ");
-    win_save_print(console, '-', NULL, NO_DATE, THEME_GREEN_BOLD, "",   " bold_green");
-    win_save_print(console, '-', NULL, NO_EOL, THEME_RED, "",           " red     ");
-    win_save_print(console, '-', NULL, NO_DATE, THEME_RED_BOLD, "",     " bold_red");
-    win_save_print(console, '-', NULL, NO_EOL, THEME_YELLOW, "",        " yellow  ");
-    win_save_print(console, '-', NULL, NO_DATE, THEME_YELLOW_BOLD, "",  " bold_yellow");
-    win_save_print(console, '-', NULL, NO_EOL, THEME_BLUE, "",          " blue    ");
-    win_save_print(console, '-', NULL, NO_DATE, THEME_BLUE_BOLD, "",    " bold_blue");
-    win_save_print(console, '-', NULL, NO_EOL, THEME_CYAN, "",          " cyan    ");
-    win_save_print(console, '-', NULL, NO_DATE, THEME_CYAN_BOLD, "",    " bold_cyan");
-    win_save_print(console, '-', NULL, NO_EOL, THEME_MAGENTA, "",       " magenta ");
-    win_save_print(console, '-', NULL, NO_DATE, THEME_MAGENTA_BOLD, "", " bold_magenta");
-    win_save_print(console, '-', NULL, NO_EOL, THEME_BLACK, "",         " black   ");
-    win_save_print(console, '-', NULL, NO_DATE, THEME_BLACK_BOLD, "",   " bold_black");
+    win_print(console, '-', NULL, NO_EOL, THEME_WHITE, "",         " white   ");
+    win_print(console, '-', NULL, NO_DATE, THEME_WHITE_BOLD, "",   " bold_white");
+    win_print(console, '-', NULL, NO_EOL, THEME_GREEN, "",         " green   ");
+    win_print(console, '-', NULL, NO_DATE, THEME_GREEN_BOLD, "",   " bold_green");
+    win_print(console, '-', NULL, NO_EOL, THEME_RED, "",           " red     ");
+    win_print(console, '-', NULL, NO_DATE, THEME_RED_BOLD, "",     " bold_red");
+    win_print(console, '-', NULL, NO_EOL, THEME_YELLOW, "",        " yellow  ");
+    win_print(console, '-', NULL, NO_DATE, THEME_YELLOW_BOLD, "",  " bold_yellow");
+    win_print(console, '-', NULL, NO_EOL, THEME_BLUE, "",          " blue    ");
+    win_print(console, '-', NULL, NO_DATE, THEME_BLUE_BOLD, "",    " bold_blue");
+    win_print(console, '-', NULL, NO_EOL, THEME_CYAN, "",          " cyan    ");
+    win_print(console, '-', NULL, NO_DATE, THEME_CYAN_BOLD, "",    " bold_cyan");
+    win_print(console, '-', NULL, NO_EOL, THEME_MAGENTA, "",       " magenta ");
+    win_print(console, '-', NULL, NO_DATE, THEME_MAGENTA_BOLD, "", " bold_magenta");
+    win_print(console, '-', NULL, NO_EOL, THEME_BLACK, "",         " black   ");
+    win_print(console, '-', NULL, NO_DATE, THEME_BLACK_BOLD, "",   " bold_black");
     cons_show("");
 }
 
@@ -1560,25 +1594,25 @@ static void
 _cons_splash_logo(void)
 {
     ProfWin *console = wins_get_console();
-    win_save_println(console, "Welcome to");
+    win_println(console, "Welcome to");
 
-    win_save_print(console, '-', NULL, 0, THEME_SPLASH, "", "                   ___            _           ");
-    win_save_print(console, '-', NULL, 0, THEME_SPLASH, "", "                  / __)          (_)_         ");
-    win_save_print(console, '-', NULL, 0, THEME_SPLASH, "", " ____   ____ ___ | |__ ____ ____  _| |_ _   _ ");
-    win_save_print(console, '-', NULL, 0, THEME_SPLASH, "", "|  _ \\ / ___) _ \\|  __) _  |  _ \\| |  _) | | |");
-    win_save_print(console, '-', NULL, 0, THEME_SPLASH, "", "| | | | |  | |_| | | ( ( | | | | | | |_| |_| |");
-    win_save_print(console, '-', NULL, 0, THEME_SPLASH, "", "| ||_/|_|   \\___/|_|  \\_||_|_| |_|_|\\___)__  |");
-    win_save_print(console, '-', NULL, 0, THEME_SPLASH, "", "|_|                                    (____/ ");
-    win_save_print(console, '-', NULL, 0, THEME_SPLASH, "", "");
+    win_print(console, '-', NULL, 0, THEME_SPLASH, "", "                   ___            _           ");
+    win_print(console, '-', NULL, 0, THEME_SPLASH, "", "                  / __)          (_)_         ");
+    win_print(console, '-', NULL, 0, THEME_SPLASH, "", " ____   ____ ___ | |__ ____ ____  _| |_ _   _ ");
+    win_print(console, '-', NULL, 0, THEME_SPLASH, "", "|  _ \\ / ___) _ \\|  __) _  |  _ \\| |  _) | | |");
+    win_print(console, '-', NULL, 0, THEME_SPLASH, "", "| | | | |  | |_| | | ( ( | | | | | | |_| |_| |");
+    win_print(console, '-', NULL, 0, THEME_SPLASH, "", "| ||_/|_|   \\___/|_|  \\_||_|_| |_|_|\\___)__  |");
+    win_print(console, '-', NULL, 0, THEME_SPLASH, "", "|_|                                    (____/ ");
+    win_print(console, '-', NULL, 0, THEME_SPLASH, "", "");
 
     if (strcmp(PACKAGE_STATUS, "development") == 0) {
 #ifdef HAVE_GIT_VERSION
-        win_save_vprint(console, '-', NULL, 0, 0, "", "Version %sdev.%s.%s", PACKAGE_VERSION, PROF_GIT_BRANCH, PROF_GIT_REVISION);
+        win_vprint(console, '-', NULL, 0, 0, "", "Version %sdev.%s.%s", PACKAGE_VERSION, PROF_GIT_BRANCH, PROF_GIT_REVISION);
 #else
-        win_save_vprint(console, '-', NULL, 0, 0, "", "Version %sdev", PACKAGE_VERSION);
+        win_vprint(console, '-', NULL, 0, 0, "", "Version %sdev", PACKAGE_VERSION);
 #endif
     } else {
-        win_save_vprint(console, '-', NULL, 0, 0, "", "Version %s", PACKAGE_VERSION);
+        win_vprint(console, '-', NULL, 0, 0, "", "Version %s", PACKAGE_VERSION);
     }
 }
 
@@ -1592,7 +1626,7 @@ _show_roster_contacts(GSList *list, gboolean show_groups)
         PContact contact = curr->data;
         GString *title = g_string_new("  ");
         title = g_string_append(title, p_contact_barejid(contact));
-        if (p_contact_name(contact) != NULL) {
+        if (p_contact_name(contact)) {
             title = g_string_append(title, " (");
             title = g_string_append(title, p_contact_name(contact));
             title = g_string_append(title, ")");
@@ -1605,11 +1639,11 @@ _show_roster_contacts(GSList *list, gboolean show_groups)
         } else {
             presence_colour = theme_main_presence_attrs("offline");
         }
-        win_save_vprint(console, '-', NULL, NO_EOL, presence_colour, "", title->str);
+        win_vprint(console, '-', NULL, NO_EOL, presence_colour, "", title->str);
 
         g_string_free(title, TRUE);
 
-        win_save_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", " - ");
+        win_print(console, '-', NULL, NO_DATE | NO_EOL, 0, "", " - ");
         GString *sub = g_string_new("");
         sub = g_string_append(sub, p_contact_subscription(contact));
         if (p_contact_pending_out(contact)) {
@@ -1625,28 +1659,28 @@ _show_roster_contacts(GSList *list, gboolean show_groups)
         }
 
         if (show_groups) {
-            win_save_vprint(console, '-', NULL, NO_DATE | NO_EOL, presence_colour, "", "%s", sub->str);
+            win_vprint(console, '-', NULL, NO_DATE | NO_EOL, presence_colour, "", "%s", sub->str);
         } else {
-            win_save_vprint(console, '-', NULL, NO_DATE, presence_colour, "", "%s", sub->str);
+            win_vprint(console, '-', NULL, NO_DATE, presence_colour, "", "%s", sub->str);
         }
 
         g_string_free(sub, TRUE);
 
         if (show_groups) {
             GSList *groups = p_contact_groups(contact);
-            if (groups != NULL) {
+            if (groups) {
                 GString *groups_str = g_string_new(" - ");
-                while (groups != NULL) {
+                while (groups) {
                     g_string_append(groups_str, groups->data);
-                    if (g_slist_next(groups) != NULL) {
+                    if (g_slist_next(groups)) {
                         g_string_append(groups_str, ", ");
                     }
                     groups = g_slist_next(groups);
                 }
-                win_save_vprint(console, '-', NULL, NO_DATE, 0, "", "%s", groups_str->str);
+                win_vprint(console, '-', NULL, NO_DATE, 0, "", "%s", groups_str->str);
                 g_string_free(groups_str, TRUE);
             } else {
-                 win_save_print(console, '-', NULL, NO_DATE, 0, "", " ");
+                 win_print(console, '-', NULL, NO_DATE, 0, "", " ");
             }
         }