diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b9e33f0..9e07b308 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,6 +72,8 @@ means foot can be PGO:d in e.g. sandboxed build scripts. See implements foot's old font sizing behavior. But, when **disabled**, foot will ignore the monitors' DPI and instead size fonts using the scale factor alone (https://codeberg.org/dnkl/foot/issues/206). +* `-w,--window-size-pixels` and `-W,--window-size-chars` command line + options to `footclient`. ### Changed diff --git a/client-protocol.h b/client-protocol.h index cf99c1d9..a99d4ecf 100644 --- a/client-protocol.h +++ b/client-protocol.h @@ -10,6 +10,9 @@ struct client_argv { }; struct client_data { + unsigned width; + unsigned height; + uint8_t size_type:1; // Values correspond to enum conf_size_type uint8_t maximized:1; uint8_t fullscreen:1; uint8_t hold:1; diff --git a/client.c b/client.c index a9d823c7..9887c514 100644 --- a/client.c +++ b/client.c @@ -37,6 +37,8 @@ print_usage(const char *prog_name) 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" + " -w,--window-size-pixels=WIDTHxHEIGHT initial width and height, in pixels\n" + " -W,--window-size-chars=WIDTHxHEIGHT initial width and height, in characters\n" " --maximized start in maximized mode\n" " --fullscreen start in fullscreen mode\n" " --login-shell start shell as a login shell\n" @@ -54,23 +56,28 @@ main(int argc, char *const *argv) const char *const prog_name = argv[0]; static const struct option longopts[] = { - {"term", required_argument, NULL, 't'}, - {"title", required_argument, NULL, 'T'}, - {"app-id", required_argument, NULL, 'a'}, - {"maximized", no_argument, NULL, 'm'}, - {"fullscreen", no_argument, NULL, 'F'}, - {"login-shell", no_argument, NULL, 'L'}, - {"server-socket", required_argument, NULL, 's'}, - {"hold", no_argument, NULL, 'H'}, - {"log-colorize", optional_argument, NULL, 'l'}, - {"version", no_argument, NULL, 'v'}, - {"help", no_argument, NULL, 'h'}, - {NULL, no_argument, NULL, 0}, + {"term", required_argument, NULL, 't'}, + {"title", required_argument, NULL, 'T'}, + {"app-id", required_argument, NULL, 'a'}, + {"window-size-pixels", required_argument, NULL, 'w'}, + {"window-size-chars", required_argument, NULL, 'W'}, + {"maximized", no_argument, NULL, 'm'}, + {"fullscreen", no_argument, NULL, 'F'}, + {"login-shell", no_argument, NULL, 'L'}, + {"server-socket", required_argument, NULL, 's'}, + {"hold", no_argument, NULL, 'H'}, + {"log-colorize", optional_argument, NULL, 'l'}, + {"version", no_argument, NULL, 'v'}, + {"help", no_argument, NULL, 'h'}, + {NULL, no_argument, NULL, 0}, }; const char *term = ""; const char *title = ""; const char *app_id = ""; + unsigned size_type = 0; // enum conf_size_type (without pulling in tllist/fcft via config.h) + unsigned width = 0; + unsigned height = 0; const char *server_socket_path = NULL; enum log_colorize log_colorize = LOG_COLORIZE_AUTO; bool login_shell = false; @@ -79,7 +86,7 @@ main(int argc, char *const *argv) bool hold = false; while (true) { - int c = getopt_long(argc, argv, "+t:T:a:mFLs:Hl::vh", longopts, NULL); + int c = getopt_long(argc, argv, "+t:T:a:w:W:mFLs:Hl::vh", longopts, NULL); if (c == -1) break; @@ -100,6 +107,22 @@ main(int argc, char *const *argv) login_shell = true; break; + case 'w': + if (sscanf(optarg, "%ux%u", &width, &height) != 2 || width == 0 || height == 0) { + fprintf(stderr, "error: invalid window-size-pixels: %s\n", optarg); + return EXIT_FAILURE; + } + size_type = 0; // CONF_SIZE_PX + break; + + case 'W': + if (sscanf(optarg, "%ux%u", &width, &height) != 2 || width == 0 || height == 0) { + fprintf(stderr, "error: invalid window-size-chars: %s\n", optarg); + return EXIT_FAILURE; + } + size_type = 1; // CONF_SIZE_CELLS + break; + case 'm': maximized = true; fullscreen = false; @@ -215,6 +238,9 @@ main(int argc, char *const *argv) const size_t app_id_len = strlen(app_id) + 1; const struct client_data data = { + .width = width, + .height = height, + .size_type = size_type, .maximized = maximized, .fullscreen = fullscreen, .hold = hold, diff --git a/completions/zsh/_footclient b/completions/zsh/_footclient index a1307e97..3c375fd1 100644 --- a/completions/zsh/_footclient +++ b/completions/zsh/_footclient @@ -8,6 +8,8 @@ _arguments \ '--maximized[start in maximized mode]' \ '--fullscreen[start in fullscreen mode]' \ '--login-shell[start shell as a login shell]' \ + '(-w --window-size-pixels)'{-w,--window-size-pixels}'[window WIDTHxHEIGHT, in pixels (700x500)]:size_pixels:()' \ + '(-W --window-size-chars)'{-W,--window-size-chars}'[window WIDTHxHEIGHT, in characters (not set)]:size_chars:()' \ '(-s --server-socket)'{-s,--server-socket}'[override the default path to the foot server socket ($XDG_RUNTIME_DIR/foot-$WAYLAND_DISPLAY.sock)]:server:_files' \ '--hold[remain open after child process exits]' \ '(-l --log-colorize)'{-l,--log-colorize}'[enable or disable colorization of log output on stderr]:logcolor:(never always auto)' \ diff --git a/doc/footclient.1.scd b/doc/footclient.1.scd index 5da91119..cc520391 100644 --- a/doc/footclient.1.scd +++ b/doc/footclient.1.scd @@ -32,6 +32,12 @@ terminal has terminated). Value to set the *app-id* property on the Wayland window to. Default: _foot_. +*-w*,*--window-size-pixels*=_WIDTHxHEIGHT_ + Set initial window width and height, in pixels. Default: _700x500_. + +*-W*,*--window-size-chars*=_WIDTHxHEIGHT_ + Set initial window width and height, in characters. Default: _not set_. + *--maximized* Start in maximized mode. If both *--maximized* and *--fullscreen* are specified, the _last_ one takes precedence. diff --git a/server.c b/server.c index 464fc1f1..6e2f514f 100644 --- a/server.c +++ b/server.c @@ -263,6 +263,22 @@ fdm_client(struct fdm *fdm, int fd, int events, void *data) else if (cdata.fullscreen) client->conf.startup_mode = STARTUP_FULLSCREEN; + if (cdata.width > 0 && cdata.height > 0) { + client->conf.size.type = cdata.size_type; + + switch (cdata.size_type) { + case CONF_SIZE_PX: + client->conf.size.px.width = cdata.width; + client->conf.size.px.height = cdata.height; + break; + + case CONF_SIZE_CELLS: + client->conf.size.cells.width = cdata.width; + client->conf.size.cells.height = cdata.height; + break; + } + } + client->term = term_init( &client->conf, server->fdm, server->reaper, server->wayl, "footclient", cwd, cdata.argc, argv, &term_shutdown_handler, client);