Merge pull request #1164 from kemenaran/qt-high-dpi-fixes
citra-qt: high-DPI fixes and Retina on OS X
This commit is contained in:
commit
87eca546b2
|
@ -24,6 +24,7 @@ set(SRCS
|
||||||
hotkeys.cpp
|
hotkeys.cpp
|
||||||
main.cpp
|
main.cpp
|
||||||
citra-qt.rc
|
citra-qt.rc
|
||||||
|
Info.plist
|
||||||
)
|
)
|
||||||
|
|
||||||
set(HEADERS
|
set(HEADERS
|
||||||
|
@ -72,6 +73,7 @@ endif()
|
||||||
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
add_executable(citra-qt MACOSX_BUNDLE ${SRCS} ${HEADERS} ${UI_HDRS})
|
add_executable(citra-qt MACOSX_BUNDLE ${SRCS} ${HEADERS} ${UI_HDRS})
|
||||||
|
set_target_properties(citra-qt PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
|
||||||
else()
|
else()
|
||||||
add_executable(citra-qt ${SRCS} ${HEADERS} ${UI_HDRS})
|
add_executable(citra-qt ${SRCS} ${HEADERS} ${UI_HDRS})
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>English</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
<key>CFBundleGetInfoString</key>
|
||||||
|
<string></string>
|
||||||
|
<key>CFBundleIconFile</key>
|
||||||
|
<string>citra.icns</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>com.citra-emu.citra</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleLongVersionString</key>
|
||||||
|
<string></string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>Citra</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>APPL</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string></string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string></string>
|
||||||
|
<key>CSResourcesFileMapped</key>
|
||||||
|
<true/>
|
||||||
|
<key>LSRequiresCarbon</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSHumanReadableCopyright</key>
|
||||||
|
<string></string>
|
||||||
|
<key>NSPrincipalClass</key>
|
||||||
|
<string>NSApplication</string>
|
||||||
|
<key>NSHighResolutionCapable</key>
|
||||||
|
<string>True</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
|
@ -181,16 +181,9 @@ void GRenderWindow::PollEvents() {
|
||||||
void GRenderWindow::OnFramebufferSizeChanged()
|
void GRenderWindow::OnFramebufferSizeChanged()
|
||||||
{
|
{
|
||||||
// Screen changes potentially incur a change in screen DPI, hence we should update the framebuffer size
|
// Screen changes potentially incur a change in screen DPI, hence we should update the framebuffer size
|
||||||
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
|
qreal pixelRatio = windowPixelRatio();
|
||||||
// windowHandle() might not be accessible until the window is displayed to screen.
|
unsigned width = child->QPaintDevice::width() * pixelRatio;
|
||||||
auto pixel_ratio = windowHandle() ? (windowHandle()->screen()->devicePixelRatio()) : 1.0;
|
unsigned height = child->QPaintDevice::height() * pixelRatio;
|
||||||
|
|
||||||
unsigned width = child->QPaintDevice::width() * pixel_ratio;
|
|
||||||
unsigned height = child->QPaintDevice::height() * pixel_ratio;
|
|
||||||
#else
|
|
||||||
unsigned width = child->QPaintDevice::width();
|
|
||||||
unsigned height = child->QPaintDevice::height();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
NotifyFramebufferLayoutChanged(EmuWindow::FramebufferLayout::DefaultScreenLayout(width, height));
|
NotifyFramebufferLayoutChanged(EmuWindow::FramebufferLayout::DefaultScreenLayout(width, height));
|
||||||
}
|
}
|
||||||
|
@ -223,6 +216,16 @@ QByteArray GRenderWindow::saveGeometry()
|
||||||
return geometry;
|
return geometry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qreal GRenderWindow::windowPixelRatio()
|
||||||
|
{
|
||||||
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
|
||||||
|
// windowHandle() might not be accessible until the window is displayed to screen.
|
||||||
|
return windowHandle() ? windowHandle()->screen()->devicePixelRatio() : 1.0f;
|
||||||
|
#else
|
||||||
|
return 1.0f;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void GRenderWindow::closeEvent(QCloseEvent* event) {
|
void GRenderWindow::closeEvent(QCloseEvent* event) {
|
||||||
emit Closed();
|
emit Closed();
|
||||||
QWidget::closeEvent(event);
|
QWidget::closeEvent(event);
|
||||||
|
@ -243,14 +246,18 @@ void GRenderWindow::mousePressEvent(QMouseEvent *event)
|
||||||
if (event->button() == Qt::LeftButton)
|
if (event->button() == Qt::LeftButton)
|
||||||
{
|
{
|
||||||
auto pos = event->pos();
|
auto pos = event->pos();
|
||||||
this->TouchPressed(static_cast<unsigned>(pos.x()), static_cast<unsigned>(pos.y()));
|
qreal pixelRatio = windowPixelRatio();
|
||||||
|
this->TouchPressed(static_cast<unsigned>(pos.x() * pixelRatio),
|
||||||
|
static_cast<unsigned>(pos.y() * pixelRatio));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GRenderWindow::mouseMoveEvent(QMouseEvent *event)
|
void GRenderWindow::mouseMoveEvent(QMouseEvent *event)
|
||||||
{
|
{
|
||||||
auto pos = event->pos();
|
auto pos = event->pos();
|
||||||
this->TouchMoved(static_cast<unsigned>(std::max(pos.x(), 0)), static_cast<unsigned>(std::max(pos.y(), 0)));
|
qreal pixelRatio = windowPixelRatio();
|
||||||
|
this->TouchMoved(std::max(static_cast<unsigned>(pos.x() * pixelRatio), 0u),
|
||||||
|
std::max(static_cast<unsigned>(pos.y() * pixelRatio), 0u));
|
||||||
}
|
}
|
||||||
|
|
||||||
void GRenderWindow::mouseReleaseEvent(QMouseEvent *event)
|
void GRenderWindow::mouseReleaseEvent(QMouseEvent *event)
|
||||||
|
|
|
@ -111,6 +111,8 @@ public:
|
||||||
void restoreGeometry(const QByteArray& geometry); // overridden
|
void restoreGeometry(const QByteArray& geometry); // overridden
|
||||||
QByteArray saveGeometry(); // overridden
|
QByteArray saveGeometry(); // overridden
|
||||||
|
|
||||||
|
qreal windowPixelRatio();
|
||||||
|
|
||||||
void closeEvent(QCloseEvent* event) override;
|
void closeEvent(QCloseEvent* event) override;
|
||||||
|
|
||||||
void keyPressEvent(QKeyEvent* event) override;
|
void keyPressEvent(QKeyEvent* event) override;
|
||||||
|
|
Reference in New Issue