Compare commits

...

8 Commits

10 changed files with 154 additions and 72 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
bbs bbs
build/

View File

@@ -1,18 +1,37 @@
CC=gcc # SPDX-License-Identifier: MIT
CFLAGS=-std=c99 -pedantic -Wall -Wextra
LIBS=-lncursesw
EXECUTABLE=bbs
.PHONY: all # Makefile for Amber's BBS Interface
all: make # Buildsys by Gale Faraday
.PHONY: all clean run
.SUFFIXES:
.DEFAULT_GOAL := all
TARGET := $(shell basename $(CURDIR))
SOURCES := src/
BUILD := build/
OBJS := $(patsubst $(SOURCES)%.c,$(BUILD)%.o,$(wildcard $(SOURCES)*.c))
EXECUTABLE := $(TARGET)
make: CC := gcc
$(CC) $(CFLAGS) $(LIBS) bbs.c -o $(EXECUTABLE) LD := gcc
CFLAGS := -std=c99 -pedantic -Wall -Wextra -O2 -ggdb
LDFLAGS := $(CFLAGS) -lncursesw
.PHONY: execute all: $(EXECUTABLE)
execute:
run: $(EXECUTABLE)
./$(EXECUTABLE) ./$(EXECUTABLE)
.PHONY: run .IGNORE: clean
run: make execute clean:
@rm -rvf $(BUILD) $(EXECUTABLE)
$(EXECUTABLE): $(OBJS)
$(LD) $(LDFLAGS) -o $@ $^
$(OBJS): $(BUILD)%.o : $(SOURCES)%.c
-@mkdir -p $(BUILD)
$(CC) $(CFLAGS) -o $@ -c $<

View File

