mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-05 06:25:59 +01:00
internal: fix initial cursor warping (#7793)
This commit is contained in:
parent
4dbdb556fe
commit
e74efd87e5
3 changed files with 35 additions and 40 deletions
|
@ -2943,6 +2943,38 @@ PHLWINDOW CCompositor::windowForCPointer(CWindow* pWindow) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void checkDefaultCursorWarp(SP<CMonitor> monitor) {
|
||||||
|
static auto PCURSORMONITOR = CConfigValue<std::string>("cursor:default_monitor");
|
||||||
|
static bool cursorDefaultDone = false;
|
||||||
|
static bool firstLaunch = true;
|
||||||
|
|
||||||
|
const auto POS = monitor->middle();
|
||||||
|
|
||||||
|
// by default, cursor should be set to first monitor detected
|
||||||
|
// this is needed as a default if the monitor given in config above doesn't exist
|
||||||
|
if (firstLaunch) {
|
||||||
|
firstLaunch = false;
|
||||||
|
g_pCompositor->warpCursorTo(POS, true);
|
||||||
|
g_pInputManager->refocus();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!cursorDefaultDone && *PCURSORMONITOR != STRVAL_EMPTY) {
|
||||||
|
if (*PCURSORMONITOR == monitor->szName) {
|
||||||
|
cursorDefaultDone = true;
|
||||||
|
g_pCompositor->warpCursorTo(POS, true);
|
||||||
|
g_pInputManager->refocus();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// modechange happend check if cursor is on that monitor and warp it to middle to not place it out of bounds if resolution changed.
|
||||||
|
if (g_pCompositor->getMonitorFromCursor() == monitor.get()) {
|
||||||
|
g_pCompositor->warpCursorTo(POS, true);
|
||||||
|
g_pInputManager->refocus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CCompositor::onNewMonitor(SP<Aquamarine::IOutput> output) {
|
void CCompositor::onNewMonitor(SP<Aquamarine::IOutput> output) {
|
||||||
// add it to real
|
// add it to real
|
||||||
auto PNEWMONITOR = g_pCompositor->m_vRealMonitors.emplace_back(makeShared<CMonitor>(output));
|
auto PNEWMONITOR = g_pCompositor->m_vRealMonitors.emplace_back(makeShared<CMonitor>(output));
|
||||||
|
@ -2977,6 +3009,8 @@ void CCompositor::onNewMonitor(SP<Aquamarine::IOutput> output) {
|
||||||
g_pConfigManager->m_bWantsMonitorReload = true;
|
g_pConfigManager->m_bWantsMonitorReload = true;
|
||||||
g_pCompositor->scheduleFrameForMonitor(PNEWMONITOR.get(), IOutput::AQ_SCHEDULE_NEW_MONITOR);
|
g_pCompositor->scheduleFrameForMonitor(PNEWMONITOR.get(), IOutput::AQ_SCHEDULE_NEW_MONITOR);
|
||||||
|
|
||||||
|
checkDefaultCursorWarp(PNEWMONITOR);
|
||||||
|
|
||||||
for (auto const& w : g_pCompositor->m_vWindows) {
|
for (auto const& w : g_pCompositor->m_vWindows) {
|
||||||
if (w->m_iMonitorID == PNEWMONITOR->ID) {
|
if (w->m_iMonitorID == PNEWMONITOR->ID) {
|
||||||
w->m_iLastSurfaceMonitorID = MONITOR_INVALID;
|
w->m_iLastSurfaceMonitorID = MONITOR_INVALID;
|
||||||
|
|
|
@ -18,13 +18,7 @@ CPointerManager::CPointerManager() {
|
||||||
onMonitorLayoutChange();
|
onMonitorLayoutChange();
|
||||||
|
|
||||||
PMONITOR->events.modeChanged.registerStaticListener(
|
PMONITOR->events.modeChanged.registerStaticListener(
|
||||||
[this, PMONITOR](void* owner, std::any data) {
|
[this, PMONITOR](void* owner, std::any data) { g_pEventLoopManager->doLater([this, PMONITOR]() { onMonitorLayoutChange(); }); }, nullptr);
|
||||||
g_pEventLoopManager->doLater([this, PMONITOR]() {
|
|
||||||
onMonitorLayoutChange();
|
|
||||||
checkDefaultCursorWarp(PMONITOR, PMONITOR->output->name);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
nullptr);
|
|
||||||
PMONITOR->events.disconnect.registerStaticListener(
|
PMONITOR->events.disconnect.registerStaticListener(
|
||||||
[this, PMONITOR](void* owner, std::any data) { g_pEventLoopManager->doLater([this, PMONITOR]() { onMonitorLayoutChange(); }); }, nullptr);
|
[this, PMONITOR](void* owner, std::any data) { g_pEventLoopManager->doLater([this, PMONITOR]() { onMonitorLayoutChange(); }); }, nullptr);
|
||||||
PMONITOR->events.destroy.registerStaticListener(
|
PMONITOR->events.destroy.registerStaticListener(
|
||||||
|
@ -44,38 +38,6 @@ CPointerManager::CPointerManager() {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPointerManager::checkDefaultCursorWarp(SP<CMonitor> monitor, std::string monitorName) {
|
|
||||||
static auto PCURSORMONITOR = CConfigValue<std::string>("cursor:default_monitor");
|
|
||||||
static bool cursorDefaultDone = false;
|
|
||||||
static bool firstLaunch = true;
|
|
||||||
|
|
||||||
const auto POS = monitor->middle();
|
|
||||||
|
|
||||||
// by default, cursor should be set to first monitor detected
|
|
||||||
// this is needed as a default if the monitor given in config above doesn't exist
|
|
||||||
if (firstLaunch) {
|
|
||||||
firstLaunch = false;
|
|
||||||
g_pCompositor->warpCursorTo(POS, true);
|
|
||||||
g_pInputManager->refocus();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cursorDefaultDone && *PCURSORMONITOR != STRVAL_EMPTY) {
|
|
||||||
if (*PCURSORMONITOR == monitorName) {
|
|
||||||
cursorDefaultDone = true;
|
|
||||||
g_pCompositor->warpCursorTo(POS, true);
|
|
||||||
g_pInputManager->refocus();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// modechange happend check if cursor is on that monitor and warp it to middle to not place it out of bounds if resolution changed.
|
|
||||||
if (g_pCompositor->getMonitorFromCursor() == monitor.get()) {
|
|
||||||
g_pCompositor->warpCursorTo(POS, true);
|
|
||||||
g_pInputManager->refocus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CPointerManager::lockSoftwareAll() {
|
void CPointerManager::lockSoftwareAll() {
|
||||||
for (auto const& state : monitorStates)
|
for (auto const& state : monitorStates)
|
||||||
state->softwareLocks++;
|
state->softwareLocks++;
|
||||||
|
|
|
@ -26,7 +26,6 @@ class CPointerManager {
|
||||||
public:
|
public:
|
||||||
CPointerManager();
|
CPointerManager();
|
||||||
|
|
||||||
void checkDefaultCursorWarp(SP<CMonitor> monitor, std::string monitorName);
|
|
||||||
void attachPointer(SP<IPointer> pointer);
|
void attachPointer(SP<IPointer> pointer);
|
||||||
void attachTouch(SP<ITouch> touch);
|
void attachTouch(SP<ITouch> touch);
|
||||||
void attachTablet(SP<CTablet> tablet);
|
void attachTablet(SP<CTablet> tablet);
|
||||||
|
|
Loading…
Reference in a new issue