added install option to makefile and a manpage

This commit is contained in:
Lexi Quinn 2021-09-28 00:33:33 +10:00
parent ad7b81f448
commit 8e3683340d
7 changed files with 69 additions and 12 deletions

View File

@ -2,6 +2,8 @@ TARGET = quest
LIBS = -lm -luiohook LIBS = -lm -luiohook
CC = gcc CC = gcc
CFLAGS = -g -Wall CFLAGS = -g -Wall
INSTALL_PATH = /usr/local
VERSION = 0.5.0
.PHONY: default all clean .PHONY: default all clean
@ -22,3 +24,15 @@ $(TARGET): $(OBJECTS)
clean: clean:
-rm -f *.o -rm -f *.o
-rm -f $(TARGET) -rm -f $(TARGET)
install: all
mkdir -p $(DESTDIR)$(INSTALL_PATH)/bin
cp -f $(TARGET) $(DESTDIR)$(INSTALL_PATH)/bin
chmod 755 $(DESTDIR)$(INSTALL_PATH)/bin/$(TARGET)
mkdir -p $(DESTDIR)$(INSTALL_PATH)/share/man/man1
sed "s/VERSION/$(VERSION)/g" < docs/$(TARGET).1 > $(DESTDIR)$(INSTALL_PATH)/share/man/man1/$(TARGET).1
chmod 644 $(DESTDIR)$(INSTALL_PATH)/share/man/man1/$(TARGET).1
uninstall:
rm -f $(DESTDIR)$(INSTALL_PATH)/bin/$(TARGET)\
$(DESTDIR)$(INSTALL_PATH)/share/man/man1/$(TARGET).1

View File

@ -20,9 +20,10 @@ splits after the first use of the split file is currently unsupported.
| Keys | Action | | Keys | Action |
| ---- | --------------------- | | ---- | --------------------- |
| `R` | Start | | `R` | Start |
| `F` | Stop | | `F` | Stop / Reset |
| `E` | Split | | `E` | Split |
| `G` | Undo split | | `G` | Undo split |
| `V` | Skip split |
| `C` | Close | | `C` | Close |
| `T` | Toggle global hotkeys | | `T` | Toggle global hotkeys |

17
docs/quest.1 Normal file
View File

@ -0,0 +1,17 @@
.TH QUEST 1 quest\-VERSION
.SH NAME
quest \- speedrun timer
.SH SYNOPSIS
.B quest
.IR file
.SH DESCRIPTION
quest provides a timer for timing speedruns of video games, with features
speedrunners expect of such software like splitting the timer between named
segments and displaying comparisons between a known previous time such as
a personal best or world record.
.PP
I/O features such as importing split names from a splits.io run file/exporting
runs to the splits.io generic exchange format and global hotkeys to control the
software while a video game has window focus are also supported.
.SH OPTIONS

View File

