summaryrefslogtreecommitdiff
path: root/src/chat.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/chat.c')
-rw-r--r--src/chat.c200
1 files changed, 184 insertions, 16 deletions
diff --git a/src/chat.c b/src/chat.c
index fac192e..b7ed4fa 100644
--- a/src/chat.c
+++ b/src/chat.c
@@ -25,32 +25,26 @@
#include "chat.h"
#include "application.h"
+#include "util.h"
static void
_chat_refresh(MESSENGER_Application *app)
{
- const struct GNUNET_CHAT_Account *account = GNUNET_CHAT_get_connected(
- app->chat.handle
- );
-
application_clear(app);
-
- if (!account)
- app->accounts.window = app->window;
- else if (app->chat.context)
- {
- if (app->chat.show_members)
- app->current.members.window = app->window;
- else
- app->current.messages.window = app->window;
- }
- else
- app->chats.window = app->window;
+ chat_update_layout(&(app->chat), app);
accounts_print(&(app->accounts), app);
chats_print(&(app->chats), app);
members_print(&(app->current.members));
messages_print(&(app->current.messages));
+
+ if (!app->ui.logo)
+ return;
+
+ werase(app->ui.logo);
+ wmove(app->ui.logo, 0, 0);
+
+ util_print_logo(app->ui.logo);
}
static bool
@@ -160,6 +154,180 @@ chat_stop(MESSENGER_Chat *chat)
}
void
+_chat_update_layout_accounts(struct MESSENGER_Application *app)
+{
+ int rows, cols;
+ getmaxyx(app->window, rows, cols);
+
+ if (rows >= UTIL_LOGO_ROWS + UI_ACCOUNTS_ROWS_MIN)
+ {
+ const int offset = UTIL_LOGO_ROWS + 1;
+
+ app->ui.logo = subwin(app->window, UTIL_LOGO_ROWS, cols, 0, 0);
+ app->ui.main = subwin(app->window, rows - offset, cols, offset, 0);
+
+ wmove(app->window, UTIL_LOGO_ROWS, 0);
+ whline(app->window, ACS_HLINE, cols);
+ }
+ else
+ app->ui.main = subwin(app->window, rows, cols, 0, 0);
+
+ app->accounts.window = app->ui.main;
+}
+
+void
+_chat_update_layout_chats(struct MESSENGER_Application *app)
+{
+ int rows, cols;
+ getmaxyx(app->window, rows, cols);
+
+ int min_rows = UI_CHATS_ROWS_MIN;
+ int offset_x = 0;
+ int offset_y = 0;
+
+ if (cols >= UI_ACCOUNTS_COLS_MIN + UI_CHATS_COLS_MIN)
+ {
+ offset_x = UI_ACCOUNTS_COLS_MIN + 1;
+
+ if (UI_ACCOUNTS_ROWS_MIN > min_rows) min_rows = UI_ACCOUNTS_ROWS_MIN;
+ }
+
+ if (rows >= UTIL_LOGO_ROWS + min_rows)
+ {
+ offset_y = UTIL_LOGO_ROWS + 1;
+
+ app->ui.logo = subwin(app->window, UTIL_LOGO_ROWS, cols, 0, 0);
+
+ wmove(app->window, UTIL_LOGO_ROWS, 0);
+ whline(app->window, ACS_HLINE, cols);
+ }
+
+ if (offset_x > 0)
+ {
+ app->ui.left = subwin(
+ app->window,
+ rows - offset_y,
+ UI_ACCOUNTS_COLS_MIN,
+ offset_y,
+ 0
+ );
+
+ wmove(app->window, offset_y > 0? offset_y : 0, UI_ACCOUNTS_COLS_MIN);
+ wvline(app->window, ACS_VLINE, rows - offset_y);
+
+ if (offset_y > 0)
+ {
+ wmove(app->window, offset_y - 1, UI_ACCOUNTS_COLS_MIN);
+ waddch(app->window, ACS_TTEE);
+ }
+ }
+
+ app->ui.main = subwin(
+ app->window,
+ rows - offset_y,
+ cols - offset_x,
+ offset_y,
+ offset_x
+ );
+
+ app->accounts.window = app->ui.left;
+ app->chats.window = app->ui.main;
+}
+
+void
+_chat_update_layout_messages(struct MESSENGER_Application *app)
+{
+ int rows, cols;
+ getmaxyx(app->window, rows, cols);
+
+ const int cols_min_left = (UTIL_LOGO_COLS > UI_CHATS_COLS_MIN?
+ UTIL_LOGO_COLS : UI_CHATS_COLS_MIN
+ );
+
+ int offset_x = 0;
+
+ if (cols >= cols_min_left + UI_MESSAGES_COLS_MIN)
+ offset_x = cols_min_left + 1;
+ else
+ goto skip_left_split;
+
+ if (rows >= UTIL_LOGO_ROWS + UI_CHATS_ROWS_MIN)
+ {
+ const int offset = UTIL_LOGO_ROWS + 1;
+
+ app->ui.logo = subwin(app->window, UTIL_LOGO_ROWS, cols_min_left, 0, 0);
+ app->ui.left = subwin(app->window, rows - offset, cols_min_left, offset, 0);
+
+ wmove(app->window, UTIL_LOGO_ROWS, 0);
+ whline(app->window, ACS_HLINE, cols_min_left);
+ }
+ else
+ app->ui.left = subwin(app->window, rows, cols_min_left, 0, 0);
+
+ int cut_x = 0;
+
+ if (cols >= cols_min_left + UI_MESSAGES_COLS_MIN + UI_MEMBERS_COLS_MIN)
+ {
+ cut_x = UI_MEMBERS_COLS_MIN + 1;
+
+ app->ui.right = subwin(
+ app->window,
+ rows,
+ UI_MEMBERS_COLS_MIN,
+ 0,
+ cols - UI_MEMBERS_COLS_MIN
+ );
+
+ wmove(app->window, 0, cols - cut_x);
+ wvline(app->window, ACS_VLINE, rows);
+ }
+
+ wmove(app->window, 0, cols_min_left);
+ wvline(app->window, ACS_VLINE, rows);
+
+skip_left_split:
+ app->ui.main = subwin(
+ app->window,
+ rows,
+ cols - offset_x - cut_x,
+ 0,
+ offset_x
+ );
+
+ app->chats.window = app->ui.left;
+
+ if (app->ui.right)
+ {
+ app->current.members.window = app->ui.right;
+ app->current.messages.window = app->ui.main;
+ return;
+ }
+
+ if (app->chat.show_members)
+ app->current.members.window = app->ui.main;
+ else
+ app->current.messages.window = app->ui.main;
+}
+
+void
+chat_update_layout(MESSENGER_Chat *chat,
+ struct MESSENGER_Application *app)
+{
+ const struct GNUNET_CHAT_Account *account = GNUNET_CHAT_get_connected(
+ chat->handle
+ );
+
+ application_refresh(app);
+
+ if (!account)
+ _chat_update_layout_accounts(app);
+ else if (app->chat.context)
+ _chat_update_layout_messages(app);
+ else
+ _chat_update_layout_chats(app);
+}
+
+void
chat_process_message(UNUSED MESSENGER_Chat *chat,
struct GNUNET_CHAT_Context *context,
const struct GNUNET_CHAT_Message *message)