147 lines
2.7 KiB
C
147 lines
2.7 KiB
C
/*
|
|
* TTS - track your time.
|
|
* Copyright (c) 2012-2014 Felicity Tarnell.
|
|
*
|
|
* Permission is granted to anyone to use this software for any purpose,
|
|
* including commercial applications, and to alter it and redistribute it
|
|
* freely. This software is provided 'as-is', without any express or implied
|
|
* warranty.
|
|
*/
|
|
|
|
#include "commands.h"
|
|
#include "style.h"
|
|
#include "bindings.h"
|
|
#include "variable.h"
|
|
|
|
static command_t commands[] = {
|
|
{ L"bind", c_bind },
|
|
{ L"macro", c_macro },
|
|
{ L"style", c_style },
|
|
{ L"set", c_set },
|
|
{ }
|
|
};
|
|
|
|
command_t *
|
|
find_command(name)
|
|
const wchar_t *name;
|
|
{
|
|
size_t i;
|
|
for (i = 0; i < sizeof(commands) / sizeof(*commands); i++)
|
|
if (wcscmp(name, commands[i].cm_name) == 0)
|
|
return &commands[i];
|
|
return NULL;
|
|
}
|
|
|
|
void
|
|
c_style(argc, argv)
|
|
size_t argc;
|
|
wchar_t **argv;
|
|
{
|
|
style_t *sy;
|
|
wchar_t *last, *tok;
|
|
|
|
if (argc < 3 || argc > 4) {
|
|
cmderr(L"Usage: style <item> <foreground> [background]");
|
|
return;
|
|
}
|
|
|
|
if (wcscmp(argv[1], L"header") == 0)
|
|
sy = &sy_header;
|
|
else if (wcscmp(argv[1], L"status") == 0)
|
|
sy = &sy_status;
|
|
else if (wcscmp(argv[1], L"entry") == 0)
|
|
sy = &sy_entry;
|
|
else if (wcscmp(argv[1], L"selected") == 0)
|
|
sy = &sy_selected;
|
|
else if (wcscmp(argv[1], L"running") == 0)
|
|
sy = &sy_running;
|
|
else if (wcscmp(argv[1], L"date") == 0)
|
|
sy = &sy_date;
|
|
else {
|
|
cmderr(L"Unknown style item.");
|
|
return;
|
|
}
|
|
|
|
style_clear(sy);
|
|
for (tok = wcstok(argv[2], L",", &last); tok != NULL;
|
|
tok = wcstok(NULL, L",", &last)) {
|
|
style_add(sy, tok, argv[3]);
|
|
}
|
|
|
|
apply_styles();
|
|
}
|
|
|
|
void
|
|
c_bind(argc, argv)
|
|
size_t argc;
|
|
wchar_t **argv;
|
|
{
|
|
if (argc != 3) {
|
|
cmderr(L"Usage: bind <key> <function>");
|
|
return;
|
|
}
|
|
|
|
bind_key(argv[1], argv[2], 0);
|
|
}
|
|
|
|
void
|
|
c_macro(argc, argv)
|
|
size_t argc;
|
|
wchar_t **argv;
|
|
{
|
|
if (argc != 3) {
|
|
cmderr(L"Usage: macro <key> <def>");
|
|
return;
|
|
}
|
|
|
|
bind_key(argv[1], argv[2], 1);
|
|
}
|
|
|
|
void
|
|
c_set(argc, argv)
|
|
size_t argc;
|
|
wchar_t **argv;
|
|
{
|
|
variable_t *var;
|
|
int val;
|
|
|
|
if (argc != 3) {
|
|
cmderr(L"Usage: set <variable> <value>");
|
|
return;
|
|
}
|
|
|
|
if ((var = find_variable(argv[1])) == NULL) {
|
|
cmderr(L"Unknown variable \"%ls\".", argv[1]);
|
|
return;
|
|
}
|
|
|
|
switch (var->va_type) {
|
|
case VTYPE_BOOL:
|
|
if (wcscmp(argv[2], L"true") == 0 ||
|
|
wcscmp(argv[2], L"yes") == 0 ||
|
|
wcscmp(argv[2], L"on") == 0 ||
|
|
wcscmp(argv[2], L"1") == 0) {
|
|
val = 1;
|
|
} else if (wcscmp(argv[2], L"false") == 0 ||
|
|
wcscmp(argv[2], L"no") == 0 ||
|
|
wcscmp(argv[2], L"off") == 0 ||
|
|
wcscmp(argv[2], L"0") == 0) {
|
|
val = 0;
|
|
} else {
|
|
cmderr(L"Invalid value for boolean: \"%ls\".", argv[2]);
|
|
return;
|
|
}
|
|
|
|
*(int *)var->va_addr = val;
|
|
break;
|
|
|
|
case VTYPE_STRING:
|
|
*(wchar_t **)var->va_addr = wcsdup(argv[2]);
|
|
break;
|
|
|
|
case VTYPE_INT:
|
|
*(int *)var->va_addr = wcstol(argv[2], NULL, 0);
|
|
break;
|
|
}
|
|
}
|
|
|