diff options
| author | SND\ckain_cp <SND\ckain_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2013-04-16 21:58:47 +0000 |
|---|---|---|
| committer | SND\ckain_cp <SND\ckain_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2013-04-16 21:58:47 +0000 |
| commit | 32a5e70e9134f933756a96e547dcdd718b8d5f1e (patch) | |
| tree | 0ba88391433d9157f96eb484d6de5975ff097181 /plugins/dfinput | |
| parent | 733612551879e081161604a6e10b7e5fdfe0f89e (diff) | |
| download | pcsxr-32a5e70e9134f933756a96e547dcdd718b8d5f1e.tar.gz | |
GTK: dfinput added emulator key (hotkey) mapping to keyboard or controller. Existing hotkeys are hard coded like F1 for savestate, but now it can have an alias hotkey on keyboard s button for example. These can be configured from dfinput dialog. Also added support for fastforward key (tilde / section key). Currently only dfxvideo supports it by full extent. Hopefully someone can merge these changes to Windows build.
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@84102 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'plugins/dfinput')
| -rwxr-xr-x | plugins/dfinput/cfg-gtk.c | 356 | ||||
| -rwxr-xr-x | plugins/dfinput/cfg.c | 63 | ||||
| -rw-r--r-- | plugins/dfinput/dfinput.ui | 189 | ||||
| -rwxr-xr-x | plugins/dfinput/pad.h | 31 | ||||
| -rwxr-xr-x | plugins/dfinput/sdljoy.c | 77 | ||||
| -rwxr-xr-x | plugins/dfinput/xkb.c | 30 |
6 files changed, 580 insertions, 166 deletions
diff --git a/plugins/dfinput/cfg-gtk.c b/plugins/dfinput/cfg-gtk.c index 6b82a753..eae6e8dd 100755 --- a/plugins/dfinput/cfg-gtk.c +++ b/plugins/dfinput/cfg-gtk.c @@ -25,6 +25,14 @@ GtkWidget *MainWindow; GtkBuilder *xml; + +const int NUM_KEYLIST = 3; // emukey + num controllers +const char *widgetname_treeview[3] = {"treeview_e", "treeview1", "treeview2"}; +const char *widgetname_change[3] = {"btnchange_e", "btnchange1", "btnchange2"}; +const char *widgetname_reset[3] = {"btnreset_e", "btnreset1", "btnreset2"}; +const char *widgetname_combodev[3] = {"combodev_e", "combodev1", "combodev2"}; + +// TODO: this could be removed if the underlying enum order is changed like this has, so then GUI's order will be the same const int DPad[DKEY_TOTAL] = { DKEY_UP, DKEY_DOWN, @@ -45,6 +53,15 @@ const int DPad[DKEY_TOTAL] = { DKEY_ANALOG }; + +const char *EmuKeyText[EMU_TOTAL] = { + N_("Increment state slot"), + N_("Fast-forwards"), + N_("Load state"), + N_("Save state"), + N_("Screenshot") +}; + const char *DPadText[DKEY_TOTAL] = { N_("D-Pad Up"), N_("D-Pad Down"), @@ -84,7 +101,7 @@ static int GetSelectedKeyIndex(int padnum) { gboolean selected; int i; - selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtk_builder_get_object(xml, padnum == 0 ? "treeview1" : "treeview2"))); + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gtk_builder_get_object(xml, widgetname_treeview[padnum+1]))); selected = gtk_tree_selection_get_selected(selection, &model, &iter); if (!selected) { @@ -103,19 +120,21 @@ static void GetKeyDescription(char *buf, int joynum, int key) { _("Down"), "", _("Rightdown"), "", _("Left"), _("Leftup"), "", "", _("Leftdown"), "", "", ""}; - switch (g.cfg.PadDef[joynum].KeyDef[key].JoyEvType) { + KEYDEF* keydef = joynum < 0 ? &g.cfg.E.EmuDef[key].Mapping : &g.cfg.PadDef[joynum].KeyDef[key]; + + switch (keydef->JoyEvType) { case BUTTON: - sprintf(buf, _("Joystick: Button %d"), g.cfg.PadDef[joynum].KeyDef[key].J.Button); + sprintf(buf, _("Joystick: Button %d"), keydef->J.Button); break; case AXIS: - sprintf(buf, _("Joystick: Axis %d%c"), abs(g.cfg.PadDef[joynum].KeyDef[key].J.Axis) - 1, - g.cfg.PadDef[joynum].KeyDef[key].J.Axis > 0 ? '+' : '-'); + sprintf(buf, _("Joystick: Axis %d%c"), abs(keydef->J.Axis) - 1, + keydef->J.Axis > 0 ? '+' : '-'); break; case HAT: - sprintf(buf, _("Joystick: Hat %d %s"), (g.cfg.PadDef[joynum].KeyDef[key].J.Hat >> 8), - hatname[g.cfg.PadDef[joynum].KeyDef[key].J.Hat & 0x0F]); + sprintf(buf, _("Joystick: Hat %d %s"), (keydef->J.Hat >> 8), + hatname[keydef->J.Hat & 0x0F]); break; case NONE: @@ -124,14 +143,14 @@ static void GetKeyDescription(char *buf, int joynum, int key) { break; } - if (g.cfg.PadDef[joynum].KeyDef[key].Key != 0) { + if (keydef->Key != 0) { if (buf[0] != '\0') { strcat(buf, " / "); } strcat(buf, _("Keyboard:")); strcat(buf, " "); - strcat(buf, XKeysymToString(g.cfg.PadDef[joynum].KeyDef[key].Key)); + strcat(buf, XKeysymToString(keydef->Key)); } else if (buf[0] == '\0') { strcpy(buf, _("(Not Set)")); } @@ -177,44 +196,46 @@ static void GetAnalogDescription(char *buf, int joynum, int analognum, int dir) } static void UpdateKeyList() { - const char *widgetname[2] = {"treeview1", "treeview2"}; - GtkWidget *widget; GtkListStore *store; GtkTreeIter iter; int i, j; char buf[256]; - for (i = 0; i < 2; i++) { + for (i = 0; i < NUM_KEYLIST; i++) { int total; - switch(g.cfg.PadDef[i].Type) - { - case PSE_PAD_TYPE_MOUSE: - total = 0; - break; - case PSE_PAD_TYPE_STANDARD: - total = DKEY_TOTAL - 3; - break; - case PSE_PAD_TYPE_ANALOGPAD: - total = DKEY_TOTAL; - break; - } - - widget = gtk_builder_get_object(xml, widgetname[i]); - + widget = GTK_WIDGET(gtk_builder_get_object(xml, widgetname_treeview[i])); store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); + if ( i == 0 ) { + total = EMU_TOTAL; + } + else { + switch(g.cfg.PadDef[i-1].Type) + { + case PSE_PAD_TYPE_MOUSE: + total = 0; + break; + case PSE_PAD_TYPE_STANDARD: + total = DKEY_TOTAL - 3; + break; + case PSE_PAD_TYPE_ANALOGPAD: + total = DKEY_TOTAL; + break; + } + } + for (j = 0; j < total; j++) { gtk_list_store_append(store, &iter); - GetKeyDescription(buf, i, DPad[j]); - gtk_list_store_set(store, &iter, 0, _(DPadText[j]), 1, buf, -1); + GetKeyDescription(buf, i-1, i == 0 ? j : DPad[j]); // change order of orig. typedef to up, down, etc + gtk_list_store_set(store, &iter, 0, i == 0 ? _(EmuKeyText[j]) : _(DPadText[j]), 1, buf, -1); } - if (g.cfg.PadDef[i].Type == PSE_PAD_TYPE_ANALOGPAD) { + if (i > 0 && g.cfg.PadDef[i-1].Type == PSE_PAD_TYPE_ANALOGPAD) { for (j = 0; j < 8; j++) { gtk_list_store_append(store, &iter); - GetAnalogDescription(buf, i, j / 4, j % 4); + GetAnalogDescription(buf, i-1, j / 4, j % 4); gtk_list_store_set(store, &iter, 0, _(AnalogText[j]), 1, buf, -1); } } @@ -227,25 +248,28 @@ static void UpdateKeyList() { } static void UpdateKey() { - const char *widgetname[2] = {"treeview1", "treeview2"}; int i, index; GtkWidget *widget; GtkTreeModel *model; GtkTreeIter iter; - GValue value = {0, }; char buf[256]; - for (i = 0; i < 2; i++) { - index = GetSelectedKeyIndex(i); + for (i = 0; i < NUM_KEYLIST; i++) { + GValue value = { 0, }; + index = GetSelectedKeyIndex(i-1); if (index == -1) continue; - widget = gtk_builder_get_object(xml, widgetname[i]); + widget = GTK_WIDGET(gtk_builder_get_object(xml, widgetname_treeview[i])); gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)), &model, &iter); - if (index < DKEY_TOTAL) { - GetKeyDescription(buf, i, DPad[index]); + // this can be removed if DPAD[index] is removed + if (i == 0) { + GetKeyDescription(buf, i-1, index); + } + else if (index < DKEY_TOTAL) { + GetKeyDescription(buf, i-1, DPad[index]); } else { - GetAnalogDescription(buf, i, (index - DKEY_TOTAL) / 4, (index - DKEY_TOTAL) % 4); + GetAnalogDescription(buf, i-1, (index - DKEY_TOTAL) / 4, (index - DKEY_TOTAL) % 4); } g_value_init(&value, G_TYPE_STRING); @@ -281,39 +305,31 @@ static void TreeSelectionChanged(GtkTreeSelection *selection, gpointer user_data // If a row was selected, and the row is not blank, we can now enable // some of the disabled widgets - if ((int)user_data == 0) { - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(xml, "btnchange1")), TRUE); - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(xml, "btnreset1")), TRUE); - } else { - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(xml, "btnchange2")), TRUE); - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(xml, "btnreset2")), TRUE); - } - } else { - if ((int)user_data == 0) { - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(xml, "btnchange1")), FALSE); - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(xml, "btnreset1")), FALSE); - } else { - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(xml, "btnchange2")), FALSE); - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(xml, "btnreset2")), FALSE); - } } + gint padnum = GPOINTER_TO_INT(user_data); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(xml, widgetname_reset[padnum+1])), selected); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(xml, widgetname_change[padnum+1])), selected); } static void OnDeviceChanged(GtkWidget *widget, gpointer user_data) { - int n = (int)user_data, current = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); - current--; - g.cfg.PadDef[n].DevNum = current; + int n = GPOINTER_TO_INT(user_data); + int current = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)) - 1; + if (n >= 0) { + g.cfg.PadDef[n].DevNum = current; + } else { + g.cfg.E.DevNum = current; + } } static void OnTypeChanged(GtkWidget *widget, gpointer user_data) { - int n = (int)user_data, current = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); - - int padTypeList[] = { - PSE_PAD_TYPE_STANDARD, - PSE_PAD_TYPE_ANALOGPAD, - PSE_PAD_TYPE_MOUSE - }; - + uint n = GPOINTER_TO_UINT(user_data), current = gtk_combo_box_get_active(GTK_COMBO_BOX(widget)); + + int padTypeList[] = { + PSE_PAD_TYPE_STANDARD, + PSE_PAD_TYPE_ANALOGPAD, + PSE_PAD_TYPE_MOUSE + }; + g.cfg.PadDef[n].Type = padTypeList[current]; UpdateKeyList(); @@ -324,28 +340,31 @@ static void OnThreadedToggled(GtkWidget *widget, gpointer user_data) { } static void OnVisualVibration1Toggled(GtkWidget *widget, gpointer user_data) { - g.cfg.PadDef[0].VisualVibration = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); + g.cfg.PadDef[0].VisualVibration = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); } static void OnVisualVibration2Toggled(GtkWidget *widget, gpointer user_data) { - g.cfg.PadDef[1].VisualVibration = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); + g.cfg.PadDef[1].VisualVibration = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); } static void OnHideCursorToggled(GtkWidget *widget, gpointer user_data) { - g.cfg.HideCursor = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); + g.cfg.HideCursor = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); } static void ReadDKeyEvent(int padnum, int key) { SDL_Joystick *js; time_t t; - GdkEvent *ge; + //GdkEvent *ge; int i; Sint16 axis, numAxes = 0, InitAxisPos[256], PrevAxisPos[256]; unsigned char buttons[32]; uint16_t Key; - if (g.cfg.PadDef[padnum].DevNum >= 0) { - js = SDL_JoystickOpen(g.cfg.PadDef[padnum].DevNum); + KEYDEF* keydef = padnum < 0 ? &g.cfg.E.EmuDef[key].Mapping : &g.cfg.PadDef[padnum].KeyDef[key]; + int8_t devnum = padnum < 0 ? g.cfg.E.DevNum : g.cfg.PadDef[padnum].DevNum; + + if (devnum >= 0) { + js = SDL_JoystickOpen(devnum); SDL_JoystickEventState(SDL_IGNORE); SDL_JoystickUpdate(); @@ -369,8 +388,8 @@ static void ReadDKeyEvent(int padnum, int key) { for (i = 0; i < SDL_JoystickNumButtons(js); i++) { if (SDL_JoystickGetButton(js, i)) { - g.cfg.PadDef[padnum].KeyDef[key].JoyEvType = BUTTON; - g.cfg.PadDef[padnum].KeyDef[key].J.Button = i; + keydef->JoyEvType = BUTTON; + keydef->J.Button = i; goto end; } } @@ -378,8 +397,8 @@ static void ReadDKeyEvent(int padnum, int key) { for (i = 0; i < numAxes; i++) { axis = SDL_JoystickGetAxis(js, i); if (abs(axis) > 16383 && (abs(axis - InitAxisPos[i]) > 4096 || abs(axis - PrevAxisPos[i]) > 4096)) { - g.cfg.PadDef[padnum].KeyDef[key].JoyEvType = AXIS; - g.cfg.PadDef[padnum].KeyDef[key].J.Axis = (i + 1) * (axis > 0 ? 1 : -1); + keydef->JoyEvType = AXIS; + keydef->J.Axis = (i + 1) * (axis > 0 ? 1 : -1); goto end; } PrevAxisPos[i] = axis; @@ -388,16 +407,16 @@ static void ReadDKeyEvent(int padnum, int key) { for (i = 0; i < SDL_JoystickNumHats(js); i++) { axis = SDL_JoystickGetHat(js, i); if (axis != SDL_HAT_CENTERED) { - g.cfg.PadDef[padnum].KeyDef[key].JoyEvType = HAT; + keydef->JoyEvType = HAT; if (axis & SDL_HAT_UP) { - g.cfg.PadDef[padnum].KeyDef[key].J.Hat = ((i << 8) | SDL_HAT_UP); + keydef->J.Hat = ((i << 8) | SDL_HAT_UP); } else if (axis & SDL_HAT_DOWN) { - g.cfg.PadDef[padnum].KeyDef[key].J.Hat = ((i << 8) | SDL_HAT_DOWN); + keydef->J.Hat = ((i << 8) | SDL_HAT_DOWN); } else if (axis & SDL_HAT_LEFT) { - g.cfg.PadDef[padnum].KeyDef[key].J.Hat = ((i << 8) | SDL_HAT_LEFT); + keydef->J.Hat = ((i << 8) | SDL_HAT_LEFT); } else if (axis & SDL_HAT_RIGHT) { - g.cfg.PadDef[padnum].KeyDef[key].J.Hat = ((i << 8) | SDL_HAT_RIGHT); + keydef->J.Hat = ((i << 8) | SDL_HAT_RIGHT); } goto end; @@ -411,7 +430,7 @@ static void ReadDKeyEvent(int padnum, int key) { if(buttons[i >> 3] & (1 << (i & 7))) { Key = XkbKeycodeToKeysym(g.Disp, i, 0, 0); if(Key != XK_Escape) { - g.cfg.PadDef[padnum].KeyDef[key].Key = Key; + keydef->Key = Key; } goto end; } @@ -517,13 +536,15 @@ end: } } -static void OnChangeClicked(GtkWidget *widget, gpointer user_data) { - int pad = (int)user_data; +static void OnChangeClicked(GtkWidget* widget, gpointer user_data) { + int pad = GPOINTER_TO_INT(user_data); int index = GetSelectedKeyIndex(pad); - if (index == -1) return; - - if (index < DKEY_TOTAL) { + if (index == -1) { + return; + } else if (pad < 0) { + ReadDKeyEvent(pad, index); // order matches EMUKEY struct + } else if (index < DKEY_TOTAL) { ReadDKeyEvent(pad, DPad[index]); } else { index -= DKEY_TOTAL; @@ -534,12 +555,16 @@ static void OnChangeClicked(GtkWidget *widget, gpointer user_data) { } static void OnResetClicked(GtkWidget *widget, gpointer user_data) { - int pad = (int)user_data; + int pad = GPOINTER_TO_INT(user_data); int index = GetSelectedKeyIndex(pad); - if (index == -1) return; - - if (index < DKEY_TOTAL) { + if (index == -1) { + return; + } else if (pad < 0) { + g.cfg.E.EmuDef[index].Mapping.Key = 0; + g.cfg.E.EmuDef[index].Mapping.JoyEvType = NONE; + g.cfg.E.EmuDef[index].Mapping.J.Button = 0; + } else if (index < DKEY_TOTAL) { g.cfg.PadDef[pad].KeyDef[DPad[index]].Key = 0; g.cfg.PadDef[pad].KeyDef[DPad[index]].JoyEvType = NONE; g.cfg.PadDef[pad].KeyDef[DPad[index]].J.Button = 0; @@ -554,7 +579,6 @@ static void OnResetClicked(GtkWidget *widget, gpointer user_data) { } static void PopulateDevList() { - const char *widgetname[2] = {"combodev1", "combodev2"}; int i, j, n; GtkWidget *widget; GtkTreeIter iter; @@ -562,8 +586,8 @@ static void PopulateDevList() { GtkCellRenderer *renderer; char buf[256]; - for (i = 0; i < 2; i++) { - widget = gtk_builder_get_object(xml, widgetname[i]); + for (i = 0; i < NUM_KEYLIST; i++) { + widget = GTK_WIDGET(gtk_builder_get_object(xml, widgetname_combodev[i])); renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget), renderer, FALSE); @@ -583,10 +607,12 @@ static void PopulateDevList() { gtk_combo_box_set_model(GTK_COMBO_BOX(widget), GTK_TREE_MODEL(store)); - n = g.cfg.PadDef[i].DevNum + 1; - if (n > SDL_NumJoysticks()) { - n = 0; - g.cfg.PadDef[i].DevNum = -1; + if (i > 0) { + n = g.cfg.PadDef[i-1].DevNum + 1; + if (n > SDL_NumJoysticks()) { + n = 0; + g.cfg.PadDef[i-1].DevNum = -1; + } } gtk_combo_box_set_active(GTK_COMBO_BOX(widget), n); @@ -603,7 +629,7 @@ long PADconfigure() { fprintf(stderr, "Failed to initialize SDL!\n"); return -1; } - + g.Disp = XOpenDisplay(NULL); if (!g.Disp) { fprintf(stderr, "XOpenDisplay failed!\n"); @@ -619,10 +645,10 @@ long PADconfigure() { return -1; } - MainWindow = gtk_builder_get_object(xml, "CfgWnd"); + MainWindow = GTK_WIDGET(gtk_builder_get_object(xml, "CfgWnd")); gtk_window_set_title(GTK_WINDOW(MainWindow), _("Gamepad/Keyboard Input Configuration")); - widget = gtk_builder_get_object(xml, "treeview1"); + widget = GTK_WIDGET(gtk_builder_get_object(xml, widgetname_treeview[1])); // pad 1 // column for key renderer = gtk_cell_renderer_text_new(); @@ -640,9 +666,9 @@ long PADconfigure() { gtk_tree_selection_set_mode(treesel, GTK_SELECTION_SINGLE); g_signal_connect_data(G_OBJECT(treesel), "changed", - G_CALLBACK(TreeSelectionChanged), (gpointer)0, NULL, G_CONNECT_AFTER); + G_CALLBACK(TreeSelectionChanged), GINT_TO_POINTER(0), NULL, G_CONNECT_AFTER); - widget = gtk_builder_get_object(xml, "treeview2"); + widget = GTK_WIDGET(gtk_builder_get_object(xml, widgetname_treeview[2])); // pad 2 // column for key renderer = gtk_cell_renderer_text_new(); @@ -660,20 +686,17 @@ long PADconfigure() { gtk_tree_selection_set_mode(treesel, GTK_SELECTION_SINGLE); g_signal_connect_data(G_OBJECT(treesel), "changed", - G_CALLBACK(TreeSelectionChanged), (gpointer)1, NULL, G_CONNECT_AFTER); + G_CALLBACK(TreeSelectionChanged), GINT_TO_POINTER(1), NULL, G_CONNECT_AFTER); - widget = gtk_builder_get_object(xml, "CfgWnd"); + widget = GTK_WIDGET(gtk_builder_get_object(xml, "CfgWnd")); g_signal_connect_data(G_OBJECT(widget), "delete_event", G_CALLBACK(OnConfigExit), NULL, NULL, G_CONNECT_AFTER); - widget = gtk_builder_get_object(xml, "btnclose"); + widget = GTK_WIDGET(gtk_builder_get_object(xml, "btnclose")); g_signal_connect_data(G_OBJECT(widget), "clicked", G_CALLBACK(OnConfigExit), NULL, NULL, G_CONNECT_AFTER); - PopulateDevList(); - UpdateKeyList(); - - widget = gtk_builder_get_object(xml, "checkmt"); + widget = GTK_WIDGET(gtk_builder_get_object(xml, "checkmt")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), g.cfg.Threaded); g_signal_connect_data(G_OBJECT(widget), "toggled", G_CALLBACK(OnThreadedToggled), NULL, NULL, G_CONNECT_AFTER); @@ -684,66 +707,105 @@ long PADconfigure() { g_signal_connect_data(GTK_OBJECT(widget), "toggled", G_CALLBACK(OnHideCursorToggled), NULL, NULL, G_CONNECT_AFTER); */ - widget = gtk_builder_get_object(xml, "combodev1"); + widget = GTK_WIDGET(gtk_builder_get_object(xml, widgetname_combodev[1])); g_signal_connect_data(G_OBJECT(widget), "changed", - G_CALLBACK(OnDeviceChanged), (gpointer)0, NULL, G_CONNECT_AFTER); + G_CALLBACK(OnDeviceChanged), GINT_TO_POINTER(0), NULL, G_CONNECT_AFTER); - widget = gtk_builder_get_object(xml, "combodev2"); + widget = GTK_WIDGET(gtk_builder_get_object(xml, widgetname_combodev[2])); g_signal_connect_data(G_OBJECT(widget), "changed", - G_CALLBACK(OnDeviceChanged), (gpointer)1, NULL, G_CONNECT_AFTER); - - int padTypeList[] = { - 0, - 2, // PSE_PAD_TYPE_MOUSE - 0, // PSE_PAD_TYPE_NEGCON - 0, // PSE_PAD_TYPE_GUN - 0, // PSE_PAD_TYPE_STANDARD - 1, // PSE_PAD_TYPE_ANALOGJOY - 0, // PSE_PAD_TYPE_GUNCON - 1, //PSE_PAD_TYPE_ANALOGPAD - }; - - widget = gtk_builder_get_object(xml, "combotype1"); + G_CALLBACK(OnDeviceChanged), GINT_TO_POINTER(1), NULL, G_CONNECT_AFTER); + + int padTypeList[] = { + 0, + 2, // PSE_PAD_TYPE_MOUSE + 0, // PSE_PAD_TYPE_NEGCON + 0, // PSE_PAD_TYPE_GUN + 0, // PSE_PAD_TYPE_STANDARD + 1, // PSE_PAD_TYPE_ANALOGJOY + 0, // PSE_PAD_TYPE_GUNCON + 1, //PSE_PAD_TYPE_ANALOGPAD + }; + + widget = GTK_WIDGET(gtk_builder_get_object(xml, "combotype1")); gtk_combo_box_set_active(GTK_COMBO_BOX(widget), padTypeList[g.cfg.PadDef[0].Type]); g_signal_connect_data(G_OBJECT(widget), "changed", - G_CALLBACK(OnTypeChanged), (gpointer)0, NULL, G_CONNECT_AFTER); + G_CALLBACK(OnTypeChanged), GUINT_TO_POINTER(0u), NULL, G_CONNECT_AFTER); - widget = gtk_builder_get_object(xml, "combotype2"); + widget = GTK_WIDGET(gtk_builder_get_object(xml, "combotype2")); gtk_combo_box_set_active(GTK_COMBO_BOX(widget), padTypeList[g.cfg.PadDef[1].Type]); g_signal_connect_data(G_OBJECT(widget), "changed", - G_CALLBACK(OnTypeChanged), (gpointer)1, NULL, G_CONNECT_AFTER); - - widget = gtk_builder_get_object(xml, "checkvv1"); + G_CALLBACK(OnTypeChanged), GUINT_TO_POINTER(1u), NULL, G_CONNECT_AFTER); + + widget = GTK_WIDGET(gtk_builder_get_object(xml, "checkvv1")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), g.cfg.PadDef[0].VisualVibration); g_signal_connect_data(G_OBJECT(widget), "toggled", G_CALLBACK(OnVisualVibration1Toggled), NULL, NULL, G_CONNECT_AFTER); - widget = gtk_builder_get_object(xml, "checkvv2"); + widget = GTK_WIDGET(gtk_builder_get_object(xml, "checkvv2")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), g.cfg.PadDef[1].VisualVibration); g_signal_connect_data(G_OBJECT(widget), "toggled", G_CALLBACK(OnVisualVibration2Toggled), NULL, NULL, G_CONNECT_AFTER); - - widget = gtk_builder_get_object(xml, "btnchange1"); + + widget = GTK_WIDGET(gtk_builder_get_object(xml, widgetname_change[1])); gtk_widget_set_sensitive(widget, FALSE); g_signal_connect_data(G_OBJECT(widget), "clicked", - G_CALLBACK(OnChangeClicked), (gpointer)0, NULL, G_CONNECT_AFTER); + G_CALLBACK(OnChangeClicked), GINT_TO_POINTER(0), NULL, G_CONNECT_AFTER); - widget = gtk_builder_get_object(xml, "btnreset1"); + widget = GTK_WIDGET(gtk_builder_get_object(xml, widgetname_reset[1])); gtk_widget_set_sensitive(widget, FALSE); g_signal_connect_data(G_OBJECT(widget), "clicked", - G_CALLBACK(OnResetClicked), (gpointer)0, NULL, G_CONNECT_AFTER); + G_CALLBACK(OnResetClicked), GINT_TO_POINTER(0), NULL, G_CONNECT_AFTER); - widget = gtk_builder_get_object(xml, "btnchange2"); + widget = GTK_WIDGET(gtk_builder_get_object(xml, widgetname_change[2])); gtk_widget_set_sensitive(widget, FALSE); g_signal_connect_data(G_OBJECT(widget), "clicked", - G_CALLBACK(OnChangeClicked), (gpointer)1, NULL, G_CONNECT_AFTER); + G_CALLBACK(OnChangeClicked), GINT_TO_POINTER(1), NULL, G_CONNECT_AFTER); - widget = gtk_builder_get_object(xml, "btnreset2"); + widget = GTK_WIDGET(gtk_builder_get_object(xml, widgetname_reset[2])); gtk_widget_set_sensitive(widget, FALSE); g_signal_connect_data(G_OBJECT(widget), "clicked", - G_CALLBACK(OnResetClicked), (gpointer)1, NULL, G_CONNECT_AFTER); + G_CALLBACK(OnResetClicked), GINT_TO_POINTER(1), NULL, G_CONNECT_AFTER); + + + // ************ Emulators keys ********************** + widget = GTK_WIDGET(gtk_builder_get_object(xml, widgetname_treeview[0])); // emu + + // column for key + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("Key"), + renderer, "text", 0, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(widget), column); + + // column for button + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("Button"), + renderer, "text", 1, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(widget), column); + + treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); + gtk_tree_selection_set_mode(treesel, GTK_SELECTION_SINGLE); + + g_signal_connect_data(G_OBJECT(treesel), "changed", + G_CALLBACK(TreeSelectionChanged), GINT_TO_POINTER(-1), NULL, G_CONNECT_AFTER); + + widget = GTK_WIDGET(gtk_builder_get_object(xml, widgetname_change[0])); + gtk_widget_set_sensitive(widget, FALSE); + g_signal_connect_data(G_OBJECT(widget), "clicked", + G_CALLBACK(OnChangeClicked), GINT_TO_POINTER(-1), NULL, G_CONNECT_AFTER); + + widget = GTK_WIDGET(gtk_builder_get_object(xml, widgetname_reset[0])); + gtk_widget_set_sensitive(widget, FALSE); + g_signal_connect_data(G_OBJECT(widget), "clicked", + G_CALLBACK(OnResetClicked), GINT_TO_POINTER(-1), NULL, G_CONNECT_AFTER); + + widget = GTK_WIDGET(gtk_builder_get_object(xml, widgetname_combodev[0])); + g_signal_connect_data(G_OBJECT(widget), "changed", + G_CALLBACK(OnDeviceChanged), GINT_TO_POINTER(-1), NULL, G_CONNECT_AFTER); + + PopulateDevList(); + UpdateKeyList(); gtk_widget_show(MainWindow); gtk_main(); @@ -752,12 +814,12 @@ long PADconfigure() { } void PADabout() { - const char *authors[]= {"Wei Mingzhi <weimingzhi@gmail.com>", NULL}; + const char *authors[]= {"Wei Mingzhi <weimingzhi@gmail.com>", "ckain <ckain@iki.fi>", NULL}; GtkWidget *widget; widget = gtk_about_dialog_new(); gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(widget), "Gamepad/Keyboard Input"); - gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(widget), "1.1"); + gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(widget), "1.2"); gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(widget), authors); gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(widget), "http://www.codeplex.com/pcsxr/"); @@ -776,16 +838,16 @@ int main(int argc, char *argv[]) { gtk_init(&argc, &argv); if (argc < 2) { - printf ("Usage: cfgDFInput {about | configure}\n"); + printf ("Usage: cfgDFInput {about | configure}\n"); return 0; } - if (strcmp(argv[1], "configure") != 0 && + if (strcmp(argv[1], "configure") != 0 && strcmp(argv[1], "about") != 0) { printf ("Usage: cfgDFInput {about | configure}\n"); return 0; - } - + } + if(!strcmp(argv[1], "configure")) PADconfigure(); else if(!strcmp(argv[1], "about")) diff --git a/plugins/dfinput/cfg.c b/plugins/dfinput/cfg.c index f7f9e174..1c3ef34d 100755 --- a/plugins/dfinput/cfg.c +++ b/plugins/dfinput/cfg.c @@ -36,7 +36,7 @@ static void SetDefaultConfig() { g.cfg.PadDef[0].VisualVibration = 0; g.cfg.PadDef[1].VisualVibration = 0; - + // Pad1 keyboard g.cfg.PadDef[0].KeyDef[DKEY_SELECT].Key = XK_c; g.cfg.PadDef[0].KeyDef[DKEY_START].Key = XK_v; @@ -113,6 +113,16 @@ static void SetDefaultConfig() { g.cfg.PadDef[1].KeyDef[DKEY_CROSS].J.Button = 2; g.cfg.PadDef[1].KeyDef[DKEY_SQUARE].JoyEvType = BUTTON; g.cfg.PadDef[1].KeyDef[DKEY_SQUARE].J.Button = 3; + + // Emu special + g.cfg.E.DevNum = -1; + g.cfg.E.EmuKeyDev = 0; + + g.cfg.E.EmuDef[EMU_SAVESTATE].EmuKeyEvent = XK_F1; + g.cfg.E.EmuDef[EMU_FASTFORWARDS].EmuKeyEvent = XK_section; + g.cfg.E.EmuDef[EMU_LOADSTATE].EmuKeyEvent = XK_F3; + g.cfg.E.EmuDef[EMU_INCREMENTSTATE].EmuKeyEvent = XK_F2; + g.cfg.E.EmuDef[EMU_SCREENSHOT].EmuKeyEvent = XK_F8; } void LoadPADConfig() { @@ -133,8 +143,8 @@ void LoadPADConfig() { if (strncmp(buf, "Threaded=", 9) == 0) { g.cfg.Threaded = atoi(&buf[9]); } else if (strncmp(buf, "HideCursor=", 11) == 0) { - g.cfg.HideCursor = atoi(&buf[11]); - } else if (strncmp(buf, "[PAD", 4) == 0) { + g.cfg.HideCursor = atoi(&buf[11]); + } else if (strncmp(buf, "[PAD", 4) == 0) { current = atoi(&buf[4]) - 1; if (current < 0) { current = 0; @@ -147,6 +157,33 @@ void LoadPADConfig() { g.cfg.PadDef[current].Type = atoi(&buf[5]); } else if (strncmp(buf, "VisualVibration=", 16) == 0) { g.cfg.PadDef[current].VisualVibration = atoi(&buf[16]); + } else if (strncmp(buf, "EmuDev=", 7) == 0) { + g.cfg.E.DevNum = atoi(&buf[5]); + } else if (strncmp(buf, "EMU_FASTFORWARDS=", 17) == 0) { + sscanf(buf, "EMU_FASTFORWARDS=%d,%d,%d", &a, &b, &c); + g.cfg.E.EmuDef[EMU_FASTFORWARDS].Mapping.Key = a; + g.cfg.E.EmuDef[EMU_FASTFORWARDS].Mapping.JoyEvType = b; + g.cfg.E.EmuDef[EMU_FASTFORWARDS].Mapping.J.d = c; + } else if (strncmp(buf, "EMU_SAVESTATE=", 14) == 0) { + sscanf(buf, "EMU_SAVESTATE=%d,%d,%d", &a, &b, &c); + g.cfg.E.EmuDef[EMU_SAVESTATE].Mapping.Key = a; + g.cfg.E.EmuDef[EMU_SAVESTATE].Mapping.JoyEvType = b; + g.cfg.E.EmuDef[EMU_SAVESTATE].Mapping.J.d = c; + } else if (strncmp(buf, "EMU_LOADSTATE=", 14) == 0) { + sscanf(buf, "EMU_LOADSTATE=%d,%d,%d", &a, &b, &c); + g.cfg.E.EmuDef[EMU_LOADSTATE].Mapping.Key = a; + g.cfg.E.EmuDef[EMU_LOADSTATE].Mapping.JoyEvType = b; + g.cfg.E.EmuDef[EMU_LOADSTATE].Mapping.J.d = c; + } else if (strncmp(buf, "EMU_SCREENSHOT=", 15) == 0) { + sscanf(buf, "EMU_SCREENSHOT=%d,%d,%d", &a, &b, &c); + g.cfg.E.EmuDef[EMU_SCREENSHOT].Mapping.Key = a; + g.cfg.E.EmuDef[EMU_SCREENSHOT].Mapping.JoyEvType = b; + g.cfg.E.EmuDef[EMU_SCREENSHOT].Mapping.J.d = c; + } else if (strncmp(buf, "EMU_INCREMENTSTATE=", 19) == 0) { + sscanf(buf, "EMU_INCREMENTSTATE=%d,%d,%d", &a, &b, &c); + g.cfg.E.EmuDef[EMU_INCREMENTSTATE].Mapping.Key = a; + g.cfg.E.EmuDef[EMU_INCREMENTSTATE].Mapping.JoyEvType = b; + g.cfg.E.EmuDef[EMU_INCREMENTSTATE].Mapping.J.d = c; } else if (strncmp(buf, "Select=", 7) == 0) { sscanf(buf, "Select=%d,%d,%d", &a, &b, &c); g.cfg.PadDef[current].KeyDef[DKEY_SELECT].Key = a; @@ -297,7 +334,7 @@ void SavePADConfig() { fprintf(fp, "DevNum=%d\n", g.cfg.PadDef[i].DevNum); fprintf(fp, "Type=%d\n", g.cfg.PadDef[i].Type); fprintf(fp, "VisualVibration=%d\n", g.cfg.PadDef[i].VisualVibration); - + fprintf(fp, "Select=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_SELECT].Key, g.cfg.PadDef[i].KeyDef[DKEY_SELECT].JoyEvType, g.cfg.PadDef[i].KeyDef[DKEY_SELECT].J.d); fprintf(fp, "L3=%d,%d,%d\n", g.cfg.PadDef[i].KeyDef[DKEY_L3].Key, @@ -360,5 +397,23 @@ void SavePADConfig() { fprintf(fp, "\n"); } + // Emulator keys + fprintf(fp, "[EMU]\n"); + fprintf(fp, "EmuDev=%d\n", g.cfg.E.DevNum); + fprintf(fp, "EMU_SAVESTATE=%d,%d,%d\n", g.cfg.E.EmuDef[EMU_SAVESTATE].Mapping.Key, + g.cfg.E.EmuDef[EMU_SAVESTATE].Mapping.JoyEvType, + g.cfg.E.EmuDef[EMU_SAVESTATE].Mapping.J.d); + fprintf(fp, "EMU_LOADSTATE=%d,%d,%d\n", g.cfg.E.EmuDef[EMU_LOADSTATE].Mapping.Key, + g.cfg.E.EmuDef[EMU_LOADSTATE].Mapping.JoyEvType, + g.cfg.E.EmuDef[EMU_LOADSTATE].Mapping.J.d); + fprintf(fp, "EMU_INCREMENTSTATE=%d,%d,%d\n", g.cfg.E.EmuDef[EMU_INCREMENTSTATE].Mapping.Key, + g.cfg.E.EmuDef[EMU_INCREMENTSTATE].Mapping.JoyEvType, + g.cfg.E.EmuDef[EMU_INCREMENTSTATE].Mapping.J.d); + fprintf(fp, "EMU_FASTFORWARDS=%d,%d,%d\n", g.cfg.E.EmuDef[EMU_FASTFORWARDS].Mapping.Key, + g.cfg.E.EmuDef[EMU_FASTFORWARDS].Mapping.JoyEvType, + g.cfg.E.EmuDef[EMU_FASTFORWARDS].Mapping.J.d); + fprintf(fp, "EMU_SCREENSHOT=%d,%d,%d\n", g.cfg.E.EmuDef[EMU_SCREENSHOT].Mapping.Key, + g.cfg.E.EmuDef[EMU_SCREENSHOT].Mapping.JoyEvType, + g.cfg.E.EmuDef[EMU_SCREENSHOT].Mapping.J.d); fclose(fp); } diff --git a/plugins/dfinput/dfinput.ui b/plugins/dfinput/dfinput.ui index 7adb6277..236b597a 100644 --- a/plugins/dfinput/dfinput.ui +++ b/plugins/dfinput/dfinput.ui @@ -471,7 +471,190 @@ <property name="label" translatable="yes">Controller 2</property> </object> <packing> - <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox_e"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="border_width">5</property> + <property name="spacing">2</property> + <child> + <object class="GtkGrid" id="grid_e"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="row_spacing">5</property> + <property name="column_spacing">5</property> + <child> + <object class="GtkLabel" id="label_e2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Device:</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="combodev_e"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">0</property> + <property name="width">1</property> + <property name="height">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow_e"> + <property name="width_request">500</property> + <property name="height_request">275</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="border_width">5</property> + <property name="window_placement_set">True</property> + <property name="shadow_type">etched-in</property> + <child> + <object class="GtkTreeView" id="treeview_e"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="treeview-selection-e"/> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkHButtonBox" id="hbuttonbox_e"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">20</property> + <property name="layout_style">center</property> + <child> + <object class="GtkButton" id="btnchange_e"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <child> + <object class="GtkHBox" id="hbox_e1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkImage" id="image_e1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-edit</property> + <property name="icon-size">1</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label_e3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Change</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="btnreset_e"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <child> + <object class="GtkHBox" id="hbox_e2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkImage" id="image_e2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="stock">gtk-undo</property> + <property name="icon-size">1</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label_e4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Reset</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="label_e5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Emulator keys</property> + </object> + <packing> <property name="tab_fill">False</property> </packing> </child> @@ -498,7 +681,7 @@ </child> </object> <packing> - <property name="position">2</property> + <property name="position">3</property> </packing> </child> <child type="tab"> @@ -508,7 +691,7 @@ <property name="label" translatable="yes">Options</property> </object> <packing> - <property name="position">2</property> + <property name="position">3</property> <property name="tab_fill">False</property> </packing> </child> diff --git a/plugins/dfinput/pad.h b/plugins/dfinput/pad.h index 3249f6b3..2b69f111 100755 --- a/plugins/dfinput/pad.h +++ b/plugins/dfinput/pad.h @@ -83,11 +83,11 @@ extern char* PLUGLOC(char* toloc); #define _(x) (x) #define N_(x) (x) #endif - + #if SDL_VERSION_ATLEAST(1,3,0) extern int has_haptic; #endif - + int JoyHapticRumble(int pad, uint32_t low, uint32_t high); enum { @@ -113,6 +113,16 @@ enum { }; enum { + EMU_INCREMENTSTATE=0, + EMU_FASTFORWARDS, + EMU_LOADSTATE, + EMU_SAVESTATE, + EMU_SCREENSHOT, + + EMU_TOTAL +}; + +enum { ANALOG_LEFT = 0, ANALOG_RIGHT, @@ -130,6 +140,7 @@ typedef struct tagKeyDef { uint16_t Button; // button number } J; uint16_t Key; + uint8_t ReleaseEventPending; } KEYDEF; enum { ANALOG_XP = 0, ANALOG_XM, ANALOG_YP, ANALOG_YM }; @@ -142,17 +153,29 @@ typedef struct tagPadDef { KEYDEF AnalogDef[ANALOG_TOTAL][4]; } PADDEF; +typedef struct tagEmuDef { + uint16_t EmuKeyEvent; + KEYDEF Mapping; +} EMUDEF; + +typedef struct tagEmuDef2{ + EMUDEF EmuDef[EMU_TOTAL]; + SDL_Joystick *EmuKeyDev; + int8_t DevNum; +} EMUDEF2; + typedef struct tagConfig { uint8_t Threaded; - uint8_t HideCursor; + uint8_t HideCursor; PADDEF PadDef[2]; + EMUDEF2 E; } CONFIG; typedef struct tagPadState { SDL_Joystick *JoyDev; uint8_t PadMode; uint8_t PadID; - uint8_t PadModeKey; + uint8_t PadModeKey; volatile uint8_t PadModeSwitch; volatile uint16_t KeyStatus; volatile uint16_t JoyKeyStatus; diff --git a/plugins/dfinput/sdljoy.c b/plugins/dfinput/sdljoy.c index cd93a17c..92db9f4a 100755 --- a/plugins/dfinput/sdljoy.c +++ b/plugins/dfinput/sdljoy.c @@ -84,13 +84,18 @@ int JoyHapticRumble(int pad, uint32_t low, uint32_t high) void InitSDLJoy() { uint8_t i; - + uint8_t emukeydev; g.PadState[0].JoyKeyStatus = 0xFFFF; g.PadState[1].JoyKeyStatus = 0xFFFF; for (i = 0; i < 2; i++) { if (g.cfg.PadDef[i].DevNum >= 0) { g.PadState[i].JoyDev = SDL_JoystickOpen(g.cfg.PadDef[i].DevNum); + + // Saves an extra call to SDL joystick open + if (g.cfg.E.DevNum == g.cfg.PadDef[i].DevNum) { + g.cfg.E.EmuKeyDev = g.PadState[i].JoyDev; + } } else { g.PadState[i].JoyDev = NULL; } @@ -107,6 +112,10 @@ void InitSDLJoy() { } #endif + if (g.cfg.E.EmuKeyDev == 0 && g.cfg.E.DevNum >= 0) { + g.cfg.E.EmuKeyDev = SDL_JoystickOpen(g.cfg.E.DevNum); + } + SDL_JoystickEventState(SDL_IGNORE); InitAnalog(); @@ -133,6 +142,7 @@ void DestroySDLJoy() { for (i = 0; i < 2; i++) { g.PadState[i].JoyDev = NULL; } + g.cfg.E.EmuKeyDev = NULL; } static void bdown(int pad, int bit) @@ -210,6 +220,71 @@ void CheckJoy() { } } + // Check for emulator button states + for (i=(g.cfg.E.EmuKeyDev == NULL ? EMU_TOTAL : 0) ; i < EMU_TOTAL ; i++) { + switch (g.cfg.E.EmuDef[i].Mapping.JoyEvType) { + case BUTTON: + if (SDL_JoystickGetButton(g.cfg.E.EmuKeyDev, g.cfg.E.EmuDef[i].Mapping.J.Button)) { + if (g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending == 0) { + //printf("%x %x %x %x\n", g.cfg.E.EmuKeyDev, i, g.cfg.E.EmuDef[i].Mapping.J.Button, g.cfg.E.EmuDef[i].EmuKeyEvent); + g.KeyLeftOver = g.cfg.E.EmuDef[i].EmuKeyEvent; + g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending = 1; + } + } else if (g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending) { + //printf("%x %x %x %x\n", g.cfg.E.EmuKeyDev, i, g.cfg.E.EmuDef[i].Mapping.J.Button, g.cfg.E.EmuDef[i].EmuKeyEvent); + g.KeyLeftOver = ( g.cfg.E.EmuDef[i].EmuKeyEvent | 0x40000000l ); + g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending = 0; + } + break; + case HAT: + n = (g.cfg.E.EmuDef[i].Mapping.J.Hat >> 8); + if (SDL_JoystickGetHat(g.cfg.E.EmuKeyDev, n) & (g.cfg.E.EmuDef[i].Mapping.J.Hat & 0xFF)) { + if (g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending == 0) { + //printf("%x %x %x %x\n", g.cfg.E.EmuKeyDev, i, g.cfg.E.EmuDef[i].Mapping.J.Button, g.cfg.E.EmuDef[i].EmuKeyEvent); + g.KeyLeftOver = g.cfg.E.EmuDef[i].EmuKeyEvent; + g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending = 1; + } + } else if (g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending) { + //printf("%x %x %x %x\n", g.cfg.E.EmuKeyDev, i, g.cfg.E.EmuDef[i].Mapping.J.Button, g.cfg.E.EmuDef[i].EmuKeyEvent); + g.KeyLeftOver = ( g.cfg.E.EmuDef[i].EmuKeyEvent | 0x40000000l ); + g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending = 0; + } + break; + case AXIS: + n = abs(g.cfg.E.EmuDef[i].Mapping.J.Axis) - 1; + + if (g.cfg.E.EmuDef[i].Mapping.J.Axis > 0) { + if (SDL_JoystickGetAxis(g.cfg.E.EmuKeyDev, n) > 16383) { + if (g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending == 0) { + //printf("push1 %x %x %x %x\n", g.cfg.E.EmuKeyDev, i, g.cfg.E.EmuDef[i].Mapping.J.Axis, g.cfg.E.EmuDef[i].EmuKeyEvent); + g.KeyLeftOver = g.cfg.E.EmuDef[i].EmuKeyEvent; + g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending = 1; + } + } else if (g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending) { + //printf("rel1 %x %x %x %x\n", g.cfg.E.EmuKeyDev, i, g.cfg.E.EmuDef[i].Mapping.J.Button, g.cfg.E.EmuDef[i].EmuKeyEvent); + g.KeyLeftOver = ( g.cfg.E.EmuDef[i].EmuKeyEvent | 0x40000000l ); + g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending = 0; + } + } else if (g.cfg.E.EmuDef[i].Mapping.J.Axis < 0) { + if (SDL_JoystickGetAxis(g.cfg.E.EmuKeyDev, n) < -16383) { + if (g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending == 0) { + //printf("push2 %x %x %x %x\n", g.cfg.E.EmuKeyDev, i, g.cfg.E.EmuDef[i].Mapping.J.Axis, g.cfg.E.EmuDef[i].EmuKeyEvent); + g.KeyLeftOver = g.cfg.E.EmuDef[i].EmuKeyEvent; + g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending = 1; + } + } else if (g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending) { + //printf("rel2 %x %x %x %x\n", g.cfg.E.EmuKeyDev, i, g.cfg.E.EmuDef[i].Mapping.J.Button, g.cfg.E.EmuDef[i].EmuKeyEvent); + g.KeyLeftOver = ( g.cfg.E.EmuDef[i].EmuKeyEvent | 0x40000000l ); + g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending = 0; + } + } + break; + default: + break; + + } + } + CheckAnalog(); for (i = 0; i < 2; i++) { diff --git a/plugins/dfinput/xkb.c b/plugins/dfinput/xkb.c index 9592f340..c10ab9c8 100755 --- a/plugins/dfinput/xkb.c +++ b/plugins/dfinput/xkb.c @@ -37,17 +37,17 @@ void InitKeyboard() { grabCursor(g.Disp, window, 1); showCursor(g.Disp, window, 0); } - + g_currentMouse_X = 0; g_currentMouse_Y = 0; - + g.PadState[0].KeyStatus = 0xFFFF; g.PadState[1].KeyStatus = 0xFFFF; } void DestroyKeyboard() { XkbSetDetectableAutoRepeat(g.Disp, 0, NULL); - + if (g.cfg.PadDef[0].Type == PSE_PAD_TYPE_MOUSE || g.cfg.PadDef[1].Type == PSE_PAD_TYPE_MOUSE) { grabCursor(g.Disp, window, 0); @@ -74,7 +74,7 @@ void CheckKeyboard() { XEvent evt; XClientMessageEvent *xce; uint16_t Key; - + while (XPending(g.Disp)) { XNextEvent(g.Disp, &evt); switch (evt.type) { @@ -126,6 +126,14 @@ void CheckKeyboard() { } } if (!found && !AnalogKeyPressed(Key)) { + for (i=0 ; i < EMU_TOTAL ; i++) { + if (Key == g.cfg.E.EmuDef[i].Mapping.Key /*&& g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending == 0*/) { + //printf("press %x %x and %x\n", Key, g.cfg.E.EmuDef[i].Mapping.Key, g.cfg.E.EmuDef[i].EmuKeyEvent); + Key = g.cfg.E.EmuDef[i].EmuKeyEvent; + //g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending = 1; // joypad sends immediately release if enabled here + i=EMU_TOTAL; + } + } g.KeyLeftOver = Key; } break; @@ -141,7 +149,15 @@ void CheckKeyboard() { } } if (!found && !AnalogKeyReleased(Key)) { - g.KeyLeftOver = ((long)Key | 0x40000000); + for (i=0 ; i < EMU_TOTAL ; i++) { + if (Key == g.cfg.E.EmuDef[i].Mapping.Key) { + //printf("release %x and %x\n", Key, g.cfg.E.EmuDef[i].EmuKeyEvent); + Key = g.cfg.E.EmuDef[i].EmuKeyEvent; + //g.cfg.E.EmuDef[i].Mapping.ReleaseEventPending = 0; + i=EMU_TOTAL; + } + } + g.KeyLeftOver = (long) ( Key | 0x40000000l ); } break; case ClientMessage: @@ -154,12 +170,12 @@ void CheckKeyboard() { break; } } - + g.PadState[0].MouseAxis[0][0] = g_currentMouse_X; g.PadState[0].MouseAxis[0][1] = g_currentMouse_Y; g_currentMouse_X *= 0.7; g_currentMouse_Y *= 0.7; - + if (g.cfg.PadDef[0].Type == PSE_PAD_TYPE_MOUSE || g.cfg.PadDef[1].Type == PSE_PAD_TYPE_MOUSE) { XWarpPointer(g.Disp, None, window, 0, 0, 0, 0, 160, 120); |
