ncurses template

This commit is contained in:
2025-11-26 17:57:34 +02:00
parent 2cd9455f7e
commit c524ece546
5 changed files with 225 additions and 14 deletions
+75 -12
View File
@@ -1,23 +1,86 @@
#include "main.h"
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <termios.h>
#include <unistd.h>
/* TODO: перед загрузкой файла спрашивать права доступа
TODO: сделать при интерфес выбора по пунктам меню */
#include "ui/app.h"
#include <ncurses.h>
void event_loop(app_t *app);
int main(int argc, char **argv) {
app_t *app;
app = calloc(1, sizeof(app_t));
init_nc();
app = init_app();
wrefresh(app->menu_win);
wrefresh(app->action_win);
event_loop(app);
destroy_app(app);
endwin();
int main(int argc, char *argv[]) {
params_t params;
init_params(&params);
analyze_args(argc, argv, &params);
get_missing_params(&params);
int sd = init_client();
connect_to_server(sd, &params);
query_loop(sd, &params);
clear_params(&params);
return 0;
}
}
void event_loop(app_t *app) {
int c;
for (;;) {
c = wgetch(app->win);
switch (c) {
// 113 is q key. This exits the program
case 113:
return;
case KEY_F(9):
return;
case 'e':
// ac_edit(app);
break;
// 27 is ESC key. Usage of ESC is not recommended, but for now this clears
// the menus
case 27:
// app->menu_bar->selected_menu = -1;
break;
// 9 or \t is horizontal tab
case 9:
// if (app->active == N_MENU) {
// app->active = N_ACTION;
// } else {
// app->active = N_MENU;
// }
break;
default:
break;
}
draw_borders(app);
wnoutrefresh(app->win);
wnoutrefresh(app->menu_win);
wnoutrefresh(app->action_win);
doupdate();
};
}
// int main(int argc, char *argv[]) {
// params_t params;
// init_params(&params);
// analyze_args(argc, argv, &params);
// get_missing_params(&params);
// int sd = init_client();
// connect_to_server(sd, &params);
// query_loop(sd, &params);
// clear_params(&params);
// return 0;
// }
+109
View File
@@ -0,0 +1,109 @@
#include "app.h"
// #include "action.h"
#include <stdlib.h>
void ac_file(WINDOW *win, int is_action_w);
app_t *init_app() {
// get values from terminal size
int y_max, x_max;
getmaxyx(stdscr, y_max, x_max);
// allocate app struct memory
app_t *_app = calloc(1, sizeof(app_t));
// associate values for screen size
_app->cur_y = y_max;
_app->cur_x = x_max;
_app->win = newwin(_app->cur_y, _app->cur_x, 0, 0);
// define the width for each sub window
int menu_w_x = x_max / 6;
int action_w_x = x_max - menu_w_x - 2;
// create the menu window
_app->menu_win = newwin(y_max - 4, menu_w_x, 2, 1);
// create the action window
_app->action_win = newwin(y_max - 4, action_w_x, 2, menu_w_x + 1);
// dialogue
_app->modal.win = NULL;
// print decorative bars
print_bars(_app);
// here goes box borders
draw_borders(_app);
// init menus
// _app->menus = malloc(3 * sizeof(menu_t));
// _app->menus[0] = init_menu("(F)ile", 'f');
// _app->menus[1] = init_menu("(E)dit", 'e');
// _app->menus[2] = init_menu("(A)bout", 'a');
// set active window by default
// _app->active = N_MENU;
// call the action window content by default
// ac_file(_app->action_win, _app->active);
// refresh the windows
wnoutrefresh(_app->win);
wnoutrefresh(_app->menu_win);
wnoutrefresh(_app->action_win);
doupdate();
return _app;
}
void init_nc() {
initscr();
noecho();
curs_set(0);
keypad(stdscr, TRUE);
if (!has_colors()) {
printf("Your terminal does not support color\n");
} else {
start_color();
init_pair(1, COLOR_RED, COLOR_BLACK);
init_pair(2, COLOR_GREEN, COLOR_BLACK);
}
}
void draw_borders(app_t *app) {
clear();
box(app->win, 0, 0);
// refresh the windows
wnoutrefresh(app->win);
wnoutrefresh(app->menu_win);
wnoutrefresh(app->action_win);
doupdate();
}
void print_bars(app_t *app) {
wattrset(app->win, A_REVERSE);
// print top and bottom bars
for (int i = 1; i < app->cur_x - 1; i++) {
mvwprintw(app->win, 1, i, " ");
mvwprintw(app->win, app->cur_y - 2, i, " ");
}
// add content to the top bar
mvwprintw(app->win, 1, 2, "example curses app | ");
mvwprintw(app->win, 1, 20, "size %d, %d", app->cur_x, app->cur_y);
// add content to the bottom bar
mvwprintw(app->win, app->cur_y - 2, 2, "F1 - Help | F9 - Quit");
wattroff(app->win, A_REVERSE);
}
void destroy_app(app_t *app) {
delwin(app->win);
free(app);
}
+32
View File
@@ -0,0 +1,32 @@
#ifndef N_APP_H
#define N_APP_H
#include <ncurses.h>
typedef enum {
none = 0,
login = 1,
} dialogue_e;
typedef struct {
WINDOW *win;
WINDOW *menu_win;
WINDOW *action_win;
struct {
dialogue_e active;
WINDOW *win;
} modal;
// menu_bar_t *menu_bar;
// menu_t *menus;
// active_win_e active;
int cur_y, cur_x;
} app_t;
app_t *init_app();
void init_nc();
void destroy_app(app_t *app);
void draw_borders(app_t *app);
void print_bars(app_t *app);
#endif // N_APP_H