|
Line 0
Link Here
|
|
|
1 |
|
| 2 |
|
| 3 |
#include "inputconfig.h" |
| 4 |
#include "gtk-main.h" |
| 5 |
#include "inputconfig_gp.h" |
| 6 |
|
| 7 |
#include <glib/gprintf.h> |
| 8 |
|
| 9 |
GtkWidget *inputcfgwin = NULL; |
| 10 |
extern GtkWidget *mainwin; |
| 11 |
|
| 12 |
extern int UsrInputType[3]; |
| 13 |
extern int InputType[3]; /* Current */ |
| 14 |
|
| 15 |
const gchar *GTK_INPUT_DEVICE_NAMES[] = { |
| 16 |
"[NONE]", |
| 17 |
"Port 1", |
| 18 |
"Port 2", |
| 19 |
"Famicom Expansion Port" |
| 20 |
}; |
| 21 |
#define GTK_GET_DEVICE_NAME(x) GTK_INPUT_DEVICE_NAMES[x] |
| 22 |
|
| 23 |
|
| 24 |
const gchar *GTK_INPUT_DEVICE_MENUPATHS[] = { |
| 25 |
"<main>/NONE", |
| 26 |
"<main>/PORT1", |
| 27 |
"<main>/PORT2", |
| 28 |
"<main>/FC" |
| 29 |
}; |
| 30 |
|
| 31 |
#define GTK_MENU_GET_PATH(x) GTK_INPUT_DEVICE_MENUPATHS[x] |
| 32 |
|
| 33 |
const gchar *GTK_INPUT_DEVICE_TYPE_NAMES[] = { |
| 34 |
"[NONE]", |
| 35 |
"Game Pad", |
| 36 |
"Zapper", |
| 37 |
"Power Pad A", |
| 38 |
"Power Pad B", |
| 39 |
"Arkanoid", |
| 40 |
NULL |
| 41 |
}; |
| 42 |
|
| 43 |
const gchar *GTK_INPUT_FCDEVICE_TYPE_NAMES[] = { |
| 44 |
"[NONE]", |
| 45 |
"Arkanoid", |
| 46 |
"Space Shadow Gun", |
| 47 |
"Four-Player Adapter", |
| 48 |
"Family BASIC Keyboard", |
| 49 |
"HyperShot", |
| 50 |
"Mahjong", |
| 51 |
"Quiz King Buzzers", |
| 52 |
"Family Trainer A", |
| 53 |
"Family Trainer B", |
| 54 |
"Oeka Kids Tablet", |
| 55 |
"Barcode World", |
| 56 |
"Top Rider", |
| 57 |
NULL |
| 58 |
}; |
| 59 |
|
| 60 |
const gchar *GTK_INPUT_UNKNOWN_TYPE_NAMES[] = { |
| 61 |
"[UNKNOWN]", |
| 62 |
NULL |
| 63 |
}; |
| 64 |
|
| 65 |
|
| 66 |
void GTKGUI_JoyConfigDeleteEvent (void); |
| 67 |
|
| 68 |
void input_device_selected_cb (GTK_INPUT_DEVICE *in_device, guint callback_action, GtkWidget *widget); |
| 69 |
void GTKGUI_get_inputdev_config (GTK_INPUT_DEVICE *in_device); |
| 70 |
|
| 71 |
|
| 72 |
GTK_INPUT_DEVICE input_device[3]; |
| 73 |
|
| 74 |
void input_device_new (GTK_INPUT_DEVICE *indevice, GTK_INPUT_DEVICES indev, GTK_INPUT_DEVICE_TYPE intype); |
| 75 |
void get_input_device_menu (GTK_INPUT_DEVICE *device); |
| 76 |
|
| 77 |
|
| 78 |
/* From input.h (I have no short term memory) |
| 79 |
|
| 80 |
#define MAXBUTTCONFIG 4 |
| 81 |
|
| 82 |
typedef struct { |
| 83 |
uint8 ButtType[MAXBUTTCONFIG]; |
| 84 |
uint8 DeviceNum[MAXBUTTCONFIG]; |
| 85 |
uint16 ButtonNum[MAXBUTTCONFIG]; |
| 86 |
uint32 NumC; |
| 87 |
} ButtConfig; |
| 88 |
*/ |
| 89 |
|
| 90 |
extern ButtConfig GamePadConfig [4][10]; |
| 91 |
extern ButtConfig powerpadsc [2][12]; |
| 92 |
extern ButtConfig QuizKingButtons [6]; |
| 93 |
extern ButtConfig FTrainerButtons [12]; |
| 94 |
|
| 95 |
|
| 96 |
GtkItemFactoryEntry input_unknown_menu_items[] = { |
| 97 |
{ "/UNKNOWN", NULL, input_device_selected_cb, GTK_INPUT_DEVICE_TYPE_NONE, NULL } |
| 98 |
}; |
| 99 |
|
| 100 |
GtkItemFactoryEntry input_device_menu_items[] = { |
| 101 |
{ "/_NONE", NULL, input_device_selected_cb, GTK_INPUT_DEVICE_TYPE_NONE, NULL }, |
| 102 |
{ "/_Game Pad", NULL, input_device_selected_cb, GTK_INPUT_DEVICE_TYPE_GP, NULL }, |
| 103 |
{ "/_Zapper", NULL, input_device_selected_cb, GTK_INPUT_DEVICE_TYPE_ZAP, NULL }, |
| 104 |
{ "/Power Pad _A", NULL, input_device_selected_cb, GTK_INPUT_DEVICE_TYPE_PPA, NULL }, |
| 105 |
{ "/Power Pad _B", NULL, input_device_selected_cb, GTK_INPUT_DEVICE_TYPE_PPB, NULL }, |
| 106 |
{ "/A_rkanoid", NULL, input_device_selected_cb, GTK_INPUT_DEVICE_TYPE_ARK, NULL } |
| 107 |
}; |
| 108 |
|
| 109 |
GtkItemFactoryEntry input_fcdevice_menu_items[] = { |
| 110 |
{ "/_NONE", NULL, input_device_selected_cb, GTK_INPUT_FCDEVICE_TYPE_NONE, NULL }, |
| 111 |
{ "/A_rkanoid", NULL, input_device_selected_cb, GTK_INPUT_FCDEVICE_TYPE_ARK, NULL }, |
| 112 |
{ "/_Space Shadow Gun", NULL, input_device_selected_cb, GTK_INPUT_FCDEVICE_TYPE_SHADOW, NULL }, |
| 113 |
{ "/_Four-Player Adapter", NULL, input_device_selected_cb, GTK_INPUT_FCDEVICE_TYPE_4PLAYER, NULL }, |
| 114 |
{ "/Family BASIC _Keyboard", NULL, input_device_selected_cb, GTK_INPUT_FCDEVICE_TYPE_FKB, NULL }, |
| 115 |
{ "/_HyperShot", NULL, input_device_selected_cb, GTK_INPUT_FCDEVICE_TYPE_HYPERSHOT, NULL }, |
| 116 |
{ "/_Mahjong", NULL, input_device_selected_cb, GTK_INPUT_FCDEVICE_TYPE_MAHJONG, NULL }, |
| 117 |
{ "/_Quiz King Buzzers", NULL, input_device_selected_cb, GTK_INPUT_FCDEVICE_TYPE_QUIZKING, NULL }, |
| 118 |
{ "/Family Trainer _A", NULL, input_device_selected_cb, GTK_INPUT_FCDEVICE_TYPE_FTRAINERA, NULL }, |
| 119 |
{ "/Family Trainer _B", NULL, input_device_selected_cb, GTK_INPUT_FCDEVICE_TYPE_FTRAINERB, NULL }, |
| 120 |
{ "/_Oeka Kids Tablet", NULL, input_device_selected_cb, GTK_INPUT_FCDEVICE_TYPE_OEKAKIDS, NULL }, |
| 121 |
{ "/_Barcode World", NULL, input_device_selected_cb, GTK_INPUT_FCDEVICE_TYPE_BWORLD, NULL }, |
| 122 |
{ "/_Top Rider", NULL, input_device_selected_cb, GTK_INPUT_FCDEVICE_TYPE_TOPRIDER, NULL } |
| 123 |
}; |
| 124 |
|
| 125 |
|
| 126 |
|
| 127 |
|
| 128 |
|
| 129 |
void get_input_device_menu( GTK_INPUT_DEVICE *device ) { |
| 130 |
gint nmenu_items = -1; |
| 131 |
gchar *accelpath = (gchar *)GTK_MENU_GET_PATH(device->device); |
| 132 |
GtkAccelGroup *accel_group = gtk_accel_group_new (); |
| 133 |
GtkItemFactory *item_factory = NULL; |
| 134 |
|
| 135 |
item_factory = gtk_item_factory_new (GTK_TYPE_OPTION_MENU, accelpath, accel_group); |
| 136 |
|
| 137 |
switch (device->device) { |
| 138 |
case GTK_INPUT_DEVICE_PORT1: |
| 139 |
nmenu_items = sizeof (input_device_menu_items) / sizeof ((input_device_menu_items)[0]); |
| 140 |
gtk_item_factory_create_items (item_factory, nmenu_items, input_device_menu_items, device); |
| 141 |
break; |
| 142 |
case GTK_INPUT_DEVICE_PORT2: |
| 143 |
nmenu_items = sizeof (input_device_menu_items) / sizeof ((input_device_menu_items)[0]); |
| 144 |
gtk_item_factory_create_items (item_factory, nmenu_items, input_device_menu_items, device); |
| 145 |
break; |
| 146 |
case GTK_INPUT_DEVICE_FC: |
| 147 |
nmenu_items = sizeof (input_fcdevice_menu_items) / sizeof ((input_fcdevice_menu_items)[0]); |
| 148 |
gtk_item_factory_create_items (item_factory, nmenu_items, input_fcdevice_menu_items, device); |
| 149 |
break; |
| 150 |
default: |
| 151 |
nmenu_items = sizeof (input_unknown_menu_items) / sizeof ((input_unknown_menu_items)[0]); |
| 152 |
gtk_item_factory_create_items (item_factory, nmenu_items, input_unknown_menu_items, device); |
| 153 |
break; |
| 154 |
}; |
| 155 |
|
| 156 |
gtk_window_add_accel_group (GTK_WINDOW (inputcfgwin), GTK_ACCEL_GROUP(accel_group)); |
| 157 |
|
| 158 |
if (device) { |
| 159 |
device->option = gtk_item_factory_get_widget (item_factory, accelpath); |
| 160 |
gtk_option_menu_set_history(GTK_OPTION_MENU(device->option), device->type); |
| 161 |
} |
| 162 |
} |
| 163 |
|
| 164 |
|
| 165 |
void DoInputConfig(GtkWidget *window){ |
| 166 |
GTKGUI_InputConfig_Init(); |
| 167 |
} |
| 168 |
|
| 169 |
|
| 170 |
int GTKGUI_InputConfig_Init (void) { |
| 171 |
GtkWidget *vboxM = NULL, // main vbox for dialog |
| 172 |
*hboxM = NULL, // hbox for Ports |
| 173 |
*butM = NULL; // Close Button |
| 174 |
|
| 175 |
inputcfgwin=gtk_window_new(GTK_WINDOW_TOPLEVEL); |
| 176 |
|
| 177 |
g_signal_connect(GTK_OBJECT(inputcfgwin), "delete_event", GTK_SIGNAL_FUNC(GTKGUI_JoyConfigDeleteEvent),NULL); |
| 178 |
gtk_window_set_transient_for(GTK_WINDOW(inputcfgwin), GTK_WINDOW(mainwin)); |
| 179 |
gtk_window_set_title(GTK_WINDOW(inputcfgwin), "Input Configuration"); |
| 180 |
gtk_window_set_modal(GTK_WINDOW(inputcfgwin), TRUE); |
| 181 |
|
| 182 |
vboxM = gtk_vbox_new(FALSE, 2); |
| 183 |
gtk_container_add(GTK_CONTAINER(inputcfgwin), vboxM); |
| 184 |
|
| 185 |
hboxM=gtk_hbox_new(TRUE, 2); |
| 186 |
gtk_box_pack_start(GTK_BOX(vboxM), hboxM, TRUE, TRUE, 2); |
| 187 |
|
| 188 |
butM=gtk_button_new_from_stock(GTK_STOCK_CLOSE); |
| 189 |
|
| 190 |
input_device_new(&input_device[0], GTK_INPUT_DEVICE_PORT1, UsrInputType[0]); |
| 191 |
input_device_new(&input_device[1], GTK_INPUT_DEVICE_PORT2, UsrInputType[1]); |
| 192 |
input_device_new(&input_device[2], GTK_INPUT_DEVICE_FC, UsrInputType[2]); |
| 193 |
|
| 194 |
gtk_box_pack_start(GTK_BOX(hboxM), input_device[0].frame, TRUE, TRUE, 2); |
| 195 |
gtk_box_pack_start(GTK_BOX(hboxM), input_device[1].frame, TRUE, TRUE, 2); |
| 196 |
gtk_box_pack_start(GTK_BOX(vboxM), input_device[2].frame, TRUE, TRUE, 2); |
| 197 |
gtk_box_pack_start(GTK_BOX(vboxM), butM, FALSE, FALSE, 2); |
| 198 |
|
| 199 |
gtk_signal_connect(GTK_OBJECT(butM), "clicked", GTK_SIGNAL_FUNC(GTKGUI_JoyConfigDeleteEvent),NULL); |
| 200 |
|
| 201 |
KillVideo(); |
| 202 |
|
| 203 |
gtk_widget_show_all(inputcfgwin); |
| 204 |
|
| 205 |
if(CurGame) |
| 206 |
InitVideo(CurGame); |
| 207 |
|
| 208 |
return 0; |
| 209 |
} |
| 210 |
|
| 211 |
|
| 212 |
// Creates, and assembles the subdevice frames of the input dialog |
| 213 |
void input_device_new(GTK_INPUT_DEVICE *indevice, GTK_INPUT_DEVICES indev, GTK_INPUT_DEVICE_TYPE intype) { |
| 214 |
indevice->device=indev; |
| 215 |
indevice->type=intype; |
| 216 |
|
| 217 |
indevice->portname = (gchar *)GTK_INPUT_DEVICE_NAMES[indev]; |
| 218 |
indevice->frame=gtk_frame_new((gchar *)indevice->portname); |
| 219 |
indevice->vbox=gtk_vbox_new(FALSE, 2); |
| 220 |
indevice->hbox=gtk_hbox_new(FALSE, 2); |
| 221 |
|
| 222 |
|
| 223 |
switch (intype) { |
| 224 |
case GTK_INPUT_DEVICE_PORT1: case GTK_INPUT_DEVICE_PORT2: |
| 225 |
indevice->devicename = (gchar *)GTK_INPUT_DEVICE_TYPE_NAMES[intype]; |
| 226 |
break; |
| 227 |
case GTK_INPUT_DEVICE_FC: |
| 228 |
indevice->devicename = (gchar *)GTK_INPUT_FCDEVICE_TYPE_NAMES[intype]; |
| 229 |
break; |
| 230 |
default: |
| 231 |
indevice->devicename = (gchar *)GTK_INPUT_UNKNOWN_TYPE_NAMES[0]; |
| 232 |
break; |
| 233 |
}; |
| 234 |
|
| 235 |
indevice->label=gtk_label_new(indevice->devicename); |
| 236 |
indevice->but=gtk_button_new_from_stock(GTK_STOCK_PROPERTIES); |
| 237 |
|
| 238 |
get_input_device_menu(indevice); // Init the device struct and hook its button to the cb function |
| 239 |
|
| 240 |
gtk_box_pack_start(GTK_BOX(indevice->hbox), indevice->label, TRUE, TRUE, 2); |
| 241 |
gtk_box_pack_start(GTK_BOX(indevice->hbox), indevice->but, FALSE, FALSE, 2); |
| 242 |
gtk_box_pack_start(GTK_BOX(indevice->vbox), indevice->hbox, FALSE, TRUE, 2); |
| 243 |
gtk_box_pack_start(GTK_BOX(indevice->vbox), indevice->option, FALSE, TRUE, 2); |
| 244 |
|
| 245 |
g_signal_connect(GTK_OBJECT(indevice->but), "clicked", GTK_SIGNAL_FUNC(GTKGUI_DoSubConfig), indevice); |
| 246 |
|
| 247 |
GTKGUI_get_inputdev_config(indevice); |
| 248 |
|
| 249 |
gtk_container_add(GTK_CONTAINER(indevice->frame), indevice->vbox); |
| 250 |
} |
| 251 |
|
| 252 |
void GTKGUI_get_inputdev_config (GTK_INPUT_DEVICE *in_device) { |
| 253 |
switch (in_device->device) { |
| 254 |
case GTK_INPUT_DEVICE_PORT1: case GTK_INPUT_DEVICE_PORT2: |
| 255 |
switch (in_device->type) { |
| 256 |
case GTK_INPUT_DEVICE_TYPE_GP: |
| 257 |
in_device->config = (ButtConfig *)&GamePadConfig; |
| 258 |
break; |
| 259 |
case GTK_INPUT_DEVICE_TYPE_ZAP: |
| 260 |
in_device->config = NULL; |
| 261 |
break; |
| 262 |
case GTK_INPUT_DEVICE_TYPE_PPA: case GTK_INPUT_DEVICE_TYPE_PPB: |
| 263 |
in_device->config = (ButtConfig *)&powerpadsc; |
| 264 |
break; |
| 265 |
case GTK_INPUT_DEVICE_TYPE_ARK: |
| 266 |
in_device->config = NULL; |
| 267 |
break; |
| 268 |
case GTK_INPUT_DEVICE_TYPE_NONE : |
| 269 |
default: |
| 270 |
in_device->config = NULL; |
| 271 |
break; |
| 272 |
}; |
| 273 |
FCEU_printf ("Input Config: input_device selected: Device=[%s] Type=[%s]\n", (GTK_INPUT_DEVICE_NAMES[in_device->device]), GTK_INPUT_DEVICE_TYPE_NAMES[in_device->type]); |
| 274 |
gtk_label_set_text (GTK_LABEL(in_device->label), GTK_INPUT_DEVICE_TYPE_NAMES[in_device->type]); |
| 275 |
break; |
| 276 |
case GTK_INPUT_DEVICE_FC: |
| 277 |
switch (in_device->type) { |
| 278 |
case GTK_INPUT_FCDEVICE_TYPE_ARK: |
| 279 |
break; |
| 280 |
case GTK_INPUT_FCDEVICE_TYPE_SHADOW: |
| 281 |
break; |
| 282 |
case GTK_INPUT_FCDEVICE_TYPE_4PLAYER: |
| 283 |
break; |
| 284 |
case GTK_INPUT_FCDEVICE_TYPE_FKB: |
| 285 |
break; |
| 286 |
case GTK_INPUT_FCDEVICE_TYPE_HYPERSHOT: |
| 287 |
break; |
| 288 |
case GTK_INPUT_FCDEVICE_TYPE_MAHJONG: |
| 289 |
break; |
| 290 |
case GTK_INPUT_FCDEVICE_TYPE_QUIZKING: |
| 291 |
in_device->config = (ButtConfig *)&QuizKingButtons; |
| 292 |
break; |
| 293 |
case GTK_INPUT_FCDEVICE_TYPE_FTRAINERA: case GTK_INPUT_FCDEVICE_TYPE_FTRAINERB: |
| 294 |
in_device->config = (ButtConfig *)&FTrainerButtons; |
| 295 |
break; |
| 296 |
case GTK_INPUT_FCDEVICE_TYPE_OEKAKIDS: |
| 297 |
break; |
| 298 |
case GTK_INPUT_FCDEVICE_TYPE_BWORLD: |
| 299 |
break; |
| 300 |
case GTK_INPUT_FCDEVICE_TYPE_TOPRIDER: |
| 301 |
break; |
| 302 |
default: case GTK_INPUT_FCDEVICE_TYPE_NONE: |
| 303 |
in_device->config = NULL; |
| 304 |
break; |
| 305 |
}; |
| 306 |
FCEU_printf ("Input Config: input_device selected: Device=[%s] Type=[%s]\n", (GTK_INPUT_DEVICE_NAMES[in_device->device]), GTK_INPUT_FCDEVICE_TYPE_NAMES[in_device->type]); |
| 307 |
gtk_label_set_text (GTK_LABEL(in_device->label), GTK_INPUT_FCDEVICE_TYPE_NAMES[in_device->type]); |
| 308 |
break; |
| 309 |
default: |
| 310 |
in_device->config = NULL; |
| 311 |
FCEU_printf ("Input Config: input_device selected: Device=[%s] Type=[%s]\n", (GTK_INPUT_DEVICE_NAMES[in_device->device]), GTK_INPUT_UNKNOWN_TYPE_NAMES[in_device->type]); |
| 312 |
gtk_label_set_text (GTK_LABEL(in_device->label), GTK_INPUT_UNKNOWN_TYPE_NAMES[in_device->type]); |
| 313 |
break; |
| 314 |
}; |
| 315 |
|
| 316 |
} |
| 317 |
|
| 318 |
// This is called when the user selects a new device for an input port |
| 319 |
void input_device_selected_cb ( GTK_INPUT_DEVICE *in_device, |
| 320 |
guint callback_action, |
| 321 |
GtkWidget *widget) { |
| 322 |
if (!in_device) |
| 323 |
return; |
| 324 |
|
| 325 |
in_device->type = callback_action; |
| 326 |
|
| 327 |
InputType[in_device->device - 1] = callback_action; |
| 328 |
InitOtherInput(); |
| 329 |
|
| 330 |
GTKGUI_get_inputdev_config (in_device); |
| 331 |
|
| 332 |
} |
| 333 |
|
| 334 |
|
| 335 |
void GTKGUI_DoSubConfig (GtkButton* button, GTK_INPUT_DEVICE *indevice) { |
| 336 |
FCEU_printf ("GTKGUI_DoSubConfig requested for %s %s config=%i\n", indevice->portname, indevice->devicename, (int)indevice->config); |
| 337 |
if (indevice->device == GTK_INPUT_DEVICE_PORT1 || indevice->device == GTK_INPUT_DEVICE_PORT2) { |
| 338 |
switch (indevice->type) { |
| 339 |
case GTK_INPUT_DEVICE_TYPE_GP: |
| 340 |
GTKGUI_DoGPConfig (indevice); |
| 341 |
break; |
| 342 |
default: |
| 343 |
break; |
| 344 |
}; |
| 345 |
} |
| 346 |
else { |
| 347 |
switch (indevice->type) { |
| 348 |
|
| 349 |
default: |
| 350 |
break; |
| 351 |
}; |
| 352 |
} |
| 353 |
} |
| 354 |
|
| 355 |
|
| 356 |
void GTKGUI_JoyConfigDeleteEvent (void) { |
| 357 |
gtk_widget_destroy(inputcfgwin); |
| 358 |
} |