diff --git a/CMake/modules/FindMir.cmake b/CMake/modules/FindMir.cmake index 3f1fb0b3e..2104df8a3 100644 --- a/CMake/modules/FindMir.cmake +++ b/CMake/modules/FindMir.cmake @@ -1,37 +1,34 @@ -# Try to find Mir on a Unix system +# FindMir +# ------- +# Finds the Mir library # -# This will define: +# This will will define the following variables:: # -# MIR_FOUND - System has Mir -# MIR_LIBRARIES - Link these to use Mir -# MIR_INCLUDE_DIR - Include directory for Mir -# MIR_DEFINITIONS - Compiler switches required for using Mir +# MIR_FOUND - the system has Mir +# MIR_INCLUDE_DIRS - the Mir include directory +# MIR_LIBRARIES - the Mir libraries +# MIR_DEFINITIONS - the Mir definitions -if (NOT WIN32) - find_package (PkgConfig) - pkg_check_modules (PKG_MIR QUIET mirclient) - set(MIR_DEFINITIONS ${PKG_MIR_CFLAGS_OTHER}) +find_package (PkgConfig) +if(PKG_CONFIG_FOUND) + pkg_check_modules (PC_MIR mirclient>=0.26.2 QUIET) - find_path(MIR_INCLUDE_DIR - NAMES xkbcommon/xkbcommon.h - HINTS ${PC_XKBCOMMON_INCLUDE_DIR} ${PC_XKBCOMMON_INCLUDE_DIRS} - ) + find_path(MIR_INCLUDE_DIR NAMES mir_toolkit/mir_client_library.h + PATHS ${PC_MIR_INCLUDE_DIRS}) - find_library(MIR_LIBRARY - NAMES mirclient - HINTS ${PKG_MIR_LIBRARIES} ${MIR_LIBRARY_DIRS} - ) - - set (MIR_INCLUDE_DIR ${PKG_MIR_INCLUDE_DIRS}) - set (MIR_LIBRARIES ${MIR_LIBRARY}) + find_library(MIR_LIBRARY NAMES mirclient + PATHS ${PC_MIR_LIBRARIES} ${PC_MIR_LIBRARY_DIRS}) include (FindPackageHandleStandardArgs) - find_package_handle_standard_args (MIR DEFAULT_MSG - MIR_LIBRARIES - MIR_INCLUDE_DIR - ) + find_package_handle_standard_args (MIR + REQUIRED_VARS MIR_LIBRARY MIR_INCLUDE_DIR) - mark_as_advanced (MIR_LIBRARIES MIR_INCLUDE_DIR) + if (MIR_FOUND) + set(MIR_LIBRARIES ${MIR_LIBRARY}) + set(MIR_INCLUDE_DIRS ${PC_MIR_INCLUDE_DIRS}) + set(MIR_DEFINITIONS -DHAVE_MIR=1) + endif() -endif () + mark_as_advanced (MIR_LIBRARY MIR_INCLUDE_DIR) +endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e8d46fe3..67b13332d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -308,7 +308,7 @@ if (_GLFW_MIR) find_package(Mir REQUIRED) list(APPEND glfw_PKG_DEPS "mirclient") - list(APPEND glfw_INCLUDE_DIRS "${MIR_INCLUDE_DIR}") + list(APPEND glfw_INCLUDE_DIRS "${MIR_INCLUDE_DIRS}") list(APPEND glfw_LIBRARIES "${MIR_LIBRARIES}" "${CMAKE_THREAD_LIBS_INIT}") find_package(XKBCommon REQUIRED) diff --git a/src/mir_monitor.c b/src/mir_monitor.c index ae2494480..268485064 100644 --- a/src/mir_monitor.c +++ b/src/mir_monitor.c @@ -38,33 +38,41 @@ void _glfwPollMonitorsMir(void) { int i; - MirDisplayConfiguration* displayConfig = - mir_connection_create_display_config(_glfw.mir.connection); + MirDisplayConfig* displayConfig = + mir_connection_create_display_configuration(_glfw.mir.connection); - for (i = 0; i < displayConfig->num_outputs; i++) + int numOutputs = mir_display_config_get_num_outputs(displayConfig); + + for (i = 0; i < numOutputs; i++) { - const MirDisplayOutput* out = displayConfig->outputs + i; + const MirOutput* output = mir_display_config_get_output(displayConfig, i); + MirOutputConnectionState state = mir_output_get_connection_state(output); + bool enabled = mir_output_is_enabled(output); - if (out->used && - out->connected && - out->num_modes && - out->current_mode < out->num_modes) + if (enabled && state == mir_output_connection_state_connected) { - _GLFWmonitor* monitor = _glfwAllocMonitor("Unknown", - out->physical_width_mm, - out->physical_height_mm); + int widthMM = mir_output_get_physical_width_mm(output); + int heightMM = mir_output_get_physical_height_mm(output); + int x = mir_output_get_position_x(output); + int y = mir_output_get_position_y(output); + int id = mir_output_get_id(output); + size_t currentMode = mir_output_get_current_mode_index(output); + const char* name = mir_output_type_name(mir_output_get_type(output)); - monitor->mir.x = out->position_x; - monitor->mir.y = out->position_y; - monitor->mir.outputId = out->output_id; - monitor->mir.curMode = out->current_mode; + _GLFWmonitor* monitor = _glfwAllocMonitor(name, + widthMM, + heightMM); + monitor->mir.x = x; + monitor->mir.y = y; + monitor->mir.outputId = id; + monitor->mir.curMode = currentMode; monitor->modes = _glfwPlatformGetVideoModes(monitor, &monitor->modeCount); _glfwInputMonitor(monitor, GLFW_CONNECTED, _GLFW_INSERT_LAST); } } - mir_display_config_destroy(displayConfig); + mir_display_config_release(displayConfig); } @@ -80,7 +88,7 @@ void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos) *ypos = monitor->mir.y; } -void FillInRGBBitsFromPixelFormat(GLFWvidmode* mode, const MirPixelFormat pf) +static void FillInRGBBitsFromPixelFormat(GLFWvidmode* mode, const MirPixelFormat pf) { switch (pf) { @@ -117,30 +125,52 @@ GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found) { int i; GLFWvidmode* modes = NULL; - MirDisplayConfiguration* displayConfig = - mir_connection_create_display_config(_glfw.mir.connection); + MirDisplayConfig* displayConfig = + mir_connection_create_display_configuration(_glfw.mir.connection); - for (i = 0; i < displayConfig->num_outputs; i++) + int numOutputs = mir_display_config_get_num_outputs(displayConfig); + + for (i = 0; i < numOutputs; i++) { - const MirDisplayOutput* out = displayConfig->outputs + i; - if (out->output_id != monitor->mir.outputId) + const MirOutput* output = mir_display_config_get_output(displayConfig, i); + int id = mir_output_get_id(output); + + if (id != monitor->mir.outputId) continue; - modes = calloc(out->num_modes, sizeof(GLFWvidmode)); + MirOutputConnectionState state = mir_output_get_connection_state(output); + bool enabled = mir_output_is_enabled(output); - for (*found = 0; *found < out->num_modes; (*found)++) + // We must have been disconnected + if (!enabled || state != mir_output_connection_state_connected) { - modes[*found].width = out->modes[*found].horizontal_resolution; - modes[*found].height = out->modes[*found].vertical_resolution; - modes[*found].refreshRate = out->modes[*found].refresh_rate; + _glfwInputError(GLFW_PLATFORM_ERROR, + "Mir: Monitor no longer connected"); + return NULL; + } - FillInRGBBitsFromPixelFormat(&modes[*found], out->output_formats[*found]); + int numModes = mir_output_get_num_modes(output); + modes = calloc(numModes, sizeof(GLFWvidmode)); + + for (*found = 0; *found < numModes; (*found)++) + { + const MirOutputMode* mode = mir_output_get_mode(output, *found); + int width = mir_output_mode_get_width(mode); + int height = mir_output_mode_get_height(mode); + double refreshRate = mir_output_mode_get_refresh_rate(mode); + MirPixelFormat currentFormat = mir_output_get_current_pixel_format(output); + + modes[*found].width = width; + modes[*found].height = height; + modes[*found].refreshRate = refreshRate; + + FillInRGBBitsFromPixelFormat(&modes[*found], currentFormat); } break; } - mir_display_config_destroy(displayConfig); + mir_display_config_release(displayConfig); return modes; } @@ -173,4 +203,3 @@ GLFWAPI int glfwGetMirMonitor(GLFWmonitor* handle) _GLFW_REQUIRE_INIT_OR_RETURN(0); return monitor->mir.outputId; } - diff --git a/src/mir_platform.h b/src/mir_platform.h index 0931633a4..d3fd10de0 100644 --- a/src/mir_platform.h +++ b/src/mir_platform.h @@ -130,6 +130,7 @@ typedef struct _GLFWcursorMir } _GLFWcursorMir; +extern void _glfwPollMonitorsMir(void); extern void _glfwInitEventQueueMir(EventQueue* queue); extern void _glfwDeleteEventQueueMir(EventQueue* queue);