Bochs/bochs/gui/wxdialog.h
Volker Ruppert 85fcabbd8f diff -urNX /home/volker/exclude-bochs /home/volker/bochs/bochs/bochs.h ./bochs.h
--- /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
2016-12-28 15:06:34 +00:00

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 ] |
+-----------------------------------------------------------+
*****************************************************************/