--- a/src/gtkui/gdrom_menu.c Thu May 29 11:00:26 2008 +0000 +++ b/src/gtkui/gdrom_menu.c Thu Jun 19 04:40:37 2008 +0000 @@ -26,173 +26,41 @@ #include "gdrom/gdrom.h" #include "gtkui/gtkui.h" -#define MAX_RECENT_ITEMS 5 +static gboolean gdrom_menu_adjusting = FALSE; -static GList *gdrom_menu_list = NULL; -static gboolean gdrom_menu_adjusting = FALSE; -static GList *gdrom_device_list = NULL; -static GList *gdrom_recent_list = NULL; - -void gdrom_menu_rebuild_all(); - - -gint gdrom_menu_find_item( const gchar *name ) -{ - gint posn = 0; - GList *ptr; - - for( ptr = gdrom_device_list; ptr != NULL; ptr = g_list_next(ptr) ) { - gchar *device = (gchar *)ptr->data; - posn++; - if( strcmp(device, name) == 0 ) { - return posn; - } - } - posn++; - for( ptr = gdrom_recent_list; ptr != NULL; ptr = g_list_next(ptr) ) { - gchar *file = (gchar *)ptr->data; - posn++; - if( strcmp(file, name) == 0 ) { - return posn; - } - } - return -1; -} - -gint gdrom_menu_add_recent_item( const gchar *name ) -{ - gdrom_recent_list = g_list_prepend( gdrom_recent_list, g_strdup(name) ); - if( g_list_length(gdrom_recent_list) > MAX_RECENT_ITEMS ) { - GList *ptr = g_list_nth( gdrom_recent_list, MAX_RECENT_ITEMS ); - g_free( ptr->data ); - gdrom_recent_list = g_list_remove( gdrom_recent_list, ptr->data ); - } - - GList *ptr; - int size = 0; - for( ptr = gdrom_recent_list; ptr != NULL; ptr = g_list_next(ptr) ) { - size += strlen( (gchar *)ptr->data ) + 1; - } - char buf[size]; - strcpy( buf, (gchar *)gdrom_recent_list->data ); - ptr = g_list_next(gdrom_recent_list); - while( ptr != NULL ) { - strcat( buf, ":" ); - strcat( buf, (gchar *)ptr->data ); - ptr = g_list_next(ptr); - } - lxdream_set_global_config_value( CONFIG_RECENT, buf ); - lxdream_save_config(); - - return g_list_length( gdrom_device_list ) + 2; // menu posn of new item -} - -void gdrom_menu_update_all() -{ - const gchar *disc_name = gdrom_get_current_disc_name(); - gint posn = 0; - GList *ptr; - - gdrom_menu_adjusting = TRUE; - - if( disc_name != NULL ) { - posn = gdrom_menu_find_item( disc_name ); - if( posn == -1 ) { - posn = gdrom_menu_add_recent_item( disc_name ); - gdrom_menu_rebuild_all(); - } - } - - for( ptr = gdrom_menu_list; ptr != NULL; ptr = g_list_next(ptr) ) { - GtkWidget *menu = GTK_WIDGET(ptr->data); - GList *children = gtk_container_get_children( GTK_CONTAINER(menu) ); - GList *item = g_list_nth( children, posn ); - assert( item != NULL ); - gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(item->data), TRUE ); - g_list_free(children); - } - - gdrom_menu_adjusting = FALSE; -} - -void gdrom_menu_empty_callback( GtkWidget *widget, gpointer user_data ) +static void gdrom_menu_open_image_callback( GtkWidget *widget, gpointer user_data ) { if( !gdrom_menu_adjusting ) { - gdrom_unmount_disc(); - lxdream_set_global_config_value( CONFIG_GDROM, NULL ); - lxdream_save_config(); + const gchar *dir = lxdream_get_config_value(CONFIG_DEFAULT_PATH); + open_file_dialog( _("Open..."), gdrom_mount_image, NULL, NULL, dir ); } } -void gdrom_menu_disc_changed( gdrom_disc_t disc, const gchar *name, void *user_data ) +void gdrom_menu_item_callback( GtkWidget *widget, gpointer user_data ) { if( !gdrom_menu_adjusting ) { - gdrom_menu_update_all(); - } -} - -gboolean gdrom_menu_open_file( const char *filename ) -{ - gboolean result = FALSE; - if( filename != NULL ) { - result = gdrom_mount_image(filename); - } - if( result ) { - lxdream_set_global_config_value( CONFIG_GDROM, filename ); - lxdream_save_config(); - } - return result; -} - -void gdrom_menu_open_image_callback( GtkWidget *widget, gpointer user_data ) -{ - if( !gdrom_menu_adjusting ) { - const gchar *dir = lxdream_get_config_value(CONFIG_DEFAULT_PATH); - open_file_dialog( _("Open..."), gdrom_menu_open_file, NULL, NULL, dir ); - } -} - - -void gdrom_menu_open_specified_callback( GtkWidget *widget, gpointer user_data ) -{ - if( !gdrom_menu_adjusting ) { - gdrom_menu_open_file( (gchar *)user_data ); + gdrom_list_set_selection( GPOINTER_TO_INT(user_data) ); } } void gdrom_menu_build( GtkWidget *menu ) { + unsigned int i, len; GSList *group = NULL; - GtkWidget *empty = gtk_radio_menu_item_new_with_label( group, _("Empty") ); - group = gtk_radio_menu_item_get_group( GTK_RADIO_MENU_ITEM(empty) ); - g_signal_connect_after( empty, "activate", G_CALLBACK(gdrom_menu_empty_callback), NULL ); - gtk_menu_shell_append( GTK_MENU_SHELL(menu), empty ); - GList *ptr; - for( ptr = gdrom_device_list; ptr != NULL; ptr = g_list_next(ptr) ) { - gchar *name = (gchar *)ptr->data; - GtkWidget *item = gtk_radio_menu_item_new_with_label( group, name); - gtk_widget_set_name( item, name ); - group = gtk_radio_menu_item_get_group( GTK_RADIO_MENU_ITEM(item) ); - g_signal_connect_after( item, "activate", G_CALLBACK(gdrom_menu_open_specified_callback), - name ); - gtk_menu_shell_append( GTK_MENU_SHELL(menu), item ); + len = gdrom_list_size(); + for( i=0; i < len; i++ ) { + const gchar *entry = gdrom_list_get_display_name(i); + if( entry[0] == '\0' ) { // Empty string = separator + gtk_menu_shell_append( GTK_MENU_SHELL(menu), gtk_separator_menu_item_new() ); + } else { + GtkWidget *item = gtk_radio_menu_item_new_with_label( group, entry ); + group = gtk_radio_menu_item_get_group( GTK_RADIO_MENU_ITEM(item) ); + g_signal_connect_after( item, "activate", G_CALLBACK(gdrom_menu_item_callback), GINT_TO_POINTER(i) ); + gtk_menu_shell_append( GTK_MENU_SHELL(menu), item ); + } } - if( gdrom_recent_list != NULL ) { - gtk_menu_shell_append( GTK_MENU_SHELL(menu), gtk_separator_menu_item_new() ); - for( ptr = gdrom_recent_list; ptr != NULL; ptr = g_list_next(ptr) ) { - gchar *path = (gchar *)ptr->data; - gchar *name = basename(path); - GtkWidget *item = gtk_radio_menu_item_new_with_label( group, name ); - gtk_widget_set_name( item, path ); - group = gtk_radio_menu_item_get_group( GTK_RADIO_MENU_ITEM(item) ); - g_signal_connect_after( item, "activate", G_CALLBACK(gdrom_menu_open_specified_callback), - path ); - gtk_menu_shell_append( GTK_MENU_SHELL(menu), item ); - - } - } gtk_menu_shell_append( GTK_MENU_SHELL(menu), gtk_separator_menu_item_new() ); GtkWidget *open = gtk_image_menu_item_new_with_label( _("Open image file...") ); g_signal_connect_after( open, "activate", G_CALLBACK(gdrom_menu_open_image_callback), NULL ); @@ -200,47 +68,45 @@ gtk_widget_show_all(menu); } +void gdrom_menu_rebuild( GtkWidget *menu ) +{ + GList *children = gtk_container_get_children( GTK_CONTAINER(menu) ); + GList *listptr; + for( listptr = children; listptr != NULL; listptr = g_list_next(listptr) ) { + gtk_widget_destroy( GTK_WIDGET(listptr->data) ); + } + g_list_free(children); + gdrom_menu_build(menu); +} + +gboolean gdrom_menu_update( gboolean list_changed, int selection, void *user_data ) +{ + gdrom_menu_adjusting = TRUE; + GtkWidget *menu = GTK_WIDGET(user_data); + + if( list_changed ) { + gdrom_menu_rebuild(menu); + } + + GList *children = gtk_container_get_children( GTK_CONTAINER(menu) ); + GList *item = g_list_nth( children, selection ); + assert( item != NULL ); + gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM(item->data), TRUE ); + g_list_free(children); + + gdrom_menu_adjusting = FALSE; + return TRUE; +} + GtkWidget *gdrom_menu_new() { GtkWidget *menu = gtk_menu_new(); gtk_menu_set_title( GTK_MENU(menu), _("GD-Rom Settings") ); gdrom_menu_build(menu); - - gdrom_menu_list = g_list_append(gdrom_menu_list, menu); + register_gdrom_list_change_hook(gdrom_menu_update, menu); + gdrom_menu_update( FALSE, gdrom_list_get_selection(), menu ); gtk_widget_show_all(menu); - gdrom_menu_update_all(); + return menu; } - -void gdrom_menu_rebuild_all() -{ - GList *ptr; - - for( ptr = gdrom_menu_list; ptr != NULL; ptr = g_list_next(ptr) ) { - GtkWidget *menu = GTK_WIDGET(ptr->data); - GList *children = gtk_container_get_children( GTK_CONTAINER(menu) ); - GList *listptr; - for( listptr = children; listptr != NULL; listptr = g_list_next(listptr) ) { - gtk_widget_destroy( GTK_WIDGET(listptr->data) ); - } - g_list_free(children); - gdrom_menu_build(menu); - } - gdrom_menu_update_all(); -} - -void gdrom_menu_init() -{ - const gchar *recent = lxdream_get_config_value( CONFIG_RECENT ); - register_gdrom_disc_change_hook( gdrom_menu_disc_changed, NULL ); - gdrom_device_list = gdrom_get_native_devices(); - if( recent != NULL ) { - gchar **list = g_strsplit(recent, ":", 5); - int i; - for( i=0; list[i] != NULL; i++ ) { - gdrom_recent_list = g_list_append( gdrom_recent_list, g_strdup(list[i]) ); - } - g_strfreev(list); - } -}