view libvo/geometry.c @ 8644:0bfd73828e33

This patch fixes so that the exit code (or return code if you like) is set to zero when mplayer exits because of natural EOF or by the quit command. This can be useful if you (like me) use mplayer in scripts. patch by Oskar Liljeblad <oskar@osk.mine.nu>
author arpi
date Sun, 29 Dec 2002 21:06:20 +0000
parents 772d6d27fd66
children 93f78fb709e6
line wrap: on
line source

/* This file (C) Mark Zealey <mark@zealos.org> 2002, released under GPL */

#include "geometry.h"
#include "../mp_msg.h"
#include "../mplayer.h" /* exit_player() */
#include <string.h>
#include <stdlib.h> /* strtol */

/* A string of the form xpos[%]:ypos[%] */
char *vo_geometry = NULL;

int geometry_error()
{
	mp_msg(MSGT_VO, MSGL_ERR, "-geometry option format incorrect (%s)\n", vo_geometry);
	exit_player(NULL);		/* ????? what else could we do ? */
	return 0;
}

int get_num(char *s, int *num, char *end)
{
	char *e;
	long int t;

	t = strtol(s, &e, 10);

	if(e != end)
		return 0;

	*num = t;
	return 1;
}

int geometry(int *xpos, int *ypos, int scrw, int scrh, int vidw, int vidh, int fs)
{
	int xper = 0, yper = 0;
	int glen;
	char *colpos;

	*xpos = 0; *ypos = 0;

	if(vo_geometry == NULL)
		return 1;

	glen = strlen(vo_geometry);
	colpos = strchr(vo_geometry, ':');
	if(colpos == NULL)
		colpos = (char *)(vo_geometry + glen);

	/* Parse the x bit */
	if(colpos[-1] == '%') {
		if(!get_num(vo_geometry, &xper, colpos - 1))
			return geometry_error();
	} else {
		if(!get_num(vo_geometry, xpos, colpos))
			return geometry_error();
	}

	if(*colpos != '\0') {
		if(vo_geometry[glen - 1] == '%') {
			if(!get_num(colpos + 1, &yper, vo_geometry + glen - 1))
				return geometry_error();
		} else {
			if(!get_num(colpos + 1, ypos, vo_geometry + glen))
				return geometry_error();
		}
	}

	if(xper)
		*xpos = (scrw - vidw) * ((float)xper / 100.0);
	if(yper)
		*ypos = (scrh - vidh) * ((float)yper / 100.0);

	if(*xpos + vidw > scrw) {
		mp_msg(MSGT_VO, MSGL_ERR, "X position is too large\n");
		return geometry_error();
	}
	if(*ypos + vidh > scrh) {
		mp_msg(MSGT_VO, MSGL_ERR, "Y position is too large\n");
		return geometry_error();
	}

	return 1;
}