4 * GD-Rom list manager - maintains the list of recently accessed images and
5 * available devices for the UI + config.
7 * Copyright (c) 2005 Nathan Keynes.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
22 #include <glib/gstrfuncs.h>
25 #include "gdrom/gdrom.h"
30 #define MAX_RECENT_ITEMS 5
32 #define FIRST_RECENT_INDEX (gdrom_device_count+2)
34 DEFINE_HOOK(gdrom_list_change_hook, gdrom_list_change_hook_t);
36 static GList *gdrom_device_list = NULL;
37 static GList *gdrom_recent_list = NULL;
38 static unsigned int gdrom_device_count = 0, gdrom_recent_count = 0;
40 gint gdrom_list_find( const gchar *name )
45 for( ptr = gdrom_device_list; ptr != NULL; ptr = g_list_next(ptr) ) {
46 gdrom_device_t device = (gdrom_device_t)ptr->data;
48 if( strcmp(device->name, name) == 0 ) {
53 for( ptr = gdrom_recent_list; ptr != NULL; ptr = g_list_next(ptr) ) {
54 gchar *file = (gchar *)ptr->data;
56 if( strcmp(file, name) == 0 ) {
64 * Update the recent list in the lxdream config (but does not save)
66 void gdrom_list_update_config()
70 for( ptr = gdrom_recent_list; ptr != NULL; ptr = g_list_next(ptr) ) {
71 size += strlen( (gchar *)ptr->data ) + 1;
74 strcpy( buf, (gchar *)gdrom_recent_list->data );
75 for( ptr = g_list_next(gdrom_recent_list); ptr != NULL; ptr = g_list_next(ptr) ) {
77 strcat( buf, (gchar *)ptr->data );
79 lxdream_set_global_config_value( CONFIG_RECENT, buf );
83 void gdrom_list_add_recent_item( const gchar *name )
85 gdrom_recent_list = g_list_prepend( gdrom_recent_list, g_strdup(name) );
86 if( g_list_length(gdrom_recent_list) > MAX_RECENT_ITEMS ) {
87 GList *ptr = g_list_nth( gdrom_recent_list, MAX_RECENT_ITEMS );
89 gdrom_recent_list = g_list_remove( gdrom_recent_list, ptr->data );
91 gdrom_recent_count ++;
93 gdrom_list_update_config();
96 void gdrom_list_move_to_front( const gchar *name )
99 for( ptr = gdrom_recent_list; ptr != NULL; ptr = g_list_next(ptr) ) {
100 gchar *file = (gchar *)ptr->data;
101 if( strcmp(file, name) == 0 ) {
102 gdrom_recent_list = g_list_delete_link( gdrom_recent_list, ptr );
103 gdrom_recent_list = g_list_prepend( gdrom_recent_list, file );
104 gdrom_list_update_config();
111 * Disc-changed callback from the GD-Rom driver. Updates the list accordingly.
113 gboolean gdrom_list_disc_changed( gdrom_disc_t disc, const gchar *disc_name, void *user_data )
115 gboolean list_changed = FALSE;
118 posn = gdrom_list_find( disc_name );
120 gdrom_list_add_recent_item( disc_name );
121 posn = FIRST_RECENT_INDEX;
123 } else if( posn > FIRST_RECENT_INDEX ) {
124 gdrom_list_move_to_front( disc_name );
125 posn = FIRST_RECENT_INDEX;
130 lxdream_set_global_config_value( CONFIG_GDROM, disc_name );
131 lxdream_save_config();
133 CALL_HOOKS( gdrom_list_change_hook, list_changed, posn );
138 * Drives-changed callback from the host CD-Rom drivers. Probably not likely to
139 * happen too often unless you're adding/removing external drives...
141 void gdrom_list_drives_changed( GList *device_list )
145 /************ Public interface ***********/
147 void gdrom_list_init()
149 const gchar *recent = lxdream_get_config_value( CONFIG_RECENT );
150 register_gdrom_disc_change_hook( gdrom_list_disc_changed, NULL );
151 gdrom_device_list = cdrom_get_native_devices();
152 if( recent != NULL ) {
153 gchar **list = g_strsplit(recent, ":", MAX_RECENT_ITEMS);
155 for( i=0; list[i] != NULL; i++ ) {
156 gdrom_recent_list = g_list_append( gdrom_recent_list, g_strdup(list[i]) );
160 gdrom_device_count = g_list_length(gdrom_device_list);
161 gdrom_recent_count = g_list_length(gdrom_recent_list);
163 // Run the hooks in case anyone registered before the list was initialized
164 CALL_HOOKS( gdrom_list_change_hook, TRUE, gdrom_list_get_selection() );
167 gboolean gdrom_list_set_selection( int posn )
169 if( posn == 0 ) { // Always 'Empty'
170 gdrom_unmount_disc();
174 if( posn <= gdrom_device_count ) {
175 gdrom_device_t device = g_list_nth_data(gdrom_device_list, posn-1);
176 return gdrom_mount_image(device->name);
179 posn -= FIRST_RECENT_INDEX;
180 if( posn >= 0 && posn < gdrom_recent_count ) {
181 gchar *entry = g_list_nth_data(gdrom_recent_list, posn);
182 return gdrom_mount_image(entry);
188 gint gdrom_list_get_selection( )
190 const char *name = gdrom_get_current_disc_name();
194 return gdrom_list_find(name);
198 int gdrom_list_size()
200 return gdrom_device_count + gdrom_recent_count + 2;
203 const gchar *gdrom_list_get_display_name( int posn )
209 if( posn <= gdrom_device_count ) {
210 gdrom_device_t device = g_list_nth_data(gdrom_device_list, posn-1);
211 return device->device_name;
214 if( posn == gdrom_device_count + 1) {
218 if( posn < 0 || posn > gdrom_list_size() ) {
222 gchar *entry = g_list_nth_data(gdrom_recent_list, posn-FIRST_RECENT_INDEX);
223 return basename(entry);
226 const gchar *gdrom_list_get_filename( int posn )
232 if( posn <= gdrom_device_count ) {
233 gdrom_device_t device = g_list_nth_data(gdrom_device_list, posn-1);
237 if( posn == gdrom_device_count + 1) {
241 if( posn < 0 || posn > gdrom_list_size() ) {
245 return g_list_nth_data(gdrom_recent_list, posn-FIRST_RECENT_INDEX);
.