/* timer.c - graphical display of stdin
 * build: cc -o timer timer.c -lSDL2 -lSDL2_ttf
 * run: ./disp width
 */

#include <err.h>
#include <stdlib.h>

#include <SDL2/SDL.h>
#include <SDL2/SDL_ttf.h>

void sdlfatal(const char *m) {
	errx(2, "%s: %s", m, SDL_GetError());
}

void ttffatal(const char *m) {
	errx(3, "%s: %s", m, TTF_GetError());
}

SDL_HitTestResult dodrag(SDL_Window* w, const SDL_Point* p, void *d) {
	return SDL_HITTEST_DRAGGABLE;
}

void drawtext(SDL_Renderer* rr, int x, int y, char *text, TTF_Font *font, int
dored) {
	SDL_Color white = { 255, 255, 255, 0 };
	SDL_Color red = { 255, 0, 0, 0 };
	SDL_Rect tr;
	SDL_Surface* surface = TTF_RenderText_Solid(font, text, dored ? red :
white);
	SDL_Texture* texture = SDL_CreateTextureFromSurface(rr, surface);

	tr.x = x;
	tr.y = y;
	tr.w = surface->w;
	tr.h = surface->h;

	SDL_FreeSurface(surface);

	SDL_RenderCopy(rr, texture, NULL, &tr);
	SDL_DestroyTexture(texture);
}

int isquit(SDL_Event *event) {
	return event->type == SDL_QUIT ||
	       (event->type == SDL_MOUSEBUTTONDOWN &&
	        event->button.button == SDL_BUTTON_RIGHT);
}

int main(int argc, char *argv[]) {
	int ww = atoi(argv[1]);
	int wh = atoi(argv[2]);
	int qd = argc > 3 ? !strcmp(argv[3], "-q") : 0;

	SDL_Event event;

	if (SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO))
		sdlfatal("SDL_Init");
	if (TTF_Init())
		ttffatal("TTF_Init");
	atexit(SDL_Quit);

	TTF_Font* font = TTF_OpenFont(
	    "/usr/share/fonts/truetype/freefont/FreeMono.ttf", wh - 16);
	if (!font)
		ttffatal("TTF_OpenFont");

	SDL_Window* window = NULL;
	SDL_Renderer* renderer = NULL;

	if (SDL_CreateWindowAndRenderer(ww, wh, SDL_WINDOW_BORDERLESS, &window, &renderer))
		sdlfatal("SDL_CreateWindowAndRenderer");

	SDL_SetWindowHitTest(window, dodrag, NULL);

	char tbuf[512];

	fgets(tbuf, sizeof(tbuf), stdin);
	if (strchr(tbuf, '\n'))
		*strchr(tbuf, '\n') = 0;

	while (!feof(stdin) && !ferror(stdin)) {
		SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
		SDL_RenderClear(renderer);
		drawtext(renderer, 8, 8, tbuf, font, 0);
		SDL_RenderPresent(renderer);
		SDL_PollEvent(&event);
		if (isquit(&event))
			exit(0);
		fgets(tbuf, sizeof(tbuf), stdin);
		if (strchr(tbuf, '\n'))
			*strchr(tbuf, '\n') = 0;
	}

	SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
	SDL_RenderClear(renderer);
	drawtext(renderer, 8, 8, tbuf, font, 1);
	SDL_RenderPresent(renderer);

	if (!qd)
		exit(0);

	while (SDL_WaitEvent(&event)) {
		if (isquit(&event))
			exit(0);
	}

	return 0;
}
