terminal: Add some functionality to the -g flag
This commit is contained in:
parent
15f6240f6e
commit
a5d8d2b92e
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user