Skip to content

Commit

Permalink
Added --request parameter, fixed reading directives at end of file, l…
Browse files Browse the repository at this point in the history
…imited most output to --verbose option
  • Loading branch information
jarcode-foss committed Nov 2, 2018
1 parent 1d2b014 commit 426f70f
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 34 deletions.
57 changes: 45 additions & 12 deletions glava.c
Original file line number Diff line number Diff line change
Expand Up @@ -166,9 +166,10 @@ static const char* help_str =
"-d, --desktop enables running glava as a desktop window by detecting the\n"
" desktop environment and setting the appropriate properties\n"
" automatically. Can override properties in \"rc.glsl\".\n"
"-r, --request=REQUEST evaluates the specified request after loading \"rc.glsl\".\n"
"-m, --force-mod=NAME forces the specified module to load instead, ignoring any\n"
" `#request mod` instances in the entry point.\n"
"-e, --entry=NAME specifies the name of the file to look for when loading shaders,\n"
"-e, --entry=FILE specifies the name of the file to look for when loading shaders,\n"
" by default this is \"rc.glsl\".\n"
"-C, --copy-config creates copies and symbolic links in the user configuration\n"
" directory for glava, copying any files in the root directory\n"
Expand All @@ -178,14 +179,23 @@ static const char* help_str =
" system.\n"
"-V, --version print application version and exit\n"
"\n"
GLAVA_VERSION_STRING "\n"
" -- Copyright (C) 2017 Levi Webb\n";
"The REQUEST argument is evaluated identically to the \'#request\' preprocessor directive\n"
"in GLSL files.\n"
"\n"
"The DEFINE argument is appended to the associated file before it is processed. It is\n"
"evaluated identically to the \'#define' preprocessor directive.\n"
"\n"
"The FILE argument may be any file path. All specified file paths are relative to the\n"
"active configuration root (usually ~/.config/glava if present).\n"
"\n"
GLAVA_VERSION_STRING "\n";

