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.
This commit is contained in:
Volker Ruppert 2014-07-08 14:30:27 +00:00
parent 3d08187563
commit 894e66574a
4 changed files with 55 additions and 41 deletions

View File

@ -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",

View File

@ -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);
}
}
}

View File

@ -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;
};

View File

@ -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