comparison src/pan-view.c @ 138:71e1ebee420e

replaced gchar* path with FileData *fd
author nadvornik
date Tue, 11 Sep 2007 20:06:29 +0000
parents 50fc73e08550
children 0ca3b4c8ffae
comparison
equal deleted inserted replaced
137:be3328a58875 138:71e1ebee420e
194 thumb_loader_free(pw->tl); 194 thumb_loader_free(pw->tl);
195 pw->tl = NULL; 195 pw->tl = NULL;
196 196
197 if (pi->type == PAN_ITEM_IMAGE) 197 if (pi->type == PAN_ITEM_IMAGE)
198 { 198 {
199 pw->il = image_loader_new(pi->fd->path); 199 pw->il = image_loader_new(pi->fd);
200 200
201 if (pw->size != PAN_IMAGE_SIZE_100) 201 if (pw->size != PAN_IMAGE_SIZE_100)
202 { 202 {
203 image_loader_set_requested_size(pw->il, pi->width, pi->height); 203 image_loader_set_requested_size(pw->il, pi->width, pi->height);
204 } 204 }
518 *----------------------------------------------------------------------------- 518 *-----------------------------------------------------------------------------
519 * cache 519 * cache
520 *----------------------------------------------------------------------------- 520 *-----------------------------------------------------------------------------
521 */ 521 */
522 522
523 static gint pan_cache_sort_file_cb(void *a, void *b)
524 {
525 PanCacheData *pca = a;
526 PanCacheData *pcb = b;
527 return filelist_sort_compare_filedata(pca->fd, pcb->fd);
528 }
529 GList *pan_cache_sort(GList *list, SortType method, gint ascend)
530 {
531 return filelist_sort_full(list, method, ascend, (GCompareFunc) pan_cache_sort_file_cb);
532 }
533
534
523 static void pan_cache_free(PanWindow *pw) 535 static void pan_cache_free(PanWindow *pw)
524 { 536 {
525 GList *work; 537 GList *work;
526 538
527 work = pw->cache_list; 539 work = pw->cache_list;
531 543
532 pc = work->data; 544 pc = work->data;
533 work = work->next; 545 work = work->next;
534 546
535 cache_sim_data_free(pc->cd); 547 cache_sim_data_free(pc->cd);
536 file_data_free((FileData *)pc); 548 file_data_unref(pc->fd);
549 g_free(pc);
537 } 550 }
538 551
539 g_list_free(pw->cache_list); 552 g_list_free(pw->cache_list);
540 pw->cache_list = NULL; 553 pw->cache_list = NULL;
541 554
610 623
611 if (!cd) cd = cache_sim_data_new(); 624 if (!cd) cd = cache_sim_data_new();
612 625
613 if (!cd->dimensions) 626 if (!cd->dimensions)
614 { 627 {
615 cd->dimensions = image_load_dimensions(fd->path, &cd->width, &cd->height); 628 cd->dimensions = image_load_dimensions(fd, &cd->width, &cd->height);
616 if (enable_thumb_caching && 629 if (enable_thumb_caching &&
617 cd->dimensions) 630 cd->dimensions)
618 { 631 {
619 gchar *base; 632 gchar *base;
620 mode_t mode = 0755; 633 mode_t mode = 0755;
634 647
635 pw->cache_tick = 9; 648 pw->cache_tick = 9;
636 } 649 }
637 #endif 650 #endif
638 pc = g_new0(PanCacheData, 1); 651 pc = g_new0(PanCacheData, 1);
639 memcpy(pc, fd, sizeof(FileData)); 652 pc->fd = file_data_ref(fd);
640 g_free(fd);
641 653
642 pc->cd = NULL; 654 pc->cd = NULL;
643 655
644 pw->cache_list = g_list_prepend(pw->cache_list, pc); 656 pw->cache_list = g_list_prepend(pw->cache_list, pc);
645 657
646 cache_loader_free(pw->cache_cl); 658 cache_loader_free(pw->cache_cl);
647 659
648 load_mask = CACHE_LOADER_NONE; 660 load_mask = CACHE_LOADER_NONE;
649 if (pw->size > PAN_IMAGE_SIZE_THUMB_LARGE) load_mask |= CACHE_LOADER_DIMENSIONS; 661 if (pw->size > PAN_IMAGE_SIZE_THUMB_LARGE) load_mask |= CACHE_LOADER_DIMENSIONS;
650 if (pw->exif_date_enable) load_mask |= CACHE_LOADER_DATE; 662 if (pw->exif_date_enable) load_mask |= CACHE_LOADER_DATE;
651 pw->cache_cl = cache_loader_new(((FileData *)pc)->path, load_mask, 663 pw->cache_cl = cache_loader_new(pc->fd, load_mask,
652 pan_cache_step_done_cb, pw); 664 pan_cache_step_done_cb, pw);
653 return (pw->cache_cl == NULL); 665 return (pw->cache_cl == NULL);
654 } 666 }
655 667
656 /* This sync date function is optimized for lists with a common sort */ 668 /* This sync date function is optimized for lists with a common sort */
675 { 687 {
676 PanCacheData *pc; 688 PanCacheData *pc;
677 gchar *path; 689 gchar *path;
678 690
679 pc = needle->data; 691 pc = needle->data;
680 path = ((FileData *)pc)->path; 692 if (pc->fd == fd)
681 if (path && strcmp(path, fd->path) == 0)
682 { 693 {
683 if (pc->cd && pc->cd->have_date && pc->cd->date >= 0) 694 if (pc->cd && pc->cd->have_date && pc->cd->date >= 0)
684 { 695 {
685 fd->date = pc->cd->date; 696 fd->date = pc->cd->date;
686 } 697 }
1167 *----------------------------------------------------------------------------- 1178 *-----------------------------------------------------------------------------
1168 * keyboard handlers 1179 * keyboard handlers
1169 *----------------------------------------------------------------------------- 1180 *-----------------------------------------------------------------------------
1170 */ 1181 */
1171 1182
1172 static const gchar *pan_menu_click_path(PanWindow *pw) 1183 FileData *pan_menu_click_fd(PanWindow *pw)
1173 { 1184 {
1174 if (pw->click_pi && pw->click_pi->fd) return pw->click_pi->fd->path; 1185 if (pw->click_pi && pw->click_pi->fd) return pw->click_pi->fd;
1175 return NULL; 1186 return NULL;
1176 } 1187 }
1177 1188
1178 static void pan_window_menu_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data) 1189 static void pan_window_menu_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
1179 { 1190 {
1185 1196
1186 static gint pan_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data) 1197 static gint pan_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
1187 { 1198 {
1188 PanWindow *pw = data; 1199 PanWindow *pw = data;
1189 PixbufRenderer *pr; 1200 PixbufRenderer *pr;
1190 const gchar *path; 1201 FileData *fd;
1191 gint stop_signal = FALSE; 1202 gint stop_signal = FALSE;
1192 GtkWidget *menu; 1203 GtkWidget *menu;
1193 gint x = 0; 1204 gint x = 0;
1194 gint y = 0; 1205 gint y = 0;
1195 gint focused; 1206 gint focused;
1196 gint on_entry; 1207 gint on_entry;
1197 1208
1198 pr = PIXBUF_RENDERER(pw->imd->pr); 1209 pr = PIXBUF_RENDERER(pw->imd->pr);
1199 path = pan_menu_click_path(pw); 1210 fd = pan_menu_click_fd(pw);
1200 1211
1201 focused = (pw->fs || GTK_WIDGET_HAS_FOCUS(GTK_WIDGET(pw->imd->widget))); 1212 focused = (pw->fs || GTK_WIDGET_HAS_FOCUS(GTK_WIDGET(pw->imd->widget)));
1202 on_entry = (GTK_WIDGET_HAS_FOCUS(pw->path_entry) || 1213 on_entry = (GTK_WIDGET_HAS_FOCUS(pw->path_entry) ||
1203 GTK_WIDGET_HAS_FOCUS(pw->search_entry)); 1214 GTK_WIDGET_HAS_FOCUS(pw->search_entry));
1204 1215
1286 break; 1297 break;
1287 case '0': 1298 case '0':
1288 n = 9; 1299 n = 9;
1289 break; 1300 break;
1290 case 'C': case 'c': 1301 case 'C': case 'c':
1291 if (path) file_util_copy(path, NULL, NULL, GTK_WIDGET(pr)); 1302 if (fd) file_util_copy(fd, NULL, NULL, GTK_WIDGET(pr));
1292 break; 1303 break;
1293 case 'M': case 'm': 1304 case 'M': case 'm':
1294 if (path) file_util_move(path, NULL, NULL, GTK_WIDGET(pr)); 1305 if (fd) file_util_move(fd, NULL, NULL, GTK_WIDGET(pr));
1295 break; 1306 break;
1296 case 'R': case 'r': 1307 case 'R': case 'r':
1297 if (path) file_util_rename(path, NULL, GTK_WIDGET(pr)); 1308 if (fd) file_util_rename(fd, NULL, GTK_WIDGET(pr));
1298 break; 1309 break;
1299 case 'D': case 'd': 1310 case 'D': case 'd':
1300 if (path) file_util_delete(path, NULL, GTK_WIDGET(pr)); 1311 if (fd) file_util_delete(fd, NULL, GTK_WIDGET(pr));
1301 break; 1312 break;
1302 case 'P': case 'p': 1313 case 'P': case 'p':
1303 if (path) info_window_new(path, NULL); 1314 if (fd) info_window_new(fd, NULL);
1304 break; 1315 break;
1305 case 'F': case 'f': 1316 case 'F': case 'f':
1306 pan_search_toggle_visible(pw, TRUE); 1317 pan_search_toggle_visible(pw, TRUE);
1307 break; 1318 break;
1308 case 'G': case 'g': 1319 case 'G': case 'g':
1314 default: 1325 default:
1315 stop_signal = FALSE; 1326 stop_signal = FALSE;
1316 break; 1327 break;
1317 } 1328 }
1318 1329
1319 if (n != -1 && path) 1330 if (n != -1 && fd)
1320 { 1331 {
1321 if (!editor_window_flag_set(n)) 1332 if (!editor_window_flag_set(n))
1322 { 1333 {
1323 pan_fullscreen_toggle(pw, TRUE); 1334 pan_fullscreen_toggle(pw, TRUE);
1324 } 1335 }
1325 start_editor_from_file(n, path); 1336 start_editor_from_file(n, fd);
1326 } 1337 }
1327 } 1338 }
1328 else 1339 else
1329 { 1340 {
1330 stop_signal = TRUE; 1341 stop_signal = TRUE;
1421 ExifData *exif; 1432 ExifData *exif;
1422 GList *work; 1433 GList *work;
1423 gint i; 1434 gint i;
1424 1435
1425 if (!fd) return; 1436 if (!fd) return;
1426 exif = exif_read(fd->path, FALSE); 1437 exif = exif_read(fd, FALSE);
1427 if (!exif) return; 1438 if (!exif) return;
1428 1439
1429 pan_text_alignment_add(ta, NULL, NULL); 1440 pan_text_alignment_add(ta, NULL, NULL);
1430 1441
1431 for (i = 0; i < bar_exif_key_count; i++) 1442 for (i = 0; i < bar_exif_key_count; i++)
1539 pan_item_added(pw, pbox); 1550 pan_item_added(pw, pbox);
1540 1551
1541 if (pw->info_image_size > PAN_IMAGE_SIZE_THUMB_NONE) 1552 if (pw->info_image_size > PAN_IMAGE_SIZE_THUMB_NONE)
1542 { 1553 {
1543 gint iw, ih; 1554 gint iw, ih;
1544 if (image_load_dimensions(pi->fd->path, &iw, &ih)) 1555 if (image_load_dimensions(pi->fd, &iw, &ih))
1545 { 1556 {
1546 gint scale = 25; 1557 gint scale = 25;
1547 1558
1548 switch (pw->info_image_size) 1559 switch (pw->info_image_size)
1549 { 1560 {
2623 2634
2624 2635
2625 static void pan_new_window_cb(GtkWidget *widget, gpointer data) 2636 static void pan_new_window_cb(GtkWidget *widget, gpointer data)
2626 { 2637 {
2627 PanWindow *pw = data; 2638 PanWindow *pw = data;
2628 const gchar *path; 2639 FileData *fd;
2629 2640
2630 path = pan_menu_click_path(pw); 2641 fd = pan_menu_click_fd(pw);
2631 if (path) 2642 if (fd)
2632 { 2643 {
2633 pan_fullscreen_toggle(pw, TRUE); 2644 pan_fullscreen_toggle(pw, TRUE);
2634 view_window_new(path); 2645 view_window_new(fd);
2635 } 2646 }
2636 } 2647 }
2637 2648
2638 static void pan_edit_cb(GtkWidget *widget, gpointer data) 2649 static void pan_edit_cb(GtkWidget *widget, gpointer data)
2639 { 2650 {
2640 PanWindow *pw; 2651 PanWindow *pw;
2641 const gchar *path; 2652 FileData *fd;
2642 gint n; 2653 gint n;
2643 2654
2644 pw = submenu_item_get_data(widget); 2655 pw = submenu_item_get_data(widget);
2645 n = GPOINTER_TO_INT(data); 2656 n = GPOINTER_TO_INT(data);
2646 if (!pw) return; 2657 if (!pw) return;
2647 2658
2648 path = pan_menu_click_path(pw); 2659 fd = pan_menu_click_fd(pw);
2649 if (path) 2660 if (fd)
2650 { 2661 {
2651 if (!editor_window_flag_set(n)) 2662 if (!editor_window_flag_set(n))
2652 { 2663 {
2653 pan_fullscreen_toggle(pw, TRUE); 2664 pan_fullscreen_toggle(pw, TRUE);
2654 } 2665 }
2655 start_editor_from_file(n, path); 2666 start_editor_from_file(n, fd);
2656 } 2667 }
2657 } 2668 }
2658 2669
2659 static void pan_info_cb(GtkWidget *widget, gpointer data) 2670 static void pan_info_cb(GtkWidget *widget, gpointer data)
2660 { 2671 {
2661 PanWindow *pw = data; 2672 PanWindow *pw = data;
2662 const gchar *path; 2673 FileData *fd;
2663 2674
2664 path = pan_menu_click_path(pw); 2675 fd = pan_menu_click_fd(pw);
2665 if (path) info_window_new(path, NULL); 2676 if (fd) info_window_new(fd, NULL);
2666 } 2677 }
2667 2678
2668 static void pan_zoom_in_cb(GtkWidget *widget, gpointer data) 2679 static void pan_zoom_in_cb(GtkWidget *widget, gpointer data)
2669 { 2680 {
2670 PanWindow *pw = data; 2681 PanWindow *pw = data;
2687 } 2698 }
2688 2699
2689 static void pan_copy_cb(GtkWidget *widget, gpointer data) 2700 static void pan_copy_cb(GtkWidget *widget, gpointer data)
2690 { 2701 {
2691 PanWindow *pw = data; 2702 PanWindow *pw = data;
2692 const gchar *path; 2703 FileData *fd;
2693 2704
2694 path = pan_menu_click_path(pw); 2705 fd = pan_menu_click_fd(pw);
2695 if (path) file_util_copy(path, NULL, NULL, pw->imd->widget); 2706 if (fd) file_util_copy(fd, NULL, NULL, pw->imd->widget);
2696 } 2707 }
2697 2708
2698 static void pan_move_cb(GtkWidget *widget, gpointer data) 2709 static void pan_move_cb(GtkWidget *widget, gpointer data)
2699 { 2710 {
2700 PanWindow *pw = data; 2711 PanWindow *pw = data;
2701 const gchar *path; 2712 FileData *fd;
2702 2713
2703 path = pan_menu_click_path(pw); 2714 fd = pan_menu_click_fd(pw);
2704 if (path) file_util_move(path, NULL, NULL, pw->imd->widget); 2715 if (fd) file_util_move(fd, NULL, NULL, pw->imd->widget);
2705 } 2716 }
2706 2717
2707 static void pan_rename_cb(GtkWidget *widget, gpointer data) 2718 static void pan_rename_cb(GtkWidget *widget, gpointer data)
2708 { 2719 {
2709 PanWindow *pw = data; 2720 PanWindow *pw = data;
2710 const gchar *path; 2721 FileData *fd;
2711 2722
2712 path = pan_menu_click_path(pw); 2723 fd = pan_menu_click_fd(pw);
2713 if (path) file_util_rename(path, NULL, pw->imd->widget); 2724 if (fd) file_util_rename(fd, NULL, pw->imd->widget);
2714 } 2725 }
2715 2726
2716 static void pan_delete_cb(GtkWidget *widget, gpointer data) 2727 static void pan_delete_cb(GtkWidget *widget, gpointer data)
2717 { 2728 {
2718 PanWindow *pw = data; 2729 PanWindow *pw = data;
2719 const gchar *path; 2730 FileData *fd;
2720 2731
2721 path = pan_menu_click_path(pw); 2732 fd = pan_menu_click_fd(pw);
2722 if (path) file_util_delete(path, NULL, pw->imd->widget); 2733 if (fd) file_util_delete(fd, NULL, pw->imd->widget);
2723 } 2734 }
2724 2735
2725 static void pan_exif_date_toggle_cb(GtkWidget *widget, gpointer data) 2736 static void pan_exif_date_toggle_cb(GtkWidget *widget, gpointer data)
2726 { 2737 {
2727 PanWindow *pw = data; 2738 PanWindow *pw = data;
2872 2883
2873 if (info == TARGET_URI_LIST) 2884 if (info == TARGET_URI_LIST)
2874 { 2885 {
2875 GList *list; 2886 GList *list;
2876 2887
2877 list = uri_list_from_text((gchar *)selection_data->data, TRUE); 2888 list = uri_filelist_from_text((gchar *)selection_data->data, TRUE);
2878 if (list && isdir((gchar *)list->data)) 2889 if (list && isdir(((FileData *)list->data)->path))
2879 { 2890 {
2880 gchar *path = list->data; 2891 FileData *fd = list->data;
2881 2892
2882 pan_layout_set_path(pw, path); 2893 pan_layout_set_path(pw, fd->path);
2883 } 2894 }
2884 2895
2885 path_list_free(list); 2896 filelist_free(list);
2886 } 2897 }
2887 } 2898 }
2888 2899
2889 static void pan_window_set_dnd_data(GtkWidget *widget, GdkDragContext *context, 2900 static void pan_window_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
2890 GtkSelectionData *selection_data, guint info, 2901 GtkSelectionData *selection_data, guint info,
2891 guint time, gpointer data) 2902 guint time, gpointer data)
2892 { 2903 {
2893 PanWindow *pw = data; 2904 PanWindow *pw = data;
2894 const gchar *path; 2905 FileData *fd;
2895 2906
2896 path = pan_menu_click_path(pw); 2907 fd = pan_menu_click_fd(pw);
2897 if (path) 2908 if (fd)
2898 { 2909 {
2899 gchar *text = NULL; 2910 gchar *text = NULL;
2900 gint len; 2911 gint len;
2901 gint plain_text; 2912 gint plain_text;
2902 GList *list; 2913 GList *list;
2909 case TARGET_TEXT_PLAIN: 2920 case TARGET_TEXT_PLAIN:
2910 default: 2921 default:
2911 plain_text = TRUE; 2922 plain_text = TRUE;
2912 break; 2923 break;
2913 } 2924 }
2914 list = g_list_append(NULL, (gchar *)path); 2925 list = g_list_append(NULL, fd);
2915 text = uri_text_from_list(list, &len, plain_text); 2926 text = uri_text_from_filelist(list, &len, plain_text);
2916 g_list_free(list); 2927 g_list_free(list);
2917 if (text) 2928 if (text)
2918 { 2929 {
2919 gtk_selection_data_set (selection_data, selection_data->target, 2930 gtk_selection_data_set (selection_data, selection_data->target,
2920 8, (guchar *)text, len); 2931 8, (guchar *)text, len);