- rewrite of the win32 dialog handling based on the "overwrite ask" example

- user shortcut dialog string limit fixed
- fixed keyboard focus in user shortcut and cdrom dialog
This commit is contained in:
Volker Ruppert 2005-10-22 11:00:00 +00:00
parent 3658399a4a
commit 9b4db66efd
5 changed files with 70 additions and 48 deletions

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: sdl.cc,v 1.60 2005-10-21 18:00:17 vruppert Exp $
// $Id: sdl.cc,v 1.61 2005-10-22 11:00:00 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -42,6 +42,9 @@
#include "icon_bochs.h"
#include "sdl.h"
#ifdef WIN32
#include "win32dialog.h"
#endif
class bx_sdl_gui_c : public bx_gui_c {
public:
@ -298,6 +301,7 @@ void bx_sdl_gui_c::specific_init(
new_gfx_api = 1;
#ifdef WIN32
win32_init_notify_callback();
user_dialog = 1;
#endif
}

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: textconfig.cc,v 1.30 2005-06-06 20:14:50 vruppert Exp $
// $Id: textconfig.cc,v 1.31 2005-10-22 11:00:00 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// This is code for a text-mode configuration interface. Note that this file
@ -644,11 +644,6 @@ int log_action_n_choices = 4 + (BX_DEBUGGER||BX_GDBSTUB?1:0);
BxEvent *
config_interface_notify_callback (void *unused, BxEvent *event)
{
#ifdef WIN32
int opts;
bx_param_c *param;
bx_param_string_c *sparam;
#endif
event->retcode = -1;
switch (event->type)
{
@ -656,34 +651,10 @@ config_interface_notify_callback (void *unused, BxEvent *event)
event->retcode = 0;
return event;
case BX_SYNC_EVT_ASK_PARAM:
#ifdef WIN32
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 (param->get_id() == BXP_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;
}
#endif
event->u.param.param->text_ask (stdin, stderr);
return event;
case BX_SYNC_EVT_LOG_ASK:
{
#ifdef WIN32
LogAskDialog(event);
#else
int level = event->u.logmsg.level;
fprintf (stderr, "========================================================================\n");
fprintf (stderr, "Event type: %s\n", SIM->get_log_level_name (level));
@ -713,7 +684,6 @@ ask:
fflush(stdout);
fflush(stderr);
event->retcode = choice;
#endif
}
return event;
case BX_ASYNC_EVT_REFRESH:

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: win32.cc,v 1.97 2005-10-21 18:00:17 vruppert Exp $
// $Id: win32.cc,v 1.98 2005-10-22 11:00:00 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -38,6 +38,7 @@
#if BX_WITH_WIN32
#include "zmouse.h"
#include "win32dialog.h"
#include "win32res.h"
#include "font/vga.bitmap.h"
// windows.h is included by bochs.h
@ -680,6 +681,7 @@ void bx_win32_gui_c::specific_init(int argc, char **argv, unsigned
bx_keymap.loadKeymap(NULL); // I have no function to convert X windows symbols
}
win32_init_notify_callback();
user_dialog = 1;
}

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: win32dialog.cc,v 1.25 2005-10-07 23:28:43 vruppert Exp $
// $Id: win32dialog.cc,v 1.26 2005-10-22 11:00:00 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
#include "config.h"
@ -7,6 +7,7 @@
#if BX_USE_TEXTCONFIG && defined(WIN32)
extern "C" {
#include <assert.h>
#include <stdio.h>
#include <windows.h>
#include <commctrl.h>
@ -18,6 +19,10 @@ extern "C" {
const char log_choices[5][16] = {"ignore", "log", "ask user", "end simulation", "no change"};
static int retcode = 0;
static bxevent_handler old_callback = NULL;
static void *old_callback_arg = NULL;
int AskFilename(HWND hwnd, bx_param_filename_c *param, const char *ext);
HWND GetBochsWindow()
{
@ -97,21 +102,23 @@ static BOOL CALLBACK LogAskProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lPara
static BOOL CALLBACK StringParamProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
static bx_param_string_c *param;
char buffer[20];
char buffer[512];
switch (msg) {
case WM_INITDIALOG:
param = (bx_param_string_c *)lParam;
SetWindowText(hDlg, param->get_name());
SetWindowText(GetDlgItem(hDlg, IDSTRING), param->getptr());
return FALSE;
SendMessage(GetDlgItem(hDlg, IDSTRING), EM_SETLIMITTEXT, param->get_maxsize(), 0);
return TRUE;
break;
case WM_CLOSE:
EndDialog(hDlg, -1);
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:
GetDlgItemText(hDlg, IDSTRING, buffer, 20);
GetDlgItemText(hDlg, IDSTRING, buffer, param->get_maxsize() + 1);
param->set(buffer);
EndDialog(hDlg, 1);
break;
@ -233,6 +240,7 @@ static BOOL CALLBACK Cdrom1DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lP
if (cdromop.Ostatus->get() == BX_INSERTED) {
SendMessage(GetDlgItem(hDlg, IDSTATUS1), BM_SETCHECK, BST_CHECKED, 0);
}
return TRUE;
break;
case WM_CLOSE:
if (lstrcmp(cdromop.Opath->getptr(), origpath)) {
@ -742,4 +750,51 @@ int RuntimeOptionsDialog()
return retcode;
}
BxEvent* win32_notify_callback(void *unused, BxEvent *event)
{
int opts;
bx_param_c *param;
bx_param_string_c *sparam;
event->retcode = -1;
switch (event->type)
{
case BX_SYNC_EVT_LOG_ASK:
LogAskDialog(event);
return event;
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 (param->get_id() == BXP_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;
}
case BX_SYNC_EVT_TICK: // called periodically by siminterface.
case BX_ASYNC_EVT_REFRESH: // called when some bx_param_c parameters have changed.
// fall into default case
default:
return (*old_callback)(old_callback_arg, event);
}
}
void win32_init_notify_callback()
{
SIM->get_notify_callback(&old_callback, &old_callback_arg);
assert (old_callback != NULL);
SIM->set_notify_callback(win32_notify_callback, NULL);
}
#endif // BX_USE_TEXTCONFIG && defined(WIN32)

View File

@ -1,21 +1,12 @@
/////////////////////////////////////////////////////////////////////////
// $Id: win32dialog.h,v 1.7 2004-02-01 01:40:14 vruppert Exp $
// $Id: win32dialog.h,v 1.8 2005-10-22 11:00:00 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
#include "config.h"
#if BX_USE_TEXTCONFIG && defined(WIN32)
extern "C" {
#include <windows.h>
}
HWND GetBochsWindow();
void LogAskDialog(BxEvent *event);
int AskFilename(HWND hwnd, bx_param_filename_c *param, const char *ext);
int AskString(bx_param_string_c *param);
int FloppyDialog(bx_param_filename_c *param);
int Cdrom1Dialog();
int RuntimeOptionsDialog();
void win32_init_notify_callback();
#endif