diff options
-rw-r--r-- | mkspecs/unsupported/android-g++/qeglfshooks_surfaceflinger.cpp | 65 | ||||
-rw-r--r-- | src/plugins/platforms/eglfs/qeglfshooks.h | 5 | ||||
-rw-r--r-- | src/plugins/platforms/eglfs/qeglfshooks_stub.cpp | 46 | ||||
-rw-r--r-- | src/plugins/platforms/eglfs/qeglfsscreen.cpp | 5 | ||||
-rw-r--r-- | src/plugins/platforms/eglfs/qeglfsscreen.h | 2 |
5 files changed, 54 insertions, 69 deletions
diff --git a/mkspecs/unsupported/android-g++/qeglfshooks_surfaceflinger.cpp b/mkspecs/unsupported/android-g++/qeglfshooks_surfaceflinger.cpp index 689300dbde..78a1eb183e 100644 --- a/mkspecs/unsupported/android-g++/qeglfshooks_surfaceflinger.cpp +++ b/mkspecs/unsupported/android-g++/qeglfshooks_surfaceflinger.cpp @@ -63,9 +63,8 @@ class QEglFSPandaHooks : public QEglFSHooks public: QEglFSPandaHooks(); virtual EGLNativeWindowType createNativeWindow(const QSize &size, const QSurfaceFormat &format); - virtual QSize screenSize() const; - virtual int screenDepth() const; virtual bool filterConfig(EGLDisplay display, EGLConfig config) const; + virtual const char *fbDeviceName() const { return "/dev/graphics/fb0"; } private: EGLNativeWindowType createNativeWindowSurfaceFlinger(const QSize &size, const QSurfaceFormat &format); @@ -152,68 +151,6 @@ bool QEglFSPandaHooks::filterConfig(EGLDisplay display, EGLConfig config) const return nativeVisualId == mFramebufferVisualId; } -QSize QEglFSPandaHooks::screenSize() const -{ - 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/graphics/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/graphics/fb0 to detect screen resolution."); - } - - // override fb0 from environment var setting - if (width) - size.setWidth(width); - if (height) - size.setHeight(height); - } - - return size; -} - -int QEglFSPandaHooks::screenDepth() const -{ - static int depth = qgetenv("QT_QPA_EGLFS_DEPTH").toInt(); - - if (depth == 0) { - struct fb_var_screeninfo vinfo; - int fd = open("/dev/graphics/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/graphics/fb0 to detect screen depth."); - } - } - - return depth == 0 ? 32 : depth; -} - static QEglFSPandaHooks eglFSPandaHooks; QEglFSHooks *platformHooks = &eglFSPandaHooks; diff --git a/src/plugins/platforms/eglfs/qeglfshooks.h b/src/plugins/platforms/eglfs/qeglfshooks.h index b8b699fea1..f3b6a28e70 100644 --- a/src/plugins/platforms/eglfs/qeglfshooks.h +++ b/src/plugins/platforms/eglfs/qeglfshooks.h @@ -55,10 +55,11 @@ class QEglFSScreen; class QEglFSHooks { public: - virtual ~QEglFSHooks() {}; + virtual ~QEglFSHooks() {} virtual void platformInit(); virtual void platformDestroy(); virtual EGLNativeDisplayType platformDisplay() const; + virtual QSizeF physicalScreenSize() const; virtual QSize screenSize() const; virtual int screenDepth() const; virtual QImage::Format screenFormat() const; @@ -68,6 +69,8 @@ public: virtual bool hasCapability(QPlatformIntegration::Capability cap) const; virtual QEglFSCursor *createCursor(QEglFSScreen *screen) const; virtual bool filterConfig(EGLDisplay display, EGLConfig config) const; + + virtual const char *fbDeviceName() const; }; #ifdef EGLFS_PLATFORM_HOOKS diff --git a/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp b/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp index 0fd22e1757..d09423ec72 100644 --- a/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp +++ b/src/plugins/platforms/eglfs/qeglfshooks_stub.cpp @@ -48,6 +48,11 @@ QT_BEGIN_NAMESPACE +const char *QEglFSHooks::fbDeviceName() const +{ + return "/dev/fb0"; +} + void QEglFSHooks::platformInit() { Q_UNUSED(hooks); @@ -62,6 +67,39 @@ EGLNativeDisplayType QEglFSHooks::platformDisplay() const return EGL_DEFAULT_DISPLAY; } +QSizeF QEglFSHooks::physicalScreenSize() const +{ + static QSizeF size; + if (size.isEmpty()) { + + // Note: in millimeters + int width = qgetenv("QT_QPA_EGLFS_PHYSICAL_WIDTH").toInt(); + int height = qgetenv("QT_QPA_EGLFS_PHYSICAL_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(fbDeviceName(), O_RDONLY); + + if (fd != -1) { + if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) == -1) + qWarning("Could not query variable screen info."); + else + size = QSizeF(vinfo.width, vinfo.height); + + close(fd); + } else { + qWarning("Failed to open %s to detect screen size.", fbDeviceName()); + } + } + return size; +} + QSize QEglFSHooks::screenSize() const { static QSize size; @@ -78,7 +116,7 @@ QSize QEglFSHooks::screenSize() const } struct fb_var_screeninfo vinfo; - int fd = open("/dev/fb0", O_RDONLY); + int fd = open(fbDeviceName(), O_RDONLY); if (fd != -1) { if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) == -1) @@ -88,7 +126,7 @@ QSize QEglFSHooks::screenSize() const close(fd); } else { - qWarning("Failed to open /dev/fb0 to detect screen resolution."); + qWarning("Failed to open %s to detect screen depth.", fbDeviceName()); } // override fb0 from environment var setting @@ -107,7 +145,7 @@ int QEglFSHooks::screenDepth() const if (depth == 0) { struct fb_var_screeninfo vinfo; - int fd = open("/dev/fb0", O_RDONLY); + int fd = open(fbDeviceName(), O_RDONLY); if (fd != -1) { if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo) == -1) @@ -117,7 +155,7 @@ int QEglFSHooks::screenDepth() const close(fd); } else { - qWarning("Failed to open /dev/fb0 to detect screen depth."); + qWarning("Failed to open %s to detect screen depth.", fbDeviceName()); } } diff --git a/src/plugins/platforms/eglfs/qeglfsscreen.cpp b/src/plugins/platforms/eglfs/qeglfsscreen.cpp index 1bc1e944de..43d7cb3b1f 100644 --- a/src/plugins/platforms/eglfs/qeglfsscreen.cpp +++ b/src/plugins/platforms/eglfs/qeglfsscreen.cpp @@ -83,6 +83,11 @@ QImage::Format QEglFSScreen::format() const return hooks->screenFormat(); } +QSizeF QEglFSScreen::physicalSize() const +{ + return hooks->physicalScreenSize(); +} + QPlatformCursor *QEglFSScreen::cursor() const { return m_cursor; diff --git a/src/plugins/platforms/eglfs/qeglfsscreen.h b/src/plugins/platforms/eglfs/qeglfsscreen.h index 309791d6c2..8d3c5dbaec 100644 --- a/src/plugins/platforms/eglfs/qeglfsscreen.h +++ b/src/plugins/platforms/eglfs/qeglfsscreen.h @@ -63,6 +63,8 @@ public: int depth() const; QImage::Format format() const; + QSizeF physicalSize() const; + QPlatformCursor *cursor() const; EGLDisplay display() const { return m_dpy; } |