void feh_menu_cb(feh_menu * m, feh_menu_item * i, int action, void *data) { char *path; Imlib_Image im; winwidget winwid; switch (action) { case CB_BG_TILED: path = feh_absolute_path(FEH_FILE(m->fehwin->file->data)->filename); feh_wm_set_bg(path, m->fehwin->im, 0, 0, 0, (int) data, 1); free(path); break; case CB_BG_SCALED: path = feh_absolute_path(FEH_FILE(m->fehwin->file->data)->filename); feh_wm_set_bg(path, m->fehwin->im, 0, 1, 0, (int) data, 1); free(path); break; case CB_BG_CENTERED: path = feh_absolute_path(FEH_FILE(m->fehwin->file->data)->filename); feh_wm_set_bg(path, m->fehwin->im, 1, 0, 0, (int) data, 1); free(path); break; case CB_BG_FILLED: path = feh_absolute_path(FEH_FILE(m->fehwin->file->data)->filename); feh_wm_set_bg(path, m->fehwin->im, 0, 0, 1, (int) data, 1); free(path); break; case CB_BG_TILED_NOFILE: feh_wm_set_bg(NULL, m->fehwin->im, 0, 0, 0, (int) data, 1); break; case CB_BG_SCALED_NOFILE: feh_wm_set_bg(NULL, m->fehwin->im, 0, 1, 0, (int) data, 1); break; case CB_BG_CENTERED_NOFILE: feh_wm_set_bg(NULL, m->fehwin->im, 1, 0, 0, (int) data, 1); break; case CB_BG_FILLED_NOFILE: feh_wm_set_bg(NULL, m->fehwin->im, 0, 0, 1, (int) data, 1); break; case CB_ABOUT: if (feh_load_image_char(&im, PREFIX "/share/feh/images/about.png") != 0) { winwid = winwidget_create_from_image(im, "About " PACKAGE, WIN_TYPE_ABOUT); winwid->file = gib_list_add_front(NULL, feh_file_new(PREFIX "/share/feh/images/about.png")); winwidget_show(winwid); } break; case CB_CLOSE: winwidget_destroy(m->fehwin); break; case CB_EXIT: winwidget_destroy_all(); break; case CB_RESET: if (m->fehwin->has_rotated) { m->fehwin->im_w = gib_imlib_image_get_width(m->fehwin->im); m->fehwin->im_h = gib_imlib_image_get_height(m->fehwin->im); winwidget_resize(m->fehwin, m->fehwin->im_w, m->fehwin->im_h); } winwidget_reset_image(m->fehwin); winwidget_render_image(m->fehwin, 1, 1); break; case CB_RELOAD: feh_reload_image(m->fehwin, 0, 0); break; case CB_REMOVE: feh_filelist_image_remove(m->fehwin, 0); break; case CB_DELETE: feh_filelist_image_remove(m->fehwin, 1); break; case CB_REMOVE_THUMB: feh_thumbnail_mark_removed(FEH_FILE(m->fehwin->file->data), 0); feh_filelist_image_remove(m->fehwin, 0); break; case CB_DELETE_THUMB: feh_thumbnail_mark_removed(FEH_FILE(m->fehwin->file->data), 1); feh_filelist_image_remove(m->fehwin, 1); break; case CB_SORT_FILENAME: filelist = gib_list_sort(filelist, feh_cmp_filename); if (opt.jump_on_resort) { slideshow_change_image(m->fehwin, SLIDE_FIRST); } break; case CB_SORT_IMAGENAME: filelist = gib_list_sort(filelist, feh_cmp_name); if (opt.jump_on_resort) { slideshow_change_image(m->fehwin, SLIDE_FIRST); } break; case CB_SORT_FILESIZE: filelist = gib_list_sort(filelist, feh_cmp_size); if (opt.jump_on_resort) { slideshow_change_image(m->fehwin, SLIDE_FIRST); } break; case CB_SORT_RANDOMIZE: filelist = gib_list_randomize(filelist); if (opt.jump_on_resort) { slideshow_change_image(m->fehwin, SLIDE_FIRST); } break; case CB_FIT: winwidget_size_to_image(m->fehwin); break; case CB_EDIT_ROTATE: feh_edit_inplace_orient(m->fehwin, (int) data); break; case CB_SAVE_IMAGE: slideshow_save_image(m->fehwin); break; case CB_SAVE_FILELIST: feh_save_filelist(); break; case CB_OPT_DRAW_FILENAME: MENU_ITEM_TOGGLE(i); if (MENU_ITEM_IS_ON(i)) opt.draw_filename = TRUE; else opt.draw_filename = FALSE; winwidget_rerender_all(0, 1); break; case CB_OPT_DRAW_ACTIONS: MENU_ITEM_TOGGLE(i); if (MENU_ITEM_IS_ON(i)) opt.draw_actions = TRUE; else opt.draw_actions = FALSE; winwidget_rerender_all(0, 1); break; case CB_OPT_KEEP_HTTP: MENU_ITEM_TOGGLE(i); if (MENU_ITEM_IS_ON(i)) opt.keep_http = TRUE; else opt.keep_http = FALSE; break; case CB_OPT_FREEZE_WINDOW: MENU_ITEM_TOGGLE(i); if (MENU_ITEM_IS_ON(i)) { opt.geom_flags = (WidthValue | HeightValue); opt.geom_w = m->fehwin->w; opt.geom_h = m->fehwin->h; } else { opt.geom_flags = 0; } break; case CB_OPT_FULLSCREEN: feh_menu_cb_opt_fullscreen(m, i); break; case CB_OPT_AUTO_ZOOM: MENU_ITEM_TOGGLE(i); if (MENU_ITEM_IS_ON(i)) opt.zoom_mode = ZOOM_MODE_FILL; else opt.zoom_mode = 0; winwidget_rerender_all(1, 1); break; } return; }
/* Recursive */ void add_file_to_filelist_recursively(char *origpath, unsigned char level) { struct stat st; char *path; if (!origpath) return; path = estrdup(origpath); D(4, ("file is %s\n", path)); if (level == FILELIST_FIRST) { /* First time through, sort out pathname */ int len = 0; len = strlen(path); if (path[len - 1] == '/') path[len - 1] = '\0'; if ((!strncmp(path, "http://", 7)) || (!strncmp(path, "https://", 8)) || (!strncmp(path, "ftp://", 6))) { /* Its a url */ D(3, ("Adding url %s to filelist\n", path)); filelist = gib_list_add_front(filelist, feh_file_new(path)); /* We'll download it later... */ free(path); return; } else if (opt.filelistfile) { char *newpath = feh_absolute_path(path); free(path); path = newpath; } } errno = 0; if (stat(path, &st)) { /* Display useful error message */ switch (errno) { case ENOENT: case ENOTDIR: if (!opt.quiet) weprintf("%s does not exist - skipping", path); break; case ELOOP: if (!opt.quiet) weprintf("%s - too many levels of symbolic links - skipping", path); break; case EACCES: if (!opt.quiet) weprintf("you don't have permission to open %s - skipping", path); break; default: if (!opt.quiet) weprintf("couldn't open %s", path); break; } free(path); return; } if ((S_ISDIR(st.st_mode)) && (level != FILELIST_LAST)) { struct dirent *de; DIR *dir; D(4, ("It is a directory\n")); if ((dir = opendir(path)) == NULL) { if (!opt.quiet) weprintf("couldn't open directory %s:", path); free(path); return; } de = readdir(dir); while (de != NULL) { if (strcmp(de->d_name, ".") && strcmp(de->d_name, "..")) { char *newfile; newfile = estrjoin("", path, "/", de->d_name, NULL); /* This ensures we go down one level even if not fully recursive - this way "feh some_dir" expands to some_dir's contents */ if (opt.recursive) add_file_to_filelist_recursively(newfile, FILELIST_CONTINUE); else add_file_to_filelist_recursively(newfile, FILELIST_LAST); free(newfile); } de = readdir(dir); } closedir(dir); } else if (S_ISREG(st.st_mode)) { D(5, ("Adding regular file %s to filelist\n", path)); filelist = gib_list_add_front(filelist, feh_file_new(path)); } free(path); return; }