[vlc-devel] [PATCH] Qt: Properly report vout size when HiDPI scaling enabled

Steve Lhomme robux4 at gmail.com
Mon Jan 30 10:10:11 CET 2017


This patch solves HiDPI issues on Windows.

On Sat, Oct 15, 2016 at 8:09 PM, Anatoliy Anischovich
<lin.aaa.lin at gmail.com> wrote:
> ---
>  modules/gui/qt/components/interface_widgets.cpp | 61 ++++++++++++++++++++++---
>  modules/gui/qt/components/interface_widgets.hpp |  3 ++
>  modules/gui/qt/qt.hpp                           |  1 +
>  3 files changed, 59 insertions(+), 6 deletions(-)
>
> diff --git a/modules/gui/qt/components/interface_widgets.cpp b/modules/gui/qt/components/interface_widgets.cpp
> index db590c5..a7c0c25 100644
> --- a/modules/gui/qt/components/interface_widgets.cpp
> +++ b/modules/gui/qt/components/interface_widgets.cpp
> @@ -62,6 +62,11 @@
>  #   include <qx11info_x11.h>
>  #endif
>
> +#if defined(_WIN32) && HAS_QT5
> +#include <QWindow>
> +#include <qpa/qplatformnativeinterface.h>
> +#endif
> +
>  #include <math.h>
>  #include <assert.h>
>
> @@ -178,6 +183,53 @@ WId VideoWidget::request( struct vout_window_t *p_wnd, unsigned int *pi_width,
>      return stable->winId();
>  }
>
> +void VideoWidget::reportSize()
> +{
> +    if( !p_window )
> +        return;
> +
> +    unsigned int w, h;
> +
> +#if defined(Q_WS_X11) && HAS_QT5
> +    Display *p_x_display = QX11Info::display();
> +    Window x_window = stable->winId();
> +    XWindowAttributes x_attributes;
> +
> +    XGetWindowAttributes( p_x_display, x_window, &x_attributes );
> +
> +    w = x_attributes.width;
> +    h = x_attributes.height;
> +#elif defined(_WIN32) && HAS_QT5
> +    HWND hwnd;
> +    RECT rect;
> +
> +    QWindow *window = stable->windowHandle();
> +    hwnd = static_cast<HWND>(QGuiApplication::platformNativeInterface()->nativeResourceForWindow("handle", window));
> +
> +    GetClientRect(hwnd, &rect);
> +
> +    w = rect.right;
> +    h = rect.bottom;
> +#else
> +    QSize current_size = size();
> +
> +#   if HAS_QT56
> +    /* Android-like scaling */
> +    current_size *= devicePixelRatioF();
> +#   elif HAS_QT54
> +    /* OSX-like scaling */
> +    current_size *= devicePixelRatio();
> +#   else
> +#       warning "No HiDPI support"
> +#   endif
> +
> +    w = current_size.width();
> +    h = current_size.height();
> +#endif
> +
> +    vout_window_ReportSize( p_window, w, h );
> +}
> +
>  /* Set the Widget to the correct Size */
>  /* Function has to be called by the parent
>     Parent has to care about resizing itself */
> @@ -188,8 +240,7 @@ void VideoWidget::setSize( unsigned int w, unsigned int h )
>       */
>      if( (unsigned)size().width() == w && (unsigned)size().height() == h )
>      {
> -        if( p_window != NULL )
> -            vout_window_ReportSize( p_window, w, h );
> +        reportSize();
>          return;
>      }
>
> @@ -207,11 +258,9 @@ void VideoWidget::setSize( unsigned int w, unsigned int h )
>
>  void VideoWidget::resizeEvent( QResizeEvent *event )
>  {
> -    if( p_window != NULL )
> -        vout_window_ReportSize( p_window, event->size().width(),
> -                                event->size().height() );
> -
>      QWidget::resizeEvent( event );
> +
> +    reportSize();
>  }
>
>  void VideoWidget::release( void )
> diff --git a/modules/gui/qt/components/interface_widgets.hpp b/modules/gui/qt/components/interface_widgets.hpp
> index a07119e..6257187 100644
> --- a/modules/gui/qt/components/interface_widgets.hpp
> +++ b/modules/gui/qt/components/interface_widgets.hpp
> @@ -77,6 +77,9 @@ private:
>
>      QWidget *stable;
>      QLayout *layout;
> +
> +    void reportSize();
> +
>  signals:
>      void sizeChanged( int, int );
>
> diff --git a/modules/gui/qt/qt.hpp b/modules/gui/qt/qt.hpp
> index 99ce132..9459896 100644
> --- a/modules/gui/qt/qt.hpp
> +++ b/modules/gui/qt/qt.hpp
> @@ -47,6 +47,7 @@
>  #endif
>
>  #define HAS_QT5  ( QT_VERSION >= 0x050000 )
> +#define HAS_QT54 ( QT_VERSION >= 0x050400 )
>  #define HAS_QT56 ( QT_VERSION >= 0x050600 )
>
>  /* Q_DECL_OVERRIDE is a Qt5 feature, add empty define to not break with Qt4 */
> --
> 2.7.3
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list