I 'd be happy if my code is part of the bochs source from now on, no problem for LGPL. Do compile it and tell me if it works without issues.
Also double check win32dialog.cpp win32_notify_callback, I think I 've changed it slightly but I don't quite remember , I think It was the "case BX_SYNC_EVT_GET_DBG_COMMAND:" case.
Code:
BxEvent* win32_notify_callback(void *unused, BxEvent *event)
{
int opts;
bx_param_c *param;
bx_param_string_c *sparam;
#if BX_DEBUGGER
char debug_msg[1024];
int i, j;
#endif
event->retcode = -1;
switch (event->type)
{
case BX_SYNC_EVT_LOG_ASK:
LogAskDialog(event);
return event;
#if BX_DEBUGGER
case BX_SYNC_EVT_GET_DBG_COMMAND:
{
debug_cmd = new char[512];
SendMessage(hDebugDialog, WM_USER, 0x1234, 1);
debug_cmd_ready = FALSE;
SendMessage(hDebugDialog, WM_USER, 0x1234, 2);
while (!debug_cmd_ready && (hDebugDialog != NULL)) {
Sleep(10);
}
if (hDebugDialog == NULL) {
lstrcpy(debug_cmd, "q");
} else {
SendMessage(hDebugDialog, WM_USER, 0x1234, 0);
}
event->u.debugcmd.command = debug_cmd;
event->retcode = 1;
return event;
}
case BX_ASYNC_EVT_DBG_MSG:
lstrcpy(debug_msg, (char*)event->u.logmsg.msg);
for (i = 0; i < lstrlen(debug_msg); i++) {
if (debug_msg[i] == 10) {
for (j = lstrlen(debug_msg); j >= i; j--) debug_msg[j+1] = debug_msg[j];
debug_msg[i] = 13;
i++;
}
}
SendMessage(hDebugDialog, WM_USER, 0x5678, (LPARAM)debug_msg);
// free the char* which was allocated in dbg_printf
delete [] ((char*)event->u.logmsg.msg);
return event;
#endif
case BX_SYNC_EVT_ASK_PARAM:
param = event->u.param.param;
if (param->get_type() == BXT_PARAM_STRING) {
sparam = (bx_param_string_c *)param;
opts = sparam->get_options()->get();
if (opts & sparam->IS_FILENAME) {
if (opts & sparam->SELECT_FOLDER_DLG) {
event->retcode = BrowseDir(sparam->get_label(), sparam->getptr());
} else if (param->get_parent() == NULL) {
event->retcode = AskFilename(GetBochsWindow(), (bx_param_filename_c *)sparam, "txt");
} else {
event->retcode = FloppyDialog((bx_param_filename_c *)sparam);
}
return event;
} else {
event->retcode = AskString(sparam);
return event;
}
} else if (param->get_type() == BXT_LIST) {
event->retcode = Cdrom1Dialog();
return event;
} else if (param->get_type() == BXT_PARAM_BOOL) {
UINT flag = MB_YESNO | MB_SETFOREGROUND;
if (((bx_param_bool_c *)param)->get() == 0) {
flag |= MB_DEFBUTTON2;
}
((bx_param_bool_c *)param)->set(MessageBox(GetActiveWindow(), param->get_description(), param->get_label(), flag) == IDYES);
event->retcode = 0;
return event;
}
case BX_ASYNC_EVT_REFRESH:
#if BX_DEBUGGER
RefreshDebugDialog();
return event;
#endif
case BX_SYNC_EVT_TICK: // called periodically by siminterface.
// fall into default case
default:
return (*old_callback)(old_callback_arg, event);
}
}