summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2018-10-03 17:34:27 +1000
committerStenzek <stenzek@gmail.com>2018-10-29 11:46:06 +1000
commita7f334dc2a3eec0119d8b77ec3ff35bbc8aae5f9 (patch)
treed26810619b5fdefa7526619f3ae1dbd8155b9685 /Source
parent2b905eb06a806bc654281910d92693e2dcb6f201 (diff)
ControllerInterface: Don't crash on non-X11 QPA
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/Core/Core.cpp2
-rw-r--r--Source/Core/DolphinQt/MainWindow.cpp21
-rw-r--r--Source/Core/DolphinQt/MainWindow.h2
-rw-r--r--Source/Core/InputCommon/ControllerInterface/ControllerInterface.cpp20
-rw-r--r--Source/Core/InputCommon/ControllerInterface/ControllerInterface.h7
5 files changed, 33 insertions, 19 deletions
diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp
index c64eb1e22e..fff3e6bfff 100644
--- a/Source/Core/Core/Core.cpp
+++ b/Source/Core/Core/Core.cpp
@@ -459,7 +459,7 @@ static void EmuThread(std::unique_ptr<BootParameters> boot, WindowSystemInfo wsi
bool init_controllers = false;
if (!g_controller_interface.IsInit())
{
- g_controller_interface.Initialize(wsi.render_surface);
+ g_controller_interface.Initialize(wsi);
Pad::Initialize();
Keyboard::Initialize();
init_controllers = true;
diff --git a/Source/Core/DolphinQt/MainWindow.cpp b/Source/Core/DolphinQt/MainWindow.cpp
index ec15365e55..f02542da95 100644
--- a/Source/Core/DolphinQt/MainWindow.cpp
+++ b/Source/Core/DolphinQt/MainWindow.cpp
@@ -169,6 +169,7 @@ MainWindow::MainWindow(std::unique_ptr<BootParameters> boot_parameters) : QMainW
setWindowIcon(Resources::GetAppIcon());
setUnifiedTitleAndToolBarOnMac(true);
setAcceptDrops(true);
+ setAttribute(Qt::WA_NativeWindow);
InitControllers();
@@ -237,7 +238,7 @@ void MainWindow::InitControllers()
if (g_controller_interface.IsInit())
return;
- g_controller_interface.Initialize(reinterpret_cast<void*>(winId()));
+ g_controller_interface.Initialize(GetWindowSystemInfo(windowHandle()));
Pad::Initialize();
Keyboard::Initialize();
Wiimote::Initialize(Wiimote::InitializeMode::DO_NOT_WAIT_FOR_WIIMOTES);
@@ -874,7 +875,8 @@ void MainWindow::SetFullScreenResolution(bool fullscreen)
// Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
ChangeDisplaySettings(&screen_settings, CDS_FULLSCREEN);
#elif defined(HAVE_XRANDR) && HAVE_XRANDR
- m_xrr_config->ToggleDisplayMode(fullscreen);
+ if (m_xrr_config)
+ m_xrr_config->ToggleDisplayMode(fullscreen);
#endif
}
@@ -1003,14 +1005,18 @@ void MainWindow::ShowGraphicsWindow()
if (!m_graphics_window)
{
#if defined(HAVE_XRANDR) && HAVE_XRANDR
- m_xrr_config = std::make_unique<X11Utils::XRRConfiguration>(
- static_cast<Display*>(QGuiApplication::platformNativeInterface()->nativeResourceForWindow(
- "display", windowHandle())),
- winId());
+ if (GetWindowSystemType() == WindowSystemType::X11)
+ {
+ m_xrr_config = std::make_unique<X11Utils::XRRConfiguration>(
+ static_cast<Display*>(QGuiApplication::platformNativeInterface()->nativeResourceForWindow(
+ "display", windowHandle())),
+ winId());
+ }
m_graphics_window = new GraphicsWindow(m_xrr_config.get(), this);
#else
m_graphics_window = new GraphicsWindow(nullptr, this);
#endif
+ InstallHotkeyFilter(m_graphics_window);
}
m_graphics_window->show();
@@ -1273,7 +1279,8 @@ void MainWindow::NetPlayQuit()
void MainWindow::EnableScreenSaver(bool enable)
{
#if defined(HAVE_XRANDR) && HAVE_XRANDR
- UICommon::EnableScreenSaver(winId(), enable);
+ if (GetWindowSystemType() == WindowSystemType::X11)
+ UICommon::EnableScreenSaver(winId(), enable);
#else
UICommon::EnableScreenSaver(enable);
#endif
diff --git a/Source/Core/DolphinQt/MainWindow.h b/Source/Core/DolphinQt/MainWindow.h
index eaec778b5d..937e3beb7c 100644
--- a/Source/Core/DolphinQt/MainWindow.h
+++ b/Source/Core/DolphinQt/MainWindow.h
@@ -173,7 +173,7 @@ private:
MenuBar* m_menu_bar;
SearchBar* m_search_bar;
GameList* m_game_list;
- RenderWidget* m_render_widget;
+ RenderWidget* m_render_widget = nullptr;
bool m_rendering_to_main;
bool m_stop_requested = false;
bool m_exit_requested = false;
diff --git a/Source/Core/InputCommon/ControllerInterface/ControllerInterface.cpp b/Source/Core/InputCommon/ControllerInterface/ControllerInterface.cpp
index 0e6857c137..7be22d4a8d 100644
--- a/Source/Core/InputCommon/ControllerInterface/ControllerInterface.cpp
+++ b/Source/Core/InputCommon/ControllerInterface/ControllerInterface.cpp
@@ -41,12 +41,12 @@ ControllerInterface g_controller_interface;
//
// Detect devices and inputs outputs / will make refresh function later
//
-void ControllerInterface::Initialize(void* const hwnd)
+void ControllerInterface::Initialize(const WindowSystemInfo& wsi)
{
if (m_is_init)
return;
- m_hwnd = hwnd;
+ m_wsi = wsi;
m_is_populating_devices = true;
#ifdef CIFACE_USE_DINPUT
@@ -59,7 +59,8 @@ void ControllerInterface::Initialize(void* const hwnd)
// nothing needed
#endif
#ifdef CIFACE_USE_OSX
- ciface::OSX::Init(hwnd);
+ if (m_wsi.type == WindowSystemType::MacOS)
+ ciface::OSX::Init(wsi.render_surface);
// nothing needed for Quartz
#endif
#ifdef CIFACE_USE_SDL
@@ -92,17 +93,22 @@ void ControllerInterface::RefreshDevices()
m_is_populating_devices = true;
#ifdef CIFACE_USE_DINPUT
- ciface::DInput::PopulateDevices(reinterpret_cast<HWND>(m_hwnd));
+ if (m_wsi.type == WindowSystemType::Windows)
+ ciface::DInput::PopulateDevices(reinterpret_cast<HWND>(m_wsi.render_surface));
#endif
#ifdef CIFACE_USE_XINPUT
ciface::XInput::PopulateDevices();
#endif
#ifdef CIFACE_USE_XLIB
- ciface::XInput2::PopulateDevices(m_hwnd);
+ if (m_wsi.type == WindowSystemType::X11)
+ ciface::XInput2::PopulateDevices(m_wsi.render_surface);
#endif
#ifdef CIFACE_USE_OSX
- ciface::OSX::PopulateDevices(m_hwnd);
- ciface::Quartz::PopulateDevices(m_hwnd);
+ if (m_wsi.type == WindowSystemType::MacOS)
+ {
+ ciface::OSX::PopulateDevices(m_wsi.render_surface);
+ ciface::Quartz::PopulateDevices(m_wsi.render_surface);
+ }
#endif
#ifdef CIFACE_USE_SDL
ciface::SDL::PopulateDevices();
diff --git a/Source/Core/InputCommon/ControllerInterface/ControllerInterface.h b/Source/Core/InputCommon/ControllerInterface/ControllerInterface.h
index c576b20fb3..2e078e8934 100644
--- a/Source/Core/InputCommon/ControllerInterface/ControllerInterface.h
+++ b/Source/Core/InputCommon/ControllerInterface/ControllerInterface.h
@@ -10,6 +10,7 @@
#include <mutex>
#include <vector>
+#include "Common/WindowSystemInfo.h"
#include "InputCommon/ControllerInterface/Device.h"
// enable disable sources
@@ -39,8 +40,8 @@
class ControllerInterface : public ciface::Core::DeviceContainer
{
public:
- ControllerInterface() : m_is_init(false), m_hwnd(nullptr) {}
- void Initialize(void* const hwnd);
+ ControllerInterface() : m_is_init(false) {}
+ void Initialize(const WindowSystemInfo& wsi);
void RefreshDevices();
void Shutdown();
void AddDevice(std::shared_ptr<ciface::Core::Device> device);
@@ -56,7 +57,7 @@ private:
mutable std::mutex m_callbacks_mutex;
bool m_is_init;
std::atomic<bool> m_is_populating_devices{false};
- void* m_hwnd;
+ WindowSystemInfo m_wsi;
};
extern ControllerInterface g_controller_interface;