just moved some code between files, behaviour unchanged
This commit is contained in:
parent
16310e7c17
commit
577e88551d
281
src/display.c
281
src/display.c
@ -6,6 +6,17 @@ int maxcols = INT_MAX;
|
|||||||
int colwidth = 10;
|
int colwidth = 10;
|
||||||
int in;
|
int in;
|
||||||
|
|
||||||
|
//UI
|
||||||
|
struct color bg = { 47, 53, 66};
|
||||||
|
struct color fg = {247, 248, 242};
|
||||||
|
struct color fade = {210, 210, 210};
|
||||||
|
struct color gold = {249, 255, 79};
|
||||||
|
struct color good = { 79, 255, 85};
|
||||||
|
struct color bad = {255, 79, 79};
|
||||||
|
int h, w;
|
||||||
|
bool compact = false;
|
||||||
|
bool dirty = false;
|
||||||
|
|
||||||
struct termios base;
|
struct termios base;
|
||||||
|
|
||||||
void setBGColor(struct color c)
|
void setBGColor(struct color c)
|
||||||
@ -135,3 +146,273 @@ void setMaxCols(int cols)
|
|||||||
{
|
{
|
||||||
maxcols = cols;
|
maxcols = cols;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void drawSegmentNames()
|
||||||
|
{
|
||||||
|
char *names[segCount];
|
||||||
|
for(int i = 0; i < segCount; i++) {
|
||||||
|
names[i] = segments[i].name;
|
||||||
|
}
|
||||||
|
drawColumn(names, segCount, 0, segCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: Fix up all this commented garbage
|
||||||
|
//Really the entire display system needs rethinking first but yea
|
||||||
|
void drawDeltaColumn(int column)
|
||||||
|
{
|
||||||
|
char *times[segCount];
|
||||||
|
for (int i = 0; i < segCount; i++) {
|
||||||
|
times[i] = calloc(1, COLSTRLEN);
|
||||||
|
int time = 0;
|
||||||
|
if (i == currSeg)
|
||||||
|
time = currentMS - pbrun[i].ms;
|
||||||
|
else if (i < currSeg)
|
||||||
|
time = segments[i].ms - pbrun[i].ms;
|
||||||
|
ftime(times[i], time, 1, true);
|
||||||
|
struct color col = {0};
|
||||||
|
if (time <= 0)
|
||||||
|
col = good;
|
||||||
|
else
|
||||||
|
col = bad;
|
||||||
|
if (i < currSeg)
|
||||||
|
drawCell(times[i], column, i + 6, col);
|
||||||
|
if (i == currSeg && time >= -5000)
|
||||||
|
drawCell(times[i], column, i + 6, col);
|
||||||
|
}
|
||||||
|
//drawColumn(times, segCount, column, currSeg);
|
||||||
|
//Use drawCell because we're doing colors.
|
||||||
|
//for (int i = 0; i < segCount; i++) {
|
||||||
|
// if (i <= currSeg)
|
||||||
|
// drawCell(times[i], column, i + 6, good);
|
||||||
|
//}
|
||||||
|
setFGColor(fg);
|
||||||
|
for (int i = 0; i < segCount; i++) {
|
||||||
|
free(times[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: try to clean the branching up
|
||||||
|
void drawTimeColumn(int timeoption, int column)
|
||||||
|
{
|
||||||
|
char *times[segCount];
|
||||||
|
int drawEnd = currSeg;
|
||||||
|
for (int i = 0; i < segCount; i++) {
|
||||||
|
times[i] = calloc(1, COLSTRLEN);
|
||||||
|
int time = 0;
|
||||||
|
switch (timeoption) {
|
||||||
|
case 0:
|
||||||
|
time = pbrun[i].ms;
|
||||||
|
drawEnd = segCount;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (i > 0 && i < currSeg)
|
||||||
|
time = segments[i].ms - segments[i - 1].ms;
|
||||||
|
else if (i > 0 && i == currSeg)
|
||||||
|
time = currentMS - segments[i - 1].ms;
|
||||||
|
else if (i == 0 && i == currSeg)
|
||||||
|
time = currentMS;
|
||||||
|
else
|
||||||
|
time = segments[i].ms;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (i == currSeg)
|
||||||
|
time = currentMS;
|
||||||
|
else
|
||||||
|
time = segments[i].ms;
|
||||||
|
}
|
||||||
|
ftime(times[i], time, 1, false);
|
||||||
|
}
|
||||||
|
drawColumn(times, segCount, column, drawEnd);
|
||||||
|
for (int i = 0; i < segCount; i++) {
|
||||||
|
free(times[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawNotif(char* text)
|
||||||
|
{
|
||||||
|
clock_gettime(CLOCK_REALTIME, ¬if);
|
||||||
|
clearNotif();
|
||||||
|
leftPrint(maxrows, w, text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearNotif()
|
||||||
|
{
|
||||||
|
leftPrint(maxrows, w, "\033[2K");
|
||||||
|
}
|
||||||
|
|
||||||
|
void toggleCompact()
|
||||||
|
{
|
||||||
|
compact = !compact;
|
||||||
|
//Clears the screen rather than dirtying it so the notif doesnt clear
|
||||||
|
clrScreen();
|
||||||
|
if (compact)
|
||||||
|
drawNotif("Compact mode enabled");
|
||||||
|
else
|
||||||
|
drawNotif("Compact mode disabled");
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawDisplay()
|
||||||
|
{
|
||||||
|
if (dirty) {
|
||||||
|
clrScreen();
|
||||||
|
dirty = false;
|
||||||
|
}
|
||||||
|
rghtPrint(1, w, "Attempts");
|
||||||
|
char atmpt[10];
|
||||||
|
sprintf(atmpt, "%9d", attempts);
|
||||||
|
rghtPrint(2, w, atmpt);
|
||||||
|
cntrPrint(1, w / 2, w, gameTitle);
|
||||||
|
cntrPrint(2, w / 2, w, categoryTitle);
|
||||||
|
setFGColor(fade);
|
||||||
|
drawHLine(5, w);
|
||||||
|
printf("\033[5;3H");
|
||||||
|
if (hotkeys_enabled || compact)
|
||||||
|
printf("[");
|
||||||
|
if (hotkeys_enabled)
|
||||||
|
printf("h");
|
||||||
|
if (compact)
|
||||||
|
printf("c");
|
||||||
|
if (hotkeys_enabled || compact)
|
||||||
|
printf("]");
|
||||||
|
setFGColor(fg);
|
||||||
|
drawSegmentNames();
|
||||||
|
//TODO: The column names stuff has to be more dynamic, part of the
|
||||||
|
//drawColumn function probably
|
||||||
|
if (!compact) {
|
||||||
|
char cols[41];
|
||||||
|
sprintf(cols, "%10s%10s%10s%10s", "Delta", "Sgmt", "Time", "PB");
|
||||||
|
setFGColor(fade);
|
||||||
|
rghtPrint(4, w, cols);
|
||||||
|
setFGColor(fg);
|
||||||
|
drawTimeColumn(0, 1);
|
||||||
|
drawTimeColumn(3, 2);
|
||||||
|
drawTimeColumn(2, 3);
|
||||||
|
drawDeltaColumn(4);
|
||||||
|
} else {
|
||||||
|
char cols[21];
|
||||||
|
sprintf(cols, "%10s%10s", "Delta", "Time/PB");
|
||||||
|
setFGColor(fade);
|
||||||
|
rghtPrint(4, w, cols);
|
||||||
|
setFGColor(fg);
|
||||||
|
drawTimeColumn(0, 1);
|
||||||
|
drawTimeColumn(3, 1);
|
||||||
|
drawDeltaColumn(2);
|
||||||
|
}
|
||||||
|
setFGColor(fade);
|
||||||
|
drawHLine(segCount + 6, w);
|
||||||
|
setFGColor(fg);
|
||||||
|
ftime(currentTime, currentMS, 2, false);
|
||||||
|
rghtPrint(segCount + 7, w, currentTime);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
void resize(int i)
|
||||||
|
{
|
||||||
|
struct winsize ws;
|
||||||
|
ioctl(1, TIOCGWINSZ, &ws);
|
||||||
|
w = ws.ws_col;
|
||||||
|
h = ws.ws_row;
|
||||||
|
setMaxCols(w);
|
||||||
|
setMaxRows(h);
|
||||||
|
dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ftime(char *timestr, int rms, int decimals, bool sign)
|
||||||
|
{
|
||||||
|
if (decimals > 3 || decimals < 0)
|
||||||
|
decimals = 0;
|
||||||
|
int seconds = rms / 1000;
|
||||||
|
int minutes = seconds / 60;
|
||||||
|
int hours = minutes / 60;
|
||||||
|
//A few better formatted variables for displaying these numbers
|
||||||
|
int thr = rms % 1000;
|
||||||
|
int two = thr / 10;
|
||||||
|
int one = two / 10;
|
||||||
|
int s = seconds % 60;
|
||||||
|
int m = minutes % 60;
|
||||||
|
int h = hours;
|
||||||
|
int d = 0;
|
||||||
|
switch (decimals) {
|
||||||
|
case 1:
|
||||||
|
d = one;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
d = two;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
d = thr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
char tformat[22];
|
||||||
|
int i = 0;
|
||||||
|
int decimalspace = decimals + (decimals != 0);
|
||||||
|
if (hours) {
|
||||||
|
tformat[i++] = '%';
|
||||||
|
if (sign)
|
||||||
|
tformat[i++] = '+';
|
||||||
|
tformat[i++] = (colwidth - 6 - decimalspace) + 48;
|
||||||
|
tformat[i++] = 'd';
|
||||||
|
tformat[i++] = ':';
|
||||||
|
}
|
||||||
|
if (minutes) {
|
||||||
|
tformat[i++] = '%';
|
||||||
|
if (sign && !hours)
|
||||||
|
tformat[i++] = '+';
|
||||||
|
if (hours) {
|
||||||
|
tformat[i++] = '0';
|
||||||
|
tformat[i++] = '2';
|
||||||
|
} else {
|
||||||
|
tformat[i++] = (colwidth - 3 - decimalspace) + 48;
|
||||||
|
}
|
||||||
|
tformat[i++] = 'd';
|
||||||
|
tformat[i++] = ':';
|
||||||
|
}
|
||||||
|
|
||||||
|
tformat[i++] = '%';
|
||||||
|
if (s != 0 && sign && !hours && !minutes)
|
||||||
|
tformat[i++] = '+';
|
||||||
|
if (minutes) {
|
||||||
|
tformat[i++] = '0';
|
||||||
|
tformat[i++] = '2';
|
||||||
|
} else {
|
||||||
|
//This value can push the resulting char out of the numbers
|
||||||
|
//section of the ascii table so we gotta clamp it
|
||||||
|
int n = colwidth - decimalspace + 48;
|
||||||
|
if (n >= 58)
|
||||||
|
n = 57;
|
||||||
|
tformat[i++] = n;
|
||||||
|
}
|
||||||
|
tformat[i++] = 'd';
|
||||||
|
|
||||||
|
if (decimals) {
|
||||||
|
tformat[i++] = '.';
|
||||||
|
tformat[i++] = '%';
|
||||||
|
tformat[i++] = '0';
|
||||||
|
tformat[i++] = decimals + 48;
|
||||||
|
tformat[i++] = 'd';
|
||||||
|
}
|
||||||
|
tformat[i] = 0;
|
||||||
|
|
||||||
|
if (hours) {
|
||||||
|
if (!decimals)
|
||||||
|
sprintf(timestr, tformat, h, abs(m), abs(s));
|
||||||
|
else
|
||||||
|
sprintf(timestr, tformat, h, abs(m), abs(s), abs(d));
|
||||||
|
} else if (minutes) {
|
||||||
|
if (!decimals)
|
||||||
|
sprintf(timestr, tformat, m, abs(s));
|
||||||
|
else
|
||||||
|
sprintf(timestr, tformat, m, abs(s), abs(d));
|
||||||
|
} else {
|
||||||
|
if (!decimals) {
|
||||||
|
sprintf(timestr, tformat, s);
|
||||||
|
} else {
|
||||||
|
sprintf(timestr, tformat, s, abs(d));
|
||||||
|
if (sign && s == 0 && d < 0)
|
||||||
|
timestr[COLSTRLEN - 4 - decimals] = '-';
|
||||||
|
if (sign && s == 0 && d >= 0)
|
||||||
|
timestr[COLSTRLEN - 4 - decimals] = '+';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -7,11 +7,18 @@
|
|||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
|
#define COLSTRLEN 11
|
||||||
|
|
||||||
extern int maxrows;
|
extern int maxrows;
|
||||||
extern int maxcols;
|
extern int maxcols;
|
||||||
extern int colwidth;
|
extern int colwidth;
|
||||||
extern int in;
|
extern int in;
|
||||||
|
extern bool dirty;
|
||||||
|
|
||||||
struct color {
|
struct color {
|
||||||
int r;
|
int r;
|
||||||
@ -19,6 +26,9 @@ struct color {
|
|||||||
int b;
|
int b;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern struct color bg;
|
||||||
|
extern struct color fg;
|
||||||
|
|
||||||
void setBGColor(struct color);
|
void setBGColor(struct color);
|
||||||
void setFGColor(struct color);
|
void setFGColor(struct color);
|
||||||
void clrScreen();
|
void clrScreen();
|
||||||
@ -37,6 +47,14 @@ void drawRow(char **data, int count, int row);
|
|||||||
void drawCell(char *data, int column, int row, struct color col);
|
void drawCell(char *data, int column, int row, struct color col);
|
||||||
void setMaxRows(int rows);
|
void setMaxRows(int rows);
|
||||||
void setMaxCols(int cols);
|
void setMaxCols(int cols);
|
||||||
|
void drawNotif();
|
||||||
|
void clearNotif();
|
||||||
|
void drawSegmentNames();
|
||||||
|
void drawTimeColumn();
|
||||||
|
void toggleCompact();
|
||||||
|
void drawDisplay();
|
||||||
|
void resize(int i);
|
||||||
|
void ftime(char *timestr, int rms, int decimals, bool sign);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
285
src/timer.c
285
src/timer.c
@ -1,24 +1,11 @@
|
|||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
|
||||||
#define COLSTRLEN 11
|
|
||||||
|
|
||||||
//Timekeeping
|
//Timekeeping
|
||||||
struct timespec timestart, finish, notif;
|
struct timespec timestart, finish, notif;
|
||||||
int currentMS = 0;
|
int currentMS = 0;
|
||||||
int timeSave = 0;
|
int timeSave = 0;
|
||||||
bool timerActive = false;
|
bool timerActive = false;
|
||||||
|
|
||||||
//UI
|
|
||||||
struct color bg = { 47, 53, 66};
|
|
||||||
struct color fg = {247, 248, 242};
|
|
||||||
struct color fade = {210, 210, 210};
|
|
||||||
struct color gold = {249, 255, 79};
|
|
||||||
struct color good = { 79, 255, 85};
|
|
||||||
struct color bad = {255, 79, 79};
|
|
||||||
int h, w;
|
|
||||||
bool compact = false;
|
|
||||||
bool dirty = false;
|
|
||||||
|
|
||||||
//Run data
|
//Run data
|
||||||
char *filepath;
|
char *filepath;
|
||||||
char *configpath;
|
char *configpath;
|
||||||
@ -58,7 +45,7 @@ void start()
|
|||||||
clock_gettime(CLOCK_REALTIME, ×tart);
|
clock_gettime(CLOCK_REALTIME, ×tart);
|
||||||
timerActive = true;
|
timerActive = true;
|
||||||
//Reset state of timer
|
//Reset state of timer
|
||||||
dirty = true;
|
dirty = true; //find a way to put this in src/display.c
|
||||||
for(int i = 0; i < segCount; i++) {
|
for(int i = 0; i < segCount; i++) {
|
||||||
segments[i].ms = 0;
|
segments[i].ms = 0;
|
||||||
segments[i].isSkipped = false;
|
segments[i].isSkipped = false;
|
||||||
@ -126,281 +113,11 @@ void skip()
|
|||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ftime(char *timestr, int rms, int decimals, bool sign)
|
|
||||||
{
|
|
||||||
if (decimals > 3 || decimals < 0)
|
|
||||||
decimals = 0;
|
|
||||||
int seconds = rms / 1000;
|
|
||||||
int minutes = seconds / 60;
|
|
||||||
int hours = minutes / 60;
|
|
||||||
//A few better formatted variables for displaying these numbers
|
|
||||||
int thr = rms % 1000;
|
|
||||||
int two = thr / 10;
|
|
||||||
int one = two / 10;
|
|
||||||
int s = seconds % 60;
|
|
||||||
int m = minutes % 60;
|
|
||||||
int h = hours;
|
|
||||||
int d = 0;
|
|
||||||
switch (decimals) {
|
|
||||||
case 1:
|
|
||||||
d = one;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
d = two;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
d = thr;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
char tformat[22];
|
|
||||||
int i = 0;
|
|
||||||
int decimalspace = decimals + (decimals != 0);
|
|
||||||
if (hours) {
|
|
||||||
tformat[i++] = '%';
|
|
||||||
if (sign)
|
|
||||||
tformat[i++] = '+';
|
|
||||||
tformat[i++] = (colwidth - 6 - decimalspace) + 48;
|
|
||||||
tformat[i++] = 'd';
|
|
||||||
tformat[i++] = ':';
|
|
||||||
}
|
|
||||||
if (minutes) {
|
|
||||||
tformat[i++] = '%';
|
|
||||||
if (sign && !hours)
|
|
||||||
tformat[i++] = '+';
|
|
||||||
if (hours) {
|
|
||||||
tformat[i++] = '0';
|
|
||||||
tformat[i++] = '2';
|
|
||||||
} else {
|
|
||||||
tformat[i++] = (colwidth - 3 - decimalspace) + 48;
|
|
||||||
}
|
|
||||||
tformat[i++] = 'd';
|
|
||||||
tformat[i++] = ':';
|
|
||||||
}
|
|
||||||
|
|
||||||
tformat[i++] = '%';
|
|
||||||
if (s != 0 && sign && !hours && !minutes)
|
|
||||||
tformat[i++] = '+';
|
|
||||||
if (minutes) {
|
|
||||||
tformat[i++] = '0';
|
|
||||||
tformat[i++] = '2';
|
|
||||||
} else {
|
|
||||||
//This value can push the resulting char out of the numbers
|
|
||||||
//section of the ascii table so we gotta clamp it
|
|
||||||
int n = colwidth - decimalspace + 48;
|
|
||||||
if (n >= 58)
|
|
||||||
n = 57;
|
|
||||||
tformat[i++] = n;
|
|
||||||
}
|
|
||||||
tformat[i++] = 'd';
|
|
||||||
|
|
||||||
if (decimals) {
|
|
||||||
tformat[i++] = '.';
|
|
||||||
tformat[i++] = '%';
|
|
||||||
tformat[i++] = '0';
|
|
||||||
tformat[i++] = decimals + 48;
|
|
||||||
tformat[i++] = 'd';
|
|
||||||
}
|
|
||||||
tformat[i] = 0;
|
|
||||||
|
|
||||||
if (hours) {
|
|
||||||
if (!decimals)
|
|
||||||
sprintf(timestr, tformat, h, abs(m), abs(s));
|
|
||||||
else
|
|
||||||
sprintf(timestr, tformat, h, abs(m), abs(s), abs(d));
|
|
||||||
} else if (minutes) {
|
|
||||||
if (!decimals)
|
|
||||||
sprintf(timestr, tformat, m, abs(s));
|
|
||||||
else
|
|
||||||
sprintf(timestr, tformat, m, abs(s), abs(d));
|
|
||||||
} else {
|
|
||||||
if (!decimals) {
|
|
||||||
sprintf(timestr, tformat, s);
|
|
||||||
} else {
|
|
||||||
sprintf(timestr, tformat, s, abs(d));
|
|
||||||
if (sign && s == 0 && d < 0)
|
|
||||||
timestr[COLSTRLEN - 4 - decimals] = '-';
|
|
||||||
if (sign && s == 0 && d >= 0)
|
|
||||||
timestr[COLSTRLEN - 4 - decimals] = '+';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int timespecToMS(struct timespec t)
|
int timespecToMS(struct timespec t)
|
||||||
{
|
{
|
||||||
return (t.tv_nsec / 1000000) + (t.tv_sec * 1000);
|
return (t.tv_nsec / 1000000) + (t.tv_sec * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawSegmentNames()
|
|
||||||
{
|
|
||||||
char *names[segCount];
|
|
||||||
for(int i = 0; i < segCount; i++) {
|
|
||||||
names[i] = segments[i].name;
|
|
||||||
}
|
|
||||||
drawColumn(names, segCount, 0, segCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: Fix up all this commented garbage
|
|
||||||
//Really the entire display system needs rethinking first but yea
|
|
||||||
void drawDeltaColumn(int column)
|
|
||||||
{
|
|
||||||
char *times[segCount];
|
|
||||||
for (int i = 0; i < segCount; i++) {
|
|
||||||
times[i] = calloc(1, COLSTRLEN);
|
|
||||||
int time = 0;
|
|
||||||
if (i == currSeg)
|
|
||||||
time = currentMS - pbrun[i].ms;
|
|
||||||
else if (i < currSeg)
|
|
||||||
time = segments[i].ms - pbrun[i].ms;
|
|
||||||
ftime(times[i], time, 1, true);
|
|
||||||
struct color col = {0};
|
|
||||||
if (time <= 0)
|
|
||||||
col = good;
|
|
||||||
else
|
|
||||||
col = bad;
|
|
||||||
if (i < currSeg)
|
|
||||||
drawCell(times[i], column, i + 6, col);
|
|
||||||
if (i == currSeg && time >= -5000)
|
|
||||||
drawCell(times[i], column, i + 6, col);
|
|
||||||
}
|
|
||||||
//drawColumn(times, segCount, column, currSeg);
|
|
||||||
//Use drawCell because we're doing colors.
|
|
||||||
//for (int i = 0; i < segCount; i++) {
|
|
||||||
// if (i <= currSeg)
|
|
||||||
// drawCell(times[i], column, i + 6, good);
|
|
||||||
//}
|
|
||||||
setFGColor(fg);
|
|
||||||
for (int i = 0; i < segCount; i++) {
|
|
||||||
free(times[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//TODO: try to clean the branching up
|
|
||||||
void drawTimeColumn(int timeoption, int column)
|
|
||||||
{
|
|
||||||
char *times[segCount];
|
|
||||||
int drawEnd = currSeg;
|
|
||||||
for (int i = 0; i < segCount; i++) {
|
|
||||||
times[i] = calloc(1, COLSTRLEN);
|
|
||||||
int time = 0;
|
|
||||||
switch (timeoption) {
|
|
||||||
case 0:
|
|
||||||
time = pbrun[i].ms;
|
|
||||||
drawEnd = segCount;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
if (i > 0 && i < currSeg)
|
|
||||||
time = segments[i].ms - segments[i - 1].ms;
|
|
||||||
else if (i > 0 && i == currSeg)
|
|
||||||
time = currentMS - segments[i - 1].ms;
|
|
||||||
else if (i == 0 && i == currSeg)
|
|
||||||
time = currentMS;
|
|
||||||
else
|
|
||||||
time = segments[i].ms;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
if (i == currSeg)
|
|
||||||
time = currentMS;
|
|
||||||
else
|
|
||||||
time = segments[i].ms;
|
|
||||||
}
|
|
||||||
ftime(times[i], time, 1, false);
|
|
||||||
}
|
|
||||||
drawColumn(times, segCount, column, drawEnd);
|
|
||||||
for (int i = 0; i < segCount; i++) {
|
|
||||||
free(times[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void drawNotif(char* text)
|
|
||||||
{
|
|
||||||
clock_gettime(CLOCK_REALTIME, ¬if);
|
|
||||||
clearNotif();
|
|
||||||
leftPrint(maxrows, w, text);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clearNotif()
|
|
||||||
{
|
|
||||||
leftPrint(maxrows, w, "\033[2K");
|
|
||||||
}
|
|
||||||
|
|
||||||
void toggleCompact()
|
|
||||||
{
|
|
||||||
compact = !compact;
|
|
||||||
//Clears the screen rather than dirtying it so the notif doesnt clear
|
|
||||||
clrScreen();
|
|
||||||
if (compact)
|
|
||||||
drawNotif("Compact mode enabled");
|
|
||||||
else
|
|
||||||
drawNotif("Compact mode disabled");
|
|
||||||
}
|
|
||||||
|
|
||||||
void drawDisplay()
|
|
||||||
{
|
|
||||||
if (dirty) {
|
|
||||||
clrScreen();
|
|
||||||
dirty = false;
|
|
||||||
}
|
|
||||||
rghtPrint(1, w, "Attempts");
|
|
||||||
char atmpt[10];
|
|
||||||
sprintf(atmpt, "%9d", attempts);
|
|
||||||
rghtPrint(2, w, atmpt);
|
|
||||||
cntrPrint(1, w / 2, w, gameTitle);
|
|
||||||
cntrPrint(2, w / 2, w, categoryTitle);
|
|
||||||
setFGColor(fade);
|
|
||||||
drawHLine(5, w);
|
|
||||||
printf("\033[5;3H");
|
|
||||||
if (hotkeys_enabled || compact)
|
|
||||||
printf("[");
|
|
||||||
if (hotkeys_enabled)
|
|
||||||
printf("h");
|
|
||||||
if (compact)
|
|
||||||
printf("c");
|
|
||||||
if (hotkeys_enabled || compact)
|
|
||||||
printf("]");
|
|
||||||
setFGColor(fg);
|
|
||||||
drawSegmentNames();
|
|
||||||
//TODO: The column names stuff has to be more dynamic, part of the
|
|
||||||
//drawColumn function probably
|
|
||||||
if (!compact) {
|
|
||||||
char cols[41];
|
|
||||||
sprintf(cols, "%10s%10s%10s%10s", "Delta", "Sgmt", "Time", "PB");
|
|
||||||
setFGColor(fade);
|
|
||||||
rghtPrint(4, w, cols);
|
|
||||||
setFGColor(fg);
|
|
||||||
drawTimeColumn(0, 1);
|
|
||||||
drawTimeColumn(3, 2);
|
|
||||||
drawTimeColumn(2, 3);
|
|
||||||
drawDeltaColumn(4);
|
|
||||||
} else {
|
|
||||||
char cols[21];
|
|
||||||
sprintf(cols, "%10s%10s", "Delta", "Time/PB");
|
|
||||||
setFGColor(fade);
|
|
||||||
rghtPrint(4, w, cols);
|
|
||||||
setFGColor(fg);
|
|
||||||
drawTimeColumn(0, 1);
|
|
||||||
drawTimeColumn(3, 1);
|
|
||||||
drawDeltaColumn(2);
|
|
||||||
}
|
|
||||||
setFGColor(fade);
|
|
||||||
drawHLine(segCount + 6, w);
|
|
||||||
setFGColor(fg);
|
|
||||||
ftime(currentTime, currentMS, 2, false);
|
|
||||||
rghtPrint(segCount + 7, w, currentTime);
|
|
||||||
fflush(stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
void resize(int i)
|
|
||||||
{
|
|
||||||
struct winsize ws;
|
|
||||||
ioctl(1, TIOCGWINSZ, &ws);
|
|
||||||
w = ws.ws_col;
|
|
||||||
h = ws.ws_row;
|
|
||||||
setMaxCols(w);
|
|
||||||
setMaxRows(h);
|
|
||||||
dirty = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void calculatePB()
|
void calculatePB()
|
||||||
{
|
{
|
||||||
bool valid = false;
|
bool valid = false;
|
||||||
|
13
src/timer.h
13
src/timer.h
@ -39,11 +39,16 @@ struct pastseg
|
|||||||
|
|
||||||
extern char *gameTitle;
|
extern char *gameTitle;
|
||||||
extern char *categoryTitle;
|
extern char *categoryTitle;
|
||||||
|
extern int currentMS;
|
||||||
|
extern int currSeg;
|
||||||
extern int segCount;
|
extern int segCount;
|
||||||
|
extern int attempts;
|
||||||
|
extern char currentTime[10];
|
||||||
extern struct segment *pbrun;
|
extern struct segment *pbrun;
|
||||||
extern struct segment *bestsegs;
|
extern struct segment *bestsegs;
|
||||||
extern struct segment *wrrun;
|
extern struct segment *wrrun;
|
||||||
extern struct segment *segments;
|
extern struct segment *segments;
|
||||||
|
extern struct timespec notif;
|
||||||
|
|
||||||
void sub_timespec(struct timespec t1, struct timespec t2, struct timespec* td);
|
void sub_timespec(struct timespec t1, struct timespec t2, struct timespec* td);
|
||||||
void add_timespec(struct timespec t1, struct timespec t2, struct timespec* td);
|
void add_timespec(struct timespec t1, struct timespec t2, struct timespec* td);
|
||||||
@ -53,15 +58,7 @@ void split();
|
|||||||
void tpause();
|
void tpause();
|
||||||
void unsplit();
|
void unsplit();
|
||||||
void skip();
|
void skip();
|
||||||
void ftime(char *timestr, int rms, int decimals, bool sign);
|
|
||||||
int timespecToMS(struct timespec t);
|
int timespecToMS(struct timespec t);
|
||||||
void drawNotif();
|
|
||||||
void clearNotif();
|
|
||||||
void drawSegmentNames();
|
|
||||||
void drawTimeColumn();
|
|
||||||
void toggleCompact();
|
|
||||||
void drawDisplay();
|
|
||||||
void resize(int i);
|
|
||||||
void calculatePB();
|
void calculatePB();
|
||||||
void loadConfig();
|
void loadConfig();
|
||||||
void saveConfig(cJSON *config);
|
void saveConfig(cJSON *config);
|
||||||
|
Loading…
Reference in New Issue
Block a user