static const char* opt_str = "dhvVe:Cm:b:";
static const char* opt_str = "dhvVe:Cm:b:r:";
static struct option p_opts[] = {
{"help", no_argument, 0, 'h'},
{"verbose", no_argument, 0, 'v'},
{"desktop", no_argument, 0, 'd'},
{"request", required_argument, 0, 'r'},
{"entry", required_argument, 0, 'e'},
{"force-mod", required_argument, 0, 'm'},
{"copy-config", no_argument, 0, 'C'},
Expand All @@ -196,22 +206,32 @@ static struct option p_opts[] = {

static renderer* rd = NULL;

void handle_term(int signum) {
static void handle_term(int signum) {
if (rd->alive) {
puts("\nInterrupt recieved, closing...");
rd->alive = false;
}
}

static inline void append_buf(char** buf, size_t* sz_store, char* str) {
buf = realloc(buf, ++(*sz_store) * sizeof(char*));
buf[*sz_store - 1] = str;
}

int main(int argc, char** argv) {

/* Evaluate these macros only once, since they allocate */
const char* install_path = SHADER_INSTALL_PATH;
const char* user_path = SHADER_USER_PATH;
const char* entry = "rc.glsl";
const char* force = NULL;
const char* backend = NULL;
const char
* install_path = SHADER_INSTALL_PATH,
* user_path = SHADER_USER_PATH,
* entry = "rc.glsl",
* force = NULL,
* backend = NULL;
const char* system_shader_paths[] = { user_path, install_path, NULL };

char** requests = malloc(1);
size_t requests_sz = 0;

bool verbose = false, copy_mode = false, desktop = false;

int c, idx;
Expand All @@ -220,6 +240,7 @@ int main(int argc, char** argv) {
case 'v': verbose = true; break;
case 'C': copy_mode = true; break;
case 'd': desktop = true; break;
case 'r': append_buf(requests, &requests_sz, optarg); break;
case 'e': entry = optarg; break;
case 'm': force = optarg; break;
case 'b': backend = optarg; break;
Expand All @@ -241,7 +262,19 @@ int main(int argc, char** argv) {
exit(EXIT_SUCCESS);
}

rd = rd_new(system_shader_paths, entry, force, backend, desktop);
/* Handle `--force` argument as a request override */
if (force) {
const size_t bsz = 5 + strlen(force);
char* force_req_buf = malloc(bsz);
snprintf(force_req_buf, bsz, "mod %s", force);
append_buf(requests, &requests_sz, force_req_buf);
}

/* Null terminate array arguments */
append_buf(requests, &requests_sz, NULL);

rd = rd_new(system_shader_paths, entry, (const char**) requests,
backend, desktop, verbose);

struct sigaction action = { .sa_handler = handle_term };
sigaction(SIGTERM, &action, NULL);
Expand Down Expand Up @@ -275,7 +308,7 @@ int main(int argc, char** argv) {
};
if (!audio.source) {
get_pulse_default_sink(&audio);
printf("Using default PulseAudio sink: %s\n", audio.source);
if (verbose) printf("Using default PulseAudio sink: %s\n", audio.source);
}

pthread_t thread;
Expand Down
2 changes: 1 addition & 1 deletion glsl_ext.c
Original file line number Diff line number Diff line change
Expand Up @@ -494,7 +494,7 @@ void ext_process(struct glsl_ext* ext, const char* f) {
arg_start_idx = t + 1;
} else arg_start = false;

if (at == '\n' || state == DEFINE) {
if (at == '\n' || at == '\0' || state == DEFINE) {
/* end directive */
size_t a;
struct schar r = directive(ext, args, args_sz, state, line, f);
Expand Down
60 changes: 43 additions & 17 deletions render.c
Original file line number Diff line number Diff line change
Expand Up @@ -688,9 +688,9 @@ static struct gl_bind_src* lookup_bind_src(const char* str) {
return NULL;
}

struct renderer* rd_new(const char** paths, const char* entry,
const char* force_mod, const char* force_backend,
bool auto_desktop) {
struct renderer* rd_new(const char** paths, const char* entry,
const char** requests, const char* force_backend,
bool auto_desktop, bool verbose) {

xwin_wait_for_wm();

Expand Down Expand Up @@ -770,7 +770,7 @@ struct renderer* rd_new(const char** paths, const char* entry,
exit(EXIT_FAILURE);
}

printf("Using backend: '%s'\n", backend);
if (verbose) printf("Using backend: '%s'\n", backend);

for (size_t t = 0; t < wcbs_idx; ++t) {
if (wcbs[t]->name && !strcmp(wcbs[t]->name, backend)) {
Expand All @@ -785,7 +785,7 @@ struct renderer* rd_new(const char** paths, const char* entry,
}

#ifdef GLAD_DEBUG
printf("Assigning debug callback\n");
if (verbose) printf("Assigning debug callback\n");
static bool assigned_debug_cb = false;
if (!assigned_debug_cb) {
glad_set_post_callback(glad_debugcb);
Expand All @@ -798,7 +798,7 @@ struct renderer* rd_new(const char** paths, const char* entry,
int shader_version = 330,
context_version_major = 3,
context_version_minor = 3;
const char* module = force_mod;
const char* module = NULL;
const char* wintitle_default = "GLava";
char* xwintype = NULL, * wintitle = (char*) wintitle_default;
char** xwinstates = malloc(1);
Expand Down Expand Up @@ -868,8 +868,8 @@ struct renderer* rd_new(const char** paths, const char* entry,
{
.name = "mod", .fmt = "s",
.handler = RHANDLER(name, args, {
if (loading_module && !force_mod) {
if (module != NULL && module != force_mod) free((char*) module);
if (loading_module) {
if (module != NULL) free((char*) module);
size_t len = strlen((char*) args[0]);
char* str = malloc(sizeof(char) * (len + 1));
strncpy(str, (char*) args[0], len + 1);
Expand Down Expand Up @@ -1113,22 +1113,25 @@ struct renderer* rd_new(const char** paths, const char* entry,
if (errno != ENOENT &&
errno != ENOTDIR &&
errno != ELOOP) {
fprintf(stderr, "Failed to load desktop environment specific presets at '%s': %s\n", se_buf, strerror(errno));
fprintf(stderr, "Failed to load desktop environment specific presets "
"at '%s': %s\n", se_buf, strerror(errno));
exit(EXIT_FAILURE);
} else {
printf("No presets for current desktop environment (\"%s\"), using default presets for embedding\n", env);
printf("No presets for current desktop environment (\"%s\"), "
"using default presets for embedding\n", env);
snprintf(se_buf, bsz, "%s/env_default.glsl", data);
fd = open(se_buf, O_RDONLY);
if (fd == -1) {
fprintf(stderr, "Failed to load default presets at '%s': %s\n", se_buf, strerror(errno));
fprintf(stderr, "Failed to load default presets at '%s': %s\n",
se_buf, strerror(errno));
exit(EXIT_FAILURE);
}
}
}
fstat(fd, &st);
map = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);

ext.source = map;
ext.source = map;
ext.source_len = st.st_size;

loading_presets = true;
Expand All @@ -1138,12 +1141,35 @@ struct renderer* rd_new(const char** paths, const char* entry,

munmap((void*) map, st.st_size);
} else {
fprintf(stderr, "Failed to detect the desktop environment! Is the window manager EWMH compliant?");
fprintf(stderr, "Failed to detect the desktop environment! "
"Is the window manager EWMH compliant?");
}
}

break;
}

{
struct glsl_ext ext = {
.cd = data,
.handlers = handlers
};

const char* req;
char fbuf[64];
int idx = 1;
for (const char** i = requests; (req = *i) != NULL; ++i) {
size_t rlen = strlen(req) + 16;
char* rbuf = malloc(rlen);
rlen = snprintf(rbuf, rlen, "#request %s", req);
snprintf(fbuf, sizeof(fbuf), "[request arg %d]", idx);
ext.source = rbuf;
ext.source_len = rlen;
ext_process(&ext, fbuf);
ext_free(&ext);
++idx;
}
}

if (!module) {
fprintf(stderr,
Expand Down Expand Up @@ -1182,9 +1208,9 @@ struct renderer* rd_new(const char** paths, const char* entry,
char shaders[bsz]; /* module pack path to use */
snprintf(shaders, bsz, "%s/%s", data, module);

printf("Loading module: '%s'\n", module);
if (verbose) printf("Loading module: '%s'\n", module);

if (!force_mod) free((void*) module);
free((void*) module);
loading_module = false;

/* Iterate through shader passes in the shader directory and build textures, framebuffers, and
Expand All @@ -1211,7 +1237,7 @@ struct renderer* rd_new(const char** paths, const char* entry,
if (d->d_type == DT_REG || d->d_type == DT_UNKNOWN) {
snprintf(buf, sizeof(buf), "%d." SHADER_EXT_FRAG, (int) idx);
if (!strcmp(buf, d->d_name)) {
printf("found GLSL stage: '%s'\n", d->d_name);
if (verbose) printf("found GLSL stage: '%s'\n", d->d_name);
++count;
found = true;
}
Expand All @@ -1232,7 +1258,7 @@ struct renderer* rd_new(const char** paths, const char* entry,
if (d->d_type == DT_REG || d->d_type == DT_UNKNOWN) {
snprintf(buf, sizeof(buf), "%d." SHADER_EXT_FRAG, (int) idx);
if (!strcmp(buf, d->d_name)) {
printf("compiling: '%s'\n", d->d_name);
if (verbose) printf("compiling: '%s'\n", d->d_name);

struct gl_sfbo* s = &stages[idx - 1];
*s = (struct gl_sfbo) {
Expand Down
6 changes: 3 additions & 3 deletions render.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ typedef struct renderer {
struct gl_data* gl;
} renderer;

struct renderer* rd_new (const char** paths, const char* entry,
const char* force_mod, const char* force_backend,
bool auto_desktop);
struct renderer* rd_new (const char** paths, const char* entry,
const char** requests, const char* force_backend,
bool auto_desktop, bool verbose);
bool rd_update (struct renderer*, float* lb, float* rb,
size_t bsz, bool modified);
void rd_destroy (struct renderer*);
Expand Down
2 changes: 1 addition & 1 deletion shaders/radial.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
/* Offset (X) of the visualization */
#define CENTER_OFFSET_X 0

/* Gravity step, overrude frin `smooth_parameters.glsl` */
/* Gravity step, override from `smooth_parameters.glsl` */
#request setgravitystep 5.0

/* Smoothing factor, override from `smooth_parameters.glsl` */
Expand Down

0 comments on commit 426f70f

Please sign in to comment.