#include "qeglfshooks.h"
+#include <fcntl.h>
+#include <unistd.h>
+#include <linux/fb.h>
+#include <sys/ioctl.h>
+
+QT_BEGIN_NAMESPACE
+
void QEglFSHooks::platformInit()
{
}
QSize QEglFSHooks::screenSize() const
{
- return QSize();
+ static QSize size;
+
+ if (size.isEmpty()) {
+ int width = qgetenv("QT_QPA_EGLFS_WIDTH").toInt();
+ int height = qgetenv("QT_QPA_EGLFS_HEIGHT").toInt();
+
+ if (width && height) {
+ // no need to read fb0
+ size.setWidth(width);
+ size.setHeight(height);
+ return size;
+ }
+
+ struct fb_var_screeninfo vinfo;
+ int fd = open("/dev/fb0", O_RDONLY);
+
+ if (fd != -1) {
+ if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) == -1)
+ qWarning("Could not query variable screen info.");
+ else
+ size = QSize(vinfo.xres, vinfo.yres);
+
+ close(fd);
+ } else {
+ qWarning("Failed to open /dev/fb0 to detect screen resolution.");
+ }
+
+ // override fb0 from environment var setting
+ if (width)
+ size.setWidth(width);
+ if (height)
+ size.setHeight(height);
+ }
+
+ return size;
}
-EGLNativeWindowType QEglFSHooks::createNativeWindow(const QSize &size)
+int QEglFSHooks::screenDepth() const
+{
+ static int depth = qgetenv("QT_QPA_EGLFS_DEPTH").toInt();
+
+ if (depth == 0) {
+ struct fb_var_screeninfo vinfo;
+ int fd = open("/dev/fb0", O_RDONLY);
+
+ if (fd != -1) {
+ if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) == -1)
+ qWarning("Could not query variable screen info.");
+ else
+ depth = vinfo.bits_per_pixel;
+
+ close(fd);
+ } else {
+ qWarning("Failed to open /dev/fb0 to detect screen depth.");
+ }
+ }
+
+ return depth == 0 ? 32 : depth;
+}
+
+QImage::Format QEglFSHooks::screenFormat() const
+{
+ return screenDepth() == 16 ? QImage::Format_RGB16 : QImage::Format_RGB32;
+}
+
+QSurfaceFormat QEglFSHooks::surfaceFormatFor(const QSurfaceFormat &inputFormat) const
+{
+ return inputFormat;
+}
+
+EGLNativeWindowType QEglFSHooks::createNativeWindow(const QSize &size, const QSurfaceFormat &format)
{
Q_UNUSED(size);
+ Q_UNUSED(format);
return 0;
}
return false;
}
+QEglFSCursor *QEglFSHooks::createCursor(QEglFSScreen *screen) const
+{
+ Q_UNUSED(screen);
+ return 0;
+}
+
#ifndef EGLFS_PLATFORM_HOOKS
QEglFSHooks stubHooks;
#endif
+
+QT_END_NAMESPACE