terminal: Add some functionality to the -g flag

This commit is contained in:
K. Lange 2021-11-25 12:21:49 +09:00
parent 15f6240f6e
commit a5d8d2b92e

View File

@ -151,6 +151,9 @@ static int32_t r_y = -1;
static uint32_t window_width = 640; static uint32_t window_width = 640;
static uint32_t window_height = 480; static uint32_t window_height = 480;
static bool window_position_set = 0;
static int32_t window_left = 0;
static int32_t window_top = 0;
#define TERMINAL_TITLE_SIZE 512 #define TERMINAL_TITLE_SIZE 512
static char terminal_title[TERMINAL_TITLE_SIZE]; static char terminal_title[TERMINAL_TITLE_SIZE];
static size_t terminal_title_length = 0; static size_t terminal_title_length = 0;
@ -2230,6 +2233,51 @@ static void render_decors_callback(struct menu_bar * self) {
render_decors(); render_decors();
} }
/**
* Geometry argument follows this format:
* [@]WxH[+X,Y]
*
* If @ is present, W and H are in characters.
* If + is present, X and Y are the left and top offset.
*/
static void parse_geometry(char ** argv, char * str) {
int in_chars = 0;
if (*str == '@') {
in_chars = 1;
str++;
}
/* Split on 'x', which is required. */
char * c = strstr(str, "x");
if (!c) return; /* Ignore invalid arg */
*c = '\0';
c++;
/* Find optional + that starts position */
char * plus = strstr(c, "+");
if (plus) {
*plus = '\0';
plus++;
}
/* Parse size */
window_width = atoi(str) * (in_chars ? char_width : 1);
window_height = atoi(c) * (in_chars ? char_height : 1);
if (plus) {
/* If there was a plus, let's look for a comma */
char * comma = strstr(plus, ",");
if (!comma) return; /* Skip invalid position */
*comma = '\0';
comma++;
window_position_set = 1;
window_left = atoi(plus);
window_top = atoi(comma);
}
}
int main(int argc, char ** argv) { int main(int argc, char ** argv) {
window_width = char_width * 80; window_width = char_width * 80;
@ -2243,13 +2291,12 @@ int main(int argc, char ** argv) {
{"grid", no_argument, 0, 'x'}, {"grid", no_argument, 0, 'x'},
{"no-frame", no_argument, 0, 'n'}, {"no-frame", no_argument, 0, 'n'},
{"geometry", required_argument, 0, 'g'}, {"geometry", required_argument, 0, 'g'},
{"no-ft", no_argument, 0, 'f'},
{0,0,0,0} {0,0,0,0}
}; };
/* Read some arguments */ /* Read some arguments */
int index, c; int index, c;
while ((c = getopt_long(argc, argv, "bhxnfFls:g:", long_opts, &index)) != -1) { while ((c = getopt_long(argc, argv, "bhxnFls:g:", long_opts, &index)) != -1) {
if (!c) { if (!c) {
if (long_opts[index].flag == 0) { if (long_opts[index].flag == 0) {
c = long_opts[index].val; c = long_opts[index].val;
@ -2278,15 +2325,7 @@ int main(int argc, char ** argv) {
font_scaling = atof(optarg); font_scaling = atof(optarg);
break; break;
case 'g': case 'g':
{ parse_geometry(argv,optarg);
char * c = strstr(optarg, "x");
if (c) {
*c = '\0';
c++;
window_width = atoi(optarg);
window_height = atoi(c);
}
}
break; break;
case '?': case '?':
break; break;
@ -2401,8 +2440,13 @@ int main(int argc, char ** argv) {
/* Clear to black */ /* Clear to black */
draw_fill(ctx, rgba(0,0,0,0)); draw_fill(ctx, rgba(0,0,0,0));
/* Move window to screen center (XXX maybe remove this and do better window placement elsewhere */ if (window_position_set) {
yutani_window_move(yctx, window, yctx->display_width / 2 - window->width / 2, yctx->display_height / 2 - window->height / 2); /* Move to requested position */
yutani_window_move(yctx, window, window_left, window_top);
} else {
/* Move window to screen center */
yutani_window_move(yctx, window, yctx->display_width / 2 - window->width / 2, yctx->display_height / 2 - window->height / 2);
}
/* Open a PTY */ /* Open a PTY */
openpty(&fd_master, &fd_slave, NULL, NULL, NULL); openpty(&fd_master, &fd_slave, NULL, NULL, NULL);