diff options
Diffstat (limited to 'apps/filetypes.c')
-rw-r--r-- | apps/filetypes.c | 56 |
1 files changed, 45 insertions, 11 deletions
diff --git a/apps/filetypes.c b/apps/filetypes.c index e992b86060..38ed7650e3 100644 --- a/apps/filetypes.c +++ b/apps/filetypes.c | |||
@@ -604,11 +604,11 @@ int filetype_get_icon(int attr) | |||
604 | return filetypes[index].icon; | 604 | return filetypes[index].icon; |
605 | } | 605 | } |
606 | 606 | ||
607 | char* filetype_get_plugin(int attr, char *buffer, size_t buffer_len) | 607 | static int filetype_get_plugin_index(int attr) |
608 | { | 608 | { |
609 | int index = find_attr(attr); | 609 | int index = find_attr(attr); |
610 | if (index < 0 || !buffer) | 610 | if (index < 0) |
611 | return NULL; | 611 | return -1; |
612 | struct file_type *ft_indexed = &filetypes[index]; | 612 | struct file_type *ft_indexed = &filetypes[index]; |
613 | 613 | ||
614 | /* attempt to find a suitable viewer by file extension */ | 614 | /* attempt to find a suitable viewer by file extension */ |
@@ -621,17 +621,27 @@ char* filetype_get_plugin(int attr, char *buffer, size_t buffer_len) | |||
621 | ft = &filetypes[i]; | 621 | ft = &filetypes[i]; |
622 | if (ft->plugin == NULL || ft->extension == NULL) | 622 | if (ft->plugin == NULL || ft->extension == NULL) |
623 | continue; | 623 | continue; |
624 | else if (strcmp(ft->extension, ft_indexed->extension) == 0) | 624 | else if (ft->plugin != NULL && |
625 | strcmp(ft->extension, ft_indexed->extension) == 0) | ||
625 | { | 626 | { |
626 | /*splashf(HZ*3, "Found %d %s %s", i, ft->extension, ft->plugin);*/ | 627 | /*splashf(HZ*3, "Found %d %s %s", i, ft->extension, ft->plugin);*/ |
627 | ft_indexed = ft; | 628 | return i; |
628 | break; | ||
629 | } | 629 | } |
630 | } | 630 | } |
631 | } | 631 | } |
632 | if (ft_indexed->plugin == NULL) | 632 | if (ft_indexed->plugin == NULL) |
633 | index = -1; | ||
634 | return index; /* Not Found */ | ||
635 | } | ||
636 | |||
637 | char* filetype_get_plugin(int attr, char *buffer, size_t buffer_len) | ||
638 | { | ||
639 | int index = filetype_get_plugin_index(attr); | ||
640 | if (index < 0 || !buffer) | ||
633 | return NULL; | 641 | return NULL; |
634 | 642 | ||
643 | struct file_type *ft_indexed = &filetypes[index]; | ||
644 | |||
635 | snprintf(buffer, buffer_len, "%s/%s." ROCK_EXTENSION, | 645 | snprintf(buffer, buffer_len, "%s/%s." ROCK_EXTENSION, |
636 | PLUGIN_DIR, ft_indexed->plugin); | 646 | PLUGIN_DIR, ft_indexed->plugin); |
637 | return buffer; | 647 | return buffer; |
@@ -674,24 +684,48 @@ static int openwith_get_talk(int selected_item, void * data) | |||
674 | return 0; | 684 | return 0; |
675 | } | 685 | } |
676 | 686 | ||
677 | int filetype_list_viewers(const char* current_file) | 687 | char* filetype_get_viewer(char *buffer, size_t buffer_len, const char* current_file) |
678 | { | 688 | { |
689 | int attr = filetype_get_attr(current_file); | ||
690 | |||
679 | struct simplelist_info info; | 691 | struct simplelist_info info; |
680 | simplelist_info_init(&info, str(LANG_ONPLAY_OPEN_WITH), viewer_count, NULL); | 692 | simplelist_info_init(&info, str(LANG_ONPLAY_OPEN_WITH), viewer_count, NULL); |
693 | |||
694 | int default_index = filetype_get_plugin_index(attr); | ||
695 | |||
696 | if (default_index >= 0) | ||
697 | { | ||
698 | for (int i = 0; i < viewer_count; i++) | ||
699 | if (viewers[i] == default_index) | ||
700 | { | ||
701 | info.selection = i; | ||
702 | break; | ||
703 | } | ||
704 | } | ||
705 | |||
681 | info.get_name = openwith_get_name; | 706 | info.get_name = openwith_get_name; |
682 | info.get_icon = global_settings.show_icons?openwith_get_icon:NULL; | 707 | info.get_icon = global_settings.show_icons?openwith_get_icon:NULL; |
683 | info.get_talk = openwith_get_talk; | 708 | info.get_talk = openwith_get_talk; |
684 | 709 | ||
685 | int ret = simplelist_show_list(&info); | 710 | simplelist_show_list(&info); |
686 | 711 | ||
687 | if (info.selection >= 0) /* run user selected viewer */ | 712 | if (info.selection >= 0) /* run user selected viewer */ |
688 | { | 713 | { |
689 | char plugin[MAX_PATH]; | ||
690 | int i = viewers[info.selection]; | 714 | int i = viewers[info.selection]; |
691 | snprintf(plugin, MAX_PATH, "%s/%s." ROCK_EXTENSION, | 715 | snprintf(buffer, buffer_len, "%s/%s." ROCK_EXTENSION, |
692 | PLUGIN_DIR, filetypes[i].plugin); | 716 | PLUGIN_DIR, filetypes[i].plugin); |
693 | ret = plugin_load(plugin, current_file); | 717 | return buffer; |
694 | } | 718 | } |
719 | return NULL; | ||
720 | |||
721 | } | ||
722 | |||
723 | int filetype_list_viewers(const char* current_file) | ||
724 | { | ||
725 | int ret = PLUGIN_ERROR; | ||
726 | char plugin[MAX_PATH]; | ||
727 | if (filetype_get_viewer(plugin, sizeof(plugin), current_file) != NULL) | ||
728 | ret = plugin_load(plugin, current_file); | ||
695 | return ret; | 729 | return ret; |
696 | } | 730 | } |
697 | 731 | ||