From 4dc48b4b48c0bfd337dc3a678254d2eff1be6f6d Mon Sep 17 00:00:00 2001 From: James Booth Date: Tue, 16 Dec 2014 23:37:23 +0000 Subject: Added occupantswin.c --- src/main.c | 1 + src/server_events.c | 16 +++--- src/ui/core.c | 104 +---------------------------------- src/ui/occupantswin.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/ui/ui.h | 6 ++- src/ui/windows.c | 19 +++++++ src/ui/windows.h | 2 + 7 files changed, 183 insertions(+), 112 deletions(-) create mode 100644 src/ui/occupantswin.c (limited to 'src') diff --git a/src/main.c b/src/main.c index a8c02534..55745818 100644 --- a/src/main.c +++ b/src/main.c @@ -69,6 +69,7 @@ _init_modules(void) console_init_module(); notifier_init_module(); rosterwin_init_module(); + occupantswin_init_module(); accounts_init_module(); #ifdef HAVE_LIBOTR diff --git a/src/server_events.c b/src/server_events.c index 47bca487..bf243c3b 100644 --- a/src/server_events.c +++ b/src/server_events.c @@ -586,7 +586,7 @@ handle_room_occupant_offline(const char * const room, const char * const nick, ui_room_member_offline(room, nick); } prefs_free_string(muc_status_pref); - ui_muc_roster(room); + occupantswin_occupants(room); } void @@ -595,7 +595,7 @@ handle_room_occupent_kicked(const char * const room, const char * const nick, co { muc_roster_remove(room, nick); ui_room_member_kicked(room, nick, actor, reason); - ui_muc_roster(room); + occupantswin_occupants(room); } void @@ -604,7 +604,7 @@ handle_room_occupent_banned(const char * const room, const char * const nick, co { muc_roster_remove(room, nick); ui_room_member_banned(room, nick, actor, reason); - ui_muc_roster(room); + occupantswin_occupants(room); } void @@ -745,7 +745,7 @@ handle_muc_self_online(const char * const room, const char * const nick, gboolea } } - ui_muc_roster(room); + occupantswin_occupants(room); } void @@ -774,7 +774,7 @@ handle_muc_occupant_online(const char * const room, const char * const nick, con if (old_nick) { ui_room_member_nick_change(room, old_nick, nick); free(old_nick); - ui_muc_roster(room); + occupantswin_occupants(room); return; } @@ -785,7 +785,7 @@ handle_muc_occupant_online(const char * const room, const char * const nick, con ui_room_member_online(room, nick, role, affiliation, show, status); } prefs_free_string(muc_status_pref); - ui_muc_roster(room); + occupantswin_occupants(room); return; } @@ -796,7 +796,7 @@ handle_muc_occupant_online(const char * const room, const char * const nick, con ui_room_member_presence(room, nick, show, status); } prefs_free_string(muc_status_pref); - ui_muc_roster(room); + occupantswin_occupants(room); // presence unchanged, check for role/affiliation change } else { @@ -814,6 +814,6 @@ handle_muc_occupant_online(const char * const room, const char * const nick, con ui_room_occupant_affiliation_change(room, nick, affiliation, actor, reason); } } - ui_muc_roster(room); + occupantswin_occupants(room); } } \ No newline at end of file diff --git a/src/ui/core.c b/src/ui/core.c index c3f25544..1d378348 100644 --- a/src/ui/core.c +++ b/src/ui/core.c @@ -751,7 +751,7 @@ _ui_redraw_all_room_rosters(void) ProfWin *window = wins_get_by_num(num); if (window->type == WIN_MUC && win_has_active_subwin(window)) { char *room = window->from; - ui_muc_roster(room); + occupantswin_occupants(room); } curr = g_list_next(curr); } @@ -2937,112 +2937,13 @@ _ui_show_lines(ProfWin *window, const gchar** lines) } } -static void -_ui_muc_roster(const char * const room) -{ - ProfWin *window = wins_get_by_recipient(room); - if (window) { - GList *occupants = muc_roster(room); - if (occupants) { - ProfLayoutSplit *layout = (ProfLayoutSplit*)window->layout; - werase(layout->subwin); - - if (prefs_get_boolean(PREF_MUC_PRIVILEGES)) { - wattron(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); - win_printline_nowrap(layout->subwin, " -Moderators"); - wattroff(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); - GList *roster_curr = occupants; - while (roster_curr) { - Occupant *occupant = roster_curr->data; - if (occupant->role == MUC_ROLE_MODERATOR) { - const char *presence_str = string_from_resource_presence(occupant->presence); - theme_item_t presence_colour = theme_main_presence_attrs(presence_str); - wattron(layout->subwin, theme_attrs(presence_colour)); - - GString *msg = g_string_new(" "); - g_string_append(msg, occupant->nick); - win_printline_nowrap(layout->subwin, msg->str); - g_string_free(msg, TRUE); - - wattroff(layout->subwin, theme_attrs(presence_colour)); - } - roster_curr = g_list_next(roster_curr); - } - - wattron(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); - win_printline_nowrap(layout->subwin, " -Participants"); - wattroff(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); - roster_curr = occupants; - while (roster_curr) { - Occupant *occupant = roster_curr->data; - if (occupant->role == MUC_ROLE_PARTICIPANT) { - const char *presence_str = string_from_resource_presence(occupant->presence); - theme_item_t presence_colour = theme_main_presence_attrs(presence_str); - wattron(layout->subwin, theme_attrs(presence_colour)); - - GString *msg = g_string_new(" "); - g_string_append(msg, occupant->nick); - win_printline_nowrap(layout->subwin, msg->str); - g_string_free(msg, TRUE); - - wattroff(layout->subwin, theme_attrs(presence_colour)); - } - roster_curr = g_list_next(roster_curr); - } - - wattron(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); - win_printline_nowrap(layout->subwin, " -Visitors"); - wattroff(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); - roster_curr = occupants; - while (roster_curr) { - Occupant *occupant = roster_curr->data; - if (occupant->role == MUC_ROLE_VISITOR) { - const char *presence_str = string_from_resource_presence(occupant->presence); - theme_item_t presence_colour = theme_main_presence_attrs(presence_str); - wattron(layout->subwin, theme_attrs(presence_colour)); - - GString *msg = g_string_new(" "); - g_string_append(msg, occupant->nick); - win_printline_nowrap(layout->subwin, msg->str); - g_string_free(msg, TRUE); - - wattroff(layout->subwin, theme_attrs(presence_colour)); - } - roster_curr = g_list_next(roster_curr); - } - } else { - wattron(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); - win_printline_nowrap(layout->subwin, " -Occupants\n"); - wattroff(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); - GList *roster_curr = occupants; - while (roster_curr) { - Occupant *occupant = roster_curr->data; - const char *presence_str = string_from_resource_presence(occupant->presence); - theme_item_t presence_colour = theme_main_presence_attrs(presence_str); - wattron(layout->subwin, theme_attrs(presence_colour)); - - GString *msg = g_string_new(" "); - g_string_append(msg, occupant->nick); - win_printline_nowrap(layout->subwin, msg->str); - g_string_free(msg, TRUE); - - wattroff(layout->subwin, theme_attrs(presence_colour)); - roster_curr = g_list_next(roster_curr); - } - } - } - - g_list_free(occupants); - } -} - static void _ui_room_show_occupants(const char * const room) { ProfWin *window = wins_get_by_recipient(room); if (window && !win_has_active_subwin(window)) { wins_show_subwin(window); - ui_muc_roster(room); + occupantswin_occupants(room); } } @@ -3383,7 +3284,6 @@ ui_init_module(void) ui_handle_room_role_set_error = _ui_handle_room_role_set_error; ui_handle_room_role_list_error = _ui_handle_room_role_list_error; ui_handle_room_role_list = _ui_handle_room_role_list; - ui_muc_roster = _ui_muc_roster; ui_room_show_occupants = _ui_room_show_occupants; ui_room_hide_occupants = _ui_room_hide_occupants; ui_show_roster = _ui_show_roster; diff --git a/src/ui/occupantswin.c b/src/ui/occupantswin.c new file mode 100644 index 00000000..939e9cef --- /dev/null +++ b/src/ui/occupantswin.c @@ -0,0 +1,147 @@ +/* + * occupantswin.c + * + * Copyright (C) 2012 - 2014 James Booth + * + * This file is part of Profanity. + * + * Profanity is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Profanity is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Profanity. If not, see . + * + * In addition, as a special exception, the copyright holders give permission to + * link the code of portions of this program with the OpenSSL library under + * certain conditions as described in each individual source file, and + * distribute linked combinations including the two. + * + * You must obey the GNU General Public License in all respects for all of the + * code used other than OpenSSL. If you modify file(s) with this exception, you + * may extend this exception to your version of the file(s), but you are not + * obligated to do so. If you do not wish to do so, delete this exception + * statement from your version. If you delete this exception statement from all + * source files in the program, then also delete it here. + * + */ + +#include + +#include "ui/ui.h" +#include "ui/window.h" +#include "ui/windows.h" +#include "config/preferences.h" + +static void +_occupantswin_occupants(const char * const roomjid) +{ + ProfMucWin *mucwin = wins_get_muc_win(roomjid); + if (mucwin) { + GList *occupants = muc_roster(roomjid); + if (occupants) { + ProfLayoutSplit *layout = (ProfLayoutSplit*)mucwin->super.layout; + assert(layout->memcheck == LAYOUT_SPLIT_MEMCHECK); + + werase(layout->subwin); + + if (prefs_get_boolean(PREF_MUC_PRIVILEGES)) { + wattron(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); + win_printline_nowrap(layout->subwin, " -Moderators"); + wattroff(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); + GList *roster_curr = occupants; + while (roster_curr) { + Occupant *occupant = roster_curr->data; + if (occupant->role == MUC_ROLE_MODERATOR) { + const char *presence_str = string_from_resource_presence(occupant->presence); + theme_item_t presence_colour = theme_main_presence_attrs(presence_str); + wattron(layout->subwin, theme_attrs(presence_colour)); + + GString *msg = g_string_new(" "); + g_string_append(msg, occupant->nick); + win_printline_nowrap(layout->subwin, msg->str); + g_string_free(msg, TRUE); + + wattroff(layout->subwin, theme_attrs(presence_colour)); + } + roster_curr = g_list_next(roster_curr); + } + + wattron(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); + win_printline_nowrap(layout->subwin, " -Participants"); + wattroff(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); + roster_curr = occupants; + while (roster_curr) { + Occupant *occupant = roster_curr->data; + if (occupant->role == MUC_ROLE_PARTICIPANT) { + const char *presence_str = string_from_resource_presence(occupant->presence); + theme_item_t presence_colour = theme_main_presence_attrs(presence_str); + wattron(layout->subwin, theme_attrs(presence_colour)); + + GString *msg = g_string_new(" "); + g_string_append(msg, occupant->nick); + win_printline_nowrap(layout->subwin, msg->str); + g_string_free(msg, TRUE); + + wattroff(layout->subwin, theme_attrs(presence_colour)); + } + roster_curr = g_list_next(roster_curr); + } + + wattron(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); + win_printline_nowrap(layout->subwin, " -Visitors"); + wattroff(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); + roster_curr = occupants; + while (roster_curr) { + Occupant *occupant = roster_curr->data; + if (occupant->role == MUC_ROLE_VISITOR) { + const char *presence_str = string_from_resource_presence(occupant->presence); + theme_item_t presence_colour = theme_main_presence_attrs(presence_str); + wattron(layout->subwin, theme_attrs(presence_colour)); + + GString *msg = g_string_new(" "); + g_string_append(msg, occupant->nick); + win_printline_nowrap(layout->subwin, msg->str); + g_string_free(msg, TRUE); + + wattroff(layout->subwin, theme_attrs(presence_colour)); + } + roster_curr = g_list_next(roster_curr); + } + } else { + wattron(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); + win_printline_nowrap(layout->subwin, " -Occupants\n"); + wattroff(layout->subwin, theme_attrs(THEME_OCCUPANTS_HEADER)); + GList *roster_curr = occupants; + while (roster_curr) { + Occupant *occupant = roster_curr->data; + const char *presence_str = string_from_resource_presence(occupant->presence); + theme_item_t presence_colour = theme_main_presence_attrs(presence_str); + wattron(layout->subwin, theme_attrs(presence_colour)); + + GString *msg = g_string_new(" "); + g_string_append(msg, occupant->nick); + win_printline_nowrap(layout->subwin, msg->str); + g_string_free(msg, TRUE); + + wattroff(layout->subwin, theme_attrs(presence_colour)); + roster_curr = g_list_next(roster_curr); + } + } + } + + g_list_free(occupants); + } +} + +void +occupantswin_init_module(void) +{ + occupantswin_occupants = _occupantswin_occupants; +} \ No newline at end of file diff --git a/src/ui/ui.h b/src/ui/ui.h index 27fddffa..2cabd62f 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -56,6 +56,7 @@ void ui_init_module(void); void console_init_module(void); void rosterwin_init_module(void); +void occupantswin_init_module(void); void notifier_init_module(void); // ui startup and control @@ -248,8 +249,6 @@ void (*ui_open_xmlconsole_win)(void); gboolean (*ui_win_has_unsaved_form)(int num); -void (*ui_muc_roster)(const char * const room); - // console window actions void (*cons_show)(const char * const msg, ...); void (*cons_about)(void); @@ -331,6 +330,9 @@ void (*cons_theme_colours)(void); // roster window void (*rosterwin_roster)(void); +// occupants window +void (*occupantswin_occupants)(const char * const room); + // desktop notifier actions void (*notifier_uninit)(void); diff --git a/src/ui/windows.c b/src/ui/windows.c index 751f068d..5e8c6a9f 100644 --- a/src/ui/windows.c +++ b/src/ui/windows.c @@ -183,6 +183,25 @@ wins_get_by_recipient(const char * const recipient) return NULL; } +ProfMucWin * +wins_get_muc_win(const char * const roomjid) +{ + GList *values = g_hash_table_get_values(windows); + GList *curr = values; + + while (curr != NULL) { + ProfWin *window = curr->data; + if ((g_strcmp0(window->from, roomjid) == 0) && window->type == WIN_MUC) { + g_list_free(values); + return (ProfMucWin*)window; + } + curr = g_list_next(curr); + } + + g_list_free(values); + return NULL; +} + int wins_get_num(ProfWin *window) { diff --git a/src/ui/windows.h b/src/ui/windows.h index 6d90c655..50660bfc 100644 --- a/src/ui/windows.h +++ b/src/ui/windows.h @@ -44,6 +44,8 @@ ProfWin * wins_new_muc_config(const char * const title, DataForm *form); ProfWin * wins_new_private(const char * const fulljid); ProfWin * wins_get_console(void); +ProfMucWin * wins_get_muc_win(const char * const roomjid); + ProfWin * wins_get_current(void); void wins_set_current_by_num(int i); ProfWin * wins_get_by_num(int i); -- cgit 1.4.1-2-gfad0