@@ -1,56 +1,23 @@
/* SPDX-License-Identifier: MIT */
#include <curses.h> #include <curses.h>
#include <string.h> #include <string.h>
#include <locale.h> #include <locale.h>
#include "globals.h"
#include "screens.h"
const unsigned int GETCH_TIMEOUT = 10; /* in ms */ const unsigned int GETCH_TIMEOUT = 10; /* in ms */
const unsigned int MAX_SCREENS = 2; /* size of screens array */
const char* LOCALE = "en_US.UTF-8"; /* enable unicode support, set to "ANSI_X3.4-1968" for ascii */ const char* LOCALE = "en_US.UTF-8"; /* enable unicode support, set to "ANSI_X3.4-1968" for ascii */
char errorMessage[60]; char error_message[MAX_ERROR_MESSAGE_SIZE];
enum Status {
STATUS_QUIT,
STATUS_WAITING,
STATUS_NEED_REFRESH
};
enum ActiveScreen {
HOME,
ERROR
};
struct Screen {
char name[20];
WINDOW *win;
void (*draw_screen)(struct Screen *, char *input); /* this is run about every 10ms */
};
static void draw_home(struct Screen *screen, char *input) {
static char* banner = ""
" _ _ _ \n"
" | | | | | | \n"
" __ _ _ __ ___ | |__ ___ _ __ ___ _ __ | | __ _ ___ ___ _ __ ___| |_ \n"
" / _` | '_ ` _ \\| '_ \\ / _ \\ '__/ __| '_ \\| |/ _` |/ __/ _ \\ | '_ \\ / _ \\ __|\n"
" | (_| | | | | | | |_) | __/ | \\__ \\ |_) | | (_| | (_| __/_| | | | __/ |_ \n"
" \\__,_|_| |_| |_|_.__/ \\___|_| |___/ .__/|_|\\__,_|\\___\\___(_)_| |_|\\___|\\__|\n"
" | | \n"
" |_| \n";
mvwprintw(screen->win, 1, 2, "Thank you for visiting:");
mvwprintw(screen->win, 2, 1, "%s", banner);
mvwprintw(screen->win, 10, 1, "Your current input is: %s", input);
}
static void draw_error(struct Screen *screen, __attribute__((unused)) char *input) {
mvwprintw(screen->win, 1, 2, "%s", errorMessage);
}
static void draw_screen (struct Screen *screen, char *input) { static void draw_screen (struct Screen *screen, char *input) {
screen->draw_screen(screen, input); screen->draw_screen(screen, input);
box(screen->win, 0, 0); box(screen->win, 0, 0);
// wattron(screen->win, A_STANDOUT); /* wattron(screen->win, A_STANDOUT); */
mvwprintw(screen->win, 0, 1, " %s ", screen->name); mvwprintw(screen->win, 0, 1, " %s ", screen->name);
// wattroff(screen->win, A_STANDOUT); /* wattroff(screen->win, A_STANDOUT); */
} }
int main() { int main() {
@@ -61,37 +28,25 @@ int main() {
timeout(GETCH_TIMEOUT); /* set timeout for getch() */ timeout(GETCH_TIMEOUT); /* set timeout for getch() */
setlocale(LC_CTYPE, LOCALE); /* set locale, UTF8 support is enabled here */ setlocale(LC_CTYPE, LOCALE); /* set locale, UTF8 support is enabled here */
unsigned int start_y = 0;
unsigned int start_x = 0;
unsigned int terminal_width; unsigned int terminal_width;
unsigned int terminal_height; unsigned int terminal_height;
unsigned int old_terminal_width = 0; unsigned int old_terminal_width = 0;
unsigned int old_terminal_height = 0; unsigned int old_terminal_height = 0;
struct Screen screens[MAX_SCREENS];
enum Status status = STATUS_NEED_REFRESH; /* refresh screens[active_screen].window on first loop */ enum Status status = STATUS_NEED_REFRESH; /* refresh screens[active_screen].window on first loop */
char input = ' '; char input = ' ';
strcpy(errorMessage, ""); strcpy(error_message, "");
getmaxyx(stdscr, terminal_height, terminal_width); getmaxyx(stdscr, terminal_height, terminal_width);
unsigned int screen_before_error = HOME; unsigned int screen_before_error = HOME;
enum ActiveScreen active_screen = HOME; enum ActiveScreen active_screen = HOME;
struct Screen home = {
"home", /* could be it's own init func within the screen's file. */
newwin(terminal_height, terminal_width, start_y, start_x), screens[HOME].win = newwin(terminal_height, terminal_width, 0, 0);
draw_home screens[ERROR].win = newwin(terminal_height, terminal_width, 0, 0);
};
screens[HOME] = home;
struct Screen error = {
"error",
newwin(terminal_height, terminal_width, start_y, start_x),
draw_error
};
screens[ERROR] = error;
/* main event loop */ /* main event loop */
while (status != STATUS_QUIT) { while (status != STATUS_QUIT) {
@@ -116,7 +71,7 @@ int main() {
if (terminal_width < 80 || terminal_height < 24) { if (terminal_width < 80 || terminal_height < 24) {
if (active_screen != ERROR) { if (active_screen != ERROR) {
strcpy(errorMessage, "This program expects at least 80 rows by 24 columns."); strcpy(error_message, "This program expects at least 80 rows by 24 columns.");
screen_before_error = active_screen; screen_before_error = active_screen;
}; };
active_screen = ERROR; active_screen = ERROR;
@@ -136,7 +91,7 @@ int main() {
}; };
/* clean up */ /* clean up */
delwin(screens[active_screen].win); delwin(screens[active_screen].win); /* TODO: delete all windows in screens[] */
nocbreak(); nocbreak();
endwin(); /* ends curses mode */ endwin(); /* ends curses mode */
curs_set(1); curs_set(1);

8
src/error.c Normal file
View File

@@ -0,0 +1,8 @@
/* SPDX-License-Identifier: MIT */
#include <curses.h>
#include "screens.h"
void draw_error(struct Screen *screen, __attribute__((unused)) char *input) {
mvwprintw(screen->win, 1, 2, "%s", error_message);
}

10
src/error.h Normal file
View File

@@ -0,0 +1,10 @@
/* SPDX-License-Identifier: MIT */
#ifndef ERROR_H /* header guard */
#define ERROR_H
#include "screens.h"
void draw_error(struct Screen *screen, char *input);
#endif

30
src/globals.h Normal file
View File

@@ -0,0 +1,30 @@
/* SPDX-License-Identifier: MIT */
#define MAX_SCREEN_NAME_SIZE 20 /* size of the screen name array */
#define MAX_ERROR_MESSAGE_SIZE 60 /* size of error_message array */
#ifndef GLOBALS_H /* header guard */
#define GLOBALS_H
#include <curses.h>
extern char error_message[];
struct Screen {
char name[MAX_SCREEN_NAME_SIZE];
WINDOW *win;
void (*draw_screen)(struct Screen *, char *input); /* GETCH_TIMEOUT determines how often this is run, in ms */
};
enum Status {
STATUS_QUIT,
STATUS_WAITING,
STATUS_NEED_REFRESH
};
enum ActiveScreen {
HOME,
ERROR
};
#endif

20
src/home.c Normal file
View File

@@ -0,0 +1,20 @@
/* SPDX-License-Identifier: MIT */
#include <curses.h>
#include "screens.h"
void draw_home(struct Screen *screen, char *input) {
static char* banner = ""
" _ _ _ \n"
" | | | | | | \n"
" __ _ _ __ ___ | |__ ___ _ __ ___ _ __ | | __ _ ___ ___ _ __ ___| |_ \n"
" / _` | '_ ` _ \\| '_ \\ / _ \\ '__/ __| '_ \\| |/ _` |/ __/ _ \\ | '_ \\ / _ \\ __|\n"
" | (_| | | | | | | |_) | __/ | \\__ \\ |_) | | (_| | (_| __/_| | | | __/ |_ \n"
" \\__,_|_| |_| |_|_.__/ \\___|_| |___/ .__/|_|\\__,_|\\___\\___(_)_| |_|\\___|\\__|\n"
" | | \n"
" |_| \n";
mvwprintw(screen->win, 1, 2, "Thank you for visiting:");
mvwprintw(screen->win, 2, 1, "%s", banner);
mvwprintw(screen->win, 10, 1, "Your current input is: %s", input);
}

10
src/home.h Normal file
View File

@@ -0,0 +1,10 @@
/* SPDX-License-Identifier: MIT */
#ifndef HOME_H /* header guard */
#define HOME_H
#include "screens.h"
void draw_home(struct Screen *screen, char *input);
#endif

19
src/screens.c Normal file
View File

@@ -0,0 +1,19 @@
/* SPDX-License-Identifier: MIT */
#include "globals.h"
#include "home.h"
#include "error.h"
/* NOTE: this should be compile time */
struct Screen screens[] = {
{
"home",
NULL,
draw_home
},
{
"error",
NULL,
draw_error
}
};

10
src/screens.h Normal file
View File

@@ -0,0 +1,10 @@
/* SPDX-License-Identifier: MIT */
#ifndef SCREENS_H /* header guard */
#define SCREENS_H
#include "globals.h"
extern struct Screen screens[];
#endif