blob: fb306b88bcdb9aa92f34187c38f57aeca49460f7 [file] [log] [blame]
/* GStreamer Wayland video sink
*
* Copyright 2018 NXP
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <math.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <ctype.h>
#include "wlutils.h"
#define WESTON_INI "/etc/xdg/weston/weston.ini"
/* FIXME: try to get from wayland server */
#define PANEL_HEIGH 32
gboolean
gst_wl_init_surface_state(GstWlDisplay * display, GstWlWindow * window)
{
gchar path[] = WESTON_INI;
gchar line[512], *p, *section = NULL, *size = NULL;
gint fd, n, i;
gint desktop_width, desktop_height;
gboolean found_config = FALSE;
gboolean ret = TRUE;
struct stat filestat;
FILE *fp;
if ((fd = open (path, O_RDONLY)) == -1) {
return FALSE;
}
if (fstat(fd, &filestat) < 0 ||
!S_ISREG(filestat.st_mode)) {
close(fd);
return FALSE;
}
fp = fdopen(fd, "r");
if (fp == NULL) {
close(fd);
return FALSE;
}
while (fgets(line, sizeof line, fp)) {
if (found_config)
break;
switch (line[0]) {
case '#':
case '\n':
continue;
case '[':
p = strchr(&line[1], ']');
if (!p || p[1] != '\n') {
continue;
}
p[0] = '\0';
if (section)
g_free (section);
section = g_strdup(&line[1]);
continue;
default:
if (section && strcmp (section, "shell") == 0) {
p = strchr(line, '=');
if (!p || p == line) {
continue;
}
p[0] = '\0';
if (strcmp (&line[0], "size") == 0) {
p++;
while (isspace(*p))
p++;
i = strlen(p);
while (i > 0 && isspace(p[i - 1])) {
p[i - 1] = '\0';
i--;
}
if (strlen(p) > 0) {
if (size)
g_free (size);
size = g_strdup(p);
found_config = TRUE;
}
}
}
continue;
}
}
if (found_config && size) {
n = sscanf(size, "%dx%d\n", &desktop_width, &desktop_height);
if (n != 2) {
ret = FALSE;
goto out;
}
} else {
ret = FALSE;
goto out;
}
/* FIXME: only support buffer scale 2 and 1 */
if (display->width > 0 && display->height > 0) {
window->scale = display->width / desktop_width;
if (window->scale != 1 && window->scale != 2) {
ret = FALSE;
goto out;
}
window->fullscreen_width = desktop_width;
window->fullscreen_height = desktop_height - PANEL_HEIGH;
} else {
ret = FALSE;
goto out;
}
out:
if (section)
g_free (section);
if (size)
g_free (size);
fclose(fp);
return ret;
}