Reuse same ID when reconnecting monitor, otherwise use minimum available ID (#2666)

Fixes #2601
This commit is contained in:
Tuur Vanhoutte 2023-07-09 23:08:40 +02:00 committed by GitHub
parent b33d82734f
commit b99ac063ea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 8 deletions

View file

@ -1,6 +1,7 @@
#include "Compositor.hpp" #include "Compositor.hpp"
#include "helpers/Splashes.hpp" #include "helpers/Splashes.hpp"
#include <random> #include <random>
#include <unordered_set>
#include "debug/HyprCtl.hpp" #include "debug/HyprCtl.hpp"
#include "debug/CrashReporter.hpp" #include "debug/CrashReporter.hpp"
#ifdef USES_SYSTEMD #ifdef USES_SYSTEMD
@ -1697,14 +1698,23 @@ void CCompositor::updateWindowAnimatedDecorationValues(CWindow* pWindow) {
d->updateWindow(pWindow); d->updateWindow(pWindow);
} }
int CCompositor::getNextAvailableMonitorID() { int CCompositor::getNextAvailableMonitorID(std::string const& name) {
int64_t topID = -1; // reuse ID if it's already in the map
for (auto& m : m_vRealMonitors) { if (m_mMonitorIDMap.contains(name))
if ((int64_t)m->ID > topID) return m_mMonitorIDMap[name];
topID = m->ID;
// otherwise, find minimum available ID that is not in the map
std::unordered_set<int> usedIDs;
for (auto const& monitor : m_vRealMonitors) {
usedIDs.insert(monitor->ID);
} }
return topID + 1; int nextID = 0;
while (usedIDs.count(nextID) > 0) {
nextID++;
}
m_mMonitorIDMap[name] = nextID;
return nextID;
} }
void CCompositor::swapActiveWorkspaces(CMonitor* pMonitorA, CMonitor* pMonitorB) { void CCompositor::swapActiveWorkspaces(CMonitor* pMonitorA, CMonitor* pMonitorB) {

View file

@ -101,6 +101,8 @@ class CCompositor {
std::vector<CWindow*> m_vWindowsFadingOut; std::vector<CWindow*> m_vWindowsFadingOut;
std::vector<SLayerSurface*> m_vSurfacesFadingOut; std::vector<SLayerSurface*> m_vSurfacesFadingOut;
std::unordered_map<std::string, int64_t> m_mMonitorIDMap;
void initServer(); void initServer();
void startCompositor(); void startCompositor();
void cleanup(); void cleanup();
@ -168,7 +170,7 @@ class CCompositor {
CMonitor* getMonitorInDirection(const char&); CMonitor* getMonitorInDirection(const char&);
void updateAllWindowsAnimatedDecorationValues(); void updateAllWindowsAnimatedDecorationValues();
void updateWindowAnimatedDecorationValues(CWindow*); void updateWindowAnimatedDecorationValues(CWindow*);
int getNextAvailableMonitorID(); int getNextAvailableMonitorID(std::string const & name);
void moveWorkspaceToMonitor(CWorkspace*, CMonitor*); void moveWorkspaceToMonitor(CWorkspace*, CMonitor*);
void swapActiveWorkspaces(CMonitor*, CMonitor*); void swapActiveWorkspaces(CMonitor*, CMonitor*);
CMonitor* getMonitorFromString(const std::string&); CMonitor* getMonitorFromString(const std::string&);

View file

@ -76,7 +76,7 @@ void Events::listener_newOutput(wl_listener* listener, void* data) {
Debug::log(LOG, "Adding completely new monitor."); Debug::log(LOG, "Adding completely new monitor.");
PNEWMONITORWRAP = &g_pCompositor->m_vRealMonitors.emplace_back(std::make_shared<CMonitor>()); PNEWMONITORWRAP = &g_pCompositor->m_vRealMonitors.emplace_back(std::make_shared<CMonitor>());
(*PNEWMONITORWRAP)->ID = g_pCompositor->getNextAvailableMonitorID(); (*PNEWMONITORWRAP)->ID = g_pCompositor->getNextAvailableMonitorID(OUTPUT->name);
} }
const auto PNEWMONITOR = PNEWMONITORWRAP->get(); const auto PNEWMONITOR = PNEWMONITORWRAP->get();