Enlightenment CVS committal Author : moom16 Project : e17 Module : apps/eclair
Dir : e17/apps/eclair/src Modified Files: eclair.c eclair_args.c eclair_callbacks.c eclair_callbacks.h eclair_config.c eclair_cover.c eclair_cover.h eclair_playlist.c eclair_playlist.h eclair_private.h eclair_subtitles.c eclair_utils.c eclair_utils.h Added Files: .cvsignore Log Message: * Add .cvsignore files * Drop files on playlist now add the files to the playlist * Drop files on the cover will change the cover of the file/album (still need fixes) * Modify the theme to support drag and drop * Can change the theme with the -t option * We can also now play uris (e.g. dvd://) * Add also a lot of bugs ;) * Update TODO file =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- eclair.c 7 May 2005 14:07:32 -0000 1.12 +++ eclair.c 7 May 2005 20:58:58 -0000 1.13 @@ -2,6 +2,7 @@ #include "../config.h" #include <Ecore.h> #include <Ecore_X.h> +#include <Ecore_File.h> #include <Ecore_Evas.h> #include <Edje.h> #include <Emotion.h> @@ -35,6 +36,7 @@ return 0; ecore_init(); + ecore_file_init(); ecore_evas_init(); edje_init(); gtk_init(argc, &argv); @@ -43,7 +45,6 @@ eclair->video_object = NULL; eclair->black_background = NULL; eclair->subtitles_object = NULL; - eclair->gui_window = NULL; eclair->gui_object = NULL; eclair->gui_draggies = NULL; @@ -59,6 +60,8 @@ eclair->file_chooser_th_created = 0; eclair->video_engine = ECLAIR_SOFTWARE; eclair->gui_engine = ECLAIR_SOFTWARE; + eclair->gui_theme_file = strdup(PACKAGE_DATA_DIR "/themes/default.edj"); + eclair->gui_drop_object = ECLAIR_DROP_NONE; if (!eclair_args_parse(eclair, *argc, argv, &filenames)) return 0; @@ -73,7 +76,7 @@ eclair_update_current_file_info(eclair); for (l = filenames; l; l = l->next) - eclair_playlist_add_media_file(&eclair->playlist, (char *)l->data); + eclair_playlist_add_uri(&eclair->playlist, (char *)l->data); evas_list_free(filenames); edje_object_part_drag_value_set(eclair->gui_object, "volume_bar_drag", 1.0, 0.0); @@ -94,12 +97,10 @@ eclair_cover_shutdown(&eclair->cover_manager); eclair_playlist_empty(&eclair->playlist); eclair_config_shutdown(&eclair->config); + free(eclair->gui_theme_file); } ecore_main_loop_quit(); - - edje_shutdown(); - ecore_evas_shutdown(); } //Update text objects, progress bar... @@ -295,7 +296,7 @@ { filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(eclair->file_chooser_widget)); for (l = filenames; l; l = l->next) - eclair_playlist_add_media_file(&eclair->playlist, (char *)l->data); + eclair_playlist_add_uri(&eclair->playlist, (char *)l->data); g_slist_foreach(filenames, (GFunc)g_free, NULL); g_slist_free(filenames); @@ -525,7 +526,7 @@ evas = ecore_evas_get(eclair->gui_window); eclair->gui_object = edje_object_add(evas); - edje_object_file_set(eclair->gui_object, PACKAGE_DATA_DIR "/themes/default.edj", "eclair_body"); + edje_object_file_set(eclair->gui_object, eclair->gui_theme_file, "eclair_body"); edje_object_size_min_get(eclair->gui_object, &gui_width, &gui_height); evas_object_resize(eclair->gui_object, (int)gui_width, (int)gui_height); evas_object_show(eclair->gui_object); @@ -654,7 +655,6 @@ return NULL; } - //Handle segvs static void _eclair_sig_pregest() { @@ -693,5 +693,10 @@ ecore_main_loop_begin(); + edje_shutdown(); + ecore_file_shutdown(); + ecore_evas_shutdown(); + ecore_shutdown(); + return 0; } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_args.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- eclair_args.c 7 May 2005 14:07:32 -0000 1.3 +++ eclair_args.c 7 May 2005 20:58:58 -0000 1.4 @@ -17,6 +17,9 @@ { NULL, 0, NULL, 0 } }; + if (!eclair) + return 0; + while ((c = getopt_long(argc, argv, "ht:g:v:", long_options, NULL)) != -1) { switch (c) @@ -28,8 +31,8 @@ return 0; break; case 't': - //TODO - fprintf(stderr, "Not yet implemented...\n"); + free(eclair->gui_theme_file); + eclair->gui_theme_file = strdup(optarg); break; case 'g': if (strcmp(optarg, "software") == 0) =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_callbacks.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- eclair_callbacks.c 7 May 2005 12:42:17 -0000 1.9 +++ eclair_callbacks.c 7 May 2005 20:58:58 -0000 1.10 @@ -9,6 +9,7 @@ #include <pthread.h> #include "eclair.h" #include "eclair_playlist.h" +#include "eclair_cover.h" //Called when eclair is closed int eclair_exit_cb(void *data, int type, void *event) @@ -325,7 +326,6 @@ { Evas *evas; Evas_Coord gui_window_x, gui_window_y, x, y; - Evas_Object *top_object; Ecore_X_Rectangle rect; Ecore_X_Event_Xdnd_Position *ev = (Ecore_X_Event_Xdnd_Position *)event; Eclair *eclair = (Eclair *)data; @@ -337,54 +337,77 @@ ecore_evas_geometry_get(eclair->gui_window, &gui_window_x, &gui_window_y, NULL, NULL); x = ev->position.x - gui_window_x; y = ev->position.y - gui_window_y; - top_object = evas_object_top_at_xy_get(evas, x, y, 1, 1); - if (top_object && - (top_object == eclair->gui_cover || top_object == eclair->gui_previous_cover || top_object == eclair->playlist_container)) - { - evas_object_geometry_get(top_object, &rect.x, &rect.y, &rect.width, &rect.height); - rect.x += gui_window_x; - rect.y += gui_window_y; - ecore_x_dnd_send_status(1, 1, rect, ECORE_X_DND_ACTION_PRIVATE); - return 1; + + if (eclair->playlist_container && evas_object_visible_get(eclair->playlist_container)) + { + evas_object_geometry_get(eclair->playlist_container, &rect.x, &rect.y, &rect.width, &rect.height); + if (x >= rect.x && x <= (rect.x + rect.width) && y >= rect.y && y <= (rect.y + rect.height)) + { + rect.x += gui_window_x; + rect.y += gui_window_y; + ecore_x_dnd_send_status(1, 1, rect, ECORE_X_DND_ACTION_PRIVATE); + eclair->gui_drop_object = ECLAIR_DROP_PLAYLIST; + return 1; + } } + if (eclair->gui_cover && evas_object_visible_get(eclair->gui_cover)) + { + evas_object_geometry_get(eclair->gui_cover, &rect.x, &rect.y, &rect.width, &rect.height); + if (x >= rect.x && x <= (rect.x + rect.width) && y >= rect.y && y <= (rect.y + rect.height)) + { + rect.x += gui_window_x; + rect.y += gui_window_y; + ecore_x_dnd_send_status(1, 1, rect, ECORE_X_DND_ACTION_PRIVATE); + eclair->gui_drop_object = ECLAIR_DROP_COVER; + return 1; + } + } ecore_evas_geometry_get(eclair->gui_window, &rect.x, &rect.y, &rect.width, &rect.height); rect.x += gui_window_x; rect.y += gui_window_y; ecore_x_dnd_send_status(0, 1, rect, ECORE_X_DND_ACTION_PRIVATE); + eclair->gui_drop_object = ECLAIR_DROP_NONE; return 1; } -int eclair_gui_dnd_selection_cb(void *data, int type, void *event) +//Called when an object is dropped on the gui +int eclair_gui_dnd_drop_cb(void *data, int type, void *event) { Eclair *eclair = (Eclair *)data; - Ecore_X_Event_Selection_Notify *ev = (Ecore_X_Event_Selection_Notify *)event; - Ecore_X_Selection_Data_Files *files; - int i; - - if (!eclair || ev->selection != ECORE_X_SELECTION_XDND) - return 1; - files = ev->data; - for (i = 0; i < files->num_files; i++) - { - printf("%s\n", files->files[i]); - } - - ecore_x_dnd_send_finished(); + if (!eclair) + return 1; + ecore_x_selection_xdnd_request(eclair->gui_x_window, "text/uri-list"); return 1; } -//Called when an object is dropped on the gui -int eclair_gui_dnd_drop_cb(void *data, int type, void *event) +//Treat the files dropped +int eclair_gui_dnd_selection_cb(void *data, int type, void *event) { + Ecore_X_Event_Selection_Notify *ev = (Ecore_X_Event_Selection_Notify *)event; Eclair *eclair = (Eclair *)data; + Ecore_X_Selection_Data_Files *files; + int i; - if (!eclair) + if (!eclair || !eclair->gui_window || eclair->gui_drop_object == ECLAIR_DROP_NONE + || ev->selection != ECORE_X_SELECTION_XDND || !(files = ev->data) || files->num_files <= 0) + { + ecore_x_dnd_send_finished(); return 1; + } + + if (eclair->gui_drop_object == ECLAIR_DROP_PLAYLIST) + { + for (i = 0; i < files->num_files; i++) + eclair_playlist_add_uri(&eclair->playlist, files->files[i]); + } + else if (eclair->gui_drop_object == ECLAIR_DROP_COVER) + eclair_cover_current_set(&eclair->cover_manager, files->files[0]); + + ecore_x_dnd_send_finished(); - ecore_x_selection_xdnd_request(eclair->gui_x_window, "text/uri-list"); return 1; } =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_callbacks.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- eclair_callbacks.h 7 May 2005 12:42:17 -0000 1.5 +++ eclair_callbacks.h 7 May 2005 20:58:59 -0000 1.6 @@ -27,8 +27,8 @@ void eclair_gui_playlist_container_wheel_cb(void *data, Evas *evas, Evas_Object *playlist_container, void *event_info); void eclair_gui_playlist_scroll_cb(void *data, Evas_Object *edje_object, const char *emission, const char *source); int eclair_gui_dnd_position_cb(void *data, int type, void *event); -int eclair_gui_dnd_selection_cb(void *data, int type, void *event); int eclair_gui_dnd_drop_cb(void *data, int type, void *event); +int eclair_gui_dnd_selection_cb(void *data, int type, void *event); void eclair_gui_message_cb(void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_config.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- eclair_config.c 30 Apr 2005 12:11:16 -0000 1.3 +++ eclair_config.c 7 May 2005 20:58:59 -0000 1.4 @@ -1,5 +1,7 @@ #include "eclair_config.h" -#include <stdlib.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <stdio.h> Evas_Bool eclair_config_init(Eclair_Config *config) { @@ -17,7 +19,7 @@ mkdir(config->config_dir_path, 0755); sprintf(config->covers_dir_path, "%scovers/", config->config_dir_path); - mkdir(config->covers_dir_path, 0755); + mkdir(config->config_dir_path, 0755); sprintf(config->config_file_path, "%seclair.cfg", config->config_dir_path); config->config_file = fopen(config->config_file_path, "a+t"); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_cover.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -3 -r1.9 -r1.10 --- eclair_cover.c 7 May 2005 12:42:17 -0000 1.9 +++ eclair_cover.c 7 May 2005 20:58:59 -0000 1.10 @@ -8,7 +8,9 @@ #include <netdb.h> #include <libxml/parser.h> #include <libxml/tree.h> +#include <Ecore_File.h> #include "eclair.h" +#include "eclair_playlist.h" #include "eclair_media_file.h" #include "eclair_utils.h" @@ -662,3 +664,52 @@ new_album->album = strdup(album); *list = evas_list_prepend(*list, new_album); } + +//Set the cover of the file +void eclair_cover_current_set(Eclair_Cover_Manager *cover_manager, const char *uri) +{ + char *clean_uri, *cover_path, *new_path; + Eclair_Media_File *current_file; + + if (!cover_manager || !cover_manager->eclair || !uri) + return; + + if (!(current_file = eclair_playlist_current_media_file(&cover_manager->eclair->playlist))) + return; + + if (strstr(uri, "://")) + { + if (!(clean_uri = eclair_utils_remove_uri_special_chars(uri))) + return; + + if ((strlen(uri) <= 7) || (strncmp(uri, "file://", 7) != 0)) + { + free(clean_uri); + return; + } + cover_path = strdup(&clean_uri[7]); + free(clean_uri); + } + else + cover_path = strdup(uri); + + //TODO: extract extension + if (!(new_path = _eclair_cover_build_path_from_artist_album(cover_manager, current_file->artist, current_file->album, "jpg"))) + { + //TODO: + //if (!(new_path = _eclair_cover_build_path_from_filepath(cover_manager))) + free(cover_path); + free(new_path); + return; + } + if (!ecore_file_cp(cover_path, new_path)) + { + free(cover_path); + free(new_path); + return; + } + + free(cover_path); + current_file->cover_path = new_path; + eclair_update_current_file_info(cover_manager->eclair); +} =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_cover.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- eclair_cover.h 3 May 2005 20:36:33 -0000 1.4 +++ eclair_cover.h 7 May 2005 20:58:59 -0000 1.5 @@ -9,5 +9,6 @@ char *eclair_cover_file_get(Eclair_Cover_Manager *cover_manager, const char *artist, const char *album, const char *file_path); char *eclair_cover_file_get_from_local(Eclair_Cover_Manager *cover_manager, const char *artist, const char *album, const char *file_path); char *eclair_cover_file_get_from_amazon(Eclair_Cover_Manager *cover_manager, const char *artist, const char *album); +void eclair_cover_current_set(Eclair_Cover_Manager *cover_manager, const char *uri); #endif =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_playlist.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- eclair_playlist.c 4 May 2005 21:36:50 -0000 1.5 +++ eclair_playlist.c 7 May 2005 20:58:59 -0000 1.6 @@ -67,17 +67,33 @@ return (Eclair_Media_File *)evas_list_data(evas_list_next(playlist->current)); } -//Add a new media file to the playlist -Eclair_Media_File *eclair_playlist_add_media_file(Eclair_Playlist *playlist, char *path) +Eclair_Media_File *eclair_playlist_add_uri(Eclair_Playlist *playlist, char *uri) { Eclair_Media_File *new_media_file; Evas_Coord min_height; Eclair *eclair; + char *clean_uri; - if (!playlist || !path) + if (!playlist || !uri) return NULL; + new_media_file = eclair_media_file_new(); - new_media_file->path = strdup(path); + + if (strstr(uri, "://")) + { + if (!(clean_uri = eclair_utils_remove_uri_special_chars(uri))) + return NULL; + + if ((strlen(clean_uri) <= 7) || (strncmp(clean_uri, "file://", 7) != 0)) + new_media_file->path = clean_uri; + else + { + new_media_file->path = strdup(&clean_uri[7]); + free(clean_uri); + } + } + else + new_media_file->path = strdup(uri); if ((eclair = playlist->eclair)) { @@ -92,14 +108,15 @@ eclair->playlist_entry_height = (int)min_height; } evas_object_resize(new_media_file->playlist_entry, 1, eclair->playlist_entry_height); - edje_object_part_text_set(new_media_file->playlist_entry, "playlist_entry_name", eclair_utils_path_to_filename(path)); + edje_object_part_text_set(new_media_file->playlist_entry, "playlist_entry_name", eclair_utils_path_to_filename(new_media_file->path)); edje_object_part_text_set(new_media_file->playlist_entry, "playlist_entry_length", ""); edje_object_signal_callback_add(new_media_file->playlist_entry, "eclair_play_entry", "*", eclair_gui_play_entry_cb, eclair); esmart_container_element_append(eclair->playlist_container, new_media_file->playlist_entry); evas_object_show(new_media_file->playlist_entry); } - eclair_meta_tag_add_file_to_scan(&eclair->meta_tag_manager, new_media_file); + if (!strstr(new_media_file->path, "://")) + eclair_meta_tag_add_file_to_scan(&eclair->meta_tag_manager, new_media_file); } playlist->playlist = evas_list_append(playlist->playlist, new_media_file); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_playlist.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- eclair_playlist.h 30 Apr 2005 12:11:16 -0000 1.3 +++ eclair_playlist.h 7 May 2005 20:58:59 -0000 1.4 @@ -10,7 +10,7 @@ Eclair_Media_File *eclair_playlist_prev_media_file(Eclair_Playlist *playlist); Eclair_Media_File *eclair_playlist_next_media_file(Eclair_Playlist *playlist); -Eclair_Media_File *eclair_playlist_add_media_file(Eclair_Playlist *playlist, char *filename); +Eclair_Media_File *eclair_playlist_add_uri(Eclair_Playlist *playlist, char *uri); void eclair_playlist_remove_media_file(Eclair_Playlist *playlist, Eclair_Media_File *media_file); Evas_List *eclair_playlist_remove_media_file_list(Eclair_Playlist *playlist, Evas_List *list); =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_private.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -3 -r1.10 -r1.11 --- eclair_private.h 7 May 2005 12:42:17 -0000 1.10 +++ eclair_private.h 7 May 2005 20:58:59 -0000 1.11 @@ -20,6 +20,7 @@ typedef struct _Eclair_Meta_Tag_Manager Eclair_Meta_Tag_Manager; typedef struct _Eclair_Cover_Manager Eclair_Cover_Manager; typedef struct _Eclair_Config Eclair_Config; +typedef enum _Eclair_Drop_Object Eclair_Drop_Object; struct _Eclair_Config { @@ -108,6 +109,13 @@ Evas_Bool enable; }; +enum _Eclair_Drop_Object +{ + ECLAIR_DROP_NONE = 0, + ECLAIR_DROP_COVER, + ECLAIR_DROP_PLAYLIST +}; + struct _Eclair { //Video related vars @@ -130,6 +138,8 @@ Evas_Bool use_progress_bar_drag_for_time; Evas_Bool dont_update_progressbar; Eclair_Engine gui_engine; + char *gui_theme_file; + Eclair_Drop_Object gui_drop_object; //File chooser related vars GtkWidget *file_chooser_widget; =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_subtitles.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- eclair_subtitles.c 30 Apr 2005 12:11:16 -0000 1.2 +++ eclair_subtitles.c 7 May 2005 20:58:59 -0000 1.3 @@ -47,7 +47,7 @@ for (l = subtitles->subtitles; l; l = l->next) { - if (!(subtitle = (Eclair_Subtitle *)evas_list_data(l))) + if (!(subtitle = (Eclair_Subtitle *)l->data)) continue; if (subtitle->start <= current_time && subtitle->end >= current_time) =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_utils.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- eclair_utils.c 30 Apr 2005 12:11:16 -0000 1.2 +++ eclair_utils.c 7 May 2005 20:58:59 -0000 1.3 @@ -30,6 +30,43 @@ return path; } +//Remove uri special chars (e.g. "%20" -> ' ') +//The returned string has to be freed +char *eclair_utils_remove_uri_special_chars(const char *uri) +{ + int uri_length; + char *clean_uri; + int i, j; + char hex_code[3]; + int hex_to_char; + + if (!uri) + return NULL; + + uri_length = strlen(uri); + clean_uri = (char *)malloc(strlen(uri) + 1); + for (i = 0, j = 0; i < uri_length; i++, j++) + { + if ((uri[i] == '%') && (i < (uri_length - 2))) + { + strncpy(hex_code, &uri[i + 1], 2); + hex_code[2] = 0; + if (sscanf(hex_code, "%x", &hex_to_char) == 1) + { + clean_uri[j] = hex_to_char; + i += 2; + } + else + clean_uri[j] = uri[i]; + } + else + clean_uri[j] = uri[i]; + } + clean_uri[j] = 0; + + return clean_uri; +} + //Return the string "artist - title" //NULL if the media file doesn't have tag //This string has to be freed =================================================================== RCS file: /cvsroot/enlightenment/e17/apps/eclair/src/eclair_utils.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- eclair_utils.h 30 Apr 2005 12:11:16 -0000 1.2 +++ eclair_utils.h 7 May 2005 20:58:59 -0000 1.3 @@ -5,6 +5,7 @@ void eclair_utils_second_to_string(double position, double length, char *string); const char *eclair_utils_path_to_filename(const char *path); +char *eclair_utils_remove_uri_special_chars(const char *uri); char *eclair_utils_mediafile_to_artist_title_string(const Eclair_Media_File *media_file); #endif ------------------------------------------------------- This SF.Net email is sponsored by: NEC IT Guy Games. Get your fingers limbered up and give it your best shot. 4 great events, 4 opportunities to win big! Highest score wins.NEC IT Guy Games. Play to win an NEC 61 plasma display. Visit http://www.necitguy.com/?r=20 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs