about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2014-12-16 23:37:23 +0000
committerJames Booth <boothj5@gmail.com>2014-12-16 23:37:23 +0000
commit4dc48b4b48c0bfd337dc3a678254d2eff1be6f6d (patch)
tree499ec3b9c989f18adb97975f44d93bfaa9671757 /src
parent052eee3c3e028fe6f631a7af05e503021dbcf79a (diff)
downloadprofani-tty-4dc48b4b48c0bfd337dc3a678254d2eff1be6f6d.tar.gz
Added occupantswin.c
Diffstat (limited to 'src')
-rw-r--r--src/main.c1
-rw-r--r--src/server_events.c16
-rw-r--r--src/ui/core.c104
-rw-r--r--src/ui/occupantswin.c147
-rw-r--r--src/ui/ui.h6
-rw-r--r--src/ui/windows.c19
-rw-r--r--src/ui/windows.h2
7 files changed, 183 insertions, 112 deletions
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);
     }
@@ -2938,111 +2938,12 @@ _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 <boothj5@gmail.com>
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ *
+ * 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 <assert.h>
+
+#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);