forked from external/yambar
module/script: path: expand ‘~’ to the user’s $HOME directory
Closes #307
This commit is contained in:
parent
d6e7710a7e
commit
8e4d7f04e4
3 changed files with 32 additions and 7 deletions
|
@ -20,6 +20,7 @@
|
||||||
* modules/dwl: handle the appid status ([#284][284])
|
* modules/dwl: handle the appid status ([#284][284])
|
||||||
* battery: also show estimation for time to full ([#303][303]).
|
* battery: also show estimation for time to full ([#303][303]).
|
||||||
* on-click: tilde expansion ([#307][307])
|
* on-click: tilde expansion ([#307][307])
|
||||||
|
* script: tilde expansion of `path` ([#307][307]).
|
||||||
|
|
||||||
[246]: https://codeberg.org/dnkl/yambar/issues/246
|
[246]: https://codeberg.org/dnkl/yambar/issues/246
|
||||||
[256]: https://codeberg.org/dnkl/yambar/pulls/256
|
[256]: https://codeberg.org/dnkl/yambar/pulls/256
|
||||||
|
|
|
@ -70,7 +70,8 @@ User defined.
|
||||||
| path
|
| path
|
||||||
: string
|
: string
|
||||||
: yes
|
: yes
|
||||||
: Path to script/binary to execute. Must be an absolute path.
|
: Path to script/binary to execute. Must either be an absolute path,
|
||||||
|
or start with *~/*.
|
||||||
| args
|
| args
|
||||||
: list of strings
|
: list of strings
|
||||||
: no
|
: no
|
||||||
|
|
|
@ -631,11 +631,11 @@ run(struct module *mod)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct module *
|
static struct module *
|
||||||
script_new(const char *path, size_t argc, const char *const argv[static argc],
|
script_new(char *path, size_t argc, const char *const argv[static argc],
|
||||||
int poll_interval, struct particle *_content)
|
int poll_interval, struct particle *_content)
|
||||||
{
|
{
|
||||||
struct private *m = calloc(1, sizeof(*m));
|
struct private *m = calloc(1, sizeof(*m));
|
||||||
m->path = strdup(path);
|
m->path = path;
|
||||||
m->content = _content;
|
m->content = _content;
|
||||||
m->argc = argc;
|
m->argc = argc;
|
||||||
m->argv = malloc(argc * sizeof(m->argv[0]));
|
m->argv = malloc(argc * sizeof(m->argv[0]));
|
||||||
|
@ -655,7 +655,7 @@ script_new(const char *path, size_t argc, const char *const argv[static argc],
|
||||||
static struct module *
|
static struct module *
|
||||||
from_conf(const struct yml_node *node, struct conf_inherit inherited)
|
from_conf(const struct yml_node *node, struct conf_inherit inherited)
|
||||||
{
|
{
|
||||||
const struct yml_node *path = yml_get_value(node, "path");
|
const struct yml_node *path_node = yml_get_value(node, "path");
|
||||||
const struct yml_node *args = yml_get_value(node, "args");
|
const struct yml_node *args = yml_get_value(node, "args");
|
||||||
const struct yml_node *c = yml_get_value(node, "content");
|
const struct yml_node *c = yml_get_value(node, "content");
|
||||||
const struct yml_node *poll_interval = yml_get_value(node, "poll-interval");
|
const struct yml_node *poll_interval = yml_get_value(node, "poll-interval");
|
||||||
|
@ -673,8 +673,26 @@ from_conf(const struct yml_node *node, struct conf_inherit inherited)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *yml_path = yml_value_as_string(path_node);
|
||||||
|
char *path = NULL;
|
||||||
|
|
||||||
|
if (yml_path[0] == '~' && yml_path[1] == '/') {
|
||||||
|
const char *home_dir = getenv("HOME");
|
||||||
|
|
||||||
|
if (home_dir == NULL) {
|
||||||
|
LOG_ERRNO("failed to expand '~");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asprintf(&path, "%s/%s", home_dir, yml_path + 2) < 0) {
|
||||||
|
LOG_ERRNO("failed to expand '~");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
path = strdup(yml_path);
|
||||||
|
|
||||||
return script_new(
|
return script_new(
|
||||||
yml_value_as_string(path), argc, argv,
|
path, argc, argv,
|
||||||
poll_interval != NULL ? yml_value_as_int(poll_interval) : 0,
|
poll_interval != NULL ? yml_value_as_int(poll_interval) : 0,
|
||||||
conf_to_particle(c, inherited));
|
conf_to_particle(c, inherited));
|
||||||
}
|
}
|
||||||
|
@ -686,8 +704,13 @@ conf_verify_path(keychain_t *chain, const struct yml_node *node)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const char *path = yml_value_as_string(node);
|
const char *path = yml_value_as_string(node);
|
||||||
if (strlen(path) < 1 || path[0] != '/') {
|
|
||||||
LOG_ERR("%s: path must be absolute", conf_err_prefix(chain, node));
|
const bool is_tilde = path[0] == '~' && path[1] == '/';
|
||||||
|
const bool is_absolute = path[0] == '/';
|
||||||
|
|
||||||
|
if (!is_tilde && !is_absolute) {
|
||||||
|
LOG_ERR("%s: path must either be absolute, or begin with '~/'",
|
||||||
|
conf_err_prefix(chain, node));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue