eglfs: Allow setting screen size through environment variables.
[profile/ivi/qtbase.git] / src / plugins / platforms / eglfs / qeglfshooks_stub.cpp
index c0e202f..3c944e6 100644 (file)
 
 #include "qeglfshooks.h"
 
+#include <fcntl.h>
+#include <unistd.h>
+#include <linux/fb.h>
+#include <sys/ioctl.h>
+
 QT_BEGIN_NAMESPACE
 
 void QEglFSHooks::platformInit()
@@ -58,12 +63,80 @@ EGLNativeDisplayType QEglFSHooks::platformDisplay() const
 
 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;
 }
 
@@ -78,6 +151,12 @@ bool QEglFSHooks::hasCapability(QPlatformIntegration::Capability cap) const
     return false;
 }
 
+QEglFSCursor *QEglFSHooks::createCursor(QEglFSScreen *screen) const
+{
+    Q_UNUSED(screen);
+    return 0;
+}
+
 #ifndef EGLFS_PLATFORM_HOOKS
 QEglFSHooks stubHooks;
 #endif