@ -27,6 +27,8 @@ void dispatch_proc(uiohook_event * const event) {
buf = K_HOTKS; buf = K_HOTKS;
if (event->data.keyboard.keycode == km.USPLT) if (event->data.keyboard.keycode == km.USPLT)
buf = K_USPLT; buf = K_USPLT;
if (event->data.keyboard.keycode == km.SKIP)
buf = K_SKIP;
write(pipefd[1], &buf, 1); write(pipefd[1], &buf, 1);
default: default:
break; break;
@ -50,6 +52,8 @@ int handleInput()
hotkeys_enabled = !hotkeys_enabled; hotkeys_enabled = !hotkeys_enabled;
if (buf == K_USPLT) if (buf == K_USPLT)
unsplit(); unsplit();
if (buf == K_SKIP)
skip();
if (buf == K_CLOSE) if (buf == K_CLOSE)
return 1; return 1;
return 0; return 0;

View File

@ -12,6 +12,7 @@
#define K_CLOSE 5 #define K_CLOSE 5
#define K_HOTKS 6 #define K_HOTKS 6
#define K_USPLT 7 #define K_USPLT 7
#define K_SKIP 8
struct keymap struct keymap
{ {
@ -22,6 +23,7 @@ struct keymap
uint16_t CLOSE; uint16_t CLOSE;
uint16_t HOTKS; uint16_t HOTKS;
uint16_t USPLT; uint16_t USPLT;
uint16_t SKIP;
}; };
extern char buf; extern char buf;

View File

@ -50,15 +50,6 @@ void sub_timespec(struct timespec t1, struct timespec t2, struct timespec* td)
} }
} }
void reset()
{
if (!timerActive)
return;
segments[currSeg].isReset = true;
stop();
currSeg = -1;
}
void start() void start()
{ {
if (timerActive || segCount == 0) if (timerActive || segCount == 0)
@ -73,6 +64,8 @@ void stop()
{ {
if (!timerActive) if (!timerActive)
return; return;
if (currSeg < segCount)
segments[currSeg].isReset = true;
timerActive = false; timerActive = false;
attempts++; attempts++;
if (pastRuns) if (pastRuns)
@ -88,6 +81,14 @@ void stop()
} }
calculatePB(); calculatePB();
saveFile(); saveFile();
//Reset state of timer
for(int i = 0; i < segCount; i++) {
segments[i].ms = 0;
segments[i].isSkipped = false;
segments[i].isReset = false;
}
currSeg = 0;
} }
void split() void split()
@ -112,6 +113,16 @@ void tpause()
} }
void skip()
{
if (!timerActive)
return;
segments[currSeg].isSkipped = true;
currSeg++;
if (currSeg >= segCount)
stop();
}
void loadKeymap() void loadKeymap()
{ {
km.START = VC_R; km.START = VC_R;
@ -121,6 +132,7 @@ void loadKeymap()
km.CLOSE = VC_C; km.CLOSE = VC_C;
km.HOTKS = VC_T; km.HOTKS = VC_T;
km.USPLT = VC_G; km.USPLT = VC_G;
km.SKIP = VC_V;
} }
void ftime(char *timestr, bool withMS, int rms) void ftime(char *timestr, bool withMS, int rms)
@ -176,6 +188,9 @@ void drawSegments()
ftime(deltaTime, false, segments[i].ms - pbrun[i].ms); ftime(deltaTime, false, segments[i].ms - pbrun[i].ms);
ftime(sgmtTime, false, segments[i].ms - segments[i - 1].ms); ftime(sgmtTime, false, segments[i].ms - segments[i - 1].ms);
ftime(segTime, false, segments[i].ms); ftime(segTime, false, segments[i].ms);
if (segments[i].isSkipped)
sprintf(data, "%10s%10s%10s%10s", zeroStr, zeroStr, zeroStr, segmentTime);
else
sprintf(data, "%10s%10s%10s%10s", deltaTime, sgmtTime, segTime, segmentTime); sprintf(data, "%10s%10s%10s%10s", deltaTime, sgmtTime, segTime, segmentTime);
} }
rghtPrint(6 + i, w, data); rghtPrint(6 + i, w, data);
@ -232,6 +247,7 @@ void drawDisplay()
drawHLine(5, w); drawHLine(5, w);
printf("\033[5;3H[dsph]"); printf("\033[5;3H[dsph]");
if (timerActive) { if (timerActive) {
drawSegments();
drawCurrentSegment(); drawCurrentSegment();
struct timespec delta; struct timespec delta;
sub_timespec(timestart, finish, &delta); sub_timespec(timestart, finish, &delta);
@ -254,6 +270,9 @@ void resize(int i)
resized = true; resized = true;
} }
//This function will find an invalid run if theres only one in the history
//and that run is invalid. Also, runs with skipped segments aren't considered
//valid but should be
void calculatePB() void calculatePB()
{ {
if (attempts == 0) if (attempts == 0)

View File

@ -43,7 +43,7 @@ void stop();
void split(); void split();
void tpause(); void tpause();
void unsplit(); void unsplit();
void reset(); void skip();
void loadKeymap(); void loadKeymap();
void ftime(char *timestr, bool withMS, int ms); void ftime(char *timestr, bool withMS, int ms);
int timespecToMS(struct timespec t); int timespecToMS(struct timespec t);