- 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. // Copyright (C) 2002 MandrakeSoft S.A.
@ -42,6 +42,9 @@
#include "icon_bochs.h" #include "icon_bochs.h"
#include "sdl.h" #include "sdl.h"
#ifdef WIN32
#include "win32dialog.h"
#endif
class bx_sdl_gui_c : public bx_gui_c { class bx_sdl_gui_c : public bx_gui_c {
public: public:
@ -298,6 +301,7 @@ void bx_sdl_gui_c::specific_init(
new_gfx_api = 1; new_gfx_api = 1;
#ifdef WIN32 #ifdef WIN32
win32_init_notify_callback();
user_dialog = 1; user_dialog = 1;
#endif #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 // 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 * BxEvent *
config_interface_notify_callback (void *unused, BxEvent *event) 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; event->retcode = -1;
switch (event->type) switch (event->type)
{ {
@ -656,34 +651,10 @@ config_interface_notify_callback (void *unused, BxEvent *event)
event->retcode = 0; event->retcode = 0;
return event; return event;
case BX_SYNC_EVT_ASK_PARAM: 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); event->u.param.param->text_ask (stdin, stderr);
return event; return event;
case BX_SYNC_EVT_LOG_ASK: case BX_SYNC_EVT_LOG_ASK:
{ {
#ifdef WIN32
LogAskDialog(event);
#else
int level = event->u.logmsg.level; int level = event->u.logmsg.level;
fprintf (stderr, "========================================================================\n"); fprintf (stderr, "========================================================================\n");
fprintf (stderr, "Event type: %s\n", SIM->get_log_level_name (level)); fprintf (stderr, "Event type: %s\n", SIM->get_log_level_name (level));
@ -713,7 +684,6 @@ ask:
fflush(stdout); fflush(stdout);
fflush(stderr); fflush(stderr);
event->retcode = choice; event->retcode = choice;
#endif
} }
return event; return event;
case BX_ASYNC_EVT_REFRESH: 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. // Copyright (C) 2002 MandrakeSoft S.A.
@ -38,6 +38,7 @@
#if BX_WITH_WIN32 #if BX_WITH_WIN32
#include "zmouse.h" #include "zmouse.h"
#include "win32dialog.h"
#include "win32res.h" #include "win32res.h"
#include "font/vga.bitmap.h" #include "font/vga.bitmap.h"
// windows.h is included by bochs.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 bx_keymap.loadKeymap(NULL); // I have no function to convert X windows symbols
} }
win32_init_notify_callback();
user_dialog = 1; 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" #include "config.h"
@ -7,6 +7,7 @@
#if BX_USE_TEXTCONFIG && defined(WIN32) #if BX_USE_TEXTCONFIG && defined(WIN32)
extern "C" { extern "C" {
#include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <windows.h> #include <windows.h>
#include <commctrl.h> #include <commctrl.h>
@ -18,6 +19,10 @@ extern "C" {
const char log_choices[5][16] = {"ignore", "log", "ask user", "end simulation", "no change"}; const char log_choices[5][16] = {"ignore", "log", "ask user", "end simulation", "no change"};
static int retcode = 0; 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() 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 BOOL CALLBACK StringParamProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{ {
static bx_param_string_c *param; static bx_param_string_c *param;
char buffer[20]; char buffer[512];
switch (msg) { switch (msg) {
case WM_INITDIALOG: case WM_INITDIALOG:
param = (bx_param_string_c *)lParam; param = (bx_param_string_c *)lParam;
SetWindowText(hDlg, param->get_name()); SetWindowText(hDlg, param->get_name());
SetWindowText(GetDlgItem(hDlg, IDSTRING), param->getptr()); SetWindowText(GetDlgItem(hDlg, IDSTRING), param->getptr());
return FALSE; SendMessage(GetDlgItem(hDlg, IDSTRING), EM_SETLIMITTEXT, param->get_maxsize(), 0);
return TRUE;
break;
case WM_CLOSE: case WM_CLOSE:
EndDialog(hDlg, -1); EndDialog(hDlg, -1);
break; break;
case WM_COMMAND: case WM_COMMAND:
switch (LOWORD(wParam)) { switch (LOWORD(wParam)) {
case IDOK: case IDOK:
GetDlgItemText(hDlg, IDSTRING, buffer, 20); GetDlgItemText(hDlg, IDSTRING, buffer, param->get_maxsize() + 1);
param->set(buffer); param->set(buffer);
EndDialog(hDlg, 1); EndDialog(hDlg, 1);
break; break;
@ -233,6 +240,7 @@ static BOOL CALLBACK Cdrom1DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lP
if (cdromop.Ostatus->get() == BX_INSERTED) { if (cdromop.Ostatus->get() == BX_INSERTED) {
SendMessage(GetDlgItem(hDlg, IDSTATUS1), BM_SETCHECK, BST_CHECKED, 0); SendMessage(GetDlgItem(hDlg, IDSTATUS1), BM_SETCHECK, BST_CHECKED, 0);
} }
return TRUE;
break; break;
case WM_CLOSE: case WM_CLOSE:
if (lstrcmp(cdromop.Opath->getptr(), origpath)) { if (lstrcmp(cdromop.Opath->getptr(), origpath)) {
@ -742,4 +750,51 @@ int RuntimeOptionsDialog()
return retcode; 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) #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" #include "config.h"
#if BX_USE_TEXTCONFIG && defined(WIN32) #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(); int RuntimeOptionsDialog();
void win32_init_notify_callback();
#endif #endif