--- a/src/gui/ctrl_dlg.c Sun Oct 21 05:21:35 2007 +0000 +++ b/src/gui/ctrl_dlg.c Tue Oct 23 10:47:17 2007 +0000 @@ -1,5 +1,5 @@ /** - * $Id: ctrl_dlg.c,v 1.3 2007-10-21 05:21:35 nkeynes Exp $ + * $Id: ctrl_dlg.c,v 1.4 2007-10-23 10:47:17 nkeynes Exp $ * * Define the main (emu) GTK window, along with its menubars, * toolbars, etc. @@ -19,6 +19,7 @@ #include #include +#include #include "dream.h" #include "gui/gtkui.h" @@ -46,21 +47,78 @@ static struct maple_slot_data maple_data[MAX_DEVICES]; +static gboolean config_key_buttonpress( GtkWidget *widget, GdkEventButton *event, gpointer user_data ) +{ + gboolean keypress_mode = GPOINTER_TO_INT(g_object_get_data( G_OBJECT(widget), "keypress_mode")); + if( !keypress_mode ) { + gtk_entry_set_text( GTK_ENTRY(widget), "" ); + g_object_set_data( G_OBJECT(widget), "keypress_mode", GINT_TO_POINTER(TRUE) ); + } + return FALSE; +} + static gboolean config_key_keypress( GtkWidget *widget, GdkEventKey *event, gpointer user_data ) { - GdkKeymap *keymap = gdk_keymap_get_default(); - guint keyval; - - gdk_keymap_translate_keyboard_state( keymap, event->hardware_keycode, 0, 0, &keyval, - NULL, NULL, NULL ); - gtk_entry_set_text( GTK_ENTRY(widget), gdk_keyval_name(keyval) ); - return TRUE; + gboolean keypress_mode = GPOINTER_TO_INT(g_object_get_data( G_OBJECT(widget), "keypress_mode")); + if( keypress_mode ) { + if( event->keyval == GDK_Escape ) { + gtk_entry_set_text( GTK_ENTRY(widget), "" ); + g_object_set_data( G_OBJECT(widget), "keypress_mode", GINT_TO_POINTER(FALSE) ); + return TRUE; + } + GdkKeymap *keymap = gdk_keymap_get_default(); + guint keyval; + + gdk_keymap_translate_keyboard_state( keymap, event->hardware_keycode, 0, 0, &keyval, + NULL, NULL, NULL ); + gtk_entry_set_text( GTK_ENTRY(widget), gdk_keyval_name(keyval) ); + g_object_set_data( G_OBJECT(widget), "keypress_mode", GINT_TO_POINTER(FALSE) ); + return TRUE; + } else { + switch( event->keyval ) { + case GDK_Return: + case GDK_KP_Enter: + gtk_entry_set_text( GTK_ENTRY(widget), "" ); + g_object_set_data( G_OBJECT(widget), "keypress_mode", GINT_TO_POINTER(TRUE) ); + return TRUE; + case GDK_BackSpace: + case GDK_Delete: + gtk_entry_set_text( GTK_ENTRY(widget), "" ); + return TRUE; + } + return FALSE; + } + } static void controller_config_done( GtkWidget *panel, gboolean isOK ) { - - + if( isOK ) { + maple_device_t device = (maple_device_t)gtk_object_get_data( GTK_OBJECT(panel), "maple_device" ); + lxdream_config_entry_t conf = device->get_config(device); + int i; + for( i=0; conf[i].key != NULL; i++ ) { + char buf[64]; + GtkWidget *entry1, *entry2; + const gchar *key1, *key2; + snprintf( buf, sizeof(buf), "%s.1", conf[i].key ); + entry1 = GTK_WIDGET(g_object_get_qdata( G_OBJECT(panel), g_quark_from_string(buf))); + key1 = gtk_entry_get_text(GTK_ENTRY(entry1)); + snprintf( buf, sizeof(buf), "%s.2", conf[i].key ); + entry2 = GTK_WIDGET(g_object_get_qdata( G_OBJECT(panel), g_quark_from_string(buf))); + key2 = gtk_entry_get_text(GTK_ENTRY(entry2)); + if( key1 == NULL || key1[0] == '\0') { + lxdream_set_config_value( &conf[i], key2 ); + } else if( key2 == NULL || key2[0] == '\0') { + lxdream_set_config_value( &conf[i], key1 ); + } else { + char buf[64]; + snprintf( buf, sizeof(buf), "%s, %s", key1, key2 ); + lxdream_set_config_value( &conf[i], buf ); + } + } + } + } static void controller_device_configure( maple_device_t device ) @@ -70,8 +128,12 @@ for( count=0; conf[count].key != NULL; count++ ); GtkWidget *table = gtk_table_new( (count+1)>>1, 6, FALSE ); + GList *focus_chain = NULL; + gtk_object_set_data( GTK_OBJECT(table), "maple_device", device ); for( i=0; i= (count+1)>>1 ) { @@ -80,27 +142,42 @@ } gtk_table_attach( GTK_TABLE(table), gtk_label_new(conf[i].key), x, x+1, y, y+1, GTK_SHRINK, GTK_SHRINK, 0, 0 ); - gchar **parts = g_strsplit(conf[i].value,",",3); - text = gtk_entry_new(); gtk_entry_set_width_chars( GTK_ENTRY(text), 8 ); + gtk_entry_set_editable( GTK_ENTRY(text), FALSE ); g_signal_connect( text, "key_press_event", G_CALLBACK(config_key_keypress), NULL ); + g_signal_connect( text, "button_press_event", + G_CALLBACK(config_key_buttonpress), NULL ); + snprintf( buf, sizeof(buf), "%s.1", conf[i].key ); + g_object_set_data( G_OBJECT(text), "keypress_mode", GINT_TO_POINTER(FALSE) ); + g_object_set_qdata( G_OBJECT(table), g_quark_from_string(buf), text ); gtk_table_attach_defaults( GTK_TABLE(table), text, x+1, x+2, y, y+1); - + focus_chain = g_list_append( focus_chain, text ); text2 = gtk_entry_new(); gtk_entry_set_width_chars( GTK_ENTRY(text2), 8 ); + gtk_entry_set_editable( GTK_ENTRY(text2), FALSE ); g_signal_connect( text2, "key_press_event", G_CALLBACK(config_key_keypress), NULL ); + g_signal_connect( text2, "button_press_event", + G_CALLBACK(config_key_buttonpress), NULL ); + snprintf( buf, sizeof(buf), "%s.2", conf[i].key ); + g_object_set_data( G_OBJECT(text2), "keypress_mode", GINT_TO_POINTER(FALSE) ); + g_object_set_qdata( G_OBJECT(table), g_quark_from_string(buf), text2 ); gtk_table_attach_defaults( GTK_TABLE(table), text2, x+2, x+3, y, y+1); - if( parts[0] != NULL ) { - gtk_entry_set_text( GTK_ENTRY(text), g_strstrip(parts[0]) ); - if( parts[1] != NULL ) { - gtk_entry_set_text( GTK_ENTRY(text2), g_strstrip(parts[1]) ); + focus_chain = g_list_append( focus_chain, text2 ); + if( conf[i].value != NULL ) { + gchar **parts = g_strsplit(conf[i].value,",",3); + if( parts[0] != NULL ) { + gtk_entry_set_text( GTK_ENTRY(text), g_strstrip(parts[0]) ); + if( parts[1] != NULL ) { + gtk_entry_set_text( GTK_ENTRY(text2), g_strstrip(parts[1]) ); + } } + g_strfreev(parts); } - g_strfreev(parts); } + gtk_container_set_focus_chain( GTK_CONTAINER(table), focus_chain ); gtk_gui_run_property_dialog( "Controller Configuration", table, controller_config_done ); } @@ -112,6 +189,10 @@ int i; for( i=0; maple_device_config[i].name != NULL; i++ ) { if( strcmp(data->new_device->device_class->name, maple_device_config[i].name) == 0 ) { + if( data->new_device == data->old_device ) { + // Make a copy at this point if we haven't already + data->new_device = data->old_device->clone(data->old_device); + } maple_device_config[i].config_func(data->new_device); break; } @@ -149,31 +230,31 @@ return TRUE; } -void maple_commit_changes( ) +void maple_dialog_done( GtkWidget *panel, gboolean isOK ) { - int i; - for( i=0; idestroy(maple_data[i].new_device); } } } - lxdream_save_config(); -} -void maple_cancel_changes( ) -{ - int i; - for( i=0; idestroy(maple_data[i].new_device); - } - } } GtkWidget *maple_panel_new() @@ -217,12 +298,7 @@ return table; } -void maple_dialog_run( GtkWindow *parent ) +void maple_dialog_run( ) { - gint result = gtk_gui_run_property_dialog( "Controller Settings", maple_panel_new(), NULL ); - if( result == GTK_RESPONSE_ACCEPT ) { - maple_commit_changes(); - } else { - maple_cancel_changes(); - } + gtk_gui_run_property_dialog( "Controller Settings", maple_panel_new(), maple_dialog_done ); }