diff --git a/src/internal.h b/src/internal.h index 1e84bbc6..c9a7ccc3 100644 --- a/src/internal.h +++ b/src/internal.h @@ -388,6 +388,7 @@ GLboolean _glfwIsValidContext(_GLFWwindow* window, _GLFWwndconfig* wndconfig); // Monitor management (monitor.c) void _glfwInitMonitors(void); +void _glfwRefreshMonitors(void); void _glfwTerminateMonitors(void); #endif // _internal_h_ diff --git a/src/monitor.c b/src/monitor.c index 138637f8..0cc8f511 100644 --- a/src/monitor.c +++ b/src/monitor.c @@ -154,6 +154,90 @@ void _glfwInitMonitors(void) _glfwLibrary.monitorListHead = _glfwCreateMonitors(); } +//======================================================================== +// Refresh monitor list and notify callback. +//======================================================================== + +void _glfwRefreshMonitors(void) +{ + _GLFWmonitor* newMonitorList; + _GLFWmonitor* curNewMonitor; + _GLFWmonitor* curOldMonitor; + + newMonitorList = _glfwCreateMonitors(); + curNewMonitor = newMonitorList; + curOldMonitor = _glfwLibrary.monitorListHead; + + while (_glfwLibrary.monitorCallback && (curNewMonitor || curOldMonitor)) + { + _GLFWmonitor* lookAheadOldMonitor; + _GLFWmonitor* lookAheadNewMonitor; + + if (curOldMonitor && curNewMonitor && !strcmp(curOldMonitor->name, curOldMonitor->name)) + { + curNewMonitor = curNewMonitor->next; + curOldMonitor = curOldMonitor->next; + continue; + } + + if (curNewMonitor && !curOldMonitor) + { + _glfwLibrary.monitorCallback(curNewMonitor, GLFW_MONITOR_CONNECTED); + curNewMonitor = curNewMonitor->next; + continue; + } + + if (!curNewMonitor && curOldMonitor) + { + _glfwLibrary.monitorCallback(curOldMonitor, GLFW_MONITOR_DISCONNECTED); + curOldMonitor = curOldMonitor->next; + continue; + } + + lookAheadOldMonitor = curOldMonitor->next; + lookAheadNewMonitor = curNewMonitor->next; + + while (lookAheadOldMonitor && !strcmp(curNewMonitor->name, lookAheadOldMonitor->name)) + lookAheadOldMonitor = lookAheadOldMonitor->next; + + while (lookAheadNewMonitor && !strcmp(curOldMonitor->name, lookAheadNewMonitor->name)) + lookAheadNewMonitor = lookAheadNewMonitor->next; + + if (!lookAheadOldMonitor) + { + // nothing found in the old monitor list, that matches the current new monitor. + _glfwLibrary.monitorCallback(curNewMonitor, GLFW_MONITOR_CONNECTED); + curNewMonitor = curNewMonitor->next; + } + else + { + while (strcmp(curOldMonitor->name, lookAheadOldMonitor->name)) + { + _glfwLibrary.monitorCallback(curOldMonitor, GLFW_MONITOR_DISCONNECTED); + curOldMonitor = curOldMonitor->next; + } + } + + if (!lookAheadNewMonitor) + { + // nothing found in the new monitor list, that matches the current old monitor. + _glfwLibrary.monitorCallback(curOldMonitor, GLFW_MONITOR_DISCONNECTED); + curOldMonitor = curOldMonitor->next; + } + else + { + while (strcmp(curNewMonitor->name, lookAheadNewMonitor->name)) + { + _glfwLibrary.monitorCallback(curNewMonitor, GLFW_MONITOR_CONNECTED); + curNewMonitor = curNewMonitor->next; + } + } + } + + _glfwTerminateMonitors(); + _glfwLibrary.monitorListHead = newMonitorList; +} + //======================================================================== // Delete the monitor list. //======================================================================== diff --git a/src/win32_monitor.c b/src/win32_monitor.c index 7aad70d9..506394b0 100644 --- a/src/win32_monitor.c +++ b/src/win32_monitor.c @@ -117,81 +117,3 @@ _GLFWmonitor* _glfwCreateMonitors(void) return monitorList; } -void _glfwRefreshMonitors(void) -{ - _GLFWmonitor* curNewMonitor; - _GLFWmonitor* curOldMonitor; - - curNewMonitor = _glfwCreateMonitors(); - curOldMonitor = _glfwLibrary.monitorListHead; - - while (_glfwLibrary.monitorCallback && (curNewMonitor || curOldMonitor)) - { - _GLFWmonitor* lookAheadOldMonitor; - _GLFWmonitor* lookAheadNewMonitor; - - if (curOldMonitor && curNewMonitor && !strcmp(curOldMonitor->name, curOldMonitor->name)) - { - curNewMonitor = curNewMonitor->next; - curOldMonitor = curOldMonitor->next; - continue; - } - - if (curNewMonitor && !curOldMonitor) - { - _glfwLibrary.monitorCallback(curNewMonitor, GLFW_MONITOR_CONNECTED); - curNewMonitor = curNewMonitor->next; - continue; - } - - if (!curNewMonitor && curOldMonitor) - { - _glfwLibrary.monitorCallback(curOldMonitor, GLFW_MONITOR_DISCONNECTED); - curOldMonitor = curOldMonitor->next; - continue; - } - - lookAheadOldMonitor = curOldMonitor->next; - lookAheadNewMonitor = curNewMonitor->next; - - while (lookAheadOldMonitor && !strcmp(curNewMonitor->name, lookAheadOldMonitor->name)) - lookAheadOldMonitor = lookAheadOldMonitor->next; - - while (lookAheadNewMonitor && !strcmp(curOldMonitor->name, lookAheadNewMonitor->name)) - lookAheadNewMonitor = lookAheadNewMonitor->next; - - if (!lookAheadOldMonitor) - { - // nothing found in the old monitor list, that matches the current new monitor. - _glfwLibrary.monitorCallback(curNewMonitor, GLFW_MONITOR_CONNECTED); - curNewMonitor = curNewMonitor->next; - } - else - { - while (strcmp(curOldMonitor->name, lookAheadOldMonitor->name)) - { - _glfwLibrary.monitorCallback(curOldMonitor, GLFW_MONITOR_DISCONNECTED); - curOldMonitor = curOldMonitor->next; - } - } - - if (!lookAheadNewMonitor) - { - // nothing found in the new monitor list, that matches the current old monitor. - _glfwLibrary.monitorCallback(curOldMonitor, GLFW_MONITOR_DISCONNECTED); - curOldMonitor = curOldMonitor->next; - } - else - { - while (strcmp(curNewMonitor->name, lookAheadNewMonitor->name)) - { - _glfwLibrary.monitorCallback(curNewMonitor, GLFW_MONITOR_CONNECTED); - curNewMonitor = curNewMonitor->next; - } - } - } - - _glfwTerminateMonitors(); - _glfwLibrary.monitorListHead = newMonitorList; -} - diff --git a/src/win32_platform.h b/src/win32_platform.h index 64cc61ff..4a1dded8 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -337,8 +337,6 @@ typedef struct _GLFWmonitorWin32 void _glfwInitTimer(void); // Monitor support -void _glfwInitMonitors(void); -void _glfwRefreshMonitors(void); _GLFWmonitor* _glfwCreateMonitors(void); _GLFWmonitor* _glfwDestroyMonitor(_GLFWmonitor* monitor);