Made glfwGetMonitors work from monitor callback.

master
Camilla Berglund ago%!(EXTRA string=12 years)
parent 98cbf6fda1
commit b4e0ee418e
  1. 74
      src/monitor.c

@ -94,62 +94,72 @@ static int refreshVideoModes(_GLFWmonitor* monitor)
void _glfwInputMonitorChange(void) void _glfwInputMonitorChange(void)
{ {
int i, j, monitorCount; int i, j, monitorCount = _glfw.monitorCount;
_GLFWmonitor** monitors; _GLFWmonitor** monitors = _glfw.monitors;
monitors = _glfwPlatformGetMonitors(&monitorCount); _glfw.monitors = _glfwPlatformGetMonitors(&_glfw.monitorCount);
// Re-use unchanged monitors and report new ones // Re-use still connected monitor objects
for (i = 0; i < monitorCount; i++) for (i = 0; i < _glfw.monitorCount; i++)
{ {
for (j = 0; j < _glfw.monitorCount; j++) for (j = 0; j < monitorCount; j++)
{ {
if (_glfw.monitors[j] == NULL) if (_glfwPlatformIsSameMonitor(_glfw.monitors[i], monitors[j]))
continue;
if (_glfwPlatformIsSameMonitor(monitors[i], _glfw.monitors[j]))
{ {
// This monitor was connected before, so re-use the existing _glfwDestroyMonitor(_glfw.monitors[i]);
// monitor object to preserve its address and user pointer _glfw.monitors[i] = monitors[j];
_glfwDestroyMonitor(monitors[i]);
monitors[i] = _glfw.monitors[j];
_glfw.monitors[j] = NULL;
break; break;
} }
} }
if (j == _glfw.monitorCount)
{
// This monitor was not connected before
_glfw.monitorCallback((GLFWmonitor*) monitors[i], GLFW_CONNECTED);
}
} }
// The only monitors remaining in the global list are the disconnected ones // Find and report disconnected monitors (not in the new list)
// Report them as disconnected
for (i = 0; i < _glfw.monitorCount; i++) for (i = 0; i < monitorCount; i++)
{ {
_GLFWwindow* window; _GLFWwindow* window;
if (_glfw.monitors[i] == NULL) for (j = 0; j < _glfw.monitorCount; j++)
continue; {
if (monitors[i] == _glfw.monitors[j])
break;
}
_glfw.monitorCallback((GLFWmonitor*) _glfw.monitors[i], GLFW_DISCONNECTED); if (j < _glfw.monitorCount)
continue;
for (window = _glfw.windowListHead; window; window = window->next) for (window = _glfw.windowListHead; window; window = window->next)
{ {
if (window->monitor == _glfw.monitors[i]) if (window->monitor == monitors[i])
window->monitor = NULL; window->monitor = NULL;
} }
_glfw.monitorCallback((GLFWmonitor*) monitors[i], GLFW_DISCONNECTED);
} }
_glfwDestroyMonitors(_glfw.monitors, _glfw.monitorCount); // Find and report newly connected monitors (not in the old list)
// Re-used monitor objects are then removed from the old list to avoid
// having them destroyed at the end of this function
for (i = 0; i < _glfw.monitorCount; i++)
{
for (j = 0; j < monitorCount; j++)
{
if (_glfw.monitors[i] == monitors[j])
{
monitors[j] = NULL;
break;
}
}
if (j < monitorCount)
continue;
_glfw.monitorCallback((GLFWmonitor*) _glfw.monitors[i], GLFW_CONNECTED);
}
_glfw.monitors = monitors; _glfwDestroyMonitors(monitors, monitorCount);
_glfw.monitorCount = monitorCount;
} }

Loading…
Cancel
Save