From 9d1af57afca13c07e5f3612512513c72dcc32956 Mon Sep 17 00:00:00 2001 From: TheJackiMonster Date: Mon, 7 Mar 2022 12:43:22 +0100 Subject: Added initial accounts menu Signed-off-by: TheJackiMonster --- Makefile | 3 +- src/ui/accounts.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/ui/accounts.h | 18 ++++++++- 3 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 src/ui/accounts.c diff --git a/Makefile b/Makefile index 000c792..24f771d 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,8 @@ INSTALL_DIR ?= /usr/local/ BINARY = messenger-cli SOURCES = messenger_cli.c\ application.c\ - chat.c + chat.c\ + ui/accounts.c HEADERS = LIBRARIES = gnunetchat gnunetutil ncurses diff --git a/src/ui/accounts.c b/src/ui/accounts.c new file mode 100644 index 0000000..067e781 --- /dev/null +++ b/src/ui/accounts.c @@ -0,0 +1,118 @@ +/* + This file is part of GNUnet. + Copyright (C) 2022 GNUnet e.V. + + GNUnet is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, + or (at your option) any later version. + + GNUnet 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 + Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + SPDX-License-Identifier: AGPL3.0-or-later + */ +/* + * @author Tobias Frisch + * @file ui/accounts.c + */ + +#include "accounts.h" +#include "../application.h" + +int +_accounts_iterate(void *cls, + UNUSED const struct GNUNET_CHAT_Handle *handle, + struct GNUNET_CHAT_Account *account) +{ + UI_ACCOUNTS_Handle *accounts = cls; + + if (accounts->line_index++ == accounts->line_selected) + accounts->selected = account; + + return GNUNET_NO; +} + +void +accounts_event(UI_ACCOUNTS_Handle *accounts, + struct MESSENGER_Application *app, + int key) +{ + accounts->line_index = 0; + accounts->selected = NULL; + + int count = GNUNET_CHAT_iterate_accounts( + app->chat.handle, + &_accounts_iterate, + accounts + ); + + switch (key) + { + case KEY_UP: + { + accounts->line_selected--; + break; + } + case KEY_DOWN: + { + accounts->line_selected++; + break; + } + case KEY_ENTER: + { + if (accounts->selected) + GNUNET_CHAT_connect(app->chat.handle, accounts->selected); + + break; + } + default: + if (accounts->line_selected < 0) + accounts->line_selected = 0; + else if (accounts->line_selected >= count) + accounts->line_selected = count - 1; + break; + } +} + +int +_accounts_iterate_print(void *cls, + UNUSED const struct GNUNET_CHAT_Handle *handle, + struct GNUNET_CHAT_Account *account) +{ + UI_ACCOUNTS_Handle *accounts = cls; + + const int y = accounts->line_index - accounts->line_offset; + + if (accounts->line_index++ < accounts->line_offset) + return GNUNET_YES; + + const int height = getmaxy(accounts->window) - getbegy(accounts->window); + + if (y >= height) + return GNUNET_NO; + + const char *name = GNUNET_CHAT_account_get_name(account); + + move(y, 0); + wprintw(accounts->window, "%s", name); + return GNUNET_YES; +} + +void +accounts_print(UI_ACCOUNTS_Handle *accounts, + struct MESSENGER_Application *app) +{ + accounts->line_index = 0; + + GNUNET_CHAT_iterate_accounts( + app->chat.handle, + &_accounts_iterate_print, + accounts + ); +} diff --git a/src/ui/accounts.h b/src/ui/accounts.h index 1373502..63b0af2 100644 --- a/src/ui/accounts.h +++ b/src/ui/accounts.h @@ -28,11 +28,27 @@ #include #include -struct UI_ACCOUNTS_Handle +struct MESSENGER_Application; +struct GNUNET_CHAT_Account; + +typedef struct UI_ACCOUNTS_Handle { WINDOW *window; + + int line_index; + int line_offset; + int line_selected; + + struct GNUNET_CHAT_Account *selected; } UI_ACCOUNTS_Handle; +void +accounts_event(UI_ACCOUNTS_Handle *accounts, + struct MESSENGER_Application *app, + int key); +void +accounts_print(UI_ACCOUNTS_Handle *accounts, + struct MESSENGER_Application *app); #endif /* UI_ACCOUNTS_H_ */ -- cgit v1.2.3