ecore_fb_init(): use 'name' parameter similar to ecore_evas_fb_new().

Instead of assuming /dev/fb/0 or /dev/fb0, use the given 'name'
parameter in a similar way to ecore_evas_fb_new(): a number to be
parsed with 'strtoul()'.

Without this calling ecore_evas_fb_new() or ecore_evas_new() with
'display=1' will produce incorrect results.

@fix
This commit is contained in:
Gustavo Sverzut Barbieri 2017-01-03 12:41:07 -02:00
parent 3f84aac424
commit 806be7adc0
1 changed files with 31 additions and 8 deletions

View File

@ -4,8 +4,9 @@
#include "Ecore_Fb.h" #include "Ecore_Fb.h"
#include "ecore_fb_private.h" #include "ecore_fb_private.h"
#include <limits.h>
static void _ecore_fb_size_get(int *w, int *h); static void _ecore_fb_size_get(const char *name, int *w, int *h);
static int _ecore_fb_init_count = 0; static int _ecore_fb_init_count = 0;
static int _ecore_fb_console_w = 0; static int _ecore_fb_console_w = 0;
@ -38,7 +39,7 @@ nosigint(int val EINA_UNUSED)
* the Ecore_Fb library. * the Ecore_Fb library.
*/ */
EAPI int EAPI int
ecore_fb_init(const char *name EINA_UNUSED) ecore_fb_init(const char *name)
{ {
if (++_ecore_fb_init_count != 1) if (++_ecore_fb_init_count != 1)
return _ecore_fb_init_count; return _ecore_fb_init_count;
@ -51,7 +52,7 @@ ecore_fb_init(const char *name EINA_UNUSED)
oldhand = signal(SIGINT, nosigint); oldhand = signal(SIGINT, nosigint);
} }
_ecore_fb_size_get(&_ecore_fb_console_w, &_ecore_fb_console_h); _ecore_fb_size_get(name, &_ecore_fb_console_w, &_ecore_fb_console_h);
return _ecore_fb_init_count; return _ecore_fb_init_count;
} }
@ -103,7 +104,7 @@ ecore_fb_size_get(int *w, int *h)
} }
static void static void
_ecore_fb_size_get(int *w, int *h) _ecore_fb_size_get(const char *name, int *w, int *h)
{ {
struct fb_var_screeninfo fb_var; struct fb_var_screeninfo fb_var;
int fb; int fb;
@ -113,18 +114,40 @@ _ecore_fb_size_get(int *w, int *h)
(getuid() == geteuid()) && (getuid() == geteuid()) &&
#endif #endif
(getenv("EVAS_FB_DEV"))) (getenv("EVAS_FB_DEV")))
fb = open(getenv("EVAS_FB_DEV"), O_RDWR); {
fb = open(getenv("EVAS_FB_DEV"), O_RDWR);
if (fb < 0)
fprintf(stderr, "[ecore_fb] error opening $EVAS_FB_DEV=%s: %s\n", getenv("EVAS_FB_DEV"), strerror(errno));
}
else else
{ {
fb = open("/dev/fb/0", O_RDWR); char dev[PATH_MAX];
int device;
/* consistent with ecore_evas_default_display in ecore_evas_fb.c */
if (!name) name = "0";
/* consistent with ecore_evas_fb.c -> evas_fb_main.c */
device = strtol(name, NULL, 10);
snprintf(dev, sizeof(dev), "/dev/fb/%i", device);
fb = open(dev, O_RDWR);
if (fb == -1) if (fb == -1)
fb = open("/dev/fb0", O_RDWR); {
snprintf(dev, sizeof(dev), "/dev/fb%i", device);
fb = open(dev, O_RDWR);
if (fb < 0)
fprintf(stderr, "[ecore_fb] error opening /dev/fb/%i and /dev/fb%i: %s\n", device, device, strerror(errno));
}
} }
if (fb < 0) if (fb < 0)
goto exit; goto exit;
if (ioctl(fb, FBIOGET_VSCREENINFO, &fb_var) == -1) if (ioctl(fb, FBIOGET_VSCREENINFO, &fb_var) == -1)
goto err_ioctl; {
perror("[ecore_fb] ioctl FBIOGET_VSCREENINFO");
goto err_ioctl;
}
*w = fb_var.xres; *w = fb_var.xres;
*h = fb_var.yres; *h = fb_var.yres;