Refactor subwin sizing and disabled wrapping

This commit is contained in:
James Booth
2014-11-10 22:47:53 +00:00
parent 04bacdcf38
commit 5d59d17642
5 changed files with 94 additions and 39 deletions

View File

@@ -2813,7 +2813,7 @@ _ui_roster(void)
if (contacts) { if (contacts) {
werase(window->subwin); werase(window->subwin);
wattron(window->subwin, COLOUR_ROOMINFO); wattron(window->subwin, COLOUR_ROOMINFO);
wprintw(window->subwin, " -Roster\n"); win_printline_nowrap(window->subwin, " -Roster");
wattroff(window->subwin, COLOUR_ROOMINFO); wattroff(window->subwin, COLOUR_ROOMINFO);
GSList *curr_contact = contacts; GSList *curr_contact = contacts;
while (curr_contact) { while (curr_contact) {
@@ -2824,7 +2824,12 @@ _ui_roster(void)
int presence_colour = win_presence_colour(presence); int presence_colour = win_presence_colour(presence);
wattron(window->subwin, presence_colour); wattron(window->subwin, presence_colour);
wprintw(window->subwin, " %s\n", name);
GString *msg = g_string_new(" ");
g_string_append(msg, name);
win_printline_nowrap(window->subwin, msg->str);
g_string_free(msg, TRUE);
wattroff(window->subwin, presence_colour); wattroff(window->subwin, presence_colour);
GList *resources = p_contact_get_available_resources(contact); GList *resources = p_contact_get_available_resources(contact);
@@ -2844,8 +2849,14 @@ _ui_roster(void)
const char *resource_presence = string_from_resource_presence(resource->presence); const char *resource_presence = string_from_resource_presence(resource->presence);
int resource_presence_colour = win_presence_colour(resource_presence); int resource_presence_colour = win_presence_colour(resource_presence);
wattron(window->subwin, resource_presence_colour); wattron(window->subwin, resource_presence_colour);
wprintw(window->subwin, " %s\n", resource->name);
GString *msg = g_string_new(" ");
g_string_append(msg, resource->name);
win_printline_nowrap(window->subwin, msg->str);
g_string_free(msg, TRUE);
wattroff(window->subwin, resource_presence_colour); wattroff(window->subwin, resource_presence_colour);
ordered_resources = g_list_next(ordered_resources); ordered_resources = g_list_next(ordered_resources);
} }
g_list_free(ordered_resources); g_list_free(ordered_resources);
@@ -2868,72 +2879,84 @@ _ui_muc_roster(const char * const room)
if (prefs_get_boolean(PREF_MUC_PRIVILEGES)) { if (prefs_get_boolean(PREF_MUC_PRIVILEGES)) {
wattron(window->subwin, COLOUR_ROOMINFO); wattron(window->subwin, COLOUR_ROOMINFO);
wprintw(window->subwin, " -Moderators\n"); win_printline_nowrap(window->subwin, " -Moderators");
wattroff(window->subwin, COLOUR_ROOMINFO); wattroff(window->subwin, COLOUR_ROOMINFO);
GList *roster_curr = occupants; GList *roster_curr = occupants;
while (roster_curr) { while (roster_curr) {
Occupant *occupant = roster_curr->data; Occupant *occupant = roster_curr->data;
if (occupant->role == MUC_ROLE_MODERATOR) { if (occupant->role == MUC_ROLE_MODERATOR) {
wprintw(window->subwin, " ");
const char *presence_str = string_from_resource_presence(occupant->presence); const char *presence_str = string_from_resource_presence(occupant->presence);
int presence_colour = win_presence_colour(presence_str); int presence_colour = win_presence_colour(presence_str);
wattron(window->subwin, presence_colour); wattron(window->subwin, presence_colour);
wprintw(window->subwin, occupant->nick);
GString *msg = g_string_new(" ");
g_string_append(msg, occupant->nick);
win_printline_nowrap(window->subwin, msg->str);
g_string_free(msg, TRUE);
wattroff(window->subwin, presence_colour); wattroff(window->subwin, presence_colour);
wprintw(window->subwin, "\n");
} }
roster_curr = g_list_next(roster_curr); roster_curr = g_list_next(roster_curr);
} }
wattron(window->subwin, COLOUR_ROOMINFO); wattron(window->subwin, COLOUR_ROOMINFO);
wprintw(window->subwin, " -Participants\n"); win_printline_nowrap(window->subwin, " -Participants");
wattroff(window->subwin, COLOUR_ROOMINFO); wattroff(window->subwin, COLOUR_ROOMINFO);
roster_curr = occupants; roster_curr = occupants;
while (roster_curr) { while (roster_curr) {
Occupant *occupant = roster_curr->data; Occupant *occupant = roster_curr->data;
if (occupant->role == MUC_ROLE_PARTICIPANT) { if (occupant->role == MUC_ROLE_PARTICIPANT) {
wprintw(window->subwin, " ");
const char *presence_str = string_from_resource_presence(occupant->presence); const char *presence_str = string_from_resource_presence(occupant->presence);
int presence_colour = win_presence_colour(presence_str); int presence_colour = win_presence_colour(presence_str);
wattron(window->subwin, presence_colour); wattron(window->subwin, presence_colour);
wprintw(window->subwin, occupant->nick);
GString *msg = g_string_new(" ");
g_string_append(msg, occupant->nick);
win_printline_nowrap(window->subwin, msg->str);
g_string_free(msg, TRUE);
wattroff(window->subwin, presence_colour); wattroff(window->subwin, presence_colour);
wprintw(window->subwin, "\n");
} }
roster_curr = g_list_next(roster_curr); roster_curr = g_list_next(roster_curr);
} }
wattron(window->subwin, COLOUR_ROOMINFO); wattron(window->subwin, COLOUR_ROOMINFO);
wprintw(window->subwin, " -Visitors\n"); win_printline_nowrap(window->subwin, " -Visitors");
wattroff(window->subwin, COLOUR_ROOMINFO); wattroff(window->subwin, COLOUR_ROOMINFO);
roster_curr = occupants; roster_curr = occupants;
while (roster_curr) { while (roster_curr) {
Occupant *occupant = roster_curr->data; Occupant *occupant = roster_curr->data;
if (occupant->role == MUC_ROLE_VISITOR) { if (occupant->role == MUC_ROLE_VISITOR) {
wprintw(window->subwin, " ");
const char *presence_str = string_from_resource_presence(occupant->presence); const char *presence_str = string_from_resource_presence(occupant->presence);
int presence_colour = win_presence_colour(presence_str); int presence_colour = win_presence_colour(presence_str);
wattron(window->subwin, presence_colour); wattron(window->subwin, presence_colour);
wprintw(window->subwin, occupant->nick);
GString *msg = g_string_new(" ");
g_string_append(msg, occupant->nick);
win_printline_nowrap(window->subwin, msg->str);
g_string_free(msg, TRUE);
wattroff(window->subwin, presence_colour); wattroff(window->subwin, presence_colour);
wprintw(window->subwin, "\n");
} }
roster_curr = g_list_next(roster_curr); roster_curr = g_list_next(roster_curr);
} }
} else { } else {
wattron(window->subwin, COLOUR_ROOMINFO); wattron(window->subwin, COLOUR_ROOMINFO);
wprintw(window->subwin, " -Occupants\n"); win_printline_nowrap(window->subwin, " -Occupants\n");
wattroff(window->subwin, COLOUR_ROOMINFO); wattroff(window->subwin, COLOUR_ROOMINFO);
GList *roster_curr = occupants; GList *roster_curr = occupants;
while (roster_curr) { while (roster_curr) {
Occupant *occupant = roster_curr->data; Occupant *occupant = roster_curr->data;
wprintw(window->subwin, " ");
const char *presence_str = string_from_resource_presence(occupant->presence); const char *presence_str = string_from_resource_presence(occupant->presence);
int presence_colour = win_presence_colour(presence_str); int presence_colour = win_presence_colour(presence_str);
wattron(window->subwin, presence_colour); wattron(window->subwin, presence_colour);
wprintw(window->subwin, occupant->nick);
GString *msg = g_string_new(" ");
g_string_append(msg, occupant->nick);
win_printline_nowrap(window->subwin, msg->str);
g_string_free(msg, TRUE);
wattroff(window->subwin, presence_colour); wattroff(window->subwin, presence_colour);
wprintw(window->subwin, "\n");
roster_curr = g_list_next(roster_curr); roster_curr = g_list_next(roster_curr);
} }
} }

View File

@@ -52,8 +52,6 @@
#include "xmpp/xmpp.h" #include "xmpp/xmpp.h"
#define INP_WIN_MAX 1000 #define INP_WIN_MAX 1000
#define SUB_WIN_RATIO 5
#define SUB_WIN_WIDTH 100
void ui_init_module(void); void ui_init_module(void);
void console_init_module(void); void console_init_module(void);

View File

@@ -51,22 +51,32 @@
#include "ui/window.h" #include "ui/window.h"
#include "xmpp/xmpp.h" #include "xmpp/xmpp.h"
static int sub_win_ratio = 3; // size = (cols / 10) * SUB_WIN_RATIO
static void _win_print(ProfWin *window, const char show_char, const char * const date_fmt, static void _win_print(ProfWin *window, const char show_char, const char * const date_fmt,
int flags, int attrs, const char * const from, const char * const message); int flags, int attrs, const char * const from, const char * const message);
static void _win_print_wrapped(WINDOW *win, const char * const message); static void _win_print_wrapped(WINDOW *win, const char * const message);
int
win_main_width(void)
{
int cols = getmaxx(stdscr);
return (cols/(10/sub_win_ratio)) * ((10/sub_win_ratio)-1);
}
ProfWin* ProfWin*
win_create(const char * const title, int cols, win_type_t type) win_create(const char * const title, win_type_t type)
{ {
ProfWin *new_win = malloc(sizeof(struct prof_win_t)); ProfWin *new_win = malloc(sizeof(struct prof_win_t));
new_win->from = strdup(title); new_win->from = strdup(title);
int cols = getmaxx(stdscr);
if ((type == WIN_MUC && prefs_get_boolean(PREF_OCCUPANTS)) || (type == WIN_CONSOLE)) { if ((type == WIN_MUC && prefs_get_boolean(PREF_OCCUPANTS)) || (type == WIN_CONSOLE)) {
new_win->win = newpad(PAD_SIZE, (cols/SUB_WIN_RATIO) * (SUB_WIN_RATIO-1)); int main_cols = win_main_width();
new_win->win = newpad(PAD_SIZE, main_cols);
wbkgd(new_win->win, COLOUR_TEXT); wbkgd(new_win->win, COLOUR_TEXT);
new_win->subwin = newpad(PAD_SIZE, SUB_WIN_WIDTH); new_win->subwin = newpad(PAD_SIZE, cols - main_cols);
wbkgd(new_win->subwin, COLOUR_TEXT); wbkgd(new_win->subwin, COLOUR_TEXT);
} else { } else {
new_win->win = newpad(PAD_SIZE, (cols)); new_win->win = newpad(PAD_SIZE, (cols));
@@ -108,11 +118,13 @@ void
win_show_subwin(ProfWin *window) win_show_subwin(ProfWin *window)
{ {
if (!window->subwin) { if (!window->subwin) {
window->subwin = newpad(PAD_SIZE, SUB_WIN_WIDTH); int cols = getmaxx(stdscr);
int main_cols = win_main_width();
window->subwin = newpad(PAD_SIZE, cols - main_cols);
wbkgd(window->subwin, COLOUR_TEXT); wbkgd(window->subwin, COLOUR_TEXT);
int cols = getmaxx(stdscr); wresize(window->win, PAD_SIZE, main_cols);
wresize(window->win, PAD_SIZE, (cols/SUB_WIN_RATIO) * (SUB_WIN_RATIO-1));
win_redraw(window); win_redraw(window);
} }
} }
@@ -135,10 +147,11 @@ win_update_virtual(ProfWin *window)
{ {
int rows, cols; int rows, cols;
getmaxyx(stdscr, rows, cols); getmaxyx(stdscr, rows, cols);
int main_cols = win_main_width();
if (((window->type == WIN_MUC) || (window->type == WIN_CONSOLE)) && (window->subwin)) { if (((window->type == WIN_MUC) || (window->type == WIN_CONSOLE)) && (window->subwin)) {
pnoutrefresh(window->win, window->y_pos, 0, 1, 0, rows-3, ((cols/SUB_WIN_RATIO) * (SUB_WIN_RATIO-1)) -1); pnoutrefresh(window->win, window->y_pos, 0, 1, 0, rows-3, main_cols-1);
pnoutrefresh(window->subwin, window->sub_y_pos, 0, 1, (cols/SUB_WIN_RATIO) * (SUB_WIN_RATIO-1), rows-3, cols-1); pnoutrefresh(window->subwin, window->sub_y_pos, 0, 1, main_cols, rows-3, cols-1);
} else { } 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-1);
} }
@@ -661,3 +674,16 @@ win_redraw(ProfWin *window)
_win_print(window, e->show_char, e->date_fmt, e->flags, e->attrs, e->from, e->message); _win_print(window, e->show_char, e->date_fmt, e->flags, e->attrs, e->from, e->message);
} }
} }
void
win_printline_nowrap(WINDOW *win, char *msg)
{
int maxx = getmaxx(win);
int cury = getcury(win);
int i = 0;
for (i = 0; i<strlen(msg) && i<maxx; i++) {
waddch(win, msg[i]);
}
wmove(win, cury+1, 0);
}

View File

@@ -82,7 +82,7 @@ typedef struct prof_win_t {
DataForm *form; DataForm *form;
} ProfWin; } ProfWin;
ProfWin* win_create(const char * const title, int cols, win_type_t type); ProfWin* win_create(const char * const title, win_type_t type);
void win_free(ProfWin *window); void win_free(ProfWin *window);
void win_update_virtual(ProfWin *window); void win_update_virtual(ProfWin *window);
void win_move_to_end(ProfWin *window); void win_move_to_end(ProfWin *window);
@@ -104,5 +104,7 @@ void win_save_newline(ProfWin *window);
void win_redraw(ProfWin *window); void win_redraw(ProfWin *window);
void win_hide_subwin(ProfWin *window); void win_hide_subwin(ProfWin *window);
void win_show_subwin(ProfWin *window); void win_show_subwin(ProfWin *window);
int win_main_width(void);
void win_printline_nowrap(WINDOW *win, char *msg);
#endif #endif

View File

@@ -65,8 +65,7 @@ wins_init(void)
(GDestroyNotify)win_free); (GDestroyNotify)win_free);
max_cols = getmaxx(stdscr); max_cols = getmaxx(stdscr);
int cols = getmaxx(stdscr); ProfWin *console = win_create(CONS_WIN_TITLE, WIN_CONSOLE);
ProfWin *console = win_create(CONS_WIN_TITLE, cols, WIN_CONSOLE);
g_hash_table_insert(windows, GINT_TO_POINTER(1), console); g_hash_table_insert(windows, GINT_TO_POINTER(1), console);
current = 1; current = 1;
@@ -261,8 +260,7 @@ wins_new(const char * const from, win_type_t type)
{ {
GList *keys = g_hash_table_get_keys(windows); GList *keys = g_hash_table_get_keys(windows);
int result = get_next_available_win_num(keys); int result = get_next_available_win_num(keys);
int cols = getmaxx(stdscr); ProfWin *new = win_create(from, type);
ProfWin *new = win_create(from, cols, type);
g_hash_table_insert(windows, GINT_TO_POINTER(result), new); g_hash_table_insert(windows, GINT_TO_POINTER(result), new);
g_list_free(keys); g_list_free(keys);
return new; return new;
@@ -289,13 +287,20 @@ wins_resize_all(void)
{ {
int rows, cols; int rows, cols;
getmaxyx(stdscr, rows, cols); getmaxyx(stdscr, rows, cols);
int main_cols = win_main_width();
GList *values = g_hash_table_get_values(windows); GList *values = g_hash_table_get_values(windows);
GList *curr = values; GList *curr = values;
while (curr != NULL) { while (curr != NULL) {
ProfWin *window = curr->data; ProfWin *window = curr->data;
if (((window->type == WIN_MUC) || (window->type == WIN_CONSOLE)) && (window->subwin)) { if (((window->type == WIN_MUC) || (window->type == WIN_CONSOLE)) && (window->subwin)) {
wresize(window->win, PAD_SIZE, (cols/SUB_WIN_RATIO) * (SUB_WIN_RATIO-1)); wresize(window->win, PAD_SIZE, main_cols);
wresize(window->subwin, PAD_SIZE, cols - main_cols);
if (window->type == WIN_MUC) {
ui_muc_roster(window->from);
} else if (window->type == WIN_CONSOLE) {
ui_roster();
}
} else { } else {
wresize(window->win, PAD_SIZE, cols); wresize(window->win, PAD_SIZE, cols);
} }
@@ -306,8 +311,8 @@ wins_resize_all(void)
ProfWin *current_win = wins_get_current(); ProfWin *current_win = wins_get_current();
if (((current_win->type == WIN_MUC) || (current_win->type == WIN_CONSOLE)) && (current_win->subwin)) { if (((current_win->type == WIN_MUC) || (current_win->type == WIN_CONSOLE)) && (current_win->subwin)) {
pnoutrefresh(current_win->win, current_win->y_pos, 0, 1, 0, rows-3, ((cols/SUB_WIN_RATIO) * (SUB_WIN_RATIO-1)) -1); pnoutrefresh(current_win->win, current_win->y_pos, 0, 1, 0, rows-3, main_cols-1);
pnoutrefresh(current_win->subwin, current_win->sub_y_pos, 0, 1, (cols/SUB_WIN_RATIO) * (SUB_WIN_RATIO-1), rows-3, cols-1); pnoutrefresh(current_win->subwin, current_win->sub_y_pos, 0, 1, main_cols, rows-3, cols-1);
} else { } else {
pnoutrefresh(current_win->win, current_win->y_pos, 0, 1, 0, rows-3, cols-1); pnoutrefresh(current_win->win, current_win->y_pos, 0, 1, 0, rows-3, cols-1);
} }
@@ -332,13 +337,14 @@ wins_show_subwin(ProfWin *window)
{ {
int rows, cols; int rows, cols;
getmaxyx(stdscr, rows, cols); getmaxyx(stdscr, rows, cols);
int main_cols = win_main_width();
win_show_subwin(window); win_show_subwin(window);
ProfWin *current_win = wins_get_current(); ProfWin *current_win = wins_get_current();
if ((current_win->type == WIN_MUC) || (current_win->type == WIN_CONSOLE)) { 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/SUB_WIN_RATIO) * (SUB_WIN_RATIO-1)) -1); pnoutrefresh(current_win->win, current_win->y_pos, 0, 1, 0, rows-3, main_cols-1);
pnoutrefresh(current_win->subwin, current_win->sub_y_pos, 0, 1, (cols/SUB_WIN_RATIO) * (SUB_WIN_RATIO-1), rows-3, cols-1); pnoutrefresh(current_win->subwin, current_win->sub_y_pos, 0, 1, main_cols, rows-3, cols-1);
} }
} }