Mir: Remove this experimental backend

As of the release of MirĀ 1.0, libmirclient has been deprecated[1] and
its developers recommend clients using it to switch to Wayland.  This
patch removes support for libmirclient and instruct users to use the
experimental Wayland backend instead.

[1] https://discourse.ubuntu.com/t/mir-news-28th-september-2018/8184
diff --git a/CMake/modules/FindMir.cmake b/CMake/modules/FindMir.cmake
deleted file mode 100644
index 2104df8..0000000
--- a/CMake/modules/FindMir.cmake
+++ /dev/null
@@ -1,34 +0,0 @@
-# FindMir
-# -------
-# Finds the Mir library
-#
-# This will will define the following variables::
-#
-# MIR_FOUND        - the system has Mir
-# MIR_INCLUDE_DIRS - the Mir include directory
-# MIR_LIBRARIES    - the Mir libraries
-# MIR_DEFINITIONS  - the Mir definitions
-
-
-find_package (PkgConfig)
-if(PKG_CONFIG_FOUND)
-  pkg_check_modules (PC_MIR mirclient>=0.26.2 QUIET)
-
-  find_path(MIR_INCLUDE_DIR NAMES mir_toolkit/mir_client_library.h
-                            PATHS ${PC_MIR_INCLUDE_DIRS})
-
-  find_library(MIR_LIBRARY NAMES mirclient
-                           PATHS ${PC_MIR_LIBRARIES} ${PC_MIR_LIBRARY_DIRS})
-
-  include (FindPackageHandleStandardArgs)
-  find_package_handle_standard_args (MIR
-                                     REQUIRED_VARS MIR_LIBRARY 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()
-
-  mark_as_advanced (MIR_LIBRARY MIR_INCLUDE_DIR)
-endif()
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d46d364..fcd6da1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -35,7 +35,6 @@
 
 if (UNIX AND NOT APPLE)
     option(GLFW_USE_WAYLAND "Use Wayland for window creation" OFF)
-    option(GLFW_USE_MIR     "Use Mir for window creation" OFF)
 endif()
 
 if (MSVC)
@@ -141,9 +140,6 @@
 if (GLFW_USE_WAYLAND)
     set(_GLFW_WAYLAND 1)
     message(STATUS "Using Wayland for window creation")
-elseif (GLFW_USE_MIR)
-    set(_GLFW_MIR 1)
-    message(STATUS "Using Mir for window creation")
 elseif (GLFW_USE_OSMESA)
     set(_GLFW_OSMESA 1)
     message(STATUS "Using OSMesa for headless context creation")
@@ -287,22 +283,6 @@
 endif()
 
 #--------------------------------------------------------------------
-# Use Mir for window creation
-#--------------------------------------------------------------------
-if (_GLFW_MIR)
-    find_package(Mir REQUIRED)
-    list(APPEND glfw_PKG_DEPS "mirclient")
-
-    list(APPEND glfw_INCLUDE_DIRS "${MIR_INCLUDE_DIRS}")
-    list(APPEND glfw_LIBRARIES "${MIR_LIBRARIES}" "${CMAKE_THREAD_LIBS_INIT}")
-
-    find_package(XKBCommon REQUIRED)
-    list(APPEND glfw_PKG_DEPS "xkbcommon")
-    list(APPEND glfw_INCLUDE_DIRS "${XKBCOMMON_INCLUDE_DIRS}")
-    list(APPEND glfw_LIBRARIES "${XKBCOMMON_LIBRARY}")
-endif()
-
-#--------------------------------------------------------------------
 # Use OSMesa for offscreen context creation
 #--------------------------------------------------------------------
 if (_GLFW_OSMESA)
diff --git a/README.md b/README.md
index 6eaa796..6d4e678 100644
--- a/README.md
+++ b/README.md
@@ -11,8 +11,8 @@
 creating windows, contexts and surfaces, reading input, handling events, etc.
 
 GLFW natively supports Windows, macOS and Linux and other Unix-like systems.
-Experimental implementations for the Wayland protocol and the Mir display server
-are available but not yet officially supported.
+An experimental implementation for the Wayland protocol is available but not
+yet officially supported.
 
 GLFW is licensed under the [zlib/libpng
 license](http://www.glfw.org/license.html).
diff --git a/deps/vulkan/vulkan.h b/deps/vulkan/vulkan.h
index bf35a3a..4ffdeb9 100644
--- a/deps/vulkan/vulkan.h
+++ b/deps/vulkan/vulkan.h
@@ -35,12 +35,6 @@
 #endif

 

 

-#ifdef VK_USE_PLATFORM_MIR_KHR

-#include <mir_toolkit/client_types.h>

-#include "vulkan_mir.h"

-#endif

-

-

 #ifdef VK_USE_PLATFORM_VI_NN

 #include "vulkan_vi.h"

 #endif

diff --git a/docs/Doxyfile.in b/docs/Doxyfile.in
index c2069c5..51f2b09 100644
--- a/docs/Doxyfile.in
+++ b/docs/Doxyfile.in
@@ -1573,7 +1573,6 @@
                          GLFW_EXPOSE_NATIVE_WGL     \
                          GLFW_EXPOSE_NATIVE_X11     \
                          GLFW_EXPOSE_NATIVE_WAYLAND \
-                         GLFW_EXPOSE_NATIVE_MIR     \
                          GLFW_EXPOSE_NATIVE_GLX     \
                          GLFW_EXPOSE_NATIVE_COCOA   \
                          GLFW_EXPOSE_NATIVE_NSGL    \
diff --git a/docs/compat.dox b/docs/compat.dox
index 5146319..ade24ec 100644
--- a/docs/compat.dox
+++ b/docs/compat.dox
@@ -277,9 +277,4 @@
 glfwGetRequiredInstanceExtensions will return an empty list and window surface
 creation will fail.
 
-GLFW uses the `VK_KHR_surface` and `VK_KHR_mir_surface` extensions to create
-surfaces on Mir.  If any of these extensions are not available, @ref
-glfwGetRequiredInstanceExtensions will return an empty list and window surface
-creation will fail.
-
 */
diff --git a/docs/compile.dox b/docs/compile.dox
index 756559a..762143a 100644
--- a/docs/compile.dox
+++ b/docs/compile.dox
@@ -268,7 +268,6 @@
  - @b _GLFW_WIN32 to use the Win32 API
  - @b _GLFW_X11 to use the X Window System
  - @b _GLFW_WAYLAND to use the Wayland API (experimental and incomplete)
- - @b _GLFW_MIR to use the Mir API (experimental and incomplete)
  - @b _GLFW_OSMESA to use the OSMesa API (headless and non-interactive)
 
 If you are building GLFW as a shared library / dynamic library / DLL then you
diff --git a/docs/news.dox b/docs/news.dox
index 9e75d7f..d751f13 100644
--- a/docs/news.dox
+++ b/docs/news.dox
@@ -173,6 +173,14 @@
 glfwSetX11SelectionString.
 
 
+@subsection news_33_mir_removal Experimental Mir support has been removed
+
+As per the release of Mir 1.0, the recommended API is now Wayland, the
+experimental Mir display server backend introduced in GLFW 3.1 has thus been
+removed.  To use the experimental Wayland backend, pass -DGLFW_USE_WAYLAND=ON
+to cmake where you previously passed the now-removed -DGLFW_USE_MIR=ON.
+
+
 @section news_32 Release notes for 3.2
 
 
diff --git a/docs/window.dox b/docs/window.dox
index ca3f364..355a74e 100644
--- a/docs/window.dox
+++ b/docs/window.dox
@@ -337,7 +337,7 @@
 will fail.
 
 @par
-__Wayland, Mir:__ The EGL API _is_ the native context creation API, so this hint
+__Wayland:__ The EGL API _is_ the native context creation API, so this hint
 will have no effect.
 
 @par
diff --git a/include/GLFW/glfw3native.h b/include/GLFW/glfw3native.h
index 4372cb7..83d3ca4 100644
--- a/include/GLFW/glfw3native.h
+++ b/include/GLFW/glfw3native.h
@@ -62,7 +62,6 @@
  *  * `GLFW_EXPOSE_NATIVE_COCOA`
  *  * `GLFW_EXPOSE_NATIVE_X11`
  *  * `GLFW_EXPOSE_NATIVE_WAYLAND`
- *  * `GLFW_EXPOSE_NATIVE_MIR`
  *
  *  The available context API macros are:
  *  * `GLFW_EXPOSE_NATIVE_WGL`
@@ -103,8 +102,6 @@
  #include <X11/extensions/Xrandr.h>
 #elif defined(GLFW_EXPOSE_NATIVE_WAYLAND)
  #include <wayland-client.h>
-#elif defined(GLFW_EXPOSE_NATIVE_MIR)
- #include <mir_toolkit/mir_client_library.h>
 #endif
 
 #if defined(GLFW_EXPOSE_NATIVE_WGL)
@@ -418,50 +415,6 @@
 GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window);
 #endif
 
-#if defined(GLFW_EXPOSE_NATIVE_MIR)
-/*! @brief Returns the `MirConnection*` used by GLFW.
- *
- *  @return The `MirConnection*` used by GLFW, or `NULL` if an
- *  [error](@ref error_handling) occurred.
- *
- *  @thread_safety This function may be called from any thread.  Access is not
- *  synchronized.
- *
- *  @since Added in version 3.2.
- *
- *  @ingroup native
- */
-GLFWAPI MirConnection* glfwGetMirDisplay(void);
-
-/*! @brief Returns the Mir output ID of the specified monitor.
- *
- *  @return The Mir output ID of the specified monitor, or zero if an
- *  [error](@ref error_handling) occurred.
- *
- *  @thread_safety This function may be called from any thread.  Access is not
- *  synchronized.
- *
- *  @since Added in version 3.2.
- *
- *  @ingroup native
- */
-GLFWAPI int glfwGetMirMonitor(GLFWmonitor* monitor);
-
-/*! @brief Returns the `MirWindow*` of the specified window.
- *
- *  @return The `MirWindow*` of the specified window, or `NULL` if an
- *  [error](@ref error_handling) occurred.
- *
- *  @thread_safety This function may be called from any thread.  Access is not
- *  synchronized.
- *
- *  @since Added in version 3.2.
- *
- *  @ingroup native
- */
-GLFWAPI MirWindow* glfwGetMirWindow(GLFWwindow* window);
-#endif
-
 #if defined(GLFW_EXPOSE_NATIVE_EGL)
 /*! @brief Returns the `EGLDisplay` used by GLFW.
  *
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index d440006..ecce170 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -55,13 +55,6 @@
         PROTOCOL
         "${WAYLAND_PROTOCOLS_PKGDATADIR}/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml"
         BASENAME idle-inhibit-unstable-v1)
-elseif (_GLFW_MIR)
-    set(glfw_HEADERS ${common_HEADERS} mir_platform.h linux_joystick.h
-                     posix_time.h posix_thread.h xkb_unicode.h egl_context.h
-                     osmesa_context.h)
-    set(glfw_SOURCES ${common_SOURCES} mir_init.c mir_monitor.c mir_window.c
-                     linux_joystick.c posix_time.c posix_thread.c xkb_unicode.c
-                     egl_context.c osmesa_context.c)
 elseif (_GLFW_OSMESA)
     set(glfw_HEADERS ${common_HEADERS} null_platform.h null_joystick.h
                      posix_time.h posix_thread.h osmesa_context.h)
diff --git a/src/egl_context.h b/src/egl_context.h
index aa339ba..8f3d075 100644
--- a/src/egl_context.h
+++ b/src/egl_context.h
@@ -43,10 +43,6 @@
  #define EGLAPIENTRY
 typedef struct wl_display* EGLNativeDisplayType;
 typedef struct wl_egl_window* EGLNativeWindowType;
-#elif defined(_GLFW_MIR)
- #define EGLAPIENTRY
-typedef MirEGLNativeDisplayType EGLNativeDisplayType;
-typedef MirEGLNativeWindowType EGLNativeWindowType;
 #else
  #error "No supported EGL platform selected"
 #endif
diff --git a/src/glfw_config.h.in b/src/glfw_config.h.in
index 381ad28..f418c99 100644
--- a/src/glfw_config.h.in
+++ b/src/glfw_config.h.in
@@ -42,8 +42,6 @@
 #cmakedefine _GLFW_COCOA
 // Define this to 1 if building GLFW for Wayland
 #cmakedefine _GLFW_WAYLAND
-// Define this to 1 if building GLFW for Mir
-#cmakedefine _GLFW_MIR
 // Define this to 1 if building GLFW for OSMesa
 #cmakedefine _GLFW_OSMESA
 
diff --git a/src/internal.h b/src/internal.h
index 81cd961..7be2b26 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -126,7 +126,6 @@
     VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR = 1000004000,
     VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR = 1000005000,
     VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR = 1000006000,
-    VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR = 1000007000,
     VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000,
     VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK = 1000123000,
     VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF
@@ -188,8 +187,6 @@
  #include "x11_platform.h"
 #elif defined(_GLFW_WAYLAND)
  #include "wl_platform.h"
-#elif defined(_GLFW_MIR)
- #include "mir_platform.h"
 #elif defined(_GLFW_OSMESA)
  #include "null_platform.h"
 #else
@@ -563,8 +560,6 @@
         GLFWbool        KHR_xcb_surface;
 #elif defined(_GLFW_WAYLAND)
         GLFWbool        KHR_wayland_surface;
-#elif defined(_GLFW_MIR)
-        GLFWbool        KHR_mir_surface;
 #endif
     } vk;
 
diff --git a/src/mir_init.c b/src/mir_init.c
deleted file mode 100644
index 5f9ed37..0000000
--- a/src/mir_init.c
+++ /dev/null
@@ -1,240 +0,0 @@
-//========================================================================
-// GLFW 3.3 Mir - www.glfw.org
-//------------------------------------------------------------------------
-// Copyright (c) 2014-2017 Brandon Schaefer <brandon.schaefer@canonical.com>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-//    claim that you wrote the original software. If you use this software
-//    in a product, an acknowledgment in the product documentation would
-//    be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-//    be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-//    distribution.
-//
-//========================================================================
-
-#include "internal.h"
-
-#include <linux/input.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-// Create key code translation tables
-//
-static void createKeyTables(void)
-{
-    int scancode;
-
-    memset(_glfw.mir.keycodes, -1, sizeof(_glfw.mir.keycodes));
-    memset(_glfw.mir.scancodes, -1, sizeof(_glfw.mir.scancodes));
-
-    _glfw.mir.keycodes[KEY_GRAVE]      = GLFW_KEY_GRAVE_ACCENT;
-    _glfw.mir.keycodes[KEY_1]          = GLFW_KEY_1;
-    _glfw.mir.keycodes[KEY_2]          = GLFW_KEY_2;
-    _glfw.mir.keycodes[KEY_3]          = GLFW_KEY_3;
-    _glfw.mir.keycodes[KEY_4]          = GLFW_KEY_4;
-    _glfw.mir.keycodes[KEY_5]          = GLFW_KEY_5;
-    _glfw.mir.keycodes[KEY_6]          = GLFW_KEY_6;
-    _glfw.mir.keycodes[KEY_7]          = GLFW_KEY_7;
-    _glfw.mir.keycodes[KEY_8]          = GLFW_KEY_8;
-    _glfw.mir.keycodes[KEY_9]          = GLFW_KEY_9;
-    _glfw.mir.keycodes[KEY_0]          = GLFW_KEY_0;
-    _glfw.mir.keycodes[KEY_SPACE]      = GLFW_KEY_SPACE;
-    _glfw.mir.keycodes[KEY_MINUS]      = GLFW_KEY_MINUS;
-    _glfw.mir.keycodes[KEY_EQUAL]      = GLFW_KEY_EQUAL;
-    _glfw.mir.keycodes[KEY_Q]          = GLFW_KEY_Q;
-    _glfw.mir.keycodes[KEY_W]          = GLFW_KEY_W;
-    _glfw.mir.keycodes[KEY_E]          = GLFW_KEY_E;
-    _glfw.mir.keycodes[KEY_R]          = GLFW_KEY_R;
-    _glfw.mir.keycodes[KEY_T]          = GLFW_KEY_T;
-    _glfw.mir.keycodes[KEY_Y]          = GLFW_KEY_Y;
-    _glfw.mir.keycodes[KEY_U]          = GLFW_KEY_U;
-    _glfw.mir.keycodes[KEY_I]          = GLFW_KEY_I;
-    _glfw.mir.keycodes[KEY_O]          = GLFW_KEY_O;
-    _glfw.mir.keycodes[KEY_P]          = GLFW_KEY_P;
-    _glfw.mir.keycodes[KEY_LEFTBRACE]  = GLFW_KEY_LEFT_BRACKET;
-    _glfw.mir.keycodes[KEY_RIGHTBRACE] = GLFW_KEY_RIGHT_BRACKET;
-    _glfw.mir.keycodes[KEY_A]          = GLFW_KEY_A;
-    _glfw.mir.keycodes[KEY_S]          = GLFW_KEY_S;
-    _glfw.mir.keycodes[KEY_D]          = GLFW_KEY_D;
-    _glfw.mir.keycodes[KEY_F]          = GLFW_KEY_F;
-    _glfw.mir.keycodes[KEY_G]          = GLFW_KEY_G;
-    _glfw.mir.keycodes[KEY_H]          = GLFW_KEY_H;
-    _glfw.mir.keycodes[KEY_J]          = GLFW_KEY_J;
-    _glfw.mir.keycodes[KEY_K]          = GLFW_KEY_K;
-    _glfw.mir.keycodes[KEY_L]          = GLFW_KEY_L;
-    _glfw.mir.keycodes[KEY_SEMICOLON]  = GLFW_KEY_SEMICOLON;
-    _glfw.mir.keycodes[KEY_APOSTROPHE] = GLFW_KEY_APOSTROPHE;
-    _glfw.mir.keycodes[KEY_Z]          = GLFW_KEY_Z;
-    _glfw.mir.keycodes[KEY_X]          = GLFW_KEY_X;
-    _glfw.mir.keycodes[KEY_C]          = GLFW_KEY_C;
-    _glfw.mir.keycodes[KEY_V]          = GLFW_KEY_V;
-    _glfw.mir.keycodes[KEY_B]          = GLFW_KEY_B;
-    _glfw.mir.keycodes[KEY_N]          = GLFW_KEY_N;
-    _glfw.mir.keycodes[KEY_M]          = GLFW_KEY_M;
-    _glfw.mir.keycodes[KEY_COMMA]      = GLFW_KEY_COMMA;
-    _glfw.mir.keycodes[KEY_DOT]        = GLFW_KEY_PERIOD;
-    _glfw.mir.keycodes[KEY_SLASH]      = GLFW_KEY_SLASH;
-    _glfw.mir.keycodes[KEY_BACKSLASH]  = GLFW_KEY_BACKSLASH;
-    _glfw.mir.keycodes[KEY_ESC]        = GLFW_KEY_ESCAPE;
-    _glfw.mir.keycodes[KEY_TAB]        = GLFW_KEY_TAB;
-    _glfw.mir.keycodes[KEY_LEFTSHIFT]  = GLFW_KEY_LEFT_SHIFT;
-    _glfw.mir.keycodes[KEY_RIGHTSHIFT] = GLFW_KEY_RIGHT_SHIFT;
-    _glfw.mir.keycodes[KEY_LEFTCTRL]   = GLFW_KEY_LEFT_CONTROL;
-    _glfw.mir.keycodes[KEY_RIGHTCTRL]  = GLFW_KEY_RIGHT_CONTROL;
-    _glfw.mir.keycodes[KEY_LEFTALT]    = GLFW_KEY_LEFT_ALT;
-    _glfw.mir.keycodes[KEY_RIGHTALT]   = GLFW_KEY_RIGHT_ALT;
-    _glfw.mir.keycodes[KEY_LEFTMETA]   = GLFW_KEY_LEFT_SUPER;
-    _glfw.mir.keycodes[KEY_RIGHTMETA]  = GLFW_KEY_RIGHT_SUPER;
-    _glfw.mir.keycodes[KEY_MENU]       = GLFW_KEY_MENU;
-    _glfw.mir.keycodes[KEY_NUMLOCK]    = GLFW_KEY_NUM_LOCK;
-    _glfw.mir.keycodes[KEY_CAPSLOCK]   = GLFW_KEY_CAPS_LOCK;
-    _glfw.mir.keycodes[KEY_PRINT]      = GLFW_KEY_PRINT_SCREEN;
-    _glfw.mir.keycodes[KEY_SCROLLLOCK] = GLFW_KEY_SCROLL_LOCK;
-    _glfw.mir.keycodes[KEY_PAUSE]      = GLFW_KEY_PAUSE;
-    _glfw.mir.keycodes[KEY_DELETE]     = GLFW_KEY_DELETE;
-    _glfw.mir.keycodes[KEY_BACKSPACE]  = GLFW_KEY_BACKSPACE;
-    _glfw.mir.keycodes[KEY_ENTER]      = GLFW_KEY_ENTER;
-    _glfw.mir.keycodes[KEY_HOME]       = GLFW_KEY_HOME;
-    _glfw.mir.keycodes[KEY_END]        = GLFW_KEY_END;
-    _glfw.mir.keycodes[KEY_PAGEUP]     = GLFW_KEY_PAGE_UP;
-    _glfw.mir.keycodes[KEY_PAGEDOWN]   = GLFW_KEY_PAGE_DOWN;
-    _glfw.mir.keycodes[KEY_INSERT]     = GLFW_KEY_INSERT;
-    _glfw.mir.keycodes[KEY_LEFT]       = GLFW_KEY_LEFT;
-    _glfw.mir.keycodes[KEY_RIGHT]      = GLFW_KEY_RIGHT;
-    _glfw.mir.keycodes[KEY_DOWN]       = GLFW_KEY_DOWN;
-    _glfw.mir.keycodes[KEY_UP]         = GLFW_KEY_UP;
-    _glfw.mir.keycodes[KEY_F1]         = GLFW_KEY_F1;
-    _glfw.mir.keycodes[KEY_F2]         = GLFW_KEY_F2;
-    _glfw.mir.keycodes[KEY_F3]         = GLFW_KEY_F3;
-    _glfw.mir.keycodes[KEY_F4]         = GLFW_KEY_F4;
-    _glfw.mir.keycodes[KEY_F5]         = GLFW_KEY_F5;
-    _glfw.mir.keycodes[KEY_F6]         = GLFW_KEY_F6;
-    _glfw.mir.keycodes[KEY_F7]         = GLFW_KEY_F7;
-    _glfw.mir.keycodes[KEY_F8]         = GLFW_KEY_F8;
-    _glfw.mir.keycodes[KEY_F9]         = GLFW_KEY_F9;
-    _glfw.mir.keycodes[KEY_F10]        = GLFW_KEY_F10;
-    _glfw.mir.keycodes[KEY_F11]        = GLFW_KEY_F11;
-    _glfw.mir.keycodes[KEY_F12]        = GLFW_KEY_F12;
-    _glfw.mir.keycodes[KEY_F13]        = GLFW_KEY_F13;
-    _glfw.mir.keycodes[KEY_F14]        = GLFW_KEY_F14;
-    _glfw.mir.keycodes[KEY_F15]        = GLFW_KEY_F15;
-    _glfw.mir.keycodes[KEY_F16]        = GLFW_KEY_F16;
-    _glfw.mir.keycodes[KEY_F17]        = GLFW_KEY_F17;
-    _glfw.mir.keycodes[KEY_F18]        = GLFW_KEY_F18;
-    _glfw.mir.keycodes[KEY_F19]        = GLFW_KEY_F19;
-    _glfw.mir.keycodes[KEY_F20]        = GLFW_KEY_F20;
-    _glfw.mir.keycodes[KEY_F21]        = GLFW_KEY_F21;
-    _glfw.mir.keycodes[KEY_F22]        = GLFW_KEY_F22;
-    _glfw.mir.keycodes[KEY_F23]        = GLFW_KEY_F23;
-    _glfw.mir.keycodes[KEY_F24]        = GLFW_KEY_F24;
-    _glfw.mir.keycodes[KEY_KPSLASH]    = GLFW_KEY_KP_DIVIDE;
-    _glfw.mir.keycodes[KEY_KPDOT]      = GLFW_KEY_KP_MULTIPLY;
-    _glfw.mir.keycodes[KEY_KPMINUS]    = GLFW_KEY_KP_SUBTRACT;
-    _glfw.mir.keycodes[KEY_KPPLUS]     = GLFW_KEY_KP_ADD;
-    _glfw.mir.keycodes[KEY_KP0]        = GLFW_KEY_KP_0;
-    _glfw.mir.keycodes[KEY_KP1]        = GLFW_KEY_KP_1;
-    _glfw.mir.keycodes[KEY_KP2]        = GLFW_KEY_KP_2;
-    _glfw.mir.keycodes[KEY_KP3]        = GLFW_KEY_KP_3;
-    _glfw.mir.keycodes[KEY_KP4]        = GLFW_KEY_KP_4;
-    _glfw.mir.keycodes[KEY_KP5]        = GLFW_KEY_KP_5;
-    _glfw.mir.keycodes[KEY_KP6]        = GLFW_KEY_KP_6;
-    _glfw.mir.keycodes[KEY_KP7]        = GLFW_KEY_KP_7;
-    _glfw.mir.keycodes[KEY_KP8]        = GLFW_KEY_KP_8;
-    _glfw.mir.keycodes[KEY_KP9]        = GLFW_KEY_KP_9;
-    _glfw.mir.keycodes[KEY_KPCOMMA]    = GLFW_KEY_KP_DECIMAL;
-    _glfw.mir.keycodes[KEY_KPEQUAL]    = GLFW_KEY_KP_EQUAL;
-    _glfw.mir.keycodes[KEY_KPENTER]    = GLFW_KEY_KP_ENTER;
-
-    for (scancode = 0;  scancode < 256;  scancode++)
-    {
-        if (_glfw.mir.keycodes[scancode] > 0)
-            _glfw.mir.scancodes[_glfw.mir.keycodes[scancode]] = scancode;
-    }
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-//////                       GLFW internal API                      //////
-//////////////////////////////////////////////////////////////////////////
-
-int _glfwPlatformInit(void)
-{
-    int error;
-
-    _glfw.mir.connection = mir_connect_sync(NULL, __PRETTY_FUNCTION__);
-
-    if (!mir_connection_is_valid(_glfw.mir.connection))
-    {
-        _glfwInputError(GLFW_PLATFORM_ERROR,
-                        "Mir: Unable to connect to server: %s",
-                        mir_connection_get_error_message(_glfw.mir.connection));
-
-        return GLFW_FALSE;
-    }
-
-    _glfw.mir.display =
-        mir_connection_get_egl_native_display(_glfw.mir.connection);
-
-    createKeyTables();
-
-    if (!_glfwInitJoysticksLinux())
-        return GLFW_FALSE;
-
-    _glfwInitTimerPOSIX();
-
-    _glfw.mir.eventQueue = calloc(1, sizeof(EventQueue));
-    _glfwInitEventQueueMir(_glfw.mir.eventQueue);
-
-    error = pthread_mutex_init(&_glfw.mir.eventMutex, NULL);
-    if (error)
-    {
-        _glfwInputError(GLFW_PLATFORM_ERROR,
-                        "Mir: Failed to create event mutex: %s",
-                        strerror(error));
-        return GLFW_FALSE;
-    }
-
-    _glfwPollMonitorsMir();
-    return GLFW_TRUE;
-}
-
-void _glfwPlatformTerminate(void)
-{
-    _glfwTerminateEGL();
-    _glfwTerminateJoysticksLinux();
-
-    _glfwDeleteEventQueueMir(_glfw.mir.eventQueue);
-
-    pthread_mutex_destroy(&_glfw.mir.eventMutex);
-
-    mir_connection_release(_glfw.mir.connection);
-}
-
-const char* _glfwPlatformGetVersionString(void)
-{
-    return _GLFW_VERSION_NUMBER " Mir EGL"
-#if defined(_POSIX_TIMERS) && defined(_POSIX_MONOTONIC_CLOCK)
-        " clock_gettime"
-#else
-        " gettimeofday"
-#endif
-        " evdev"
-#if defined(_GLFW_BUILD_DLL)
-        " shared"
-#endif
-        ;
-}
-
diff --git a/src/mir_monitor.c b/src/mir_monitor.c
deleted file mode 100644
index c340701..0000000
--- a/src/mir_monitor.c
+++ /dev/null
@@ -1,218 +0,0 @@
-//========================================================================
-// GLFW 3.3 Mir - www.glfw.org
-//------------------------------------------------------------------------
-// Copyright (c) 2014-2017 Brandon Schaefer <brandon.schaefer@canonical.com>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-//    claim that you wrote the original software. If you use this software
-//    in a product, an acknowledgment in the product documentation would
-//    be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-//    be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-//    distribution.
-//
-//========================================================================
-
-#include "internal.h"
-
-#include <stdlib.h>
-
-
-//////////////////////////////////////////////////////////////////////////
-//////                       GLFW internal API                      //////
-//////////////////////////////////////////////////////////////////////////
-
-// Poll for changes in the set of connected monitors
-//
-void _glfwPollMonitorsMir(void)
-{
-    int i;
-    MirDisplayConfig* displayConfig =
-        mir_connection_create_display_configuration(_glfw.mir.connection);
-
-    int numOutputs = mir_display_config_get_num_outputs(displayConfig);
-
-    for (i = 0;  i < numOutputs;  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 (enabled && state == mir_output_connection_state_connected)
-        {
-            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));
-
-            _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_release(displayConfig);
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-//////                       GLFW platform API                      //////
-//////////////////////////////////////////////////////////////////////////
-
-void _glfwPlatformFreeMonitor(_GLFWmonitor* monitor)
-{
-}
-
-void _glfwPlatformGetMonitorPos(_GLFWmonitor* monitor, int* xpos, int* ypos)
-{
-    if (xpos)
-        *xpos = monitor->mir.x;
-    if (ypos)
-        *ypos = monitor->mir.y;
-}
-
-void _glfwPlatformGetMonitorContentScale(_GLFWmonitor* monitor,
-                                         float* xscale, float* yscale)
-{
-    if (xscale)
-        *xscale = 1.f;
-    if (yscale)
-        *yscale = 1.f;
-}
-
-static void FillInRGBBitsFromPixelFormat(GLFWvidmode* mode, const MirPixelFormat pf)
-{
-    switch (pf)
-    {
-      case mir_pixel_format_rgb_565:
-          mode->redBits   = 5;
-          mode->greenBits = 6;
-          mode->blueBits  = 5;
-          break;
-      case mir_pixel_format_rgba_5551:
-          mode->redBits   = 5;
-          mode->greenBits = 5;
-          mode->blueBits  = 5;
-          break;
-      case mir_pixel_format_rgba_4444:
-          mode->redBits   = 4;
-          mode->greenBits = 4;
-          mode->blueBits  = 4;
-          break;
-      case mir_pixel_format_abgr_8888:
-      case mir_pixel_format_xbgr_8888:
-      case mir_pixel_format_argb_8888:
-      case mir_pixel_format_xrgb_8888:
-      case mir_pixel_format_bgr_888:
-      case mir_pixel_format_rgb_888:
-      default:
-          mode->redBits   = 8;
-          mode->greenBits = 8;
-          mode->blueBits  = 8;
-          break;
-    }
-}
-
-GLFWvidmode* _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, int* found)
-{
-    int i;
-    GLFWvidmode* modes = NULL;
-    MirDisplayConfig* displayConfig =
-        mir_connection_create_display_configuration(_glfw.mir.connection);
-
-    int numOutputs = mir_display_config_get_num_outputs(displayConfig);
-
-    for (i = 0;  i < numOutputs;  i++)
-    {
-        const MirOutput* output = mir_display_config_get_output(displayConfig, i);
-        int id = mir_output_get_id(output);
-
-        if (id != monitor->mir.outputId)
-            continue;
-
-        MirOutputConnectionState state = mir_output_get_connection_state(output);
-        bool enabled = mir_output_is_enabled(output);
-
-        // We must have been disconnected
-        if (!enabled || state != mir_output_connection_state_connected)
-        {
-            _glfwInputError(GLFW_PLATFORM_ERROR,
-                            "Mir: Monitor no longer connected");
-            return NULL;
-        }
-
-        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_release(displayConfig);
-
-    return modes;
-}
-
-void _glfwPlatformGetVideoMode(_GLFWmonitor* monitor, GLFWvidmode* mode)
-{
-    *mode = monitor->modes[monitor->mir.curMode];
-}
-
-void _glfwPlatformGetGammaRamp(_GLFWmonitor* monitor, GLFWgammaramp* ramp)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-void _glfwPlatformSetGammaRamp(_GLFWmonitor* monitor, const GLFWgammaramp* ramp)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-//////                        GLFW native API                       //////
-//////////////////////////////////////////////////////////////////////////
-
-GLFWAPI int glfwGetMirMonitor(GLFWmonitor* handle)
-{
-    _GLFWmonitor* monitor = (_GLFWmonitor*) handle;
-    _GLFW_REQUIRE_INIT_OR_RETURN(0);
-    return monitor->mir.outputId;
-}
diff --git a/src/mir_platform.h b/src/mir_platform.h
deleted file mode 100644
index da00a32..0000000
--- a/src/mir_platform.h
+++ /dev/null
@@ -1,133 +0,0 @@
-//========================================================================
-// GLFW 3.3 Mir - www.glfw.org
-//------------------------------------------------------------------------
-// Copyright (c) 2014-2017 Brandon Schaefer <brandon.schaefer@canonical.com>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-//    claim that you wrote the original software. If you use this software
-//    in a product, an acknowledgment in the product documentation would
-//    be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-//    be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-//    distribution.
-//
-//========================================================================
-
-#include <sys/queue.h>
-#include <pthread.h>
-#include <dlfcn.h>
-
-#include <mir_toolkit/mir_client_library.h>
-
-typedef VkFlags VkMirWindowCreateFlagsKHR;
-
-typedef struct VkMirWindowCreateInfoKHR
-{
-    VkStructureType             sType;
-    const void*                 pNext;
-    VkMirWindowCreateFlagsKHR   flags;
-    MirConnection*              connection;
-    MirWindow*                  mirWindow;
-} VkMirWindowCreateInfoKHR;
-
-typedef VkResult (APIENTRY *PFN_vkCreateMirWindowKHR)(VkInstance,const VkMirWindowCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);
-typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceMirPresentationSupportKHR)(VkPhysicalDevice,uint32_t,MirConnection*);
-
-#include "posix_thread.h"
-#include "posix_time.h"
-#include "linux_joystick.h"
-#include "xkb_unicode.h"
-#include "egl_context.h"
-#include "osmesa_context.h"
-
-#define _glfw_dlopen(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL)
-#define _glfw_dlclose(handle) dlclose(handle)
-#define _glfw_dlsym(handle, name) dlsym(handle, name)
-
-#define _GLFW_EGL_NATIVE_WINDOW  ((EGLNativeWindowType) window->mir.nativeWindow)
-#define _GLFW_EGL_NATIVE_DISPLAY ((EGLNativeDisplayType) _glfw.mir.display)
-
-#define _GLFW_PLATFORM_WINDOW_STATE         _GLFWwindowMir  mir
-#define _GLFW_PLATFORM_MONITOR_STATE        _GLFWmonitorMir mir
-#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryMir mir
-#define _GLFW_PLATFORM_CURSOR_STATE         _GLFWcursorMir  mir
-
-#define _GLFW_PLATFORM_CONTEXT_STATE
-#define _GLFW_PLATFORM_LIBRARY_CONTEXT_STATE
-
-
-// Mir-specific Event Queue
-//
-typedef struct EventQueue
-{
-    TAILQ_HEAD(, EventNode) head;
-} EventQueue;
-
-// Mir-specific per-window data
-//
-typedef struct _GLFWwindowMir
-{
-    MirWindow*              window;
-    int                     width;
-    int                     height;
-    MirEGLNativeWindowType  nativeWindow;
-    _GLFWcursor*            currentCursor;
-
-} _GLFWwindowMir;
-
-// Mir-specific per-monitor data
-//
-typedef struct _GLFWmonitorMir
-{
-    int curMode;
-    int outputId;
-    int x;
-    int y;
-
-} _GLFWmonitorMir;
-
-// Mir-specific global data
-//
-typedef struct _GLFWlibraryMir
-{
-    MirConnection*          connection;
-    MirEGLNativeDisplayType display;
-    EventQueue* eventQueue;
-
-    short int keycodes[256];
-    short int scancodes[GLFW_KEY_LAST + 1];
-
-    pthread_mutex_t eventMutex;
-    pthread_cond_t  eventCond;
-
-    // The window whose disabled cursor mode is active
-    _GLFWwindow* disabledCursorWindow;
-
-} _GLFWlibraryMir;
-
-// Mir-specific per-cursor data
-// TODO: Only system cursors are implemented in Mir atm. Need to wait for support.
-//
-typedef struct _GLFWcursorMir
-{
-    MirCursorConfiguration* conf;
-    MirBufferStream*        customCursor;
-    char const*             cursorName; // only needed for system cursors
-} _GLFWcursorMir;
-
-
-extern void _glfwPollMonitorsMir(void);
-extern void _glfwInitEventQueueMir(EventQueue* queue);
-extern void _glfwDeleteEventQueueMir(EventQueue* queue);
-
diff --git a/src/mir_window.c b/src/mir_window.c
deleted file mode 100644
index a0d17db..0000000
--- a/src/mir_window.c
+++ /dev/null
@@ -1,975 +0,0 @@
-//========================================================================
-// GLFW 3.3 Mir - www.glfw.org
-//------------------------------------------------------------------------
-// Copyright (c) 2014-2017 Brandon Schaefer <brandon.schaefer@canonical.com>
-//
-// This software is provided 'as-is', without any express or implied
-// warranty. In no event will the authors be held liable for any damages
-// arising from the use of this software.
-//
-// Permission is granted to anyone to use this software for any purpose,
-// including commercial applications, and to alter it and redistribute it
-// freely, subject to the following restrictions:
-//
-// 1. The origin of this software must not be misrepresented; you must not
-//    claim that you wrote the original software. If you use this software
-//    in a product, an acknowledgment in the product documentation would
-//    be appreciated but is not required.
-//
-// 2. Altered source versions must be plainly marked as such, and must not
-//    be misrepresented as being the original software.
-//
-// 3. This notice may not be removed or altered from any source
-//    distribution.
-//
-//========================================================================
-
-#include "internal.h"
-
-#include <linux/input.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-typedef struct EventNode
-{
-    TAILQ_ENTRY(EventNode) entries;
-    const MirEvent*        event;
-    _GLFWwindow*           window;
-} EventNode;
-
-static void deleteNode(EventQueue* queue, EventNode* node)
-{
-    mir_event_unref(node->event);
-    free(node);
-}
-
-static GLFWbool emptyEventQueue(EventQueue* queue)
-{
-    return queue->head.tqh_first == NULL;
-}
-
-// TODO The mir_event_ref is not supposed to be used but ... its needed
-//      in this case. Need to wait until we can read from an FD set up by mir
-//      for single threaded event handling.
-static EventNode* newEventNode(const MirEvent* event, _GLFWwindow* context)
-{
-    EventNode* newNode = calloc(1, sizeof(EventNode));
-    newNode->event     = mir_event_ref(event);
-    newNode->window    = context;
-
-    return newNode;
-}
-
-static void enqueueEvent(const MirEvent* event, _GLFWwindow* context)
-{
-    pthread_mutex_lock(&_glfw.mir.eventMutex);
-
-    EventNode* newNode = newEventNode(event, context);
-    TAILQ_INSERT_TAIL(&_glfw.mir.eventQueue->head, newNode, entries);
-
-    pthread_cond_signal(&_glfw.mir.eventCond);
-
-    pthread_mutex_unlock(&_glfw.mir.eventMutex);
-}
-
-static EventNode* dequeueEvent(EventQueue* queue)
-{
-    EventNode* node = NULL;
-
-    pthread_mutex_lock(&_glfw.mir.eventMutex);
-
-    node = queue->head.tqh_first;
-
-    if (node)
-        TAILQ_REMOVE(&queue->head, node, entries);
-
-    pthread_mutex_unlock(&_glfw.mir.eventMutex);
-
-    return node;
-}
-
-static MirPixelFormat findValidPixelFormat(void)
-{
-    unsigned int i, validFormats, mirPixelFormats = 32;
-    MirPixelFormat formats[mir_pixel_formats];
-
-    mir_connection_get_available_surface_formats(_glfw.mir.connection, formats,
-                                                 mirPixelFormats, &validFormats);
-
-    for (i = 0;  i < validFormats;  i++)
-    {
-        if (formats[i] == mir_pixel_format_abgr_8888 ||
-            formats[i] == mir_pixel_format_xbgr_8888 ||
-            formats[i] == mir_pixel_format_argb_8888 ||
-            formats[i] == mir_pixel_format_xrgb_8888)
-        {
-            return formats[i];
-        }
-    }
-
-    return mir_pixel_format_invalid;
-}
-
-static int mirModToGLFWMod(uint32_t mods)
-{
-    int publicMods = 0x0;
-
-    if (mods & mir_input_event_modifier_alt)
-        publicMods |= GLFW_MOD_ALT;
-    if (mods & mir_input_event_modifier_shift)
-        publicMods |= GLFW_MOD_SHIFT;
-    if (mods & mir_input_event_modifier_ctrl)
-        publicMods |= GLFW_MOD_CONTROL;
-    if (mods & mir_input_event_modifier_meta)
-        publicMods |= GLFW_MOD_SUPER;
-    if (mods & mir_input_event_modifier_caps_lock)
-        publicMods |= GLFW_MOD_CAPS_LOCK;
-    if (mods & mir_input_event_modifier_num_lock)
-        publicMods |= GLFW_MOD_NUM_LOCK;
-
-    return publicMods;
-}
-
-static int toGLFWKeyCode(uint32_t key)
-{
-    if (key < sizeof(_glfw.mir.keycodes) / sizeof(_glfw.mir.keycodes[0]))
-        return _glfw.mir.keycodes[key];
-
-    return GLFW_KEY_UNKNOWN;
-}
-
-static void handleKeyEvent(const MirKeyboardEvent* key_event, _GLFWwindow* window)
-{
-    const int action    = mir_keyboard_event_action   (key_event);
-    const int scan_code = mir_keyboard_event_scan_code(key_event);
-    const int key_code  = mir_keyboard_event_key_code (key_event);
-    const int modifiers = mir_keyboard_event_modifiers(key_event);
-
-    const int  pressed = action == mir_keyboard_action_up ? GLFW_RELEASE : GLFW_PRESS;
-    const int  mods    = mirModToGLFWMod(modifiers);
-    const long text    = _glfwKeySym2Unicode(key_code);
-    const int  plain   = !(mods & (GLFW_MOD_CONTROL | GLFW_MOD_ALT));
-
-    _glfwInputKey(window, toGLFWKeyCode(scan_code), scan_code, pressed, mods);
-
-    if (text != -1)
-        _glfwInputChar(window, text, mods, plain);
-}
-
-static void handlePointerButton(_GLFWwindow* window,
-                              int pressed,
-                              const MirPointerEvent* pointer_event)
-{
-    int mods                = mir_pointer_event_modifiers(pointer_event);
-    const int publicMods    = mirModToGLFWMod(mods);
-    MirPointerButton button = mir_pointer_button_primary;
-    static uint32_t oldButtonStates = 0;
-    uint32_t newButtonStates        = mir_pointer_event_buttons(pointer_event);
-    int publicButton                = GLFW_MOUSE_BUTTON_LEFT;
-
-    // XOR our old button states our new states to figure out what was added or removed
-    button = newButtonStates ^ oldButtonStates;
-
-    switch (button)
-    {
-        case mir_pointer_button_primary:
-            publicButton = GLFW_MOUSE_BUTTON_LEFT;
-            break;
-        case mir_pointer_button_secondary:
-            publicButton = GLFW_MOUSE_BUTTON_RIGHT;
-            break;
-        case mir_pointer_button_tertiary:
-            publicButton = GLFW_MOUSE_BUTTON_MIDDLE;
-            break;
-        case mir_pointer_button_forward:
-            // FIXME What is the forward button?
-            publicButton = GLFW_MOUSE_BUTTON_4;
-            break;
-        case mir_pointer_button_back:
-            // FIXME What is the back button?
-            publicButton = GLFW_MOUSE_BUTTON_5;
-            break;
-        default:
-            break;
-    }
-
-    oldButtonStates = newButtonStates;
-
-    _glfwInputMouseClick(window, publicButton, pressed, publicMods);
-}
-
-static void handlePointerMotion(_GLFWwindow* window,
-                                const MirPointerEvent* pointer_event)
-{
-    const int hscroll = mir_pointer_event_axis_value(pointer_event, mir_pointer_axis_hscroll);
-    const int vscroll = mir_pointer_event_axis_value(pointer_event, mir_pointer_axis_vscroll);
-
-    if (window->cursorMode == GLFW_CURSOR_DISABLED)
-    {
-        if (_glfw.mir.disabledCursorWindow != window)
-            return;
-
-        const int dx = mir_pointer_event_axis_value(pointer_event, mir_pointer_axis_relative_x);
-        const int dy = mir_pointer_event_axis_value(pointer_event, mir_pointer_axis_relative_y);
-        const int current_x = window->virtualCursorPosX;
-        const int current_y = window->virtualCursorPosY;
-
-        _glfwInputCursorPos(window, dx + current_x, dy + current_y);
-    }
-    else
-    {
-        const int x = mir_pointer_event_axis_value(pointer_event, mir_pointer_axis_x);
-        const int y = mir_pointer_event_axis_value(pointer_event, mir_pointer_axis_y);
-
-        _glfwInputCursorPos(window, x, y);
-    }
-
-    if (hscroll != 0 || vscroll != 0)
-      _glfwInputScroll(window, hscroll, vscroll);
-}
-
-static void handlePointerEvent(const MirPointerEvent* pointer_event,
-                             _GLFWwindow* window)
-{
-    int action = mir_pointer_event_action(pointer_event);
-
-    switch (action)
-    {
-          case mir_pointer_action_button_down:
-              handlePointerButton(window, GLFW_PRESS, pointer_event);
-              break;
-          case mir_pointer_action_button_up:
-              handlePointerButton(window, GLFW_RELEASE, pointer_event);
-              break;
-          case mir_pointer_action_motion:
-              handlePointerMotion(window, pointer_event);
-              break;
-          case mir_pointer_action_enter:
-          case mir_pointer_action_leave:
-              break;
-          default:
-              break;
-    }
-}
-
-static void handleInput(const MirInputEvent* input_event, _GLFWwindow* window)
-{
-    int type = mir_input_event_get_type(input_event);
-
-    switch (type)
-    {
-        case mir_input_event_type_key:
-            handleKeyEvent(mir_input_event_get_keyboard_event(input_event), window);
-            break;
-        case mir_input_event_type_pointer:
-            handlePointerEvent(mir_input_event_get_pointer_event(input_event), window);
-            break;
-        default:
-            break;
-    }
-}
-
-static void handleEvent(const MirEvent* event, _GLFWwindow* window)
-{
-    int type = mir_event_get_type(event);
-
-    switch (type)
-    {
-        case mir_event_type_input:
-            handleInput(mir_event_get_input_event(event), window);
-            break;
-        default:
-            break;
-    }
-}
-
-static void addNewEvent(MirWindow* window, const MirEvent* event, void* context)
-{
-    enqueueEvent(event, context);
-}
-
-static GLFWbool createWindow(_GLFWwindow* window)
-{
-    MirWindowSpec* spec;
-    MirBufferUsage buffer_usage = mir_buffer_usage_hardware;
-    MirPixelFormat pixel_format = findValidPixelFormat();
-
-    if (pixel_format == mir_pixel_format_invalid)
-    {
-        _glfwInputError(GLFW_PLATFORM_ERROR,
-                        "Mir: Unable to find a correct pixel format");
-        return GLFW_FALSE;
-    }
-
-    spec = mir_create_normal_window_spec(_glfw.mir.connection,
-                                         window->mir.width,
-                                         window->mir.height);
-
-    mir_window_spec_set_pixel_format(spec, pixel_format);
-    mir_window_spec_set_buffer_usage(spec, buffer_usage);
-
-    window->mir.window = mir_create_window_sync(spec);
-    mir_window_spec_release(spec);
-
-    if (!mir_window_is_valid(window->mir.window))
-    {
-        _glfwInputError(GLFW_PLATFORM_ERROR,
-                        "Mir: Unable to create window: %s",
-                        mir_window_get_error_message(window->mir.window));
-
-        return GLFW_FALSE;
-    }
-
-    mir_window_set_event_handler(window->mir.window, addNewEvent, window);
-
-    return GLFW_TRUE;
-}
-
-static void setWindowConfinement(_GLFWwindow* window, MirPointerConfinementState state)
-{
-    MirWindowSpec* spec;
-
-    spec = mir_create_window_spec(_glfw.mir.connection);
-    mir_window_spec_set_pointer_confinement(spec, state);
-
-    mir_window_apply_spec(window->mir.window, spec);
-    mir_window_spec_release(spec);
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////                       GLFW internal API                      //////
-//////////////////////////////////////////////////////////////////////////
-
-void _glfwInitEventQueueMir(EventQueue* queue)
-{
-    TAILQ_INIT(&queue->head);
-}
-
-void _glfwDeleteEventQueueMir(EventQueue* queue)
-{
-    if (queue)
-    {
-        EventNode* node, *node_next;
-        node = queue->head.tqh_first;
-
-        while (node != NULL)
-        {
-            node_next = node->entries.tqe_next;
-
-            TAILQ_REMOVE(&queue->head, node, entries);
-            deleteNode(queue, node);
-
-            node = node_next;
-        }
-
-        free(queue);
-    }
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////                       GLFW platform API                      //////
-//////////////////////////////////////////////////////////////////////////
-
-int _glfwPlatformCreateWindow(_GLFWwindow* window,
-                              const _GLFWwndconfig* wndconfig,
-                              const _GLFWctxconfig* ctxconfig,
-                              const _GLFWfbconfig* fbconfig)
-{
-    if (window->monitor)
-    {
-        GLFWvidmode mode;
-        _glfwPlatformGetVideoMode(window->monitor, &mode);
-
-        mir_window_set_state(window->mir.window, mir_window_state_fullscreen);
-
-        if (wndconfig->width > mode.width || wndconfig->height > mode.height)
-        {
-            _glfwInputError(GLFW_PLATFORM_ERROR,
-                            "Mir: Requested window size too large: %ix%i",
-                            wndconfig->width, wndconfig->height);
-
-            return GLFW_FALSE;
-        }
-    }
-
-    window->mir.width  = wndconfig->width;
-    window->mir.height = wndconfig->height;
-    window->mir.currentCursor = NULL;
-
-    if (!createWindow(window))
-        return GLFW_FALSE;
-
-    window->mir.nativeWindow = mir_buffer_stream_get_egl_native_window(
-        mir_window_get_buffer_stream(window->mir.window));
-
-    if (ctxconfig->client != GLFW_NO_API)
-    {
-        if (ctxconfig->source == GLFW_EGL_CONTEXT_API ||
-            ctxconfig->source == GLFW_NATIVE_CONTEXT_API)
-        {
-            if (!_glfwInitEGL())
-                return GLFW_FALSE;
-            if (!_glfwCreateContextEGL(window, ctxconfig, fbconfig))
-                return GLFW_FALSE;
-        }
-        else if (ctxconfig->source == GLFW_OSMESA_CONTEXT_API)
-        {
-            if (!_glfwInitOSMesa())
-                return GLFW_FALSE;
-            if (!_glfwCreateContextOSMesa(window, ctxconfig, fbconfig))
-                return GLFW_FALSE;
-        }
-    }
-
-    return GLFW_TRUE;
-}
-
-void _glfwPlatformDestroyWindow(_GLFWwindow* window)
-{
-    if (_glfw.mir.disabledCursorWindow == window)
-        _glfw.mir.disabledCursorWindow = NULL;
-
-    if (mir_window_is_valid(window->mir.window))
-    {
-        mir_window_release_sync(window->mir.window);
-        window->mir.window= NULL;
-    }
-
-    if (window->context.destroy)
-        window->context.destroy(window);
-}
-
-void _glfwPlatformSetWindowTitle(_GLFWwindow* window, const char* title)
-{
-    MirWindowSpec* spec;
-
-    spec = mir_create_window_spec(_glfw.mir.connection);
-    mir_window_spec_set_name(spec, title);
-    mir_window_apply_spec(window->mir.window, spec);
-    mir_window_spec_release(spec);
-}
-
-void _glfwPlatformSetWindowIcon(_GLFWwindow* window,
-                                int count, const GLFWimage* images)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
-{
-    MirWindowSpec* spec;
-
-    spec = mir_create_window_spec(_glfw.mir.connection);
-    mir_window_spec_set_width (spec, width);
-    mir_window_spec_set_height(spec, height);
-
-    mir_window_apply_spec(window->mir.window, spec);
-    mir_window_spec_release(spec);
-}
-
-void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
-                                      int minwidth, int minheight,
-                                      int maxwidth, int maxheight)
-{
-    MirWindowSpec* spec;
-
-    spec = mir_create_window_spec(_glfw.mir.connection);
-    mir_window_spec_set_max_width (spec, maxwidth);
-    mir_window_spec_set_max_height(spec, maxheight);
-    mir_window_spec_set_min_width (spec, minwidth);
-    mir_window_spec_set_min_height(spec, minheight);
-
-    mir_window_apply_spec(window->mir.window, spec);
-    mir_window_spec_release(spec);
-}
-
-void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-void _glfwPlatformSetWindowPos(_GLFWwindow* window, int xpos, int ypos)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-void _glfwPlatformGetWindowFrameSize(_GLFWwindow* window,
-                                     int* left, int* top,
-                                     int* right, int* bottom)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-void _glfwPlatformGetWindowPos(_GLFWwindow* window, int* xpos, int* ypos)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height)
-{
-    if (width)
-        *width  = window->mir.width;
-    if (height)
-        *height = window->mir.height;
-}
-
-void _glfwPlatformGetWindowContentScale(_GLFWwindow* window,
-                                        float* xscale, float* yscale)
-{
-    if (xscale)
-        *xscale = 1.f;
-    if (yscale)
-        *yscale = 1.f;
-}
-
-void _glfwPlatformIconifyWindow(_GLFWwindow* window)
-{
-    MirWindowSpec* spec;
-
-    spec = mir_create_window_spec(_glfw.mir.connection);
-    mir_window_spec_set_state(spec, mir_window_state_minimized);
-
-    mir_window_apply_spec(window->mir.window, spec);
-    mir_window_spec_release(spec);
-}
-
-void _glfwPlatformRestoreWindow(_GLFWwindow* window)
-{
-    MirWindowSpec* spec;
-
-    spec = mir_create_window_spec(_glfw.mir.connection);
-    mir_window_spec_set_state(spec, mir_window_state_restored);
-
-    mir_window_apply_spec(window->mir.window, spec);
-    mir_window_spec_release(spec);
-}
-
-void _glfwPlatformMaximizeWindow(_GLFWwindow* window)
-{
-    MirWindowSpec* spec;
-
-    spec = mir_create_window_spec(_glfw.mir.connection);
-    mir_window_spec_set_state(spec, mir_window_state_maximized);
-
-    mir_window_apply_spec(window->mir.window, spec);
-    mir_window_spec_release(spec);
-}
-
-void _glfwPlatformHideWindow(_GLFWwindow* window)
-{
-    MirWindowSpec* spec;
-
-    spec = mir_create_window_spec(_glfw.mir.connection);
-    mir_window_spec_set_state(spec, mir_window_state_hidden);
-
-    mir_window_apply_spec(window->mir.window, spec);
-    mir_window_spec_release(spec);
-}
-
-void _glfwPlatformShowWindow(_GLFWwindow* window)
-{
-    MirWindowSpec* spec;
-
-    spec = mir_create_window_spec(_glfw.mir.connection);
-    mir_window_spec_set_state(spec, mir_window_state_restored);
-
-    mir_window_apply_spec(window->mir.window, spec);
-    mir_window_spec_release(spec);
-}
-
-void _glfwPlatformRequestWindowAttention(_GLFWwindow* window)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-void _glfwPlatformFocusWindow(_GLFWwindow* window)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-void _glfwPlatformSetWindowMonitor(_GLFWwindow* window,
-                                   _GLFWmonitor* monitor,
-                                   int xpos, int ypos,
-                                   int width, int height,
-                                   int refreshRate)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-int _glfwPlatformWindowFocused(_GLFWwindow* window)
-{
-    return mir_window_get_focus_state(window->mir.window) == mir_window_focus_state_focused;
-}
-
-int _glfwPlatformWindowIconified(_GLFWwindow* window)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-    return GLFW_FALSE;
-}
-
-int _glfwPlatformWindowVisible(_GLFWwindow* window)
-{
-    return mir_window_get_visibility(window->mir.window) == mir_window_visibility_exposed;
-}
-
-int _glfwPlatformWindowMaximized(_GLFWwindow* window)
-{
-    return mir_window_get_state(window->mir.window) == mir_window_state_maximized;
-}
-
-int _glfwPlatformWindowHovered(_GLFWwindow* window)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-    return GLFW_FALSE;
-}
-
-int _glfwPlatformFramebufferTransparent(_GLFWwindow* window)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-    return GLFW_FALSE;
-}
-
-void _glfwPlatformSetWindowResizable(_GLFWwindow* window, GLFWbool enabled)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-void _glfwPlatformSetWindowDecorated(_GLFWwindow* window, GLFWbool enabled)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-void _glfwPlatformSetWindowFloating(_GLFWwindow* window, GLFWbool enabled)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-float _glfwPlatformGetWindowOpacity(_GLFWwindow* window)
-{
-    return 1.f;
-}
-
-void _glfwPlatformSetWindowOpacity(_GLFWwindow* window, float opacity)
-{
-}
-
-void _glfwPlatformPollEvents(void)
-{
-    EventNode* node = NULL;
-
-    while ((node = dequeueEvent(_glfw.mir.eventQueue)))
-    {
-        handleEvent(node->event, node->window);
-        deleteNode(_glfw.mir.eventQueue, node);
-    }
-}
-
-void _glfwPlatformWaitEvents(void)
-{
-    pthread_mutex_lock(&_glfw.mir.eventMutex);
-
-    while (emptyEventQueue(_glfw.mir.eventQueue))
-        pthread_cond_wait(&_glfw.mir.eventCond, &_glfw.mir.eventMutex);
-
-    pthread_mutex_unlock(&_glfw.mir.eventMutex);
-
-    _glfwPlatformPollEvents();
-}
-
-void _glfwPlatformWaitEventsTimeout(double timeout)
-{
-    pthread_mutex_lock(&_glfw.mir.eventMutex);
-
-    if (emptyEventQueue(_glfw.mir.eventQueue))
-    {
-        struct timespec time;
-        clock_gettime(CLOCK_REALTIME, &time);
-        time.tv_sec += (long) timeout;
-        time.tv_nsec += (long) ((timeout - (long) timeout) * 1e9);
-        pthread_cond_timedwait(&_glfw.mir.eventCond, &_glfw.mir.eventMutex, &time);
-    }
-
-    pthread_mutex_unlock(&_glfw.mir.eventMutex);
-
-    _glfwPlatformPollEvents();
-}
-
-void _glfwPlatformPostEmptyEvent(void)
-{
-}
-
-void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)
-{
-    if (width)
-        *width  = window->mir.width;
-    if (height)
-        *height = window->mir.height;
-}
-
-int _glfwPlatformCreateCursor(_GLFWcursor* cursor,
-                              const GLFWimage* image,
-                              int xhot, int yhot)
-{
-    MirBufferStream* stream;
-
-    int i_w = image->width;
-    int i_h = image->height;
-
-    stream = mir_connection_create_buffer_stream_sync(_glfw.mir.connection,
-                                                      i_w, i_h,
-                                                      mir_pixel_format_argb_8888,
-                                                      mir_buffer_usage_software);
-
-    cursor->mir.conf = mir_cursor_configuration_from_buffer_stream(stream, xhot, yhot);
-
-    MirGraphicsRegion region;
-    mir_buffer_stream_get_graphics_region(stream, &region);
-
-    unsigned char* pixels = image->pixels;
-    char* dest = region.vaddr;
-    int i;
-
-    for (i = 0; i < i_w * i_h; i++, pixels += 4)
-    {
-        unsigned int alpha = pixels[3];
-        *dest++ = (char)(pixels[2] * alpha / 255);
-        *dest++ = (char)(pixels[1] * alpha / 255);
-        *dest++ = (char)(pixels[0] * alpha / 255);
-        *dest++ = (char)alpha;
-    }
-
-    mir_buffer_stream_swap_buffers_sync(stream);
-    cursor->mir.customCursor = stream;
-
-    return GLFW_TRUE;
-}
-
-static const char* getSystemCursorName(int shape)
-{
-    switch (shape)
-    {
-        case GLFW_ARROW_CURSOR:
-            return mir_arrow_cursor_name;
-        case GLFW_IBEAM_CURSOR:
-            return mir_caret_cursor_name;
-        case GLFW_CROSSHAIR_CURSOR:
-            return mir_crosshair_cursor_name;
-        case GLFW_HAND_CURSOR:
-            return mir_open_hand_cursor_name;
-        case GLFW_HRESIZE_CURSOR:
-            return mir_horizontal_resize_cursor_name;
-        case GLFW_VRESIZE_CURSOR:
-            return mir_vertical_resize_cursor_name;
-    }
-
-    return NULL;
-}
-
-int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)
-{
-    cursor->mir.conf         = NULL;
-    cursor->mir.customCursor = NULL;
-    cursor->mir.cursorName   = getSystemCursorName(shape);
-
-    return cursor->mir.cursorName != NULL;
-}
-
-void _glfwPlatformDestroyCursor(_GLFWcursor* cursor)
-{
-    if (cursor->mir.conf)
-        mir_cursor_configuration_destroy(cursor->mir.conf);
-    if (cursor->mir.customCursor)
-        mir_buffer_stream_release_sync(cursor->mir.customCursor);
-}
-
-static void setCursorNameForWindow(MirWindow* window, char const* name)
-{
-    MirWindowSpec* spec = mir_create_window_spec(_glfw.mir.connection);
-    mir_window_spec_set_cursor_name(spec, name);
-    mir_window_apply_spec(window, spec);
-    mir_window_spec_release(spec);
-}
-
-void _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor)
-{
-    if (cursor)
-    {
-        window->mir.currentCursor = cursor;
-
-        if (cursor->mir.cursorName)
-        {
-            setCursorNameForWindow(window->mir.window, cursor->mir.cursorName);
-        }
-        else if (cursor->mir.conf)
-        {
-            mir_window_configure_cursor(window->mir.window, cursor->mir.conf);
-        }
-    }
-    else
-    {
-        setCursorNameForWindow(window->mir.window, mir_default_cursor_name);
-    }
-}
-
-void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-void _glfwPlatformSetCursorPos(_GLFWwindow* window, double xpos, double ypos)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode)
-{
-    if (mode == GLFW_CURSOR_DISABLED)
-    {
-        _glfw.mir.disabledCursorWindow = window;
-        setWindowConfinement(window, mir_pointer_confined_to_window);
-        setCursorNameForWindow(window->mir.window, mir_disabled_cursor_name);
-    }
-    else
-    {
-        // If we were disabled before lets undo that!
-        if (_glfw.mir.disabledCursorWindow == window)
-        {
-            _glfw.mir.disabledCursorWindow = NULL;
-            setWindowConfinement(window, mir_pointer_unconfined);
-        }
-
-        if (window->cursorMode == GLFW_CURSOR_NORMAL)
-        {
-            _glfwPlatformSetCursor(window, window->mir.currentCursor);
-        }
-        else if (window->cursorMode == GLFW_CURSOR_HIDDEN)
-        {
-            setCursorNameForWindow(window->mir.window, mir_disabled_cursor_name);
-        }
-    }
-}
-
-const char* _glfwPlatformGetScancodeName(int scancode)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-    return NULL;
-}
-
-int _glfwPlatformGetKeyScancode(int key)
-{
-    return _glfw.mir.scancodes[key];
-}
-
-void _glfwPlatformSetClipboardString(const char* string)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-}
-
-const char* _glfwPlatformGetClipboardString(void)
-{
-    _glfwInputError(GLFW_PLATFORM_ERROR,
-                    "Mir: Unsupported function %s", __PRETTY_FUNCTION__);
-
-    return NULL;
-}
-
-void _glfwPlatformGetRequiredInstanceExtensions(char** extensions)
-{
-    if (!_glfw.vk.KHR_surface || !_glfw.vk.KHR_mir_surface)
-        return;
-
-    extensions[0] = "VK_KHR_surface";
-    extensions[1] = "VK_KHR_mir_surface";
-}
-
-int _glfwPlatformGetPhysicalDevicePresentationSupport(VkInstance instance,
-                                                      VkPhysicalDevice device,
-                                                      uint32_t queuefamily)
-{
-    PFN_vkGetPhysicalDeviceMirPresentationSupportKHR
-        vkGetPhysicalDeviceMirPresentationSupportKHR =
-        (PFN_vkGetPhysicalDeviceMirPresentationSupportKHR)
-        vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMirPresentationSupportKHR");
-    if (!vkGetPhysicalDeviceMirPresentationSupportKHR)
-    {
-        _glfwInputError(GLFW_API_UNAVAILABLE,
-                        "Mir: Vulkan instance missing VK_KHR_mir_surface extension");
-        return GLFW_FALSE;
-    }
-
-    return vkGetPhysicalDeviceMirPresentationSupportKHR(device,
-                                                        queuefamily,
-                                                        _glfw.mir.connection);
-}
-
-VkResult _glfwPlatformCreateWindowSurface(VkInstance instance,
-                                          _GLFWwindow* window,
-                                          const VkAllocationCallbacks* allocator,
-                                          VkSurfaceKHR* surface)
-{
-    VkResult err;
-    VkMirWindowCreateInfoKHR sci;
-    PFN_vkCreateMirWindowKHR vkCreateMirWindowKHR;
-
-    vkCreateMirWindowKHR = (PFN_vkCreateMirWindowKHR)
-        vkGetInstanceProcAddr(instance, "vkCreateMirWindowKHR");
-    if (!vkCreateMirWindowKHR)
-    {
-        _glfwInputError(GLFW_API_UNAVAILABLE,
-                        "Mir: Vulkan instance missing VK_KHR_mir_surface extension");
-        return VK_ERROR_EXTENSION_NOT_PRESENT;
-    }
-
-    memset(&sci, 0, sizeof(sci));
-    sci.sType = VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR;
-    sci.connection = _glfw.mir.connection;
-    sci.mirWindow  = window->mir.window;
-
-    err = vkCreateMirWindowKHR(instance, &sci, allocator, surface);
-    if (err)
-    {
-        _glfwInputError(GLFW_PLATFORM_ERROR,
-                        "Mir: Failed to create Vulkan surface: %s",
-                        _glfwGetVulkanResultString(err));
-    }
-
-    return err;
-}
-
-
-//////////////////////////////////////////////////////////////////////////
-//////                        GLFW native API                       //////
-//////////////////////////////////////////////////////////////////////////
-
-GLFWAPI MirConnection* glfwGetMirDisplay(void)
-{
-    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
-    return _glfw.mir.connection;
-}
-
-GLFWAPI MirWindow* glfwGetMirWindow(GLFWwindow* handle)
-{
-    _GLFWwindow* window = (_GLFWwindow*) handle;
-    _GLFW_REQUIRE_INIT_OR_RETURN(NULL);
-    return window->mir.window;
-}
-
diff --git a/src/vulkan.c b/src/vulkan.c
index debc0ef..b8f752f 100644
--- a/src/vulkan.c
+++ b/src/vulkan.c
@@ -136,9 +136,6 @@
 #elif defined(_GLFW_WAYLAND)
         else if (strcmp(ep[i].extensionName, "VK_KHR_wayland_surface") == 0)
             _glfw.vk.KHR_wayland_surface = GLFW_TRUE;
-#elif defined(_GLFW_MIR)
-        else if (strcmp(ep[i].extensionName, "VK_KHR_mir_surface") == 0)
-            _glfw.vk.KHR_mir_surface = GLFW_TRUE;
 #endif
     }