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);