static feh_menu *feh_menu_func_gen_info(feh_menu * m) { Imlib_Image im; feh_menu *mm; feh_file *file; char buffer[400]; if (!m->fehwin->file) return(NULL); file = FEH_FILE(m->fehwin->file->data); im = m->fehwin->im; if (!im) return(NULL); mm = feh_menu_new(); mm->name = estrdup("INFO"); snprintf(buffer, sizeof(buffer), "Filename: %s", file->name); feh_menu_add_entry(mm, buffer, NULL, NULL, 0, NULL, NULL); if (!file->info) feh_file_info_load(file, im); if (file->info) { snprintf(buffer, sizeof(buffer), "Size: %dKb", file->info->size / 1024); feh_menu_add_entry(mm, buffer, NULL, NULL, 0, NULL, NULL); snprintf(buffer, sizeof(buffer), "Dimensions: %dx%d", file->info->width, file->info->height); feh_menu_add_entry(mm, buffer, NULL, NULL, 0, NULL, NULL); snprintf(buffer, sizeof(buffer), "Type: %s", file->info->format); feh_menu_add_entry(mm, buffer, NULL, NULL, 0, NULL, NULL); } mm->func_free = feh_menu_func_free_info; return(mm); }
gib_list *feh_file_info_preload(gib_list * list) { gib_list *l; feh_file *file = NULL; gib_list *remove_list = NULL; if (opt.verbose) fprintf(stdout, PACKAGE " - preloading...\n"); for (l = list; l; l = l->next) { file = FEH_FILE(l->data); D(5, ("file %p, file->next %p, file->name %s\n", l, l->next, file->name)); if (feh_file_info_load(file, NULL)) { D(3, ("Failed to load file %p\n", file)); remove_list = gib_list_add_front(remove_list, l); if (opt.verbose) feh_display_status('x'); } else if (opt.verbose) feh_display_status('.'); } if (opt.verbose) fprintf(stdout, "\n"); if (remove_list) { for (l = remove_list; l; l = l->next) filelist = list = gib_list_remove(list, (gib_list *) l->data); gib_list_free(remove_list); } return(list); }
int feh_load_image(Imlib_Image * im, feh_file * file) { Imlib_Load_Error err; enum { SRC_IMLIB, SRC_HTTP, SRC_MAGICK } image_source = SRC_IMLIB; char *tmpname = NULL; char *real_filename = NULL; D(("filename is %s, image is %p\n", file->filename, im)); if (!file || !file->filename) return 0; /* Handle URLs */ if ((!strncmp(file->filename, "http://", 7)) || (!strncmp(file->filename, "https://", 8)) || (!strncmp(file->filename, "ftp://", 6))) { image_source = SRC_HTTP; if ((tmpname = feh_http_load_image(file->filename)) == NULL) err = IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST; } else *im = imlib_load_image_with_error_return(file->filename, &err); if ((err == IMLIB_LOAD_ERROR_UNKNOWN) || (err == IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT)) { image_source = SRC_MAGICK; tmpname = feh_magick_load_image(file->filename); } if ((image_source != SRC_IMLIB) && tmpname) { *im = imlib_load_image_with_error_return(tmpname, &err); if (im) { real_filename = file->filename; file->filename = tmpname; feh_file_info_load(file, *im); file->filename = real_filename; #ifdef HAVE_LIBEXIF file->ed = exif_get_data(tmpname); #endif } if ((image_source == SRC_MAGICK) || !opt.keep_http) unlink(tmpname); free(tmpname); } if ((err) || (!im)) { if (opt.verbose && !opt.quiet) { fputs("\n", stdout); reset_output = 1; } feh_imlib_print_load_error(file->filename, NULL, err); D(("Load *failed*\n")); return(0); } #ifdef HAVE_LIBEXIF file->ed = exif_get_data(file->filename); #endif D(("Loaded ok\n")); return(1); }
char *feh_printf(char *str, feh_file * file, winwidget winwid) { char *c; char buf[20]; static char ret[4096]; char *filelist_tmppath; ret[0] = '\0'; filelist_tmppath = NULL; for (c = str; *c != '\0'; c++) { if ((*c == '%') && (*(c+1) != '\0')) { c++; switch (*c) { case 'f': if (file) strncat(ret, file->filename, sizeof(ret) - strlen(ret) - 1); break; case 'F': if (file) strncat(ret, shell_escape(file->filename), sizeof(ret) - strlen(ret) - 1); break; case 'h': if (file && (file->info || !feh_file_info_load(file, NULL))) { snprintf(buf, sizeof(buf), "%d", file->info->height); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); } break; case 'l': snprintf(buf, sizeof(buf), "%d", gib_list_length(filelist)); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); break; case 'L': if (filelist_tmppath != NULL) { strncat(ret, filelist_tmppath, sizeof(ret) - strlen(ret) - 1); } else { filelist_tmppath = feh_unique_filename("/tmp/","filelist"); feh_write_filelist(filelist, filelist_tmppath); strncat(ret, filelist_tmppath, sizeof(ret) - strlen(ret) - 1); } break; case 'm': strncat(ret, mode, sizeof(ret) - strlen(ret) - 1); break; case 'n': if (file) strncat(ret, file->name, sizeof(ret) - strlen(ret) - 1); break; case 'N': if (file) strncat(ret, shell_escape(file->name), sizeof(ret) - strlen(ret) - 1); break; case 'o': if (winwid) { snprintf(buf, sizeof(buf), "%d,%d", winwid->im_x, winwid->im_y); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); } break; case 'p': if (file && (file->info || !feh_file_info_load(file, NULL))) { snprintf(buf, sizeof(buf), "%d", file->info->pixels); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); } break; case 'P': if (file && (file->info || !feh_file_info_load(file, NULL))) { strncat(ret, format_size(file->info->pixels), sizeof(ret) - strlen(ret) - 1); } break; case 'r': if (winwid) { snprintf(buf, sizeof(buf), "%.1f", winwid->im_angle); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); } break; case 's': if (file && (file->info || !feh_file_info_load(file, NULL))) { snprintf(buf, sizeof(buf), "%d", file->info->size); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); } break; case 'S': if (file && (file->info || !feh_file_info_load(file, NULL))) { strncat(ret, format_size(file->info->size), sizeof(ret) - strlen(ret) - 1); } break; case 't': if (file && (file->info || !feh_file_info_load(file, NULL))) { strncat(ret, file->info->format, sizeof(ret) - strlen(ret) - 1); } break; case 'u': snprintf(buf, sizeof(buf), "%d", current_file != NULL ? gib_list_num(filelist, current_file) + 1 : 0); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); break; case 'v': strncat(ret, VERSION, sizeof(ret) - strlen(ret) - 1); break; case 'V': snprintf(buf, sizeof(buf), "%d", getpid()); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); break; case 'w': if (file && (file->info || !feh_file_info_load(file, NULL))) { snprintf(buf, sizeof(buf), "%d", file->info->width); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); } break; case 'z': if (winwid) { snprintf(buf, sizeof(buf), "%.2f", winwid->zoom); strncat(ret, buf, sizeof(ret) - strlen(ret) - 1); } break; case '%': strncat(ret, "%", sizeof(ret) - strlen(ret) - 1); break; default: weprintf("Unrecognized format specifier %%%c", *c); if ((strlen(ret) + 3) < sizeof(ret)) strncat(ret, c - 1, 2); break; } } else if ((*c == '\\') && (*(c+1) != '\0') && ((strlen(ret) + 3) < sizeof(ret))) { c++; switch (*c) { case 'n': strcat(ret, "\n"); break; default: strncat(ret, c - 1, 2); break; } } else if ((strlen(ret) + 2) < sizeof(ret)) strncat(ret, c, 1); } if (filelist_tmppath != NULL) free(filelist_tmppath); return(ret); }
int feh_load_image(Imlib_Image * im, feh_file * file) { Imlib_Load_Error err = IMLIB_LOAD_ERROR_NONE; enum { SRC_IMLIB, SRC_HTTP, SRC_MAGICK } image_source = SRC_IMLIB; char *tmpname = NULL; char *real_filename = NULL; #ifdef HAVE_LIBEXIF ExifEntry *entry; #endif D(("filename is %s, image is %p\n", file->filename, im)); if (!file || !file->filename) return 0; if (path_is_url(file->filename)) { image_source = SRC_HTTP; if ((tmpname = feh_http_load_image(file->filename)) == NULL) err = IMLIB_LOAD_ERROR_FILE_DOES_NOT_EXIST; } else *im = imlib_load_image_with_error_return(file->filename, &err); if ((err == IMLIB_LOAD_ERROR_UNKNOWN) || (err == IMLIB_LOAD_ERROR_NO_LOADER_FOR_FILE_FORMAT)) { image_source = SRC_MAGICK; tmpname = feh_magick_load_image(file->filename); } if ((image_source != SRC_IMLIB) && tmpname) { *im = imlib_load_image_with_error_return(tmpname, &err); if (im) { real_filename = file->filename; file->filename = tmpname; feh_file_info_load(file, *im); file->filename = real_filename; #ifdef HAVE_LIBEXIF file->ed = exif_get_data(tmpname); #endif } if ((image_source == SRC_MAGICK) || !opt.keep_http) unlink(tmpname); free(tmpname); } if ((err) || (!im)) { if (opt.verbose && !opt.quiet) { fputs("\n", stdout); reset_output = 1; } feh_imlib_print_load_error(file->filename, NULL, err); D(("Load *failed*\n")); return(0); } #ifdef HAVE_LIBEXIF file->ed = exif_get_data(file->filename); if (file->ed) { entry = exif_content_get_entry(file->ed->ifd[EXIF_IFD_0], 0x0112); if (entry != NULL) { if (*(entry->data) == 3) gib_imlib_image_orientate(*im, 2); else if (*(entry->data) == 6) gib_imlib_image_orientate(*im, 1); else if (*(entry->data) == 8) gib_imlib_image_orientate(*im, 3); } } #endif D(("Loaded ok\n")); return(1); }