diff --git a/include/vkcv/Window.hpp b/include/vkcv/Window.hpp
index d2b5854bce056bc50f8c08c55e6bcdd771bfc13b..7dc6c1b7dc8fef4d5de7de5b0a9976bf714e6ac2 100644
--- a/include/vkcv/Window.hpp
+++ b/include/vkcv/Window.hpp
@@ -74,13 +74,6 @@ namespace vkcv {
          */
 		static void onCharEvent(GLFWwindow *callbackWindow, unsigned int c);
 
-        /**
-         * @brief A callback function for handling gamepad re-connection.
-         * @param gamepadIndex The gamepad index.
-         * @param gamepadEvent The gamepad connection event.
-         */
-        static void onGamepadConnection(int gamepadIndex, int gamepadEvent);
-
         /**
          * @brief A callback function for gamepad input events.
          * @param gamepadIndex The gamepad index.
diff --git a/modules/camera/src/vkcv/camera/CameraManager.cpp b/modules/camera/src/vkcv/camera/CameraManager.cpp
index d539994dc0071dd52764477a86ff202955c1b8f3..0117cce45bac9a9bd06306c6eb5e3b1c0cc15869 100644
--- a/modules/camera/src/vkcv/camera/CameraManager.cpp
+++ b/modules/camera/src/vkcv/camera/CameraManager.cpp
@@ -84,7 +84,6 @@ namespace vkcv::camera {
         }
     }
 
-    // todo: fix event catch speed
     void CameraManager::gamepadCallback(int gamepadIndex) {
         // handle camera switching
         GLFWgamepadstate gamepadState;
diff --git a/src/vkcv/Window.cpp b/src/vkcv/Window.cpp
index 53761e12caa234a6c465d640cc178e5ac36134cd..807c959a89962dd8c1ad5086e50c84f36f0d5028 100644
--- a/src/vkcv/Window.cpp
+++ b/src/vkcv/Window.cpp
@@ -28,9 +28,6 @@ namespace vkcv {
 		glfwSetKeyCallback(m_window, Window::onKeyEvent);
 		glfwSetScrollCallback(m_window, Window::onMouseScrollEvent);
 		glfwSetCharCallback(m_window, Window::onCharEvent);
-	
-		glfwSetJoystickCallback(Window::onGamepadConnection);
-		glfwSetJoystickUserPointer(GLFW_JOYSTICK_1, this);
     }
 
     Window::~Window() {
@@ -60,8 +57,7 @@ namespace vkcv {
     }
 
     void Window::pollEvents() {
-		onGamepadEvent(GLFW_JOYSTICK_1);
-    	
+
     	for (auto glfwWindow : s_Windows) {
 			auto window = static_cast<Window *>(glfwGetWindowUserPointer(glfwWindow));
 			
@@ -70,9 +66,11 @@ namespace vkcv {
 			window->e_resize.unlock();
 			window->e_key.unlock();
 			window->e_mouseScroll.unlock();
+			window->e_gamepad.unlock();
     	}
 
         glfwPollEvents();
+        onGamepadEvent(GLFW_JOYSTICK_1);
 	
 		for (auto glfwWindow : s_Windows) {
 			auto window = static_cast<Window *>(glfwGetWindowUserPointer(glfwWindow));
@@ -82,6 +80,7 @@ namespace vkcv {
 			window->e_resize.lock();
 			window->e_key.lock();
 			window->e_mouseScroll.lock();
+			window->e_gamepad.lock();
 		}
     }
 
@@ -133,20 +132,14 @@ namespace vkcv {
 		}
     }
 
-    void Window::onGamepadConnection(int gamepadIndex, int gamepadEvent) {
-        if (gamepadEvent == GLFW_CONNECTED) {
-            auto window = static_cast<Window *>(glfwGetWindowUserPointer(s_Windows[0]));    // todo check for correct window
-
-            if (window != nullptr) {
-                glfwSetJoystickUserPointer(gamepadIndex, window);
-            }
-        }
-    }
-
     void Window::onGamepadEvent(int gamepadIndex) {
-        auto window = static_cast<Window *>(glfwGetJoystickUserPointer(gamepadIndex));
+        int activeWindowIndex = std::find_if(s_Windows.begin(),
+                                             s_Windows.end(),
+                                             [](GLFWwindow* window){return glfwGetWindowAttrib(window, GLFW_FOCUSED);})
+                                - s_Windows.begin();
+        auto window = static_cast<Window *>(glfwGetWindowUserPointer(s_Windows[activeWindowIndex]));
 
-        if ( window != nullptr && glfwJoystickPresent(gamepadIndex)) {
+        if (window != nullptr && glfwJoystickPresent(gamepadIndex)) {
             window->e_gamepad(gamepadIndex);
         }
     }