diff options
author | Michael Vetter <jubalh@iodoru.org> | 2019-06-05 09:40:24 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-05 09:40:24 +0200 |
commit | 06f5e94dd7792bba568af69822d57f8e699277b1 (patch) | |
tree | 694b2c0358b62597223aec9f466b20fb2a0d2843 /src | |
parent | 7b434954b202e80fec95f2ddeeb67790a656e363 (diff) | |
parent | b210fb3603c4b52d478dd81810c6b4c38210bfd6 (diff) | |
download | profani-tty-06f5e94dd7792bba568af69822d57f8e699277b1.tar.gz |
Merge pull request #1109 from profanity-im/fix/1083
Fix SIGABRT on lost connection
Diffstat (limited to 'src')
-rw-r--r-- | src/ui/statusbar.c | 66 | ||||
-rw-r--r-- | src/xmpp/roster_list.c | 8 | ||||
-rw-r--r-- | src/xmpp/roster_list.h | 1 |
3 files changed, 47 insertions, 28 deletions
diff --git a/src/ui/statusbar.c b/src/ui/statusbar.c index d0ce7309..0e24ab3f 100644 --- a/src/ui/statusbar.c +++ b/src/ui/statusbar.c @@ -57,6 +57,7 @@ typedef struct _status_bar_tab_t { win_type_t window_type; char *identifier; gboolean highlight; + char *display_name; } StatusBarTab; typedef struct _status_bar_t { @@ -94,6 +95,7 @@ status_bar_init(void) StatusBarTab *console = malloc(sizeof(StatusBarTab)); console->window_type = WIN_CONSOLE; console->identifier = strdup("console"); + console->display_name = NULL; g_hash_table_insert(statusbar->tabs, GINT_TO_POINTER(1), console); statusbar->current_tab = 1; @@ -171,7 +173,7 @@ status_bar_inactive(const int win) } void -status_bar_active(const int win, win_type_t wintype, char *identifier) +_create_tab(const int win, win_type_t wintype, char *identifier, gboolean highlight) { int true_win = win; if (true_win == 0) { @@ -180,28 +182,44 @@ status_bar_active(const int win, win_type_t wintype, char *identifier) StatusBarTab *tab = malloc(sizeof(StatusBarTab)); tab->identifier = strdup(identifier); - tab->highlight = FALSE; + tab->highlight = highlight; tab->window_type = wintype; + tab->display_name = NULL; + + if (tab->window_type == WIN_CHAT) { + PContact contact = NULL; + if (roster_exists()) { + contact = roster_get_contact(tab->identifier); + } + if (contact && p_contact_name(contact)) { + tab->display_name = strdup(p_contact_name(contact)); + } else { + char *pref = prefs_get_string(PREF_STATUSBAR_CHAT); + if (g_strcmp0("user", pref) == 0) { + Jid *jidp = jid_create(tab->identifier); + tab->display_name = strdup(jidp->localpart); + jid_destroy(jidp); + } else { + tab->display_name = strdup(tab->identifier); + } + } + } + g_hash_table_replace(statusbar->tabs, GINT_TO_POINTER(true_win), tab); status_bar_draw(); } void -status_bar_new(const int win, win_type_t wintype, char* identifier) +status_bar_active(const int win, win_type_t wintype, char *identifier) { - int true_win = win; - if (true_win == 0) { - true_win = 10; - } - - StatusBarTab *tab = malloc(sizeof(StatusBarTab)); - tab->identifier = strdup(identifier); - tab->highlight = TRUE; - tab->window_type = wintype; - g_hash_table_replace(statusbar->tabs, GINT_TO_POINTER(true_win), tab); + _create_tab(win, wintype, identifier, FALSE); +} - status_bar_draw(); +void +status_bar_new(const int win, win_type_t wintype, char* identifier) +{ + _create_tab(win, wintype, identifier, TRUE); } void @@ -461,8 +479,12 @@ _destroy_tab(StatusBarTab *tab) if (tab->identifier) { free(tab->identifier); } + if (tab->display_name) { + free(tab->display_name); + } free(tab); } + tab = NULL; } static int @@ -520,19 +542,8 @@ _display_name(StatusBarTab *tab) } else if (tab->window_type == WIN_PLUGIN) { fullname = strdup(tab->identifier); } else if (tab->window_type == WIN_CHAT) { - PContact contact = roster_get_contact(tab->identifier); - if (contact && p_contact_name(contact)) { - fullname = strdup(p_contact_name(contact)); - } else { - char *pref = prefs_get_string(PREF_STATUSBAR_CHAT); - if (g_strcmp0("user", pref) == 0) { - Jid *jidp = jid_create(tab->identifier); - char *user = strdup(jidp->localpart); - jid_destroy(jidp); - fullname = user; - } else { - fullname = strdup(tab->identifier); - } + if (tab && tab->display_name) { + fullname = strdup(tab->display_name); } } else if (tab->window_type == WIN_MUC) { char *pref = prefs_get_string(PREF_STATUSBAR_ROOM); @@ -593,5 +604,4 @@ _display_name(StatusBarTab *tab) g_free(trimmed); return trimmedname; - } diff --git a/src/xmpp/roster_list.c b/src/xmpp/roster_list.c index 81a51581..7954e3de 100644 --- a/src/xmpp/roster_list.c +++ b/src/xmpp/roster_list.c @@ -707,3 +707,11 @@ roster_process_pending_presence(void) g_slist_free(roster_pending_presence); roster_pending_presence = NULL; } + +gboolean +roster_exists(void) { + if (roster != NULL) { + return TRUE; + } + return FALSE; +} diff --git a/src/xmpp/roster_list.h b/src/xmpp/roster_list.h index 57a932be..93f1253e 100644 --- a/src/xmpp/roster_list.h +++ b/src/xmpp/roster_list.h @@ -73,5 +73,6 @@ char* roster_get_msg_display_name(const char *const barejid, const char *const r gint roster_compare_name(PContact a, PContact b); gint roster_compare_presence(PContact a, PContact b); void roster_process_pending_presence(void); +gboolean roster_exists(void); #endif |