Mercurial > geeqie
comparison src/filelist.c @ 167:05bf5d364dba
fixed filelist refresh
author | nadvornik |
---|---|
date | Sat, 22 Dec 2007 20:33:09 +0000 |
parents | f8bd5d49eed8 |
children | 9a56e3d13e67 |
comparison
equal
deleted
inserted
replaced
166:4d14387b7bb7 | 167:05bf5d364dba |
---|---|
626 * file info struct | 626 * file info struct |
627 *----------------------------------------------------------------------------- | 627 *----------------------------------------------------------------------------- |
628 */ | 628 */ |
629 | 629 |
630 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source); | 630 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source); |
631 static void file_data_check_sidecars(FileData *fd); | |
632 FileData *file_data_disconnect_sidecar_file(FileData *target, FileData *sfd); | |
631 | 633 |
632 | 634 |
633 static void file_data_set_path(FileData *fd, const gchar *path) | 635 static void file_data_set_path(FileData *fd, const gchar *path) |
634 { | 636 { |
635 | 637 |
666 fd->extension = extension_from_path(fd->path); | 668 fd->extension = extension_from_path(fd->path); |
667 if (fd->extension == NULL) | 669 if (fd->extension == NULL) |
668 fd->extension = fd->name + strlen(fd->name); | 670 fd->extension = fd->name + strlen(fd->name); |
669 } | 671 } |
670 | 672 |
671 static void file_data_check_update(FileData *fd, struct stat *st) | 673 static void file_data_check_changed_files(FileData *fd, struct stat *st) |
672 { | 674 { |
675 GList *work; | |
673 if (fd->size != st->st_size || | 676 if (fd->size != st->st_size || |
674 fd->date != st->st_mtime) | 677 fd->date != st->st_mtime) |
675 { | 678 { |
676 fd->size = st->st_size; | 679 fd->size = st->st_size; |
677 fd->date = st->st_mtime; | 680 fd->date = st->st_mtime; |
678 if (fd->pixbuf) g_object_unref(fd->pixbuf); | 681 if (fd->pixbuf) g_object_unref(fd->pixbuf); |
679 fd->pixbuf = NULL; | 682 fd->pixbuf = NULL; |
680 } | 683 } |
681 } | 684 |
682 | 685 work = fd->sidecar_files; |
683 static void file_data_check_sidecars(FileData *fd); | 686 while (work) |
687 { | |
688 FileData *sfd = work->data; | |
689 struct stat st; | |
690 | |
691 if (!stat_utf8(sfd->path, &st)) | |
692 { | |
693 file_data_disconnect_sidecar_file(fd, sfd); | |
694 } | |
695 | |
696 file_data_check_changed_files(sfd, &st); | |
697 work = work->next; | |
698 } | |
699 } | |
700 | |
684 static GHashTable *file_data_pool = NULL; | 701 static GHashTable *file_data_pool = NULL; |
685 | 702 |
686 static FileData *file_data_new(const gchar *path_utf8, struct stat *st, gboolean check_sidecars) | 703 static FileData *file_data_new(const gchar *path_utf8, struct stat *st, gboolean check_sidecars) |
687 { | 704 { |
688 FileData *fd; | 705 FileData *fd; |
693 file_data_pool = g_hash_table_new (g_str_hash, g_str_equal); | 710 file_data_pool = g_hash_table_new (g_str_hash, g_str_equal); |
694 | 711 |
695 fd = g_hash_table_lookup(file_data_pool, path_utf8); | 712 fd = g_hash_table_lookup(file_data_pool, path_utf8); |
696 if (fd) | 713 if (fd) |
697 { | 714 { |
698 file_data_check_update(fd, st); | 715 file_data_check_changed_files(fd, st); |
699 printf("file_data_pool hit: '%s'\n", fd->path); | 716 printf("file_data_pool hit: '%s'\n", fd->path); |
700 return file_data_ref(fd); | 717 return file_data_ref(fd); |
701 } | 718 } |
702 | 719 |
703 fd = g_new0(FileData, 1); | 720 fd = g_new0(FileData, 1); |
792 if(!g_list_find(target->sidecar_files, sfd)) | 809 if(!g_list_find(target->sidecar_files, sfd)) |
793 target->sidecar_files = g_list_prepend(target->sidecar_files, sfd); | 810 target->sidecar_files = g_list_prepend(target->sidecar_files, sfd); |
794 return target; | 811 return target; |
795 } | 812 } |
796 | 813 |
814 | |
797 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source) | 815 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source) |
798 { | 816 { |
799 GList *work; | 817 GList *work; |
800 file_data_add_sidecar_file(target, source); | 818 file_data_add_sidecar_file(target, source); |
801 | 819 |
807 work = work->next; | 825 work = work->next; |
808 } | 826 } |
809 | 827 |
810 g_list_free(source->sidecar_files); | 828 g_list_free(source->sidecar_files); |
811 source->sidecar_files = NULL; | 829 source->sidecar_files = NULL; |
812 | 830 |
831 target->sidecar_files = filelist_sort(target->sidecar_files, SORT_NAME, TRUE); | |
813 return target; | 832 return target; |
814 } | 833 } |
834 | |
835 | |
815 | 836 |
816 FileData *file_data_ref(FileData *fd) | 837 FileData *file_data_ref(FileData *fd) |
817 { | 838 { |
818 if (fd == NULL) return NULL; | 839 if (fd == NULL) return NULL; |
819 | 840 |
881 parent->sidecar_files = NULL; | 902 parent->sidecar_files = NULL; |
882 | 903 |
883 file_data_free(parent); | 904 file_data_free(parent); |
884 | 905 |
885 } | 906 } |
907 } | |
908 | |
909 FileData *file_data_disconnect_sidecar_file(FileData *target, FileData *sfd) | |
910 { | |
911 sfd->parent = target; | |
912 g_assert(g_list_find(target->sidecar_files, sfd)); | |
913 | |
914 target->sidecar_files = g_list_remove(target->sidecar_files, sfd); | |
915 sfd->parent = NULL; | |
916 | |
917 if (sfd->ref == 0) { | |
918 file_data_free(sfd); | |
919 return NULL; | |
920 } | |
921 | |
922 return sfd; | |
886 } | 923 } |
887 | 924 |
888 /* compare name without extension */ | 925 /* compare name without extension */ |
889 gint file_data_compare_name_without_ext(FileData *fd1, FileData *fd2) | 926 gint file_data_compare_name_without_ext(FileData *fd1, FileData *fd2) |
890 { | 927 { |
1020 switch (filelist_sort_method) | 1057 switch (filelist_sort_method) |
1021 { | 1058 { |
1022 case SORT_SIZE: | 1059 case SORT_SIZE: |
1023 if (fa->size < fb->size) return -1; | 1060 if (fa->size < fb->size) return -1; |
1024 if (fa->size > fb->size) return 1; | 1061 if (fa->size > fb->size) return 1; |
1025 return 0; | 1062 return CASE_SORT(fa->name, fb->name); /* fall back to name */ |
1026 break; | 1063 break; |
1027 case SORT_TIME: | 1064 case SORT_TIME: |
1028 if (fa->date < fb->date) return -1; | 1065 if (fa->date < fb->date) return -1; |
1029 if (fa->date > fb->date) return 1; | 1066 if (fa->date > fb->date) return 1; |
1030 return 0; | 1067 return CASE_SORT(fa->name, fb->name); /* fall back to name */ |
1031 break; | 1068 break; |
1032 #ifdef HAVE_STRVERSCMP | 1069 #ifdef HAVE_STRVERSCMP |
1033 case SORT_NUMBER: | 1070 case SORT_NUMBER: |
1034 return strverscmp(fa->name, fb->name); | 1071 return strverscmp(fa->name, fb->name); |
1035 break; | 1072 break; |
1037 case SORT_NAME: | 1074 case SORT_NAME: |
1038 default: | 1075 default: |
1039 return CASE_SORT(fa->name, fb->name); | 1076 return CASE_SORT(fa->name, fb->name); |
1040 break; | 1077 break; |
1041 } | 1078 } |
1079 } | |
1080 | |
1081 gint filelist_sort_compare_filedata_full(FileData *fa, FileData *fb, SortType method, gint ascend) | |
1082 { | |
1083 filelist_sort_method = method; | |
1084 filelist_sort_ascend = ascend; | |
1085 return filelist_sort_compare_filedata(fa, fb); | |
1042 } | 1086 } |
1043 | 1087 |
1044 static gint filelist_sort_file_cb(void *a, void *b) | 1088 static gint filelist_sort_file_cb(void *a, void *b) |
1045 { | 1089 { |
1046 return filelist_sort_compare_filedata(a, b); | 1090 return filelist_sort_compare_filedata(a, b); |