85fcabbd8f
--- /home/volker/bochs/bochs/bochs.h 2016-08-12 19:06:18.803209189 +0200 +++ ./bochs.h 2016-12-28 00:41:20.000627252 +0100 @@ -2,7 +2,7 @@ // $Id: bochs.h 12935 2016-08-12 17:06:14Z vruppert $ ///////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2001-2015 The Bochs Project +// Copyright (C) 2001-2016 The Bochs Project // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -276,8 +276,9 @@ void error(const char *fmt, ...) BX_CPP_AttrPrintf(2, 3); void panic(const char *fmt, ...) BX_CPP_AttrPrintf(2, 3); void ldebug(const char *fmt, ...) BX_CPP_AttrPrintf(2, 3); - void fatal (const char *prefix, const char *fmt, va_list ap, int exit_status); - void ask (int level, const char *prefix, const char *fmt, va_list ap); + void fatal(const char *prefix, const char *fmt, va_list ap, int exit_status); + void warn(int level, const char *prefix, const char *fmt, va_list ap); + void ask(int level, const char *prefix, const char *fmt, va_list ap); void put(const char *p); void put(const char *n, const char *p); void setio(class iofunctions *); @@ -334,7 +335,8 @@ void set_log_action(int loglevel, int action); const char *getlevel(int i) const; const char *getaction(int i) const; - + int isaction(const char *val) const; + protected: int n_logfn; #define MAX_LOGFNS 512 diff -urNX /home/volker/exclude-bochs /home/volker/bochs/bochs/CHANGES ./CHANGES --- /home/volker/bochs/bochs/CHANGES 2016-12-26 10:45:44.000000000 +0100 +++ ./CHANGES 2016-12-28 15:54:25.127088081 +0100 @@ -1,5 +1,8 @@ Changes after 2.6.8 release: +- General + - Added new log action "warn", designed to show a message box on error events. + - Configure and compile - Added Android host platform support. diff -urNX /home/volker/exclude-bochs /home/volker/bochs/bochs/config.cc ./config.cc --- /home/volker/bochs/bochs/config.cc 2016-05-03 21:15:09.158016000 +0200 +++ ./config.cc 2016-12-27 19:53:10.461420368 +0100 @@ -2062,15 +2062,8 @@ actstr = strtok(NULL, ""); if (actstr != NULL) { def_action = !strcmp(module, "action"); - if (!strcmp(actstr, "fatal")) - action = ACT_FATAL; - else if (!strcmp (actstr, "report")) - action = ACT_REPORT; - else if (!strcmp (actstr, "ignore")) - action = ACT_IGNORE; - else if (!strcmp (actstr, "ask")) - action = ACT_ASK; - else { + action = SIM->is_action_name(actstr); + if (action < ACT_IGNORE) { PARSE_ERR(("%s: %s directive malformed.", context, params[0])); free(param); return -1; diff -urNX /home/volker/exclude-bochs /home/volker/bochs/bochs/gui/sdl2.cc ./gui/sdl2.cc --- /home/volker/bochs/bochs/gui/sdl2.cc 2016-08-12 19:06:18.811209142 +0200 +++ ./gui/sdl2.cc 2016-12-28 12:33:39.534288819 +0100 @@ -2,7 +2,7 @@ // $Id: sdl2.cc 12935 2016-08-12 17:06:14Z vruppert $ ///////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2014-2015 The Bochs Project +// Copyright (C) 2014-2016 The Bochs Project // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -1478,20 +1478,16 @@ SDL_MessageBoxData msgboxdata; SDL_MessageBoxButtonData buttondata[4]; int level, retcode; -#if BX_DEBUGGER || BX_GDBSTUB - int defbtn = 3; -#else - int defbtn = 2; -#endif char message[512]; level = event->u.logmsg.level; - sprintf(message, "%s %s", event->u.logmsg.prefix, event->u.logmsg.msg); + sprintf(message, "Device: %s\nMessage: %s", event->u.logmsg.prefix, + event->u.logmsg.msg); msgboxdata.flags = SDL_MESSAGEBOX_ERROR; msgboxdata.window = window; msgboxdata.title = SIM->get_log_level_name(level); msgboxdata.message = message; - msgboxdata.numbuttons = defbtn + 1; + msgboxdata.numbuttons = 2; msgboxdata.buttons = buttondata; msgboxdata.colorScheme = NULL; buttondata[0].flags = 0; @@ -1500,14 +1496,18 @@ buttondata[1].flags = 0; buttondata[1].buttonid = BX_LOG_ASK_CHOICE_CONTINUE_ALWAYS; buttondata[1].text = "Alwayscont"; + if (event->u.logmsg.flag == BX_LOG_ASK_ASKDLG) { + msgboxdata.numbuttons = 3; + buttondata[2].flags = SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT; + buttondata[2].buttonid = BX_LOG_ASK_CHOICE_DIE; + buttondata[2].text = "Quit"; #if BX_DEBUGGER || BX_GDBSTUB - buttondata[2].flags = 0; - buttondata[2].buttonid = BX_LOG_ASK_CHOICE_ENTER_DEBUG; - buttondata[2].text = "Debugger"; -#endif - buttondata[defbtn].flags = SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT; - buttondata[defbtn].buttonid = BX_LOG_ASK_CHOICE_DIE; - buttondata[defbtn].text = "Quit"; + msgboxdata.numbuttons = 4; + buttondata[3].flags = 0; + buttondata[3].buttonid = BX_LOG_ASK_CHOICE_ENTER_DEBUG; + buttondata[3].text = "Debugger"; +#endif + } if (SDL_ShowMessageBox(&msgboxdata, &retcode) < 0) { return -1; } else { diff -urNX /home/volker/exclude-bochs /home/volker/bochs/bochs/gui/siminterface.cc ./gui/siminterface.cc --- /home/volker/bochs/bochs/gui/siminterface.cc 2016-12-05 19:56:56.729685000 +0100 +++ ./gui/siminterface.cc 2016-12-28 11:14:02.004075717 +0100 @@ -2,7 +2,7 @@ // $Id: siminterface.cc 12981 2016-12-05 18:56:56Z sshwarts $ ///////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2002-2015 The Bochs Project +// Copyright (C) 2002-2016 The Bochs Project // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -100,6 +100,7 @@ virtual int get_log_action(int mod, int level); virtual void set_log_action(int mod, int level, int action); virtual const char *get_action_name(int action); + virtual int is_action_name(const char *val); virtual int get_default_log_action(int level) { return logfunctions::get_default_action(level); } @@ -123,6 +124,7 @@ virtual void set_notify_callback(bxevent_handler func, void *arg); virtual void get_notify_callback(bxevent_handler *func, void **arg); virtual BxEvent* sim_to_ci_event(BxEvent *event); + virtual int log_warn(const char *prefix, int level, const char *msg); virtual int log_ask(const char *prefix, int level, const char *msg); virtual void log_msg(const char *prefix, int level, const char *msg); virtual void set_log_viewer(bx_bool val) { bx_log_viewer = val; } @@ -420,6 +422,11 @@ return io->getaction(action); } +int bx_real_sim_c::is_action_name(const char *val) +{ + return io->isaction(val); +} + const char *bx_real_sim_c::get_log_level_name(int level) { return io->getlevel(level); @@ -575,6 +582,21 @@ } } +int bx_real_sim_c::log_warn(const char *prefix, int level, const char *msg) +{ + BxEvent be; + be.type = BX_SYNC_EVT_LOG_ASK; + be.u.logmsg.prefix = prefix; + be.u.logmsg.level = level; + be.u.logmsg.msg = msg; + be.u.logmsg.flag = BX_LOG_ASK_MSGBOX_WARN; + // default return value in case something goes wrong. + be.retcode = BX_LOG_NOTIFY_FAILED; + // calling notify + sim_to_ci_event(&be); + return be.retcode; +} + // returns 0 for continue, 1 for alwayscontinue, 2 for die. int bx_real_sim_c::log_ask(const char *prefix, int level, const char *msg) { @@ -583,6 +605,7 @@ be.u.logmsg.prefix = prefix; be.u.logmsg.level = level; be.u.logmsg.msg = msg; + be.u.logmsg.flag = BX_LOG_ASK_ASKDLG; // default return value in case something goes wrong. be.retcode = BX_LOG_NOTIFY_FAILED; // calling notify @@ -1157,16 +1180,10 @@ } else if (!strncmp(string, "PANIC=", 6)) { type = LOGLEV_PANIC; } - if (!strcmp(string+j, "ignore")) { - action = ACT_IGNORE; - } else if (!strcmp(string+j, "report")) { - action = ACT_REPORT; - } else if (!strcmp(string+j, "ask")) { - action = ACT_ASK; - } else if (!strcmp(string+j, "fatal")) { - action = ACT_FATAL; + action = is_action_name(string+j); + if (action >= ACT_IGNORE) { + set_log_action(dev, type, action); } - set_log_action(dev, type, action); } else { if (i == 1) { BX_ERROR(("restore_logopts(): log module '%s' not found", devname)); diff -urNX /home/volker/exclude-bochs /home/volker/bochs/bochs/gui/siminterface.h ./gui/siminterface.h --- /home/volker/bochs/bochs/gui/siminterface.h 2016-03-31 19:24:37.451025427 +0200 +++ ./gui/siminterface.h 2016-12-28 11:11:21.036683362 +0100 @@ -168,6 +168,7 @@ typedef enum { ACT_IGNORE = 0, ACT_REPORT, + ACT_WARN, ACT_ASK, ACT_FATAL, N_ACT @@ -178,11 +179,11 @@ // normally all action choices are available for all event types. The exclude // expression allows some choices to be eliminated if they don't make any // sense. For example, it would be stupid to ignore a panic. -#define BX_LOG_OPTS_EXCLUDE(type, choice) ( \ - /* can't die or ask, on debug or info events */ \ - (type <= LOGLEV_INFO && (choice == ACT_ASK || choice == ACT_FATAL)) \ - /* can't ignore panics */ \ - || (type == LOGLEV_PANIC && choice == ACT_IGNORE) \ +#define BX_LOG_OPTS_EXCLUDE(type, choice) ( \ + /* can't die, ask or warn, on debug or info events */ \ + (type <= LOGLEV_INFO && (choice >= ACT_WARN)) \ + /* can't ignore panics */ \ + || (type == LOGLEV_PANIC && choice == ACT_IGNORE) \ ) // floppy / cdrom media status @@ -392,6 +393,7 @@ // synchronizing threads, etc. for each. typedef struct { Bit8u level; + Bit8u flag; const char *prefix; const char *msg; } BxLogMsgEvent; @@ -419,6 +421,12 @@ BX_LOG_NOTIFY_FAILED }; +enum { + BX_LOG_ASK_ASKDLG, + BX_LOG_ASK_MSGBOX_WARN, + BX_LOG_ASK_MSGBOX_QUIT +}; + // Event type: BX_SYNC_EVT_GET_DBG_COMMAND // // This is a synchronous event sent from the simulator to the debugger @@ -675,6 +683,7 @@ virtual int get_default_log_action(int level) {return -1;} virtual void set_default_log_action(int level, int action) {} virtual const char *get_action_name(int action) {return NULL;} + virtual int is_action_name(const char *val) {return -1;} virtual const char *get_log_level_name(int level) {return NULL;} virtual int get_max_log_level() {return -1;} @@ -715,6 +724,9 @@ // send an event from the simulator to the CI. virtual BxEvent* sim_to_ci_event(BxEvent *event) {return NULL;} + // called from simulator when it hits errors, to warn the user + // before continuing simulation + virtual int log_warn(const char *prefix, int level, const char *msg) {return -1;} // called from simulator when it hits serious errors, to ask if the user // wants to continue or not virtual int log_ask(const char *prefix, int level, const char *msg) {return -1;} diff -urNX /home/volker/exclude-bochs /home/volker/bochs/bochs/gui/textconfig.cc ./gui/textconfig.cc --- /home/volker/bochs/bochs/gui/textconfig.cc 2016-12-05 20:15:59.112637000 +0100 +++ ./gui/textconfig.cc 2016-12-28 12:44:43.079411258 +0100 @@ -2,7 +2,7 @@ // $Id: textconfig.cc 12983 2016-12-05 19:15:59Z sshwarts $ ///////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2002-2013 The Bochs Project +// Copyright (C) 2002-2016 The Bochs Project // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -552,8 +552,8 @@ } static const char *log_options_prompt1 = "Enter the ID of the device to edit, or -1 to return: [-1] "; -static const char *log_level_choices[] = { "ignore", "report", "ask", "fatal", "no change" }; -static int log_level_n_choices_normal = 4; +static const char *log_level_choices[N_ACT+1] = { "ignore", "report", "warn", "ask", "fatal", "no change" }; +static int log_level_n_choices_normal = N_ACT; void bx_log_options(int individual) { @@ -589,7 +589,7 @@ bx_print_log_action_table(); for (int level=0; level<SIM->get_max_log_level(); level++) { char prompt[1024]; - int action, default_action = 4; // default to no change + int action, default_action = N_ACT; // default to no change sprintf(prompt, "Enter action for %s event on all devices: [no change] ", SIM->get_log_level_name(level)); // do show the no change choice (choices=4) if (ask_menu(prompt, "", log_level_n_choices_normal+1, log_level_choices, default_action, &action)<0) @@ -718,47 +718,50 @@ event->retcode = event->u.param.param->text_ask(stdin, stderr); return event; case BX_SYNC_EVT_LOG_ASK: - { - int level = event->u.logmsg.level; - fprintf(stderr, "========================================================================\n"); - fprintf(stderr, "Event type: %s\n", SIM->get_log_level_name (level)); - fprintf(stderr, "Device: %s\n", event->u.logmsg.prefix); - fprintf(stderr, "Message: %s\n\n", event->u.logmsg.msg); - fprintf(stderr, "A %s has occurred. Do you want to:\n", SIM->get_log_level_name (level)); - fprintf(stderr, " cont - continue execution\n"); - fprintf(stderr, " alwayscont - continue execution, and don't ask again.\n"); - fprintf(stderr, " This affects only %s events from device %s\n", SIM->get_log_level_name (level), event->u.logmsg.prefix); - fprintf(stderr, " die - stop execution now\n"); - fprintf(stderr, " abort - dump core %s\n", - BX_HAVE_ABORT ? "" : "(Disabled)"); + if (event->u.logmsg.flag == BX_LOG_ASK_ASKDLG) { + int level = event->u.logmsg.level; + fprintf(stderr, "========================================================================\n"); + fprintf(stderr, "Event type: %s\n", SIM->get_log_level_name (level)); + fprintf(stderr, "Device: %s\n", event->u.logmsg.prefix); + fprintf(stderr, "Message: %s\n\n", event->u.logmsg.msg); + fprintf(stderr, "A %s has occurred. Do you want to:\n", SIM->get_log_level_name (level)); + fprintf(stderr, " cont - continue execution\n"); + fprintf(stderr, " alwayscont - continue execution, and don't ask again.\n"); + fprintf(stderr, " This affects only %s events from device %s\n", SIM->get_log_level_name (level), event->u.logmsg.prefix); + fprintf(stderr, " die - stop execution now\n"); + fprintf(stderr, " abort - dump core %s\n", + BX_HAVE_ABORT ? "" : "(Disabled)"); #if BX_DEBUGGER - fprintf(stderr, " debug - continue and return to bochs debugger\n"); + fprintf(stderr, " debug - continue and return to bochs debugger\n"); #endif #if BX_GDBSTUB - fprintf(stderr, " debug - hand control to gdb\n"); + fprintf(stderr, " debug - hand control to gdb\n"); #endif - int choice; + int choice; ask: - if (ask_menu("Choose one of the actions above: [%s] ", "", - log_action_n_choices, log_action_ask_choices, 2, &choice) < 0) - event->retcode = -1; - // return 0 for continue, 1 for alwayscontinue, 2 for die, 3 for debug. - if (!BX_HAVE_ABORT && choice==BX_LOG_ASK_CHOICE_DUMP_CORE) goto ask; - fflush(stdout); - fflush(stderr); - event->retcode = choice; - } - return event; - case BX_ASYNC_EVT_REFRESH: - case BX_ASYNC_EVT_DBG_MSG: - case BX_ASYNC_EVT_LOG_MSG: - // The text mode interface does not use these events, so just ignore - // them. - return event; - default: - fprintf(stderr, "textconfig: notify callback called with event type %04x\n", event->type); - return event; + if (ask_menu("Choose one of the actions above: [%s] ", "", + log_action_n_choices, log_action_ask_choices, 2, &choice) < 0) + event->retcode = -1; + // return 0 for continue, 1 for alwayscontinue, 2 for die, 3 for debug. + if (!BX_HAVE_ABORT && choice==BX_LOG_ASK_CHOICE_DUMP_CORE) goto ask; + fflush(stdout); + fflush(stderr); + event->retcode = choice; + } else { + // warning prompt not implemented + event->retcode = 0; + } + return event; + case BX_ASYNC_EVT_REFRESH: + case BX_ASYNC_EVT_DBG_MSG: + case BX_ASYNC_EVT_LOG_MSG: + // The text mode interface does not use these events, so just ignore + // them. + return event; + default: + fprintf(stderr, "textconfig: notify callback called with event type %04x\n", event->type); + return event; } assert(0); // switch statement should return } diff -urNX /home/volker/exclude-bochs /home/volker/bochs/bochs/gui/win32dialog.cc ./gui/win32dialog.cc --- /home/volker/bochs/bochs/gui/win32dialog.cc 2014-06-20 11:32:02.034026376 +0200 +++ ./gui/win32dialog.cc 2016-12-28 12:50:14.148888740 +0100 @@ -2,7 +2,7 @@ // $Id: win32dialog.cc 12381 2014-06-20 09:31:56Z vruppert $ ///////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2003-2014 The Bochs Project +// Copyright (C) 2003-2016 The Bochs Project // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -27,7 +27,7 @@ #include "win32res.h" #include "win32paramdlg.h" -const char log_choices[5][16] = {"ignore", "log", "ask user", "end simulation", "no change"}; +const char log_choices[N_ACT+1][16] = {"ignore", "log", "warn user", "ask user", "end simulation", "no change"}; HWND GetBochsWindow() { @@ -97,12 +97,16 @@ SetWindowText(GetDlgItem(hDlg, IDASKMSG), event->u.logmsg.msg); SendMessage(GetDlgItem(hDlg, IDASKLIST), LB_ADDSTRING, 0, (LPARAM)"Continue"); SendMessage(GetDlgItem(hDlg, IDASKLIST), LB_ADDSTRING, 0, (LPARAM)"Continue and don't ask again"); - SendMessage(GetDlgItem(hDlg, IDASKLIST), LB_ADDSTRING, 0, (LPARAM)"Kill simulation"); - SendMessage(GetDlgItem(hDlg, IDASKLIST), LB_ADDSTRING, 0, (LPARAM)"Abort (dump core)"); + if (event->u.logmsg.flag == BX_LOG_ASK_ASKDLG) { + SendMessage(GetDlgItem(hDlg, IDASKLIST), LB_ADDSTRING, 0, (LPARAM)"Kill simulation"); + SendMessage(GetDlgItem(hDlg, IDASKLIST), LB_ADDSTRING, 0, (LPARAM)"Abort (dump core)"); #if BX_DEBUGGER - SendMessage(GetDlgItem(hDlg, IDASKLIST), LB_ADDSTRING, 0, (LPARAM)"Continue and return to debugger"); + SendMessage(GetDlgItem(hDlg, IDASKLIST), LB_ADDSTRING, 0, (LPARAM)"Continue and return to debugger"); #endif - SendMessage(GetDlgItem(hDlg, IDASKLIST), LB_SETCURSEL, 2, 0); + SendMessage(GetDlgItem(hDlg, IDASKLIST), LB_SETCURSEL, 2, 0); + } else { + SendMessage(GetDlgItem(hDlg, IDASKLIST), LB_SETCURSEL, 0, 0); + } SetFocus(GetDlgItem(hDlg, IDASKLIST)); return FALSE; case WM_CLOSE: diff -urNX /home/volker/exclude-bochs /home/volker/bochs/bochs/gui/wxdialog.cc ./gui/wxdialog.cc --- /home/volker/bochs/bochs/gui/wxdialog.cc 2015-01-07 17:17:40.447882000 +0100 +++ ./gui/wxdialog.cc 2016-12-27 20:30:44.997609007 +0100 @@ -2,7 +2,7 @@ // $Id: wxdialog.cc 12594 2015-01-07 16:17:40Z sshwarts $ ///////////////////////////////////////////////////////////////// // -// Copyright (C) 2002-2014 The Bochs Project +// Copyright (C) 2002-2016 The Bochs Project // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -208,7 +208,6 @@ : wxDialog(parent, id, wxT(""), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) { - //static int integers[LOG_OPTS_N_CHOICES_NORMAL] = {0, 1, 2, 3}; static wxString names[] = ADVLOG_OPTS_TYPE_NAMES; SetTitle(ADVLOG_OPTS_TITLE); vertSizer = new wxBoxSizer(wxVERTICAL); @@ -1563,7 +1562,7 @@ bool includeNoChange) { static wxString choices[] = LOG_OPTS_CHOICES; - static int integers[LOG_OPTS_N_CHOICES] = {0, 1, 2, 3, 4}; + static int integers[LOG_OPTS_N_CHOICES] = {0, 1, 2, 3, 4, 5}; wxChoice *control = new wxChoice(parent, id, wxDefaultPosition, wxDefaultSize); int lastChoice = 0; // remember index of last choice int nchoice = includeNoChange? LOG_OPTS_N_CHOICES : LOG_OPTS_N_CHOICES_NORMAL; diff -urNX /home/volker/exclude-bochs /home/volker/bochs/bochs/gui/wxdialog.h ./gui/wxdialog.h --- /home/volker/bochs/bochs/gui/wxdialog.h 2014-12-23 20:30:12.896090221 +0100 +++ ./gui/wxdialog.h 2016-12-27 20:34:28.518389938 +0100 @@ -2,7 +2,7 @@ // $Id: wxdialog.h 12576 2014-12-23 19:30:03Z vruppert $ //////////////////////////////////////////////////////////////////// // -// Copyright (C) 2002-2014 The Bochs Project +// Copyright (C) 2002-2016 The Bochs Project // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -354,10 +354,10 @@ #define LOG_OPTS_PROMPT wxT("How should Bochs respond to each type of event?") #define LOG_OPTS_TYPE_NAMES { wxT("Debug events"), wxT("Info events"), wxT("Error events"), wxT("Panic events") } #define LOG_OPTS_N_TYPES 4 -#define LOG_OPTS_CHOICES { wxT("ignore"), wxT("log"), wxT("ask user"), wxT("end simulation"), wxT("no change") } -#define LOG_OPTS_N_CHOICES_NORMAL 4 -#define LOG_OPTS_N_CHOICES 5 // number of choices, including "no change" -#define LOG_OPTS_NO_CHANGE 4 // index of "no change" +#define LOG_OPTS_CHOICES { wxT("ignore"), wxT("log"), wxT("warn user"), wxT("ask user"), wxT("end simulation"), wxT("no change") } +#define LOG_OPTS_N_CHOICES_NORMAL 5 +#define LOG_OPTS_N_CHOICES 6 // number of choices, including "no change" +#define LOG_OPTS_NO_CHANGE 5 // index of "no change" #define LOG_OPTS_ADV wxT("For additional control over how each device responds to events, use the menu option \"Log ... By Device\".") wxFlexGridSizer *gridSizer; wxChoice *action[LOG_OPTS_N_TYPES]; diff -urNX /home/volker/exclude-bochs /home/volker/bochs/bochs/gui/wxmain.cc ./gui/wxmain.cc --- /home/volker/bochs/bochs/gui/wxmain.cc 2016-12-26 17:12:57.470174541 +0100 +++ ./gui/wxmain.cc 2016-12-28 12:15:26.035961463 +0100 @@ -2,7 +2,7 @@ // $Id: wxmain.cc 13006 2016-12-26 16:12:54Z vruppert $ ///////////////////////////////////////////////////////////////// // -// Copyright (C) 2002-2014 The Bochs Project +// Copyright (C) 2002-2016 The Bochs Project // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -1158,6 +1158,10 @@ #if !BX_DEBUGGER && !BX_GDBSTUB dlg.EnableButton(dlg.DEBUG, FALSE); #endif + if (be->u.logmsg.flag != BX_LOG_ASK_ASKDLG) { + dlg.EnableButton(dlg.DIE, FALSE); + dlg.EnableButton(dlg.DUMP, FALSE); + } dlg.SetContext(wxString(be->u.logmsg.prefix, wxConvUTF8)); dlg.SetMessage(wxString(be->u.logmsg.msg, wxConvUTF8)); int n = dlg.ShowModal(); diff -urNX /home/volker/exclude-bochs /home/volker/bochs/bochs/gui/x.cc ./gui/x.cc --- /home/volker/bochs/bochs/gui/x.cc 2016-12-27 17:26:59.622665119 +0100 +++ ./gui/x.cc 2016-12-28 12:03:10.963351647 +0100 @@ -2687,11 +2687,7 @@ } else { size_x = 30 + maxlen * 6; } - if (lines < 3) { - size_y = 90; - } else { - size_y = 60 + lines * 15; - } + size_y = 70 + lines * 15; x11_dialog_c *xdlg = new x11_dialog_c(name, size_x, size_y, (mode == XDLG_SIMPLE) ? 1 : 2); ypos = 34; @@ -2729,11 +2725,21 @@ bx_param_string_c *sparam; bx_param_enum_c *eparam; bx_list_c *list; + char message[256]; switch (event->type) { case BX_SYNC_EVT_LOG_ASK: - event->retcode = x11_ask_dialog(event); + if (event->u.logmsg.flag == BX_LOG_ASK_ASKDLG) { + event->retcode = x11_ask_dialog(event); + } else if (event->u.logmsg.flag == BX_LOG_ASK_MSGBOX_WARN) { + const char *title = SIM->get_log_level_name(event->u.logmsg.level); + sprintf(message, "Device: %s\n\nMessage: %s", event->u.logmsg.prefix, + event->u.logmsg.msg); + bx_param_bool_c bparam(NULL, "warn", title, message, 1); + x11_message_box(&bparam, XDLG_SIMPLE); + event->retcode = 0; + } return event; case BX_SYNC_EVT_ASK_PARAM: param = event->u.param.param; diff -urNX /home/volker/exclude-bochs /home/volker/bochs/bochs/logio.cc ./logio.cc --- /home/volker/bochs/bochs/logio.cc 2015-05-10 08:55:18.678940963 +0200 +++ ./logio.cc 2016-12-28 00:40:40.395736643 +0100 @@ -2,7 +2,7 @@ // $Id: logio.cc 12759 2015-05-10 06:55:16Z vruppert $ ///////////////////////////////////////////////////////////////////////// // -// Copyright (C) 2001-2014 The Bochs Project +// Copyright (C) 2001-2016 The Bochs Project // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -50,11 +50,25 @@ else return "?"; } +static const char *act_name[N_ACT] = { "ignore", "report", "warn", "ask", "fatal" }; + const char* iofunctions::getaction(int i) const { - static const char *name[] = { "ignore", "report", "ask", "fatal" }; assert (i>=ACT_IGNORE && i<N_ACT); - return name[i]; + return act_name[i]; +} + +int iofunctions::isaction(const char *val) const +{ + int action = -1; + + for (int i = 0; i < N_ACT; i++) { + if (!strcmp(val, act_name[i])) { + action = ACT_IGNORE + i; + break; + } + } + return action; } void iofunctions::flush(void) @@ -414,6 +428,11 @@ logio->out(LOGLEV_ERROR, prefix, fmt, ap); va_end(ap); + if (onoff[LOGLEV_ERROR] == ACT_WARN) { + va_start(ap, fmt); + warn(LOGLEV_ERROR, prefix, fmt, ap); + va_end(ap); + } if (onoff[LOGLEV_ERROR] == ACT_ASK) { va_start(ap, fmt); ask(LOGLEV_ERROR, prefix, fmt, ap); @@ -438,6 +457,11 @@ logio->out(LOGLEV_PANIC, prefix, fmt, ap); va_end(ap); + if (onoff[LOGLEV_PANIC] == ACT_WARN) { + va_start(ap, fmt); + warn(LOGLEV_PANIC, prefix, fmt, ap); + va_end(ap); + } if (onoff[LOGLEV_PANIC] == ACT_ASK) { va_start(ap, fmt); ask(LOGLEV_PANIC, prefix, fmt, ap); @@ -465,6 +489,36 @@ // the actions ask() and fatal() are not supported here } +void logfunctions::warn(int level, const char *prefix, const char *fmt, va_list ap) +{ + // Guard against reentry on warn() function. The danger is that some + // function that's called within warn() could trigger another + // BX_ERROR that could call warn() again, leading to infinite + // recursion and infinite asks. + static char in_warn_already = 0; + char buf1[1024]; + if (in_warn_already) { + fprintf(stderr, "logfunctions::warn() should not reenter!!\n"); + return; + } + in_warn_already = 1; + vsnprintf(buf1, sizeof(buf1), fmt, ap); + // FIXME: facility set to 0 because it's unknown. + + // update vga screen. This is useful because sometimes useful messages + // are printed on the screen just before a panic. It's also potentially + // dangerous if this function calls ask again... That's why I added + // the reentry check above. + SIM->refresh_vga(); + + // ensure the text screen is showing + SIM->set_display_mode(DISP_MODE_CONFIG); + SIM->log_warn(prefix, level, buf1); + // return to simulation mode + SIM->set_display_mode(DISP_MODE_SIM); + in_warn_already = 0; +} + void logfunctions::ask(int level, const char *prefix, const char *fmt, va_list ap) { // Guard against reentry on ask() function. The danger is that some
602 lines
29 KiB
C++
602 lines
29 KiB
C++
////////////////////////////////////////////////////////////////////
|
|
// $Id$
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (C) 2002-2016 The Bochs Project
|
|
//
|
|
// This library is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
// License as published by the Free Software Foundation; either
|
|
// version 2 of the License, or (at your option) any later version.
|
|
//
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
// License along with this library; if not, write to the Free Software
|
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
|
|
// wxWidgets dialogs for Bochs
|
|
|
|
#include <wx/spinctrl.h>
|
|
#include <wx/notebook.h>
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// text messages used in several places
|
|
////////////////////////////////////////////////////////////////////
|
|
#define MSG_NO_HELP wxT("No help is available yet.")
|
|
#define MSG_NO_HELP_CAPTION wxT("No help")
|
|
#define BTNLABEL_HELP wxT("Help")
|
|
#define BTNLABEL_CANCEL wxT("Cancel")
|
|
#define BTNLABEL_OK wxT("Ok")
|
|
#define BTNLABEL_CLOSE wxT("Close")
|
|
#define BTNLABEL_CREATE_IMG wxT("Create Image")
|
|
#define BTNLABEL_BROWSE wxT("<--Browse")
|
|
|
|
#if defined(WIN32)
|
|
// On win32, apparantly the spinctrl depends on a native control which only
|
|
// has a 16bit signed value. If you try to set the max above 32767, it
|
|
// overflows and does stupid things.
|
|
#define SPINCTRL_FIX_MAX(x) ((x)>32767 ? 32767 : (x))
|
|
#else
|
|
#define SPINCTRL_FIX_MAX(x) x
|
|
#endif
|
|
|
|
// utility function prototype
|
|
void ChangeStaticText(wxSizer *sizer, wxStaticText *win, wxString newtext);
|
|
bool CreateImage(int harddisk, int sectors, const char *filename);
|
|
void SetTextCtrl(wxTextCtrl *text, const char *format, int val);
|
|
int GetTextCtrlInt(wxTextCtrl *text, bool *valid = NULL, bool complain=false, wxString complaint = wxT("Invalid integer!"));
|
|
bool BrowseTextCtrl(wxTextCtrl *text,
|
|
wxString prompt= wxT("Choose a file"),
|
|
long style=wxFD_OPEN);
|
|
wxChoice *makeLogOptionChoiceBox(wxWindow *parent, wxWindowID id, int evtype, bool includeNoChange = false);
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// LogMsgAskDialog is a modal dialog box that shows the user a
|
|
// simulation error message and asks if they want to continue or
|
|
// not. It looks something like this:
|
|
//
|
|
// +----- PANIC ---------------------------------------------------+
|
|
// | |
|
|
// | Context: Hard Drive |
|
|
// | Message: could not open hard drive image file '30M.sample' |
|
|
// | |
|
|
// | [ ] Don't ask about future messages like this |
|
|
// | |
|
|
// | [Continue] [Die] [Dump Core] [Debugger] [Help] |
|
|
// +---------------------------------------------------------------+
|
|
//
|
|
// To use this dialog:
|
|
// After constructor, use SetContext, SetMessage, EnableButton to
|
|
// determine what will be displayed. Then call n = ShowModal(). The return
|
|
// value tells which button was pressed (button_t types). Call GetDontAsk()
|
|
// to see if they checked "Don't ask about..." or not.
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
class LogMsgAskDialog: public wxDialog
|
|
{
|
|
public:
|
|
enum button_t {
|
|
CONT=0, DIE, DUMP, DEBUG, HELP,
|
|
N_BUTTONS /* number of entries in enum */
|
|
};
|
|
#define LOG_MSG_ASK_IDS \
|
|
{ ID_Continue, ID_Die, ID_DumpCore, ID_Debugger, wxHELP }
|
|
#define LOG_MSG_ASK_NAMES \
|
|
{ wxT("Continue"), wxT("Kill Sim"), wxT("Dump Core"), wxT("Debugger"), wxT("Help") }
|
|
#define LOG_MSG_DONT_ASK_STRING \
|
|
wxT("Don't ask about future messages like this")
|
|
#define LOG_MSG_CONTEXT wxT("Context: ")
|
|
#define LOG_MSG_MSG wxT("Message: ")
|
|
private:
|
|
wxStaticText *context, *message;
|
|
wxCheckBox *dontAsk;
|
|
bool enabled[N_BUTTONS];
|
|
wxBoxSizer *btnSizer, *vertSizer;
|
|
void Init(); // called automatically by ShowModal()
|
|
void ShowHelp();
|
|
public:
|
|
LogMsgAskDialog(wxWindow* parent,
|
|
wxWindowID id,
|
|
const wxString& title);
|
|
void EnableButton(button_t btn, bool en) { enabled[(int)btn] = en; }
|
|
void SetContext(wxString s);
|
|
void SetMessage(wxString s);
|
|
bool GetDontAsk() { return dontAsk->GetValue(); }
|
|
void OnEvent(wxCommandEvent& event);
|
|
int ShowModal() { Init(); return wxDialog::ShowModal(); }
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// AdvancedLogOptionsDialog
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// +---- Advanced event configuration -----------------------+
|
|
// | |
|
|
// | Log file is [_____________________________] [ Browse ] |
|
|
// | |
|
|
// | This table determines how Bochs will respond to each |
|
|
// | kind of event coming from a particular source. For |
|
|
// | example if you are having problems with the keyboard, |
|
|
// | you could ask for debug and info events from the |
|
|
// | keyboard to be reported. |
|
|
// | |
|
|
// | [Use defaults for all devices] |
|
|
// | |
|
|
// | +---------------------------------------------------+-+ |
|
|
// | |Device Debug Info Error Panic |^| |
|
|
// | |-------- -------- ------- -------- --------- ||| |
|
|
// | |Keyboard [ignore] [ignore] [report] [report] ||| |
|
|
// | |VGA [ignore] [ignore] [report] [report] ||| |
|
|
// | |NE2000 [ignore] [ignore] [report] [report] ||| |
|
|
// | |Sound [ignore] [ignore] [report] [report] |v| |
|
|
// | +-----------------------------------------------------+ |
|
|
// | |
|
|
// | [ Help ] [ Cancel ] [ Ok ] |
|
|
// +-------------------------------------------------------+-+
|
|
//
|
|
class AdvancedLogOptionsDialog: public wxDialog
|
|
{
|
|
private:
|
|
#define ADVLOG_OPTS_TITLE wxT("Configure Log Events")
|
|
#define ADVLOG_OPTS_LOGFILE wxT("Log file")
|
|
#define ADVLOG_OPTS_PROMPT wxT( \
|
|
"This table determines how Bochs will respond to each kind of event coming\n" \
|
|
"from a particular source. For example if you are having problems with\n" \
|
|
"the keyboard, you could ask for debug and info events from the keyboard\n" \
|
|
"to be reported.")
|
|
#define ADVLOG_OPTS_TYPE_NAMES { wxT("Debug"), wxT("Info"), wxT("Error"), wxT("Panic") }
|
|
#define ADVLOG_OPTS_N_TYPES 4
|
|
#define ADVLOG_DEFAULTS wxT("Use defaults for all devices")
|
|
void Init(); // called automatically by ShowModal()
|
|
void ShowHelp();
|
|
wxBoxSizer *vertSizer, *logfileSizer, *buttonSizer;
|
|
wxScrolledWindow *scrollWin;
|
|
wxPanel *scrollPanel;
|
|
wxGridSizer *headerSizer, *gridSizer;
|
|
wxTextCtrl *logfile;
|
|
wxButton *applyDefault;
|
|
// 2d array of wxChoice pointers. Each wxChoice* is action[dev][type].
|
|
wxChoice* **action;
|
|
bool runtime;
|
|
public:
|
|
AdvancedLogOptionsDialog(wxWindow* parent, wxWindowID id);
|
|
~AdvancedLogOptionsDialog();
|
|
void OnEvent(wxCommandEvent& event);
|
|
int ShowModal() { Init(); return wxDialog::ShowModal(); }
|
|
void SetLogfile(wxString f) { logfile->SetValue(f); }
|
|
wxString GetLogfile() { return logfile->GetValue(); }
|
|
void CopyParamToGui();
|
|
void CopyGuiToParam();
|
|
void SetAction(int dev, int evtype, int act);
|
|
int GetAction(int dev, int evtype);
|
|
void SetRuntimeFlag(bool val) { runtime = val; }
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// PluginControlDialog
|
|
////////////////////////////////////////////////////////////////////////////
|
|
class PluginControlDialog: public wxDialog
|
|
{
|
|
private:
|
|
void Init(); // called automatically by ShowModal()
|
|
void ShowHelp();
|
|
wxBoxSizer *vertSizer, *horzSizer, *listSizer, *editSizer, *buttonSizer;
|
|
wxTextCtrl *plugname;
|
|
wxListBox *pluglist;
|
|
wxButton *btn_load, *btn_unload;
|
|
public:
|
|
PluginControlDialog(wxWindow* parent, wxWindowID id);
|
|
~PluginControlDialog() {}
|
|
void OnEvent(wxCommandEvent& event);
|
|
int ShowModal() { Init(); return wxDialog::ShowModal(); }
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// LogViewDialog
|
|
////////////////////////////////////////////////////////////////////////////
|
|
class LogViewDialog: public wxDialog
|
|
{
|
|
private:
|
|
wxBoxSizer *mainSizer, *logSizer, *buttonSizer;
|
|
wxTextCtrl *log;
|
|
Bit32u lengthMax;
|
|
Bit32u lengthTolerance;
|
|
#define LOG_VIEW_DEFAULT_LENGTH_MAX (400*80)
|
|
#define LOG_VIEW_DEFAULT_TOLERANCE (200*80)
|
|
void CheckLogLength();
|
|
public:
|
|
LogViewDialog(wxWindow* parent, wxWindowID id);
|
|
~LogViewDialog() {}
|
|
void Init();
|
|
bool Show(bool val);
|
|
void AppendText(int level, wxString msg);
|
|
void OnEvent(wxCommandEvent& event);
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// ParamDialog is a general purpose dialog box that displays and edits
|
|
// any combination of parameters. It's always made up of a
|
|
// wxFlexGridSizer with three columns. Each parameter takes up one row.
|
|
// Column 1 shows the name of the parameter, column 2 shows the value of
|
|
// the parameter in some sort of control that can be edited. Column 3
|
|
// is used for anything that needs to appear to the right of the data, for
|
|
// example a Browse button on a filename control. Several buttons including
|
|
// Cancel and Ok will appear at the bottom.
|
|
//
|
|
// This will allow editing of all the miscellaneous parameters which do
|
|
// not need to be laid out by hand.
|
|
//
|
|
// NOTES:
|
|
// Right now, there is always one wxFlexGridSizer with three columns
|
|
// where the fields go. It is possible to create a new wxFlexGridSizer
|
|
// and make that one the default. This is used when handling a bx_list_c
|
|
// parameter.
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
struct ParamStruct : public wxObject {
|
|
bx_param_c *param;
|
|
int id;
|
|
wxStaticText *label;
|
|
union _u_tag {
|
|
void *ptr;
|
|
wxWindow *window;
|
|
wxChoice *choice;
|
|
wxTextCtrl *text;
|
|
wxSpinCtrl *spin;
|
|
wxCheckBox *checkbox;
|
|
wxStaticBox *staticbox;
|
|
wxNotebook *notebook;
|
|
} u;
|
|
int browseButtonId; // only for filename params
|
|
wxButton *browseButton; // only for filename params
|
|
ParamStruct() { param = NULL; u.window = NULL; browseButton = NULL; }
|
|
};
|
|
|
|
// This context structure is used by AddParam to keep track of where the
|
|
// next parameter's controls should be added. When AddParam is called on
|
|
// a list of parameters (bx_list_c), it calls itself recursively to add
|
|
// the child parameters, which in turn could be lists as well. When it
|
|
// calls itself recursively, it will create a new AddParamContext so that
|
|
// the various children can be added in the right place.
|
|
struct AddParamContext {
|
|
int depth;
|
|
wxWindow *parent;
|
|
wxBoxSizer *vertSizer;
|
|
wxFlexGridSizer *gridSizer;
|
|
};
|
|
|
|
|
|
class ParamDialog: public wxDialog
|
|
{
|
|
private:
|
|
void ShowHelp();
|
|
int genId();
|
|
bool isShowing;
|
|
int nbuttons;
|
|
bool runtime;
|
|
protected:
|
|
wxBoxSizer *mainSizer, *buttonSizer, *infoSizer;
|
|
// hash table that maps the ID of a wxWidgets control (e.g. wxChoice,
|
|
// wxTextCtrl) to the associated ParamStruct object. Data in the hash table
|
|
// is of ParamStruct*.
|
|
wxHashTable *idHash;
|
|
// map parameter ID onto ParamStruct.
|
|
wxHashTable *paramHash;
|
|
virtual void EnableChanged();
|
|
void EnableChanged(ParamStruct *pstr);
|
|
void EnableParam(int param_id, bool enabled);
|
|
void ProcessDependentList(ParamStruct *pstrChanged, bool enabled);
|
|
bool CopyGuiToParam();
|
|
bool CopyGuiToParam(bx_param_c *param);
|
|
bool isGeneratedId(int id);
|
|
public:
|
|
ParamDialog(wxWindow* parent, wxWindowID id);
|
|
virtual ~ParamDialog();
|
|
void OnEvent(wxCommandEvent& event);
|
|
wxButton* AddButton(int id, wxString label);
|
|
virtual void AddDefaultButtons();
|
|
virtual void Init(); // called automatically by ShowModal()
|
|
int ShowModal() {
|
|
Init();
|
|
isShowing = true;
|
|
int ret = wxDialog::ShowModal();
|
|
isShowing = false;
|
|
return ret;
|
|
}
|
|
bool Show(bool val) { isShowing = val; return wxDialog::Show(val); }
|
|
void AddParam(bx_param_c *param, wxFlexGridSizer *sizer, bool plain = false);
|
|
void AddParam(bx_param_c *param, bool plain = false, AddParamContext *context = NULL);
|
|
void AddParamList(const char *nameList[], bx_param_c *base, wxFlexGridSizer *sizer = NULL, bool plain = false);
|
|
virtual void CopyParamToGui();
|
|
bool IsShowing() { return isShowing; }
|
|
void SetRuntimeFlag(bool val) { runtime = val; }
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// FloppyConfigDialog
|
|
////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// the new FloppyConfigDialog is based on ParamDialog. It allows the user to
|
|
// configure the floppy settings and to create a floppy image if necessary.
|
|
class FloppyConfigDialog : public ParamDialog
|
|
{
|
|
private:
|
|
wxButton *createButton;
|
|
ParamStruct *pstrDevice, *pstrPath, *pstrMedia, *pstrStatus, *pstrReadonly;
|
|
public:
|
|
FloppyConfigDialog(wxWindow* parent, wxWindowID id);
|
|
void Setup(bx_list_c *list);
|
|
void OnEvent(wxCommandEvent& event);
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// LogOptionsDialog
|
|
////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// the new LogOptionsDialog is based on ParamDialog. It allows the user to
|
|
// configure the log file settings and to decide how Bochs will behave for
|
|
// each type of log event.
|
|
class LogOptionsDialog : public ParamDialog
|
|
{
|
|
private:
|
|
#define LOG_OPTS_TITLE wxT("Configure Log Events")
|
|
#define LOG_OPTS_PROMPT wxT("How should Bochs respond to each type of event?")
|
|
#define LOG_OPTS_TYPE_NAMES { wxT("Debug events"), wxT("Info events"), wxT("Error events"), wxT("Panic events") }
|
|
#define LOG_OPTS_N_TYPES 4
|
|
#define LOG_OPTS_CHOICES { wxT("ignore"), wxT("log"), wxT("warn user"), wxT("ask user"), wxT("end simulation"), wxT("no change") }
|
|
#define LOG_OPTS_N_CHOICES_NORMAL 5
|
|
#define LOG_OPTS_N_CHOICES 6 // number of choices, including "no change"
|
|
#define LOG_OPTS_NO_CHANGE 5 // index of "no change"
|
|
#define LOG_OPTS_ADV wxT("For additional control over how each device responds to events, use the menu option \"Log ... By Device\".")
|
|
wxFlexGridSizer *gridSizer;
|
|
wxChoice *action[LOG_OPTS_N_TYPES];
|
|
public:
|
|
LogOptionsDialog(wxWindow* parent, wxWindowID id);
|
|
int GetAction(int evtype);
|
|
void SetAction(int evtype, int action);
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
|
|
/**************************************************************************
|
|
Everything else in here is a comment!
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// proposed dialogs, not implemented
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
Here are some quick sketches of what different parts of the interface
|
|
could look like. None of these is implemented yet, and everything is
|
|
open for debate. Whoever writes the wxWidgets code for any of these
|
|
screens gets several thousand votes!
|
|
|
|
Idea for large configuration dialog, based on Netscape's Edit:Preferences
|
|
dialog box. Here's a sketch of a dialog with all the components that can be
|
|
configured in a list on the left, and the details of the selected component
|
|
on the right. This is a pretty familiar structure that's used in a lot of
|
|
applications these days. In the first sketch, "IDE Interface" is selected on
|
|
the left, and the details of the IDE devices are shown on the right.
|
|
|
|
+-----Configure Bochs-------------------------------------------------------+
|
|
| |
|
|
| +--------------------+ +-- IDE Controller ---------------------------+ |
|
|
| | |-CPU | | | |
|
|
| | | | | Master device: | |
|
|
| | |-Memory | | [X] Enable Hard Disk 0 | |
|
|
| | | | | | |
|
|
| | |-Video | | Slave device (choose one): | |
|
|
| | | | | [ ] No slave device | |
|
|
| | |-Floppy disks | | [ ] Hard Disk 1 | |
|
|
| | | |-Drive 0 | | [X] CD-ROM | |
|
|
| | | |-Drive 1 | | | |
|
|
| | | | +---------------------------------------------+ |
|
|
| |***IDE controller***| |
|
|
| | | |-Hard Drive 0 | |
|
|
| | | |-CD-ROM drive | |
|
|
| | | | |
|
|
| | |-Keyboard | |
|
|
| | | | |
|
|
| | |-Networking | |
|
|
| | | | |
|
|
| | |-Sound | |
|
|
| | | |
|
|
| +--------------------+ |
|
|
| [Help] [Cancel] [Ok] |
|
|
+---------------------------------------------------------------------------+
|
|
|
|
If you click on Hard Drive 0 in the component list (left), then the
|
|
whole right panel changes to show the details of the hard drive.
|
|
|
|
+-----Configure Bochs-------------------------------------------------------+
|
|
| |
|
|
| +--------------------+ +---- Configure Hard Drive 0 ----------------+ |
|
|
| | |-CPU | | | |
|
|
| | | | | [X] Enabled | |
|
|
| | |-Memory | | | |
|
|
| | | | +--------------------------------------------+ |
|
|
| | |-Video | |
|
|
| | | | +---- Disk Image ----------------------------+ |
|
|
| | |-Floppy disks | | | |
|
|
| | | |-Drive 0 | | File name: [___________________] [Browse] | |
|
|
| | | |-Drive 1 | | Geometry: cylinders [____] | |
|
|
| | | | | heads [____] | |
|
|
| | |-IDE controller | | sectors/track [____] | |
|
|
| | |***Hard Drive 0***| | | |
|
|
| | | |-CD-ROM drive | | Size in Megabytes: 38.2 | |
|
|
| | | | | [Enter size/Compute Geometry] | |
|
|
| | |-Keyboard | | | |
|
|
| | | | | [Create Image] | |
|
|
| | |-Networking | +--------------------------------------------+ |
|
|
| | | | |
|
|
| | |-Sound | |
|
|
| | | |
|
|
| +--------------------+ |
|
|
| [Help] [Cancel] [Ok] |
|
|
+---------------------------------------------------------------------------+
|
|
|
|
Or if you choose the CD-ROM, you get to edit the settings for it.
|
|
|
|
+---- Configure Bochs ------------------------------------------------------+
|
|
| |
|
|
| +--------------------+ +-- CD-ROM Device ----------------------------+ |
|
|
| | |-CPU | | | |
|
|
| | | | | [ ] Enable Emulated CD-ROM | |
|
|
| | |-Memory | | | |
|
|
| | | | +---------------------------------------------+ |
|
|
| | |-Video | |
|
|
| | | | +-- CD-ROM Media -----------------------------+ |
|
|
| | |-Floppy disks | | | |
|
|
| | | |-Drive 0 | | Bochs can use a physical CD-ROM drive as | |
|
|
| | | |-Drive 1 | | the data source, or use an image file. | |
|
|
| | | | | | |
|
|
| | |-IDE controller | | [X] Ejected | |
|
|
| | | |-Hard Drive 0 | | [ ] Physical CD-ROM drive /dev/cdrom | |
|
|
| |*****CD-ROM drive***| | [ ] Disk image: [_____________] [Browse] | |
|
|
| | | | | | |
|
|
| | |-Keyboard | +---------------------------------------------+ |
|
|
| | | | |
|
|
| | |-Networking | |
|
|
| | | | |
|
|
| | |-Sound | |
|
|
| | | |
|
|
| +--------------------+ |
|
|
| [Help] [Cancel] [Ok] |
|
|
+---------------------------------------------------------------------------+
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// ChooseConfigDialog
|
|
////////////////////////////////////////////////////////////////////////////
|
|
The idea is that you could choose from a set of configurations
|
|
(individual bochsrc files, basically). When you first install
|
|
Bochs, it would just have DLX Linux Demo, and Create New.
|
|
As you create new configurations and save them, the list
|
|
could grow.
|
|
+--------------------------------------------------------+
|
|
| |
|
|
| Choose a configuration for the Bochs simulator: |
|
|
| |
|
|
| +---+ |
|
|
| | O | DLX Linux Demo |
|
|
| | | | Boot 10MB Hard Disk |
|
|
| +---+ |
|
|
| |
|
|
| +---+ |
|
|
| | O | Redhat Linux Image |
|
|
| | | | Boot 10MB Hard Disk |
|
|
| +---+ |
|
|
| |
|
|
| +---+ |
|
|
| | O | FreeDOS |
|
|
| | | | Boot 40MB Hard Disk |
|
|
| +---+ |
|
|
| |
|
|
| ?? Create new configuration |
|
|
| |
|
|
+--------------------------------------------------------+
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// KeymappingDialog
|
|
////////////////////////////////////////////////////////////////////////////
|
|
more ambitious: create a button for each key on a standard keyboard, so that
|
|
you can view/edit/load/save key mappings, produce any combination of keys
|
|
(esp. ones that your OS or window manager won't allow)
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// new AdvancedLogOptionsDialog
|
|
////////////////////////////////////////////////////////////////////////////
|
|
Try #2 for the advanced event configuration dialog.
|
|
It shows the selection of the default actions again
|
|
at the top, with some explanation. Then at bottom, you
|
|
can select a device in the list box and edit the settings
|
|
for that device individually. It would be possible to
|
|
allow selection of multiple devices and then edit several
|
|
devices at once.
|
|
|
|
+---- Advanced event configuration ---------------------+-+
|
|
| |
|
|
| +--- Default Actions -------------+ |
|
|
| First choose the | | |
|
|
| default actions | Debug events: [ignore] | |
|
|
| that apply to all | Info events: [ignore] | |
|
|
| event sources. | Error events: [report] | |
|
|
| | Panic events: [ask ] | |
|
|
| | | |
|
|
| | [Copy to All Devices] | |
|
|
| +---------------------------------+ |
|
|
| |
|
|
| Then, if you want you can edit the actions for |
|
|
| individual devices. For example if you are having |
|
|
| problems with the keyboard, you could ask for debug |
|
|
| and info events from the keyboard to be reported. |
|
|
| |
|
|
| Select Device: |
|
|
| +-------------+-+ +--- Actions for VGA -------------+ |
|
|
| | CPU |^| | | |
|
|
| | Interrupts ||| | Debug events: [ignore] | |
|
|
| |*VGA*********||| | Info events: [ignore] | |
|
|
| | Keyboard ||| | Error events: [report] | |
|
|
| | Mouse ||| | Panic events: [ask ] | |
|
|
| | Floppy Disk |v| | | |
|
|
| +-------------+-+ +---------------------------------+ |
|
|
| |
|
|
| [ Help ] [ Cancel ] [ Ok ] |
|
|
+---------------------------------------------------------+
|
|
|
|
+---- Configure events -------------------------------------+
|
|
| __________ ____________ |
|
|
| | Default \ | Per Device \ |
|
|
| | \------------------------------------------+ |
|
|
| | | |
|
|
| | Event log file [_______________________] [Browse] | |
|
|
| | | |
|
|
| | How should Bochs respond to each type of event? | |
|
|
| | | |
|
|
| | Debug events: [ignore] | |
|
|
| | Info events: [ignore] | |
|
|
| | Error events: [report] | |
|
|
| | Panic events: [ask ] | |
|
|
| | | |
|
|
| | For additional control over how each device responds | |
|
|
| | to events, click the "Per Device" tab above. | |
|
|
| | | |
|
|
| +------------------------------------------------------+ |
|
|
| [ Help ] [ Cancel ] [ Ok ] |
|
|
+-----------------------------------------------------------+
|
|
|
|
+---- Configure events -------------------------------------+
|
|
| __________ ____________ |
|
|
| | Default \ | Per Device \ |
|
|
| +-------------| \--------------------------+ |
|
|
| | | |
|
|
| | This table determines how Bochs will respond to each | |
|
|
| | kind of event coming from a particular source. For | |
|
|
| | example if you are having problems with the keyboard,| |
|
|
| | you could ask for debug and info events from the | |
|
|
| | keyboard to be reported. | |
|
|
| | | |
|
|
| | +------------------------------------------------+-+ | |
|
|
| | |Device Debug Info Error Panic |^| | |
|
|
| | |-------- -------- ------- -------- --------- ||| | |
|
|
| | |Keyboard [ignore] [ignore] [report] [report] ||| | |
|
|
| | |VGA [ignore] [ignore] [report] [report] ||| | |
|
|
| | |NE2000 [ignore] [ignore] [report] [report] ||| | |
|
|
| | |Sound [ignore] [ignore] [report] [report] |v| | |
|
|
| | +--------------------------------------------------+ | |
|
|
| | [Set defaults for all devices] | |
|
|
| +------------------------------------------------------+ |
|
|
| [ Help ] [ Cancel ] [ Ok ] |
|
|
+-----------------------------------------------------------+
|
|
|
|
*****************************************************************/
|