From 426f70f5797d45ea9e42429700e166aafd4fbd42 Mon Sep 17 00:00:00 2001 From: Jarcode Date: Fri, 2 Nov 2018 16:27:54 -0700 Subject: [PATCH] Added --request parameter, fixed reading directives at end of file, limited most output to --verbose option --- glava.c | 57 +++++++++++++++++++++++++++++++++--------- glsl_ext.c | 2 +- render.c | 60 ++++++++++++++++++++++++++++++++------------- render.h | 6 ++--- shaders/radial.glsl | 2 +- 5 files changed, 93 insertions(+), 34 deletions(-) diff --git a/glava.c b/glava.c index 456ee76..ea1e054 100644 --- a/glava.c +++ b/glava.c @@ -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" @@ -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'}, @@ -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; @@ -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; @@ -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); @@ -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; diff --git a/glsl_ext.c b/glsl_ext.c index f63ae36..1e0eca8 100644 --- a/glsl_ext.c +++ b/glsl_ext.c @@ -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); diff --git a/render.c b/render.c index 657ad0e..3c36291 100644 --- a/render.c +++ b/render.c @@ -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(); @@ -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)) { @@ -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); @@ -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); @@ -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); @@ -1113,14 +1113,17 @@ 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); } } @@ -1128,7 +1131,7 @@ struct renderer* rd_new(const char** paths, const char* entry, 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; @@ -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, @@ -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 @@ -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; } @@ -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) { diff --git a/render.h b/render.h index 4591222..e63ca77 100644 --- a/render.h +++ b/render.h @@ -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*); diff --git a/shaders/radial.glsl b/shaders/radial.glsl index 1261b9b..4689be6 100644 --- a/shaders/radial.glsl +++ b/shaders/radial.glsl @@ -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` */