about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/ui/core.c134
-rw-r--r--src/ui/window.c130
-rw-r--r--src/ui/window.h45
-rw-r--r--src/ui/windows.c38
4 files changed, 227 insertions, 120 deletions
diff --git a/src/ui/core.c b/src/ui/core.c
index 3514a15f..14b4ce45 100644
--- a/src/ui/core.c
+++ b/src/ui/core.c
@@ -695,7 +695,7 @@ _ui_redraw_all_room_rosters(void)
     while (curr != NULL) {
         int num = GPOINTER_TO_INT(curr->data);
         ProfWin *window = wins_get_by_num(num);
-        if (window->type == WIN_MUC && window->subwin) {
+        if (window->type == WIN_MUC && window->wins.muc.subwin) {
             char *room = window->from;
             ui_muc_roster(room);
         }
@@ -715,7 +715,7 @@ _ui_hide_all_room_rosters(void)
     while (curr != NULL) {
         int num = GPOINTER_TO_INT(curr->data);
         ProfWin *window = wins_get_by_num(num);
-        if (window->type == WIN_MUC && window->subwin) {
+        if (window->type == WIN_MUC && window->wins.muc.subwin) {
             char *room = window->from;
             ui_room_hide_occupants(room);
         }
@@ -735,7 +735,7 @@ _ui_show_all_room_rosters(void)
     while (curr != NULL) {
         int num = GPOINTER_TO_INT(curr->data);
         ProfWin *window = wins_get_by_num(num);
-        if (window->type == WIN_MUC && window->subwin == NULL) {
+        if (window->type == WIN_MUC && window->wins.muc.subwin == NULL) {
             char *room = window->from;
             ui_room_show_occupants(room);
         }
@@ -2875,14 +2875,14 @@ _ui_roster_contact(PContact contact)
                 (prefs_get_boolean(PREF_ROSTER_OFFLINE)))) {
             theme_item_t presence_colour = theme_main_presence_attrs(presence);
 
-            wattron(window->subwin, theme_attrs(presence_colour));
+            wattron(window->wins.cons.subwin, theme_attrs(presence_colour));
 
             GString *msg = g_string_new("   ");
             g_string_append(msg, name);
-            win_printline_nowrap(window->subwin, msg->str);
+            win_printline_nowrap(window->wins.cons.subwin, msg->str);
             g_string_free(msg, TRUE);
 
-            wattroff(window->subwin, theme_attrs(presence_colour));
+            wattroff(window->wins.cons.subwin, theme_attrs(presence_colour));
 
             if (prefs_get_boolean(PREF_ROSTER_RESOURCE)) {
                 GList *resources = p_contact_get_available_resources(contact);
@@ -2891,14 +2891,14 @@ _ui_roster_contact(PContact contact)
                     Resource *resource = curr_resource->data;
                     const char *resource_presence = string_from_resource_presence(resource->presence);
                     theme_item_t resource_presence_colour = theme_main_presence_attrs(resource_presence);
-                    wattron(window->subwin, theme_attrs(resource_presence_colour));
+                    wattron(window->wins.cons.subwin, theme_attrs(resource_presence_colour));
 
                     GString *msg = g_string_new("     ");
                     g_string_append(msg, resource->name);
-                    win_printline_nowrap(window->subwin, msg->str);
+                    win_printline_nowrap(window->wins.cons.subwin, msg->str);
                     g_string_free(msg, TRUE);
 
-                    wattroff(window->subwin, theme_attrs(resource_presence_colour));
+                    wattroff(window->wins.cons.subwin, theme_attrs(resource_presence_colour));
 
                     curr_resource = g_list_next(curr_resource);
                 }
@@ -2912,9 +2912,9 @@ static void
 _ui_roster_contacts_by_presence(const char * const presence, char *title)
 {
     ProfWin *window = wins_get_console();
-    wattron(window->subwin, theme_attrs(THEME_ROSTER_HEADER));
-    win_printline_nowrap(window->subwin, title);
-    wattroff(window->subwin, theme_attrs(THEME_ROSTER_HEADER));
+    wattron(window->wins.cons.subwin, theme_attrs(THEME_ROSTER_HEADER));
+    win_printline_nowrap(window->wins.cons.subwin, title);
+    wattroff(window->wins.cons.subwin, theme_attrs(THEME_ROSTER_HEADER));
     GSList *contacts = roster_get_contacts_by_presence(presence);
     if (contacts) {
         GSList *curr_contact = contacts;
@@ -2931,12 +2931,12 @@ static void
 _ui_roster_contacts_by_group(char *group)
 {
     ProfWin *window = wins_get_console();
-    wattron(window->subwin, theme_attrs(THEME_ROSTER_HEADER));
+    wattron(window->wins.cons.subwin, theme_attrs(THEME_ROSTER_HEADER));
     GString *title = g_string_new(" -");
     g_string_append(title, group);
-    win_printline_nowrap(window->subwin, title->str);
+    win_printline_nowrap(window->wins.cons.subwin, title->str);
     g_string_free(title, TRUE);
-    wattroff(window->subwin, theme_attrs(THEME_ROSTER_HEADER));
+    wattroff(window->wins.cons.subwin, theme_attrs(THEME_ROSTER_HEADER));
     GSList *contacts = roster_get_group(group);
     if (contacts) {
         GSList *curr_contact = contacts;
@@ -2955,9 +2955,9 @@ _ui_roster_contacts_by_no_group(void)
     ProfWin *window = wins_get_console();
     GSList *contacts = roster_get_nogroup();
     if (contacts) {
-        wattron(window->subwin, theme_attrs(THEME_ROSTER_HEADER));
-        win_printline_nowrap(window->subwin, " -no group");
-        wattroff(window->subwin, theme_attrs(THEME_ROSTER_HEADER));
+        wattron(window->wins.cons.subwin, theme_attrs(THEME_ROSTER_HEADER));
+        win_printline_nowrap(window->wins.cons.subwin, " -no group");
+        wattroff(window->wins.cons.subwin, theme_attrs(THEME_ROSTER_HEADER));
         GSList *curr_contact = contacts;
         while (curr_contact) {
             PContact contact = curr_contact->data;
@@ -2975,7 +2975,7 @@ _ui_roster(void)
     if (window) {
         char *by = prefs_get_string(PREF_ROSTER_BY);
         if (g_strcmp0(by, "presence") == 0) {
-            werase(window->subwin);
+            werase(window->wins.cons.subwin);
             _ui_roster_contacts_by_presence("chat", " -Available for chat");
             _ui_roster_contacts_by_presence("online", " -Online");
             _ui_roster_contacts_by_presence("away", " -Away");
@@ -2985,7 +2985,7 @@ _ui_roster(void)
                 _ui_roster_contacts_by_presence("offline", " -Offline");
             }
         } else if (g_strcmp0(by, "group") == 0) {
-            werase(window->subwin);
+            werase(window->wins.cons.subwin);
             GSList *groups = roster_get_groups();
             GSList *curr_group = groups;
             while (curr_group) {
@@ -2997,10 +2997,10 @@ _ui_roster(void)
         } else {
             GSList *contacts = roster_get_contacts();
             if (contacts) {
-                werase(window->subwin);
-                wattron(window->subwin, theme_attrs(THEME_ROSTER_HEADER));
-                win_printline_nowrap(window->subwin, " -Roster");
-                wattroff(window->subwin, theme_attrs(THEME_ROSTER_HEADER));
+                werase(window->wins.cons.subwin);
+                wattron(window->wins.cons.subwin, theme_attrs(THEME_ROSTER_HEADER));
+                win_printline_nowrap(window->wins.cons.subwin, " -Roster");
+                wattroff(window->wins.cons.subwin, theme_attrs(THEME_ROSTER_HEADER));
                 GSList *curr_contact = contacts;
                 while (curr_contact) {
                     PContact contact = curr_contact->data;
@@ -3021,88 +3021,88 @@ _ui_muc_roster(const char * const room)
     if (window) {
         GList *occupants = muc_roster(room);
         if (occupants) {
-            werase(window->subwin);
+            werase(window->wins.muc.subwin);
 
             if (prefs_get_boolean(PREF_MUC_PRIVILEGES)) {
-                wattron(window->subwin, theme_attrs(THEME_OCCUPANTS_HEADER));
-                win_printline_nowrap(window->subwin, " -Moderators");
-                wattroff(window->subwin, theme_attrs(THEME_OCCUPANTS_HEADER));
+                wattron(window->wins.muc.subwin, theme_attrs(THEME_OCCUPANTS_HEADER));
+                win_printline_nowrap(window->wins.muc.subwin, " -Moderators");
+                wattroff(window->wins.muc.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(window->subwin, theme_attrs(presence_colour));
+                        wattron(window->wins.muc.subwin, theme_attrs(presence_colour));
 
                         GString *msg = g_string_new("   ");
                         g_string_append(msg, occupant->nick);
-                        win_printline_nowrap(window->subwin, msg->str);
+                        win_printline_nowrap(window->wins.muc.subwin, msg->str);
                         g_string_free(msg, TRUE);
 
-                        wattroff(window->subwin, theme_attrs(presence_colour));
+                        wattroff(window->wins.muc.subwin, theme_attrs(presence_colour));
                     }
                     roster_curr = g_list_next(roster_curr);
                 }
 
-                wattron(window->subwin, theme_attrs(THEME_OCCUPANTS_HEADER));
-                win_printline_nowrap(window->subwin, " -Participants");
-                wattroff(window->subwin, theme_attrs(THEME_OCCUPANTS_HEADER));
+                wattron(window->wins.muc.subwin, theme_attrs(THEME_OCCUPANTS_HEADER));
+                win_printline_nowrap(window->wins.muc.subwin, " -Participants");
+                wattroff(window->wins.muc.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(window->subwin, theme_attrs(presence_colour));
+                        wattron(window->wins.muc.subwin, theme_attrs(presence_colour));
 
                         GString *msg = g_string_new("   ");
                         g_string_append(msg, occupant->nick);
-                        win_printline_nowrap(window->subwin, msg->str);
+                        win_printline_nowrap(window->wins.muc.subwin, msg->str);
                         g_string_free(msg, TRUE);
 
-                        wattroff(window->subwin, theme_attrs(presence_colour));
+                        wattroff(window->wins.muc.subwin, theme_attrs(presence_colour));
                     }
                     roster_curr = g_list_next(roster_curr);
                 }
 
-                wattron(window->subwin, theme_attrs(THEME_OCCUPANTS_HEADER));
-                win_printline_nowrap(window->subwin, " -Visitors");
-                wattroff(window->subwin, theme_attrs(THEME_OCCUPANTS_HEADER));
+                wattron(window->wins.muc.subwin, theme_attrs(THEME_OCCUPANTS_HEADER));
+                win_printline_nowrap(window->wins.muc.subwin, " -Visitors");
+                wattroff(window->wins.muc.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(window->subwin, theme_attrs(presence_colour));
+                        wattron(window->wins.muc.subwin, theme_attrs(presence_colour));
 
                         GString *msg = g_string_new("   ");
                         g_string_append(msg, occupant->nick);
-                        win_printline_nowrap(window->subwin, msg->str);
+                        win_printline_nowrap(window->wins.muc.subwin, msg->str);
                         g_string_free(msg, TRUE);
 
-                        wattroff(window->subwin, theme_attrs(presence_colour));
+                        wattroff(window->wins.muc.subwin, theme_attrs(presence_colour));
                     }
                     roster_curr = g_list_next(roster_curr);
                 }
             } else {
-                wattron(window->subwin, theme_attrs(THEME_OCCUPANTS_HEADER));
-                win_printline_nowrap(window->subwin, " -Occupants\n");
-                wattroff(window->subwin, theme_attrs(THEME_OCCUPANTS_HEADER));
+                wattron(window->wins.muc.subwin, theme_attrs(THEME_OCCUPANTS_HEADER));
+                win_printline_nowrap(window->wins.muc.subwin, " -Occupants\n");
+                wattroff(window->wins.muc.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(window->subwin, theme_attrs(presence_colour));
+                    wattron(window->wins.muc.subwin, theme_attrs(presence_colour));
 
                     GString *msg = g_string_new("   ");
                     g_string_append(msg, occupant->nick);
-                    win_printline_nowrap(window->subwin, msg->str);
+                    win_printline_nowrap(window->wins.muc.subwin, msg->str);
                     g_string_free(msg, TRUE);
 
-                    wattroff(window->subwin, theme_attrs(presence_colour));
+                    wattroff(window->wins.muc.subwin, theme_attrs(presence_colour));
                     roster_curr = g_list_next(roster_curr);
                 }
             }
@@ -3116,7 +3116,7 @@ static void
 _ui_room_show_occupants(const char * const room)
 {
     ProfWin *window = wins_get_by_recipient(room);
-    if (window && !window->subwin) {
+    if (window && !window->wins.muc.subwin) {
         wins_show_subwin(window);
         ui_muc_roster(room);
     }
@@ -3126,7 +3126,7 @@ static void
 _ui_room_hide_occupants(const char * const room)
 {
     ProfWin *window = wins_get_by_recipient(room);
-    if (window && window->subwin) {
+    if (window && window->wins.muc.subwin) {
         wins_hide_subwin(window);
     }
 }
@@ -3135,7 +3135,7 @@ static void
 _ui_show_roster(void)
 {
     ProfWin *window = wins_get_console();
-    if (window && !window->subwin) {
+    if (window && !window->wins.cons.subwin) {
         wins_show_subwin(window);
         ui_roster();
     }
@@ -3145,7 +3145,7 @@ static void
 _ui_hide_roster(void)
 {
     ProfWin *window = wins_get_console();
-    if (window && window->subwin) {
+    if (window && window->wins.cons.subwin) {
         wins_hide_subwin(window);
     }
 }
@@ -3182,7 +3182,6 @@ _win_handle_page(const wint_t * const ch, const int result)
     ProfWin *current = wins_get_current();
     int rows = getmaxy(stdscr);
     int y = getcury(current->win);
-    int sub_y = getcury(current->subwin);
 
     int page_space = rows - 4;
     int *page_start = &(current->y_pos);
@@ -3257,27 +3256,38 @@ _win_handle_page(const wint_t * const ch, const int result)
     }
 
     if ((current->type == WIN_MUC) || (current->type == WIN_CONSOLE)) {
+        int sub_y = 0;
+        int *sub_y_pos = NULL;
+
+        if (current->type == WIN_MUC) {
+            sub_y = getcury(current->wins.muc.subwin);
+            sub_y_pos = &(current->wins.muc.sub_y_pos);
+        } else if (current->type == WIN_CONSOLE) {
+            sub_y = getcury(current->wins.cons.subwin);
+            sub_y_pos = &(current->wins.cons.sub_y_pos);
+        }
+
         // alt up arrow
         if ((result == KEY_CODE_YES) && ((*ch == 565) || (*ch == 337))) {
-            current->sub_y_pos -= page_space;
+            *sub_y_pos -= page_space;
 
             // went past beginning, show first page
-            if (current->sub_y_pos < 0)
-                current->sub_y_pos = 0;
+            if (*sub_y_pos < 0)
+                *sub_y_pos = 0;
 
             win_update_virtual(current);
 
         // alt down arrow
         } else if ((result == KEY_CODE_YES) && ((*ch == 524) || (*ch == 336))) {
-            current->sub_y_pos += page_space;
+            *sub_y_pos += page_space;
 
             // only got half a screen, show full screen
-            if ((sub_y- (current->sub_y_pos)) < page_space)
-                current->sub_y_pos = sub_y - page_space;
+            if ((sub_y- (*sub_y_pos)) < page_space)
+                *sub_y_pos = sub_y - page_space;
 
             // went past end, show full screen
-            else if (current->sub_y_pos >= sub_y)
-                current->sub_y_pos = sub_y - page_space - 1;
+            else if (*sub_y_pos >= sub_y)
+                *sub_y_pos = sub_y - page_space - 1;
 
             win_update_virtual(current);
         }
diff --git a/src/ui/window.c b/src/ui/window.c
index cb2587f8..183b052d 100644
--- a/src/ui/window.c
+++ b/src/ui/window.c
@@ -76,27 +76,39 @@ win_occpuants_cols(void)
 ProfWin*
 win_create(const char * const title, win_type_t type)
 {
-    ProfWin *new_win = malloc(sizeof(struct prof_win_t));
-    new_win->from = strdup(title);
+    ProfWin *new_win = malloc(sizeof(ProfWin));
     int cols = getmaxx(stdscr);
 
-    if (type == WIN_MUC && prefs_get_boolean(PREF_OCCUPANTS)) {
-        int subwin_cols = win_occpuants_cols();
-        new_win->win = newpad(PAD_SIZE, cols - subwin_cols);
+    switch (type) {
+    case WIN_CONSOLE:
+        new_win->win = newpad(PAD_SIZE, (cols));
         wbkgd(new_win->win, theme_attrs(THEME_TEXT));
-
-        new_win->subwin = newpad(PAD_SIZE, subwin_cols);
-        wbkgd(new_win->subwin, theme_attrs(THEME_TEXT));
-    } else {
+        new_win->wins.cons.subwin = NULL;
+        new_win->wins.cons.sub_y_pos = 0;
+        break;
+    case WIN_MUC:
+        if (prefs_get_boolean(PREF_OCCUPANTS)) {
+            int subwin_cols = win_occpuants_cols();
+            new_win->win = newpad(PAD_SIZE, cols - subwin_cols);
+            wbkgd(new_win->win, theme_attrs(THEME_TEXT));
+            new_win->wins.muc.subwin = newpad(PAD_SIZE, subwin_cols);;
+            wbkgd(new_win->wins.muc.subwin, theme_attrs(THEME_TEXT));
+        } else {
+            new_win->win = newpad(PAD_SIZE, (cols));
+            wbkgd(new_win->win, theme_attrs(THEME_TEXT));
+            new_win->wins.muc.subwin = NULL;
+        }
+        new_win->wins.muc.sub_y_pos = 0;
+        break;
+    default:
         new_win->win = newpad(PAD_SIZE, (cols));
         wbkgd(new_win->win, theme_attrs(THEME_TEXT));
-
-        new_win->subwin = NULL;
+        break;
     }
 
+    new_win->from = strdup(title);
     new_win->buffer = buffer_create();
     new_win->y_pos = 0;
-    new_win->sub_y_pos = 0;
     new_win->paged = 0;
     new_win->unread = 0;
     new_win->history_shown = 0;
@@ -113,11 +125,24 @@ win_create(const char * const title, win_type_t type)
 void
 win_hide_subwin(ProfWin *window)
 {
-    if (window->subwin) {
-        delwin(window->subwin);
+    switch (window->type) {
+    case WIN_CONSOLE:
+        if (window->wins.cons.subwin) {
+            delwin(window->wins.cons.subwin);
+        }
+        window->wins.cons.subwin = NULL;
+        window->wins.cons.sub_y_pos = 0;
+        break;
+    case WIN_MUC:
+        if (window->wins.muc.subwin) {
+            delwin(window->wins.muc.subwin);
+        }
+        window->wins.muc.subwin = NULL;
+        window->wins.muc.sub_y_pos = 0;
+        break;
+    default:
+        break;
     }
-    window->subwin = NULL;
-    window->sub_y_pos = 0;
 
     int cols = getmaxx(stdscr);
     wresize(window->win, PAD_SIZE, cols);
@@ -127,20 +152,26 @@ win_hide_subwin(ProfWin *window)
 void
 win_show_subwin(ProfWin *window)
 {
-    if (!window->subwin) {
-        int cols = getmaxx(stdscr);
-        int subwin_cols = 0;
-        if (window->type == WIN_CONSOLE) {
-            subwin_cols = win_roster_cols();
-        } else if (window->type == WIN_MUC) {
-            subwin_cols = win_occpuants_cols();
-        }
-
-        window->subwin = newpad(PAD_SIZE, subwin_cols);
-        wbkgd(window->subwin, theme_attrs(THEME_TEXT));
+    int cols = getmaxx(stdscr);
+    int subwin_cols = 0;
 
+    switch (window->type) {
+    case WIN_CONSOLE:
+        subwin_cols = win_roster_cols();
+        window->wins.cons.subwin = newpad(PAD_SIZE, subwin_cols);
+        wbkgd(window->wins.cons.subwin, theme_attrs(THEME_TEXT));
+        wresize(window->win, PAD_SIZE, cols - subwin_cols);
+        win_redraw(window);
+        break;
+    case WIN_MUC:
+        subwin_cols = win_occpuants_cols();
+        window->wins.muc.subwin = newpad(PAD_SIZE, subwin_cols);
+        wbkgd(window->wins.muc.subwin, theme_attrs(THEME_TEXT));
         wresize(window->win, PAD_SIZE, cols - subwin_cols);
         win_redraw(window);
+        break;
+    default:
+        break;
     }
 }
 
@@ -149,9 +180,22 @@ win_free(ProfWin* window)
 {
     buffer_free(window->buffer);
     delwin(window->win);
-    if (window->subwin) {
-        delwin(window->subwin);
+
+    switch (window->type) {
+    case WIN_CONSOLE:
+        if (window->wins.cons.subwin) {
+            delwin(window->wins.cons.subwin);
+        }
+        break;
+    case WIN_MUC:
+        if (window->wins.muc.subwin) {
+            delwin(window->wins.muc.subwin);
+        }
+        break;
+    default:
+        break;
     }
+
     free(window->chat_resource);
     free(window->from);
     form_destroy(window->form);
@@ -163,18 +207,30 @@ win_update_virtual(ProfWin *window)
 {
     int rows, cols;
     getmaxyx(stdscr, rows, cols);
+    int subwin_cols = 0;
 
-    if (window->subwin) {
-        int subwin_cols = 0;
-        if (window->type == WIN_MUC) {
-            subwin_cols = win_occpuants_cols();
-        } else if (window->type == WIN_CONSOLE) {
+    switch (window->type) {
+    case WIN_CONSOLE:
+        if (window->wins.cons.subwin) {
             subwin_cols = win_roster_cols();
+            pnoutrefresh(window->win, window->y_pos, 0, 1, 0, rows-3, (cols-subwin_cols)-1);
+            pnoutrefresh(window->wins.cons.subwin, window->wins.cons.sub_y_pos, 0, 1, (cols-subwin_cols), rows-3, cols-1);
+        } else {
+            pnoutrefresh(window->win, window->y_pos, 0, 1, 0, rows-3, cols-1);
         }
-        pnoutrefresh(window->win, window->y_pos, 0, 1, 0, rows-3, (cols-subwin_cols)-1);
-        pnoutrefresh(window->subwin, window->sub_y_pos, 0, 1, (cols-subwin_cols), rows-3, cols-1);
-    } else {
+        break;
+    case WIN_MUC:
+        if (window->wins.muc.subwin) {
+            subwin_cols = win_occpuants_cols();
+            pnoutrefresh(window->win, window->y_pos, 0, 1, 0, rows-3, (cols-subwin_cols)-1);
+            pnoutrefresh(window->wins.muc.subwin, window->wins.muc.sub_y_pos, 0, 1, (cols-subwin_cols), rows-3, cols-1);
+        } else {
+            pnoutrefresh(window->win, window->y_pos, 0, 1, 0, rows-3, cols-1);
+        }
+        break;
+    default:
         pnoutrefresh(window->win, window->y_pos, 0, 1, 0, rows-3, cols-1);
+        break;
     }
 }
 
diff --git a/src/ui/window.h b/src/ui/window.h
index ecf3a771..3c74b8da 100644
--- a/src/ui/window.h
+++ b/src/ui/window.h
@@ -57,7 +57,6 @@
 #define PAD_SIZE 1000
 
 typedef enum {
-    WIN_UNUSED,
     WIN_CONSOLE,
     WIN_CHAT,
     WIN_MUC,
@@ -67,20 +66,50 @@ typedef enum {
 } win_type_t;
 
 typedef struct prof_win_t {
-    char *from;
-    char *chat_resource;
+
+    win_type_t type;
+
     WINDOW *win;
-    WINDOW *subwin;
     ProfBuff buffer;
-    win_type_t type;
-    gboolean is_otr;
-    gboolean is_trusted;
+    char *from;
+    char *chat_resource;
     int y_pos;
-    int sub_y_pos;
     int paged;
+    gboolean is_otr;
+    gboolean is_trusted;
     int unread;
     int history_shown;
     DataForm *form;
+
+    union {
+        // WIN_CONSOLE
+        struct {
+            WINDOW *subwin;
+            int sub_y_pos;
+        } cons;
+
+        // WIN_CHAT
+        struct {
+        } chat;
+
+        // WIN_MUC
+        struct {
+            WINDOW *subwin;
+            int sub_y_pos;
+        } muc;
+
+        // WIN_MUC_CONFIG
+        struct {
+        } conf;
+
+        // WIN_PRIVATE
+        struct {
+        } priv;
+
+        // WIN_XML
+        struct {
+        } xml;
+    } wins;
 } ProfWin;
 
 ProfWin* win_create(const char * const title, win_type_t type);
diff --git a/src/ui/windows.c b/src/ui/windows.c
index b0d3cfa0..020745f7 100644
--- a/src/ui/windows.c
+++ b/src/ui/windows.c
@@ -291,22 +291,34 @@ wins_resize_all(void)
     GList *curr = values;
     while (curr != NULL) {
         ProfWin *window = curr->data;
-        if (((window->type == WIN_MUC) || (window->type == WIN_CONSOLE)) && (window->subwin)) {
-            int subwin_cols = 0;
-            if (window->type == WIN_MUC) {
-                subwin_cols = win_occpuants_cols();
-                wresize(window->win, PAD_SIZE, cols - subwin_cols);
-                wresize(window->subwin, PAD_SIZE, subwin_cols);
-                ui_muc_roster(window->from);
-            } else if (window->type == WIN_CONSOLE) {
+        int subwin_cols = 0;
+
+        switch (window->type) {
+        case WIN_CONSOLE:
+            if (window->wins.cons.subwin) {
                 subwin_cols = win_roster_cols();
                 wresize(window->win, PAD_SIZE, cols - subwin_cols);
-                wresize(window->subwin, PAD_SIZE, subwin_cols);
+                wresize(window->wins.cons.subwin, PAD_SIZE, subwin_cols);
                 ui_roster();
+            } else {
+                wresize(window->win, PAD_SIZE, cols);
             }
-        } else {
+            break;
+        case WIN_MUC:
+            if (window->wins.muc.subwin) {
+                subwin_cols = win_occpuants_cols();
+                wresize(window->win, PAD_SIZE, cols - subwin_cols);
+                wresize(window->wins.muc.subwin, PAD_SIZE, subwin_cols);
+                ui_muc_roster(window->from);
+            } else {
+                wresize(window->win, PAD_SIZE, cols);
+            }
+            break;
+        default:
             wresize(window->win, PAD_SIZE, cols);
+            break;
         }
+
         win_redraw(window);
         curr = g_list_next(curr);
     }
@@ -342,12 +354,12 @@ wins_show_subwin(ProfWin *window)
     ProfWin *current_win = wins_get_current();
     if (current_win->type == WIN_MUC) {
         subwin_cols = win_occpuants_cols();
+        pnoutrefresh(current_win->win, current_win->y_pos, 0, 1, 0, rows-3, (cols-subwin_cols)-1);
+        pnoutrefresh(current_win->wins.muc.subwin, current_win->wins.muc.sub_y_pos, 0, 1, (cols-subwin_cols), rows-3, cols-1);
     } else if (current_win->type == WIN_CONSOLE) {
         subwin_cols = win_roster_cols();
-    }
-    if ((current_win->type == WIN_MUC) || (current_win->type == WIN_CONSOLE)) {
         pnoutrefresh(current_win->win, current_win->y_pos, 0, 1, 0, rows-3, (cols-subwin_cols)-1);
-        pnoutrefresh(current_win->subwin, current_win->sub_y_pos, 0, 1, (cols-subwin_cols), rows-3, cols-1);
+        pnoutrefresh(current_win->wins.cons.subwin, current_win->wins.cons.sub_y_pos, 0, 1, (cols-subwin_cols), rows-3, cols-1);
     }
 }