1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-12-04 14:46:46 -05:00

Merge branch 'master' into osx-functional

This commit is contained in:
James Booth 2016-01-15 00:47:51 +00:00
commit bdcca3c2ad
2 changed files with 80 additions and 25 deletions

View File

@ -131,8 +131,19 @@ _rosterwin_presence(ProfLayoutSplit *layout, theme_item_t colour, const char *pr
}
}
theme_item_t
_get_roster_theme(roster_contact_theme_t theme_type, const char *presence)
{
switch (theme_type) {
case ROSTER_CONTACT: return theme_roster_presence_attrs(presence);
case ROSTER_CONTACT_ACTIVE: return theme_roster_active_presence_attrs(presence);
case ROSTER_CONTACT_UNREAD: return theme_roster_unread_presence_attrs(presence);
default: return theme_roster_presence_attrs(presence);
}
}
static void
_rosterwin_resources(ProfLayoutSplit *layout, PContact contact, int current_indent, roster_contact_theme_t theme_type)
_rosterwin_resources(ProfLayoutSplit *layout, PContact contact, int current_indent, roster_contact_theme_t theme_type, int unread)
{
gboolean join = prefs_get_boolean(PREF_ROSTER_RESOURCE_JOIN);
@ -141,13 +152,7 @@ _rosterwin_resources(ProfLayoutSplit *layout, PContact contact, int current_inde
if (join && (g_list_length(resources) == 1)) {
Resource *resource = resources->data;
const char *resource_presence = string_from_resource_presence(resource->presence);
theme_item_t resource_presence_colour;
switch (theme_type) {
case ROSTER_CONTACT: resource_presence_colour = theme_roster_presence_attrs(resource_presence); break;
case ROSTER_CONTACT_ACTIVE: resource_presence_colour = theme_roster_active_presence_attrs(resource_presence); break;
case ROSTER_CONTACT_UNREAD: resource_presence_colour = theme_roster_unread_presence_attrs(resource_presence); break;
}
theme_item_t resource_presence_colour = _get_roster_theme(theme_type, resource_presence);
wattron(layout->subwin, theme_attrs(resource_presence_colour));
GString *msg = g_string_new("");
@ -161,6 +166,11 @@ _rosterwin_resources(ProfLayoutSplit *layout, PContact contact, int current_inde
if (prefs_get_boolean(PREF_ROSTER_PRIORITY)) {
g_string_append_printf(msg, " %d", resource->priority);
}
if (unread > 0) {
g_string_append_printf(msg, " (%d)", unread);
}
gboolean wrap = prefs_get_boolean(PREF_ROSTER_WRAP);
win_sub_print(layout->subwin, msg->str, FALSE, wrap, 0);
g_string_free(msg, TRUE);
@ -170,6 +180,20 @@ _rosterwin_resources(ProfLayoutSplit *layout, PContact contact, int current_inde
_rosterwin_presence(layout, resource_presence_colour, resource_presence, resource->status, current_indent);
}
} else {
gboolean wrap = prefs_get_boolean(PREF_ROSTER_WRAP);
if (unread > 0) {
GString *unreadmsg = g_string_new("");
g_string_append_printf(unreadmsg, " (%d)", unread);
const char *presence = p_contact_presence(contact);
theme_item_t presence_colour = _get_roster_theme(theme_type, presence);
wattron(layout->subwin, theme_attrs(presence_colour));
win_sub_print(layout->subwin, unreadmsg->str, FALSE, wrap, current_indent);
wattroff(layout->subwin, theme_attrs(presence_colour));
}
int resource_indent = prefs_get_roster_resource_indent();
if (resource_indent > 0) {
current_indent += resource_indent;
@ -179,13 +203,7 @@ _rosterwin_resources(ProfLayoutSplit *layout, PContact contact, int current_inde
while (curr_resource) {
Resource *resource = curr_resource->data;
const char *resource_presence = string_from_resource_presence(resource->presence);
theme_item_t resource_presence_colour;
switch (theme_type) {
case ROSTER_CONTACT: resource_presence_colour = theme_roster_presence_attrs(resource_presence); break;
case ROSTER_CONTACT_ACTIVE: resource_presence_colour = theme_roster_active_presence_attrs(resource_presence); break;
case ROSTER_CONTACT_UNREAD: resource_presence_colour = theme_roster_unread_presence_attrs(resource_presence); break;
}
theme_item_t resource_presence_colour = _get_roster_theme(theme_type, resource_presence);
wattron(layout->subwin, theme_attrs(resource_presence_colour));
GString *msg = g_string_new(" ");
@ -203,7 +221,6 @@ _rosterwin_resources(ProfLayoutSplit *layout, PContact contact, int current_inde
g_string_append_printf(msg, " %d", resource->priority);
}
win_sub_newline_lazy(layout->subwin);
gboolean wrap = prefs_get_boolean(PREF_ROSTER_WRAP);
win_sub_print(layout->subwin, msg->str, FALSE, wrap, current_indent);
g_string_free(msg, TRUE);
wattroff(layout->subwin, theme_attrs(resource_presence_colour));
@ -218,9 +235,33 @@ _rosterwin_resources(ProfLayoutSplit *layout, PContact contact, int current_inde
} else if (prefs_get_boolean(PREF_ROSTER_PRESENCE) || prefs_get_boolean(PREF_ROSTER_STATUS)) {
const char *presence = p_contact_presence(contact);
const char *status = p_contact_status(contact);
theme_item_t presence_colour = theme_main_presence_attrs(presence);
theme_item_t presence_colour = _get_roster_theme(theme_type, presence);
gboolean wrap = prefs_get_boolean(PREF_ROSTER_WRAP);
if (unread > 0) {
GString *unreadmsg = g_string_new("");
g_string_append_printf(unreadmsg, " (%d)", unread);
wattron(layout->subwin, theme_attrs(presence_colour));
win_sub_print(layout->subwin, unreadmsg->str, FALSE, wrap, current_indent);
wattroff(layout->subwin, theme_attrs(presence_colour));
}
_rosterwin_presence(layout, presence_colour, presence, status, current_indent);
} else {
gboolean wrap = prefs_get_boolean(PREF_ROSTER_WRAP);
if (unread > 0) {
GString *unreadmsg = g_string_new("");
g_string_append_printf(unreadmsg, " (%d)", unread);
const char *presence = p_contact_presence(contact);
theme_item_t presence_colour = _get_roster_theme(theme_type, presence);
wattron(layout->subwin, theme_attrs(presence_colour));
win_sub_print(layout->subwin, unreadmsg->str, FALSE, wrap, current_indent);
wattroff(layout->subwin, theme_attrs(presence_colour));
}
}
g_list_free(resources);
}
@ -232,23 +273,20 @@ _rosterwin_contact(ProfLayoutSplit *layout, PContact contact)
const char *presence = p_contact_presence(contact);
const char *status = p_contact_status(contact);
const char *barejid = p_contact_barejid(contact);
int unread = 0;
roster_contact_theme_t theme_type = ROSTER_CONTACT;
ProfChatWin *chatwin = wins_get_chat(barejid);
if (chatwin) {
if (chatwin->unread > 0) {
theme_type = ROSTER_CONTACT_UNREAD;
unread = chatwin->unread;
} else {
theme_type = ROSTER_CONTACT_ACTIVE;
}
}
theme_item_t presence_colour;
switch (theme_type) {
case ROSTER_CONTACT: presence_colour = theme_roster_presence_attrs(presence); break;
case ROSTER_CONTACT_ACTIVE: presence_colour = theme_roster_active_presence_attrs(presence); break;
case ROSTER_CONTACT_UNREAD: presence_colour = theme_roster_unread_presence_attrs(presence); break;
}
theme_item_t presence_colour = _get_roster_theme(theme_type, presence);
wattron(layout->subwin, theme_attrs(presence_colour));
GString *msg = g_string_new(" ");
@ -266,6 +304,14 @@ _rosterwin_contact(ProfLayoutSplit *layout, PContact contact)
g_string_append_printf(msg, "%c", ch);
}
g_string_append(msg, name);
if (!prefs_get_boolean(PREF_ROSTER_RESOURCE)) {
if (unread > 0) {
g_string_append_printf(msg, " (%d)", unread);
}
unread = 0;
}
win_sub_newline_lazy(layout->subwin);
gboolean wrap = prefs_get_boolean(PREF_ROSTER_WRAP);
win_sub_print(layout->subwin, msg->str, FALSE, wrap, current_indent);
@ -273,8 +319,17 @@ _rosterwin_contact(ProfLayoutSplit *layout, PContact contact)
wattroff(layout->subwin, theme_attrs(presence_colour));
if (prefs_get_boolean(PREF_ROSTER_RESOURCE)) {
_rosterwin_resources(layout, contact, current_indent, theme_type);
_rosterwin_resources(layout, contact, current_indent, theme_type, unread);
} else if (prefs_get_boolean(PREF_ROSTER_PRESENCE) || prefs_get_boolean(PREF_ROSTER_STATUS)) {
if (unread > 0) {
GString *unreadmsg = g_string_new("");
g_string_append_printf(unreadmsg, " (%d)", unread);
wattron(layout->subwin, theme_attrs(presence_colour));
win_sub_print(layout->subwin, unreadmsg->str, FALSE, wrap, current_indent);
g_string_free(unreadmsg, TRUE);
wattroff(layout->subwin, theme_attrs(presence_colour));
}
_rosterwin_presence(layout, presence_colour, presence, status, current_indent);
}
}

View File

@ -97,7 +97,7 @@ roster.empty=false
roster.by=group
roster.order=presence
roster.count=true
roster.priority=true
roster.priority=false
roster.size=25
roster.wrap=true
roster.header.char=@