/* TDKPIN's bounded Win16 queue drain and two close-method pairs. */ #include "tdkpin_message_pump.h" enum { WIN16_PM_REMOVE = 1, TDKPIN_MAX_DRAIN_MESSAGE = 0x0032, TDKPIN_TIMER_MESSAGE = 0x0580, WIN16_WM_KEYDOWN_LOCAL = 0x0100, WIN16_WM_KEYUP_LOCAL = 0x0101, }; /* 1008:00e2 — drain messages 0..0x32 until PeekMessage reports empty. */ void tdkpin_drain_messages_except_input(void) { MSG16 message; while (PeekMessage16( &message, 0, 0, TDKPIN_MAX_DRAIN_MESSAGE, WIN16_PM_REMOVE) != 0) { if (message.message != TDKPIN_TIMER_MESSAGE && message.message != WIN16_WM_KEYDOWN_LOCAL && message.message != WIN16_WM_KEYUP_LOCAL) { (void)TranslateMessage16(&message); (void)DispatchMessage16(&message); } } } static void drain_and_close(Win16FarPtr window) { tdkpin_drain_messages_except_input(); object_windows_close_if_allowed(window); } /* 1000:5ee6 and 6202 — identical methods in two derived window VMTs. */ void tdkpin_close_variant_a(Win16FarPtr window) { drain_and_close(window); } void tdkpin_close_variant_b(Win16FarPtr window) { drain_and_close(window); } static uint16_t conditional_drain_and_close( Win16FarPtr window, ObjectWindowsMessage *message, uint8_t suppressed_notification) { uint8_t notification = (uint8_t)((uint32_t)message->lparam >> 16); if (notification != suppressed_notification) { drain_and_close(window); } return win16_indeterminate_u16(); } /* * 1000:5efc and 6218 — suppress close for notification 0x1c/0x3b. * Both routines return an uninitialized local word on every path. */ uint16_t tdkpin_conditional_close_variant_a( Win16FarPtr window, ObjectWindowsMessage *message) { return conditional_drain_and_close(window, message, 0x1c); } uint16_t tdkpin_conditional_close_variant_b( Win16FarPtr window, ObjectWindowsMessage *message) { return conditional_drain_and_close(window, message, 0x3b); }