From 2f87869e880cdbb5997799978901cad3afee7b29 Mon Sep 17 00:00:00 2001
From: BrunoCostaGH <54143084+BrunoCostaGH@users.noreply.github.com>
Date: Sun, 26 Jul 2026 21:34:30 +0100
Subject: [PATCH 1/2] fix: refactor X-Plane window handling logic
---
A320UE/A320UE.vcxproj | 10 +++---
BetterMouseYoke/BetterMouseYoke.vcxproj | 10 +++---
BetterMouseYoke/plugin.c | 43 ++++++++++++++++++-------
CycleQuickLooks/CycleQuickLooks.vcxproj | 10 +++---
MouseButtons/MouseButtons.vcxproj | 10 +++---
MouseButtons/plugin.c | 36 ++++++++++++++++++---
PluginLoader/PluginLoader.vcxproj | 10 +++---
ToggleMouseLook/ToggleMouseLook.vcxproj | 10 +++---
ToggleMouseLook/plugin.c | 36 ++++++++++++++++++---
Util/Util.vcxproj | 10 +++---
10 files changed, 131 insertions(+), 54 deletions(-)
diff --git a/A320UE/A320UE.vcxproj b/A320UE/A320UE.vcxproj
index c343400..69e5ca4 100644
--- a/A320UE/A320UE.vcxproj
+++ b/A320UE/A320UE.vcxproj
@@ -38,32 +38,32 @@
{3684F283-A3DB-48E7-BD8F-C9351A38138F}
Win32Proj
A320UE
- 10.0.17134.0
+ 10.0
DynamicLibrary
true
- v141
+ v143
NotSet
DynamicLibrary
false
- v141
+ v143
true
NotSet
DynamicLibrary
true
- v141
+ v143
NotSet
DynamicLibrary
false
- v141
+ v143
true
NotSet
diff --git a/BetterMouseYoke/BetterMouseYoke.vcxproj b/BetterMouseYoke/BetterMouseYoke.vcxproj
index fc33a97..cb68a0f 100644
--- a/BetterMouseYoke/BetterMouseYoke.vcxproj
+++ b/BetterMouseYoke/BetterMouseYoke.vcxproj
@@ -34,32 +34,32 @@
{D9E54848-F19F-4DBD-B4EC-4871922541CA}
Win32Proj
BetterMouseYoke
- 10.0.17134.0
+ 10.0
DynamicLibrary
true
- v141
+ v143
NotSet
DynamicLibrary
false
- v141
+ v143
true
NotSet
DynamicLibrary
true
- v141
+ v143
NotSet
DynamicLibrary
false
- v141
+ v143
true
NotSet
diff --git a/BetterMouseYoke/plugin.c b/BetterMouseYoke/plugin.c
index 5b75bab..de4236e 100644
--- a/BetterMouseYoke/plugin.c
+++ b/BetterMouseYoke/plugin.c
@@ -14,7 +14,7 @@
#define PLUGIN_DESCRIPTION "Does away with X-Plane's idiotic centered little box " \
"for mouse steering that has caused much grieve and " \
"countless loss of virtual lives."
-#define PLUGIN_VERSION "1.5"
+#define PLUGIN_VERSION "1.5.1"
#define RUDDER_DEFL_DIST 200
#define RUDDER_RET_SPEED 2.0f
@@ -45,15 +45,37 @@ static HCURSOR yoke_cursor;
static HCURSOR rudder_cursor;
static HCURSOR arrow_cursor;
static HCURSOR(WINAPI *true_set_cursor) (HCURSOR cursor) = SetCursor;
+
+static BOOL CALLBACK find_xplane_window_cb(HWND hwnd, LPARAM lParam)
+{
+ char class_name[64] = { 0 };
+ if (GetClassNameA(hwnd, class_name, sizeof(class_name))) {
+ if (strcmp(class_name, "X-System") == 0) {
+ HWND *out = (HWND *)lParam;
+ *out = hwnd;
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static int find_xplane_window(HWND *out_hwnd)
+{
+ *out_hwnd = NULL;
+ if (EnumWindows(find_xplane_window_cb, (LPARAM)out_hwnd) && *out_hwnd) {
+ return 1;
+ }
+ if (*out_hwnd) {
+ return 1;
+ }
+ *out_hwnd = FindWindowA("X-System", "X-System");
+ if (*out_hwnd) {
+ return 1;
+ }
+ return 0;
+}
#endif
-/**
- * X-Plane 11 Plugin Entry Point.
- *
- * Called when a plugin is initially loaded into X-Plane 11. If 0 is returned,
- * the plugin will be unloaded immediately with no further calls to any of
- * its callbacks.
- */
PLUGIN_API int XPluginStart(char *name, char *sig, char *desc) {
/* SDK docs state buffers are at least 256 bytes. */
sprintf(name, "%s (v%s)", PLUGIN_NAME, PLUGIN_VERSION);
@@ -94,9 +116,8 @@ PLUGIN_API int XPluginStart(char *name, char *sig, char *desc) {
rudder_defl_dist = ini_geti("rudder_deflection_distance", RUDDER_DEFL_DIST);
rudder_ret_spd = ini_getf("rudder_return_speed", RUDDER_RET_SPEED);
#ifdef IBM
- xp_hwnd = FindWindowA("X-System", "X-System");
- if (!xp_hwnd) {
- _log("could not find X-Plane 11 window");
+ if (!find_xplane_window(&xp_hwnd)) {
+ _log("could not find X-Plane window");
return 0;
}
if (!hook_set_cursor(1)) {
diff --git a/CycleQuickLooks/CycleQuickLooks.vcxproj b/CycleQuickLooks/CycleQuickLooks.vcxproj
index a1915c8..fbc7930 100644
--- a/CycleQuickLooks/CycleQuickLooks.vcxproj
+++ b/CycleQuickLooks/CycleQuickLooks.vcxproj
@@ -31,32 +31,32 @@
{9FD9E482-7A36-4B3A-B352-79C35D744F98}
Win32Proj
CycleQuickLooks
- 10.0.17134.0
+ 10.0
DynamicLibrary
true
- v141
+ v143
NotSet
DynamicLibrary
false
- v141
+ v143
true
NotSet
DynamicLibrary
true
- v141
+ v143
NotSet
DynamicLibrary
false
- v141
+ v143
true
NotSet
diff --git a/MouseButtons/MouseButtons.vcxproj b/MouseButtons/MouseButtons.vcxproj
index 255ae40..d668092 100644
--- a/MouseButtons/MouseButtons.vcxproj
+++ b/MouseButtons/MouseButtons.vcxproj
@@ -35,32 +35,32 @@
{71988D8C-AEF8-45DB-8609-69E6F6315C71}
Win32Proj
MouseButtons
- 10.0.17134.0
+ 10.0
DynamicLibrary
true
- v141
+ v143
NotSet
DynamicLibrary
false
- v141
+ v143
true
NotSet
DynamicLibrary
true
- v141
+ v143
NotSet
DynamicLibrary
false
- v141
+ v143
true
NotSet
diff --git a/MouseButtons/plugin.c b/MouseButtons/plugin.c
index 3655949..364ca25 100644
--- a/MouseButtons/plugin.c
+++ b/MouseButtons/plugin.c
@@ -13,7 +13,7 @@
#define PLUGIN_DESCRIPTION "Enables the use of extra mouse buttons and allows " \
"the right mouse button and mouse wheel to be re-" \
"assigned to arbitrary commands."
-#define PLUGIN_VERSION "1.0"
+#define PLUGIN_VERSION "1.0.1"
/**
* X-Plane 11 Plugin Entry Point.
@@ -96,6 +96,35 @@ PLUGIN_API void XPluginReceiveMessage(XPLMPluginID from, int msg, void *param) {
static HWND xp_hwnd;
static WNDPROC old_wnd_proc;
+static BOOL CALLBACK find_xplane_window_cb(HWND hwnd, LPARAM lParam)
+{
+ char class_name[64] = { 0 };
+ if (GetClassNameA(hwnd, class_name, sizeof(class_name))) {
+ if (strcmp(class_name, "X-System") == 0) {
+ HWND* out = (HWND*)lParam;
+ *out = hwnd;
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static int find_xplane_window(HWND* out_hwnd)
+{
+ *out_hwnd = NULL;
+ if (EnumWindows(find_xplane_window_cb, (LPARAM)out_hwnd) && *out_hwnd) {
+ return 1;
+ }
+ if (*out_hwnd) {
+ return 1;
+ }
+ *out_hwnd = FindWindowA("X-System", "X-System");
+ if (*out_hwnd) {
+ return 1;
+ }
+ return 0;
+}
+
static mbutton_t wm_to_mbutton(UINT msg, WPARAM wParam, int *state) {
switch (msg) {
case WM_LBUTTONDOWN:
@@ -169,9 +198,8 @@ LRESULT CALLBACK xp_wnd_proc(HWND hwnd, UINT msg, WPARAM wParam,
}
int hook_wnd_proc() {
- xp_hwnd = FindWindowA("X-System", "X-System");
- if (!xp_hwnd) {
- _log("could not find X-Plane 11 window");
+ if (!find_xplane_window(&xp_hwnd)) {
+ _log("could not find X-Plane window");
return 0;
}
old_wnd_proc = (WNDPROC)SetWindowLongPtrA(xp_hwnd, GWLP_WNDPROC,
diff --git a/PluginLoader/PluginLoader.vcxproj b/PluginLoader/PluginLoader.vcxproj
index eff2608..2f15741 100644
--- a/PluginLoader/PluginLoader.vcxproj
+++ b/PluginLoader/PluginLoader.vcxproj
@@ -34,32 +34,32 @@
{6A2982AA-8DC6-4217-94ED-87D956767507}
Win32Proj
PluginLoader
- 10.0.17134.0
+ 10.0
DynamicLibrary
true
- v141
+ v143
NotSet
DynamicLibrary
false
- v141
+ v143
true
NotSet
DynamicLibrary
true
- v141
+ v143
NotSet
DynamicLibrary
false
- v141
+ v143
true
NotSet
diff --git a/ToggleMouseLook/ToggleMouseLook.vcxproj b/ToggleMouseLook/ToggleMouseLook.vcxproj
index c1dfe37..1ec126e 100644
--- a/ToggleMouseLook/ToggleMouseLook.vcxproj
+++ b/ToggleMouseLook/ToggleMouseLook.vcxproj
@@ -34,32 +34,32 @@
{5AF5AA8B-673B-4D43-B077-EB5F9AAAE4A5}
Win32Proj
ToggleMouseLook
- 10.0.17134.0
+ 10.0
DynamicLibrary
true
- v141
+ v143
NotSet
DynamicLibrary
false
- v141
+ v143
true
NotSet
DynamicLibrary
true
- v141
+ v143
NotSet
DynamicLibrary
false
- v141
+ v143
true
NotSet
diff --git a/ToggleMouseLook/plugin.c b/ToggleMouseLook/plugin.c
index 549c996..c9d6415 100644
--- a/ToggleMouseLook/plugin.c
+++ b/ToggleMouseLook/plugin.c
@@ -11,7 +11,7 @@
#define PLUGIN_SIG "S22.ToggleMouseLook"
#define PLUGIN_DESCRIPTION "Adds new commands for better control of mouse " \
"look inside the cockpit."
-#define PLUGIN_VERSION "1.2"
+#define PLUGIN_VERSION "1.2.1"
static XPLMCommandRef toggle_mouse_look;
static XPLMCommandRef hold_mouse_look;
@@ -130,6 +130,35 @@ int draw_cb(XPLMDrawingPhase phase, int before, void *ref) {
static HWND xp_hwnd;
static WNDPROC old_wnd_proc;
+static BOOL CALLBACK find_xplane_window_cb(HWND hwnd, LPARAM lParam)
+{
+ char class_name[64] = { 0 };
+ if (GetClassNameA(hwnd, class_name, sizeof(class_name))) {
+ if (strcmp(class_name, "X-System") == 0) {
+ HWND* out = (HWND*)lParam;
+ *out = hwnd;
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static int find_xplane_window(HWND* out_hwnd)
+{
+ *out_hwnd = NULL;
+ if (EnumWindows(find_xplane_window_cb, (LPARAM)out_hwnd) && *out_hwnd) {
+ return 1;
+ }
+ if (*out_hwnd) {
+ return 1;
+ }
+ *out_hwnd = FindWindowA("X-System", "X-System");
+ if (*out_hwnd) {
+ return 1;
+ }
+ return 0;
+}
+
LRESULT CALLBACK xp_wnd_proc(HWND hwnd, UINT msg, WPARAM wParam,
LPARAM lParam) {
switch (msg) {
@@ -149,9 +178,8 @@ LRESULT CALLBACK xp_wnd_proc(HWND hwnd, UINT msg, WPARAM wParam,
}
int hook_wnd_proc() {
- xp_hwnd = FindWindowA("X-System", "X-System");
- if (!xp_hwnd) {
- _log("could not find X-Plane 11 window");
+ if (!find_xplane_window(&xp_hwnd)) {
+ _log("could not find X-Plane window");
return 0;
}
old_wnd_proc = (WNDPROC) SetWindowLongPtrA(xp_hwnd, GWLP_WNDPROC,
diff --git a/Util/Util.vcxproj b/Util/Util.vcxproj
index ceb4ba9..c7b4b1c 100644
--- a/Util/Util.vcxproj
+++ b/Util/Util.vcxproj
@@ -36,32 +36,32 @@
{1A1C2295-5251-42A2-A088-3E027FA34795}
Win32Proj
Util
- 10.0.17134.0
+ 10.0
StaticLibrary
true
- v141
+ v143
NotSet
StaticLibrary
false
- v141
+ v143
true
NotSet
StaticLibrary
true
- v141
+ v143
NotSet
StaticLibrary
false
- v141
+ v143
true
NotSet
From 3de96e107acd4d77401bce8ddda5d136bc0c63c4 Mon Sep 17 00:00:00 2001
From: BrunoCostaGH <54143084+BrunoCostaGH@users.noreply.github.com>
Date: Sun, 26 Jul 2026 21:58:33 +0100
Subject: [PATCH 2/2] fix: re-add comment block which was deleted by mistake
---
BetterMouseYoke/plugin.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/BetterMouseYoke/plugin.c b/BetterMouseYoke/plugin.c
index de4236e..0d0dec2 100644
--- a/BetterMouseYoke/plugin.c
+++ b/BetterMouseYoke/plugin.c
@@ -76,6 +76,13 @@ static int find_xplane_window(HWND *out_hwnd)
}
#endif
+/**
+ * X-Plane 11 Plugin Entry Point.
+ *
+ * Called when a plugin is initially loaded into X-Plane 11. If 0 is returned,
+ * the plugin will be unloaded immediately with no further calls to any of
+ * its callbacks.
+ */
PLUGIN_API int XPluginStart(char *name, char *sig, char *desc) {
/* SDK docs state buffers are at least 256 bytes. */
sprintf(name, "%s (v%s)", PLUGIN_NAME, PLUGIN_VERSION);