From 894e66574a082ad6d18df6b11b970e4bc621ddbd Mon Sep 17 00:00:00 2001 From: Volker Ruppert Date: Tue, 8 Jul 2014 14:30:27 +0000 Subject: [PATCH] Rewrite of the userbutton shortcut handling: now parsing shortcut string in gui init and string paramter handler. The shortcut keys are now stored in an array of BX_KEY* values in the gui object. siminterface.h: Fixed some default return values. --- bochs/config.cc | 9 +++-- bochs/gui/gui.cc | 71 +++++++++++++++++++++------------------- bochs/gui/gui.h | 4 +++ bochs/gui/siminterface.h | 12 +++---- 4 files changed, 55 insertions(+), 41 deletions(-) diff --git a/bochs/config.cc b/bochs/config.cc index 6220c290c..498c1e2e0 100644 --- a/bochs/config.cc +++ b/bochs/config.cc @@ -119,9 +119,13 @@ const char *bx_param_string_handler(bx_param_string_c *param, int set, param->get_param_path(pname, BX_PATHNAME_LEN); if (!strcmp(pname, BXPN_SCREENMODE)) { - if (set==1) { + if (set == 1) { BX_INFO(("Screen mode changed to %s", val)); } + } else if (!strcmp(pname, BXPN_USER_SHORTCUT)) { + if ((set == 1) && (SIM->get_init_done())) { + bx_gui->parse_user_shortcut(val); + } #if BX_PLUGINS } else if (!strncmp(pname, "misc.user_plugin", 16)) { if ((strlen(oldval) > 0) && (strcmp(oldval, "none"))) { @@ -1002,11 +1006,12 @@ void bx_init_options() deplist->add(keymap); use_kbd_mapping->set_dependent_list(deplist); - new bx_param_string_c(keyboard, + bx_param_string_c *user_shortcut = new bx_param_string_c(keyboard, "user_shortcut", "Userbutton shortcut", "Defines the keyboard shortcut to be sent when you press the 'user' button in the headerbar.", "none", 20); + user_shortcut->set_handler(bx_param_string_handler); static const char *mouse_type_list[] = { "none", diff --git a/bochs/gui/gui.cc b/bochs/gui/gui.cc index 326355521..52ad8924e 100644 --- a/bochs/gui/gui.cc +++ b/bochs/gui/gui.cc @@ -241,6 +241,10 @@ void bx_gui_c::init(int argc, char **argv, unsigned max_xres, unsigned max_yres, BX_GRAVITY_RIGHT, userbutton_handler); BX_GUI_THIS set_tooltip(BX_GUI_THIS user_hbar_id, "Send keyboard shortcut"); + if (!parse_user_shortcut(SIM->get_param_string(BXPN_USER_SHORTCUT)->getptr())) { + SIM->get_param_string(BXPN_USER_SHORTCUT)->set("none"); + } + BX_GUI_THIS charmap_updated = 0; if (!BX_GUI_THIS new_gfx_api && (BX_GUI_THIS framebuffer == NULL)) { @@ -657,49 +661,50 @@ Bit32u get_user_key(char *key) return BX_KEY_UNKNOWN; } +bx_bool bx_gui_c::parse_user_shortcut(const char *val) +{ + char *ptr, shortcut_tmp[512]; + Bit32u symbol; + + user_shortcut_len = 0; + if ((strlen(val) == 0) || !strcmp(val, "none")) { + return 1; + } else { + strcpy(shortcut_tmp, val); + ptr = strtok(shortcut_tmp, "-"); + while (ptr) { + symbol = get_user_key(ptr); + if (symbol == BX_KEY_UNKNOWN) { + BX_ERROR(("Unknown key symbol '%s' ignored", ptr)); + return 0; + } + if (user_shortcut_len < 3) { + user_shortcut[user_shortcut_len++] = symbol; + ptr = strtok(NULL, "-"); + } else { + BX_ERROR(("Ignoring extra key symbol '%s'", ptr)); + break; + } + } + return 1; + } +} + void bx_gui_c::userbutton_handler(void) { - Bit32u shortcut[4]; - Bit32u symbol; - bx_param_string_c *sparam; - char user_shortcut[512]; - char *ptr; - int i, len = 0, ret = 1; + int i, ret = 1; if (BX_GUI_THIS dialog_caps & BX_GUI_DLG_USER) { ret = SIM->ask_param(BXPN_USER_SHORTCUT); } - sparam = SIM->get_param_string(BXPN_USER_SHORTCUT); - if ((ret > 0) && !sparam->isempty()) { - strcpy(user_shortcut, sparam->getptr()); - ptr = strtok(user_shortcut, "-"); - if ((strcmp(ptr, sparam->getptr())) || - (strlen(sparam->getptr()) < 7)) { - while (ptr) { - symbol = get_user_key(ptr); - if (symbol == BX_KEY_UNKNOWN) { - BX_ERROR(("Unknown shortcut '%s' ignored", ptr)); - return; - } - if (len < 3) { - shortcut[len++] = symbol; - ptr = strtok(NULL, "-"); - } else { - BX_ERROR(("Ignoring extra key symbol '%s'", ptr)); - break; - } - } - } else { - BX_ERROR(("Unknown shortcut '%s' ignored", user_shortcut)); - return; - } + if ((ret > 0) && (BX_GUI_THIS user_shortcut_len > 0)) { i = 0; - while (i < len) { - DEV_kbd_gen_scancode(shortcut[i++]); + while (i < BX_GUI_THIS user_shortcut_len) { + DEV_kbd_gen_scancode(BX_GUI_THIS user_shortcut[i++]); } i--; while (i >= 0) { - DEV_kbd_gen_scancode(shortcut[i--] | BX_KEY_RELEASED); + DEV_kbd_gen_scancode(BX_GUI_THIS user_shortcut[i--] | BX_KEY_RELEASED); } } } diff --git a/bochs/gui/gui.h b/bochs/gui/gui.h index d3785be07..fba035a9f 100644 --- a/bochs/gui/gui.h +++ b/bochs/gui/gui.h @@ -156,6 +156,7 @@ public: static void toggle_mouse_enable(void); bx_bool mouse_toggle_check(Bit32u key, bx_bool pressed); const char* get_toggle_info(void); + bx_bool parse_user_shortcut(const char *val); #if BX_DEBUGGER && BX_DEBUGGER_GUI void init_debug_dialog(void); void close_debug_dialog(void); @@ -244,6 +245,9 @@ protected: Bit8u toggle_method; Bit32u toggle_keystate; char mouse_toggle_text[20]; + // userbutton shortcut + Bit32u user_shortcut[4]; + int user_shortcut_len; // gui dialog capabilities Bit32u dialog_caps; }; diff --git a/bochs/gui/siminterface.h b/bochs/gui/siminterface.h index df763ada2..33d118c1d 100644 --- a/bochs/gui/siminterface.h +++ b/bochs/gui/siminterface.h @@ -633,8 +633,8 @@ public: bx_simulator_interface_c() {} virtual ~bx_simulator_interface_c() {} virtual void set_quit_context(jmp_buf *context) {} - virtual int get_init_done() { return -1; } - virtual int set_init_done(int n) {return -1;} + virtual int get_init_done() { return 0; } + virtual int set_init_done(int n) {return 0;} virtual void reset_all_param() {} // new param methods virtual bx_param_c *get_param(const char *pname, bx_param_c *base=NULL) {return NULL;} @@ -644,15 +644,15 @@ public: virtual bx_param_enum_c *get_param_enum(const char *pname, bx_param_c *base=NULL) {return NULL;} virtual unsigned gen_param_id() {return 0;} virtual int get_n_log_modules() {return -1;} - virtual const char *get_logfn_name(int mod) {return 0;} + virtual const char *get_logfn_name(int mod) {return NULL;} virtual int get_logfn_id(const char *name) {return -1;} - virtual const char *get_prefix(int mod) {return 0;} + virtual const char *get_prefix(int mod) {return NULL;} virtual int get_log_action(int mod, int level) {return -1;} virtual void set_log_action(int mod, int level, int action) {} 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 0;} - virtual const char *get_log_level_name(int level) {return 0;} + virtual const char *get_action_name(int action) {return NULL;} + virtual const char *get_log_level_name(int level) {return NULL;} virtual int get_max_log_level() {return -1;} // exiting is somewhat complicated! The preferred way to exit bochs is