conf: add 'title' conf option and --title command line option

This commit is contained in:
Daniel Eklöf 2020-04-01 19:59:47 +02:00
parent 57761fbd50
commit ec7a768487
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
12 changed files with 65 additions and 2 deletions

View file

@ -19,7 +19,8 @@
the Wayland window. the Wayland window.
* `--app-id` command line option, that sets the _app-id_ property on * `--app-id` command line option, that sets the _app-id_ property on
the Wayland window. the Wayland window.
* **title** option to `footrc`, that sets the initial window title.
* `--title` command line option, that sets the initial window title.
### Changed ### Changed

View file

@ -33,6 +33,7 @@ print_usage(const char *prog_name)
printf("\n"); printf("\n");
printf("Options:\n"); printf("Options:\n");
printf(" -t,--term=TERM value to set the environment variable TERM to (foot)\n" printf(" -t,--term=TERM value to set the environment variable TERM to (foot)\n"
" --title=TITLE initial window title (foot)\n"
" -a,--app-id=ID window application ID (foot)\n" " -a,--app-id=ID window application ID (foot)\n"
" --maximized start in maximized mode\n" " --maximized start in maximized mode\n"
" --fullscreen start in fullscreen mode\n" " --fullscreen start in fullscreen mode\n"
@ -51,6 +52,7 @@ main(int argc, char *const *argv)
static const struct option longopts[] = { static const struct option longopts[] = {
{"term", required_argument, NULL, 't'}, {"term", required_argument, NULL, 't'},
{"title", required_argument, NULL, 'T'},
{"app-id", required_argument, NULL, 'a'}, {"app-id", required_argument, NULL, 'a'},
{"maximized", no_argument, NULL, 'm'}, {"maximized", no_argument, NULL, 'm'},
{"fullscreen", no_argument, NULL, 'F'}, {"fullscreen", no_argument, NULL, 'F'},
@ -63,6 +65,7 @@ main(int argc, char *const *argv)
}; };
const char *term = ""; const char *term = "";
const char *title = "";
const char *app_id = ""; const char *app_id = "";
const char *server_socket_path = NULL; const char *server_socket_path = NULL;
enum log_colorize log_colorize = LOG_COLORIZE_AUTO; enum log_colorize log_colorize = LOG_COLORIZE_AUTO;
@ -80,6 +83,10 @@ main(int argc, char *const *argv)
term = optarg; term = optarg;
break; break;
case 'T':
title = optarg;
break;
case 'a': case 'a':
app_id = optarg; app_id = optarg;
break; break;
@ -194,12 +201,14 @@ main(int argc, char *const *argv)
} }
const uint16_t cwd_len = strlen(cwd) + 1; const uint16_t cwd_len = strlen(cwd) + 1;
const uint16_t term_len = strlen(term) + 1; const uint16_t term_len = strlen(term) + 1;
const uint16_t title_len = strlen(title) + 1;
const uint16_t app_id_len = strlen(app_id) + 1; const uint16_t app_id_len = strlen(app_id) + 1;
uint32_t total_len = 0; uint32_t total_len = 0;
/* Calculate total length */ /* Calculate total length */
total_len += sizeof(cwd_len) + cwd_len; total_len += sizeof(cwd_len) + cwd_len;
total_len += sizeof(term_len) + term_len; total_len += sizeof(term_len) + term_len;
total_len += sizeof(title_len) + title_len;
total_len += sizeof(app_id_len) + app_id_len; total_len += sizeof(app_id_len) + app_id_len;
total_len += sizeof(uint8_t); /* maximized */ total_len += sizeof(uint8_t); /* maximized */
total_len += sizeof(uint8_t); /* fullscreen */ total_len += sizeof(uint8_t); /* fullscreen */
@ -233,6 +242,13 @@ main(int argc, char *const *argv)
goto err; goto err;
} }
if (send(fd, &title_len, sizeof(title_len), 0) != sizeof(title_len) ||
send(fd, title, title_len, 0) != title_len)
{
LOG_ERRNO("failed to send title to server");
goto err;
}
if (send(fd, &app_id_len, sizeof(app_id_len), 0) != sizeof(app_id_len) || if (send(fd, &app_id_len, sizeof(app_id_len), 0) != sizeof(app_id_len) ||
send(fd, app_id, app_id_len, 0) != app_id_len) send(fd, app_id, app_id_len, 0) != app_id_len)
{ {

View file

@ -5,6 +5,7 @@ _arguments \
'(-c --config)'{-c,--config}'[path to configuration file (XDG_CONFIG_HOME/footrc)]:config:_files' \ '(-c --config)'{-c,--config}'[path to configuration file (XDG_CONFIG_HOME/footrc)]:config:_files' \
'(-f --font)'{-f,--font}'[font name and style in fontconfig format (monospace)]:font:->fonts' \ '(-f --font)'{-f,--font}'[font name and style in fontconfig format (monospace)]:font:->fonts' \
'(-t --term)'{-t,--term}'[value to set the environment variable TERM to (foot)]:term:->terms' \ '(-t --term)'{-t,--term}'[value to set the environment variable TERM to (foot)]:term:->terms' \
'--title[initial window title]:()' \
'(-a --app-id)'{-a,--app-id}'[value to set the app-id property on the Wayland window to (foot)]:()' \ '(-a --app-id)'{-a,--app-id}'[value to set the app-id property on the Wayland window to (foot)]:()' \
'--maximized[start in maximized mode]' \ '--maximized[start in maximized mode]' \
'--fullscreen[start in fullscreen mode]' \ '--fullscreen[start in fullscreen mode]' \

View file

@ -3,6 +3,7 @@
_arguments \ _arguments \
-s \ -s \
'(-t --term)'{-t,--term}'[value to set the environment variable TERM to (foot)]:term:->terms' \ '(-t --term)'{-t,--term}'[value to set the environment variable TERM to (foot)]:term:->terms' \
'--title[initial window title]:()' \
'(-a --app-id)'{-a,--app-id}'[value to set the app-id property on the Wayland window to (foot)]:()' \ '(-a --app-id)'{-a,--app-id}'[value to set the app-id property on the Wayland window to (foot)]:()' \
'--maximized[start in maximized mode]' \ '--maximized[start in maximized mode]' \
'--fullscreen[start in fullscreen mode]' \ '--fullscreen[start in fullscreen mode]' \

View file

@ -209,6 +209,11 @@ parse_section_main(const char *key, const char *value, struct config *conf,
conf->login_shell = str_to_bool(value); conf->login_shell = str_to_bool(value);
} }
else if (strcmp(key, "title") == 0) {
free(conf->title);
conf->title = strdup(value);
}
else if (strcmp(key, "app-id") == 0) { else if (strcmp(key, "app-id") == 0) {
free(conf->app_id); free(conf->app_id);
conf->app_id = strdup(value); conf->app_id = strdup(value);
@ -832,6 +837,7 @@ config_load(struct config *conf, const char *conf_path)
*conf = (struct config) { *conf = (struct config) {
.term = strdup("foot"), .term = strdup("foot"),
.shell = get_shell(), .shell = get_shell(),
.title = strdup("foot"),
.app_id = strdup("foot"), .app_id = strdup("foot"),
.width = 700, .width = 700,
.height = 500, .height = 500,
@ -966,6 +972,7 @@ config_free(struct config conf)
{ {
free(conf.term); free(conf.term);
free(conf.shell); free(conf.shell);
free(conf.title);
free(conf.app_id); free(conf.app_id);
tll_free_and_free(conf.fonts, free); tll_free_and_free(conf.fonts, free);
free(conf.server_socket_path); free(conf.server_socket_path);

View file

@ -10,6 +10,7 @@
struct config { struct config {
char *term; char *term;
char *shell; char *shell;
char *title;
char *app_id; char *app_id;
bool login_shell; bool login_shell;
unsigned width; unsigned width;

View file

@ -36,6 +36,9 @@ execute (instead of the shell).
*-t*,*--term*=_TERM_ *-t*,*--term*=_TERM_
Value to set the environment variable *TERM* to. Default: _foot_. Value to set the environment variable *TERM* to. Default: _foot_.
*--title*=_TITLE:
Initial window title. Default: _foot_.
*-a*,*--app-id*=_ID_ *-a*,*--app-id*=_ID_
Value to set the *app-id* property on the Wayland window Value to set the *app-id* property on the Wayland window
to. Default: _foot_. to. Default: _foot_.

View file

@ -56,6 +56,9 @@ in this order:
*term* *term*
Value to set the environment variable *TERM* to. Default: _foot_. Value to set the environment variable *TERM* to. Default: _foot_.
*title*
Initial window title. Default: _foot_.
*app-id* *app-id*
Value to set the *app-id* property on the Wayland window to. The Value to set the *app-id* property on the Wayland window to. The
compositor can use this value to e.g. group multiple windows, or compositor can use this value to e.g. group multiple windows, or

View file

@ -15,6 +15,9 @@ execute (instead of the shell).
*-t*,*--term*=_TERM_ *-t*,*--term*=_TERM_
Value to set the environment variable *TERM* to. Default: _foot_. Value to set the environment variable *TERM* to. Default: _foot_.
*--title*=_TITLE:
Initial window title. Default: _foot_.
*-a*,*--app-id*=_ID_ *-a*,*--app-id*=_ID_
Value to set the *app-id* property on the Wayland window Value to set the *app-id* property on the Wayland window
to. Default: _foot_. to. Default: _foot_.

11
main.c
View file

@ -46,6 +46,7 @@ print_usage(const char *prog_name)
" -c,--config=PATH load configuration from PATH (XDG_CONFIG_HOME/footrc)\n" " -c,--config=PATH load configuration from PATH (XDG_CONFIG_HOME/footrc)\n"
" -f,--font=FONT comma separated list of fonts in fontconfig format (monospace)\n" " -f,--font=FONT comma separated list of fonts in fontconfig format (monospace)\n"
" -t,--term=TERM value to set the environment variable TERM to (foot)\n" " -t,--term=TERM value to set the environment variable TERM to (foot)\n"
" --title=TITLE initial window title (foot)\n"
" -a,--app-id=ID window application ID (foot)\n" " -a,--app-id=ID window application ID (foot)\n"
" --maximized start in maximized mode\n" " --maximized start in maximized mode\n"
" --fullscreen start in fullscreen mode\n" " --fullscreen start in fullscreen mode\n"
@ -140,6 +141,7 @@ main(int argc, char *const *argv)
static const struct option longopts[] = { static const struct option longopts[] = {
{"config", required_argument, NULL, 'c'}, {"config", required_argument, NULL, 'c'},
{"term", required_argument, NULL, 't'}, {"term", required_argument, NULL, 't'},
{"title", required_argument, NULL, 'T'},
{"app-id", required_argument, NULL, 'a'}, {"app-id", required_argument, NULL, 'a'},
{"login-shell", no_argument, NULL, 'L'}, {"login-shell", no_argument, NULL, 'L'},
{"font", required_argument, NULL, 'f'}, {"font", required_argument, NULL, 'f'},
@ -159,6 +161,7 @@ main(int argc, char *const *argv)
const char *conf_path = NULL; const char *conf_path = NULL;
const char *conf_term = NULL; const char *conf_term = NULL;
const char *conf_title = NULL;
const char *conf_app_id = NULL; const char *conf_app_id = NULL;
bool login_shell = false; bool login_shell = false;
tll(char *) conf_fonts = tll_init(); tll(char *) conf_fonts = tll_init();
@ -193,6 +196,10 @@ main(int argc, char *const *argv)
login_shell = true; login_shell = true;
break; break;
case 'T':
conf_title = optarg;
break;
case 'a': case 'a':
conf_app_id = optarg; conf_app_id = optarg;
break; break;
@ -313,6 +320,10 @@ main(int argc, char *const *argv)
free(conf.term); free(conf.term);
conf.term = strdup(conf_term); conf.term = strdup(conf_term);
} }
if (conf_title != NULL) {
free(conf.title);
conf.title = strdup(conf_title);
}
if (conf_app_id != NULL) { if (conf_app_id != NULL) {
free(conf.app_id); free(conf.app_id);
conf.app_id = strdup(conf_app_id); conf.app_id = strdup(conf_app_id);

View file

@ -74,6 +74,7 @@ client_destroy(struct client *client)
/* TODO: clone server conf completely, so that we can just call /* TODO: clone server conf completely, so that we can just call
* conf_destroy() here */ * conf_destroy() here */
free(client->conf.term); free(client->conf.term);
free(client->conf.title);
free(client->conf.app_id); free(client->conf.app_id);
free(client); free(client);
@ -225,6 +226,19 @@ fdm_client(struct fdm *fdm, int fd, int events, void *data)
goto shutdown; goto shutdown;
} }
CHECK_BUF(sizeof(uint16_t));
uint16_t title_len = *(uint16_t *)p; p += sizeof(title_len);
CHECK_BUF(title_len);
const char *title = (const char *)p; p += title_len;
LOG_DBG("app-id = %.*s", title_len, title);
if (title_len != strlen(title) + 1) {
LOG_ERR("title length mismatch: indicated = %hu, actual = %zu",
title_len - 1, strlen(title));
goto shutdown;
}
CHECK_BUF(sizeof(uint16_t)); CHECK_BUF(sizeof(uint16_t));
uint16_t app_id_len = *(uint16_t *)p; p += sizeof(app_id_len); uint16_t app_id_len = *(uint16_t *)p; p += sizeof(app_id_len);
@ -273,6 +287,8 @@ fdm_client(struct fdm *fdm, int fd, int events, void *data)
client->conf = *server->conf; client->conf = *server->conf;
client->conf.term = strlen(term_env) > 0 client->conf.term = strlen(term_env) > 0
? strdup(term_env) : strdup(server->conf->term); ? strdup(term_env) : strdup(server->conf->term);
client->conf.title = strlen(title) > 0
? strdup(title) : strdup(server->conf->title);
client->conf.app_id = strlen(app_id) > 0 client->conf.app_id = strlen(app_id) > 0
? strdup(app_id) : strdup(server->conf->app_id); ? strdup(app_id) : strdup(server->conf->app_id);
client->conf.login_shell = login_shell; client->conf.login_shell = login_shell;

View file

@ -795,7 +795,7 @@ term_init(const struct config *conf, struct fdm *fdm, struct wayland *wayl,
if (!term_font_dpi_changed(term)) if (!term_font_dpi_changed(term))
goto err; goto err;
term_set_window_title(term, "foot"); term_set_window_title(term, conf->title);
/* Let the Wayland backend know we exist */ /* Let the Wayland backend know we exist */
tll_push_back(wayl->terms, term); tll_push_back(wayl->terms, term);