|
@@ -94,62 +94,72 @@ static int refreshVideoModes(_GLFWmonitor* monitor)
|
|
|
|
|
|
void _glfwInputMonitorChange(void)
|
|
|
{
|
|
|
- int i, j, monitorCount;
|
|
|
- _GLFWmonitor** monitors;
|
|
|
+ int i, j, monitorCount = _glfw.monitorCount;
|
|
|
+ _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)
|
|
|
- continue;
|
|
|
-
|
|
|
- if (_glfwPlatformIsSameMonitor(monitors[i], _glfw.monitors[j]))
|
|
|
+ if (_glfwPlatformIsSameMonitor(_glfw.monitors[i], monitors[j]))
|
|
|
{
|
|
|
- // This monitor was connected before, so re-use the existing
|
|
|
- // monitor object to preserve its address and user pointer
|
|
|
-
|
|
|
- _glfwDestroyMonitor(monitors[i]);
|
|
|
- monitors[i] = _glfw.monitors[j];
|
|
|
- _glfw.monitors[j] = NULL;
|
|
|
+ _glfwDestroyMonitor(_glfw.monitors[i]);
|
|
|
+ _glfw.monitors[i] = monitors[j];
|
|
|
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
|
|
|
- // Report them as disconnected
|
|
|
+ // Find and report disconnected monitors (not in the new list)
|
|
|
|
|
|
- for (i = 0; i < _glfw.monitorCount; i++)
|
|
|
+ for (i = 0; i < monitorCount; i++)
|
|
|
{
|
|
|
_GLFWwindow* window;
|
|
|
|
|
|
- if (_glfw.monitors[i] == NULL)
|
|
|
- continue;
|
|
|
+ for (j = 0; j < _glfw.monitorCount; j++)
|
|
|
+ {
|
|
|
+ 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)
|
|
|
{
|
|
|
- if (window->monitor == _glfw.monitors[i])
|
|
|
+ if (window->monitor == monitors[i])
|
|
|
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;
|
|
|
- _glfw.monitorCount = monitorCount;
|
|
|
+ _glfwDestroyMonitors(monitors, monitorCount);
|
|
|
}
|
|
|
|
|
|
|