void _glfwAddOutputWayland(uint32_t name, uint32_t version) { _GLFWmonitor *monitor; struct wl_output *output; if (version < 2) { _glfwInputError(GLFW_PLATFORM_ERROR, "Wayland: Unsupported output interface version"); return; } // The actual name of this output will be set in the geometry handler. monitor = _glfwAllocMonitor(NULL, 0, 0); output = wl_registry_bind(_glfw.wl.registry, name, &wl_output_interface, 2); if (!output) { _glfwFreeMonitor(monitor); return; } monitor->wl.scale = 1; monitor->wl.output = output; monitor->wl.name = name; wl_output_add_listener(output, &outputListener, monitor); }
void _glfwFreeMonitors(_GLFWmonitor** monitors, int count) { int i; for (i = 0; i < count; i++) _glfwFreeMonitor(monitors[i]); free(monitors); }
void _glfwInputMonitor(_GLFWmonitor* monitor, int action, int placement) { if (action == GLFW_CONNECTED) { _glfw.monitorCount++; _glfw.monitors = realloc(_glfw.monitors, sizeof(_GLFWmonitor*) * _glfw.monitorCount); if (placement == _GLFW_INSERT_FIRST) { memmove(_glfw.monitors + 1, _glfw.monitors, (_glfw.monitorCount - 1) * sizeof(_GLFWmonitor*)); _glfw.monitors[0] = monitor; } else _glfw.monitors[_glfw.monitorCount - 1] = monitor; } else if (action == GLFW_DISCONNECTED) { int i; _GLFWwindow* window; for (window = _glfw.windowListHead; window; window = window->next) { if (window->monitor == monitor) { int width, height, xoff, yoff; _glfwPlatformGetWindowSize(window, &width, &height); _glfwPlatformSetWindowMonitor(window, NULL, 0, 0, width, height, 0); _glfwPlatformGetWindowFrameSize(window, &xoff, &yoff, NULL, NULL); _glfwPlatformSetWindowPos(window, xoff, yoff); } } for (i = 0; i < _glfw.monitorCount; i++) { if (_glfw.monitors[i] == monitor) { _glfw.monitorCount--; memmove(_glfw.monitors + i, _glfw.monitors + i + 1, (_glfw.monitorCount - i) * sizeof(_GLFWmonitor*)); break; } } } if (_glfw.callbacks.monitor) _glfw.callbacks.monitor((GLFWmonitor*) monitor, action); if (action == GLFW_DISCONNECTED) _glfwFreeMonitor(monitor); }
void _glfwAddOutput(uint32_t name, uint32_t version) { _GLFWmonitor *monitor; struct wl_output *output; char name_str[80]; memset(name_str, 0, 80 * sizeof(char)); snprintf(name_str, 79, "wl_output@%u", name); if (version < 2) { _glfwInputError(GLFW_PLATFORM_ERROR, "Wayland: Unsupported output interface version"); return; } monitor = _glfwAllocMonitor(name_str, 0, 0); output = wl_registry_bind(_glfw.wl.registry, name, &wl_output_interface, 2); if (!output) { _glfwFreeMonitor(monitor); return; } monitor->wl.modes = calloc(4, sizeof(_GLFWvidmodeWayland)); monitor->wl.modesSize = 4; monitor->wl.output = output; wl_output_add_listener(output, &output_listener, monitor); if (_glfw.wl.monitorsCount + 1 >= _glfw.wl.monitorsSize) { _GLFWmonitor** monitors = _glfw.wl.monitors; int size = _glfw.wl.monitorsSize * 2; monitors = realloc(monitors, size * sizeof(_GLFWmonitor*)); _glfw.wl.monitors = monitors; _glfw.wl.monitorsSize = size; } _glfw.wl.monitors[_glfw.wl.monitorsCount++] = monitor; }
void _glfwInputMonitor(_GLFWmonitor* monitor, int action, int placement) { if (action == GLFW_CONNECTED) { _glfw.monitorCount++; _glfw.monitors = realloc(_glfw.monitors, sizeof(_GLFWmonitor*) * _glfw.monitorCount); if (placement == _GLFW_INSERT_FIRST) { memmove(_glfw.monitors + 1, _glfw.monitors, (_glfw.monitorCount - 1) * sizeof(_GLFWmonitor*)); _glfw.monitors[0] = monitor; } else _glfw.monitors[_glfw.monitorCount - 1] = monitor; } else if (action == GLFW_DISCONNECTED) { int i; for (i = 0; i < _glfw.monitorCount; i++) { if (_glfw.monitors[i] == monitor) { _glfw.monitorCount--; memmove(_glfw.monitors + i, _glfw.monitors + i + 1, (_glfw.monitorCount - i) * sizeof(_GLFWmonitor*)); break; } } } if (_glfw.callbacks.monitor) _glfw.callbacks.monitor((GLFWmonitor*) monitor, action); if (action == GLFW_DISCONNECTED) _glfwFreeMonitor(monitor); }
void _glfwInputMonitorChange(void) { int i, j, monitorCount = _glfw.monitorCount; _GLFWmonitor** monitors = _glfw.monitors; _glfw.monitors = _glfwPlatformGetMonitors(&_glfw.monitorCount); // Re-use still connected monitor objects for (i = 0; i < _glfw.monitorCount; i++) { for (j = 0; j < monitorCount; j++) { if (_glfwPlatformIsSameMonitor(_glfw.monitors[i], monitors[j])) { _glfwFreeMonitor(_glfw.monitors[i]); _glfw.monitors[i] = monitors[j]; break; } } } // Find and report disconnected monitors (not in the new list) for (i = 0; i < monitorCount; i++) { _GLFWwindow* window; for (j = 0; j < _glfw.monitorCount; j++) { if (monitors[i] == _glfw.monitors[j]) break; } if (j < _glfw.monitorCount) continue; for (window = _glfw.windowListHead; window; window = window->next) { if (window->monitor == monitors[i]) window->monitor = NULL; } if (_glfw.callbacks.monitor) _glfw.callbacks.monitor((GLFWmonitor*) monitors[i], GLFW_DISCONNECTED); } // 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; if (_glfw.callbacks.monitor) _glfw.callbacks.monitor((GLFWmonitor*) _glfw.monitors[i], GLFW_CONNECTED); } _glfwFreeMonitors(monitors, monitorCount); }