diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/feh.h | 2 | ||||
-rw-r--r-- | src/filelist.c | 4 | ||||
-rw-r--r-- | src/gib_imlib.c | 23 | ||||
-rw-r--r-- | src/imlib.c | 30 | ||||
-rw-r--r-- | src/index.c | 2 | ||||
-rw-r--r-- | src/list.c | 2 | ||||
-rw-r--r-- | src/options.c | 16 | ||||
-rw-r--r-- | src/options.h | 1 | ||||
-rw-r--r-- | src/slideshow.c | 2 | ||||
-rw-r--r-- | src/thumbnail.c | 2 | ||||
-rw-r--r-- | src/wallpaper.c | 104 | ||||
-rw-r--r-- | src/winwidget.c | 4 |
12 files changed, 118 insertions, 74 deletions
@@ -162,8 +162,6 @@ void feh_reload_image(winwidget w, int resize, int force_new); void feh_filelist_image_remove(winwidget winwid, char do_delete); void feh_imlib_print_load_error(char *file, winwidget w, Imlib_Load_Error err); void slideshow_save_image(winwidget win); -void ungib_imlib_save_image_with_error_return(Imlib_Image im, char *file, - Imlib_Load_Error * error_return); void feh_edit_inplace(winwidget w, int orientation); void feh_edit_inplace_lossless(winwidget w, int orientation); gib_list *feh_wrap_string(char *text, int wrap_width, Imlib_Font fn, gib_style * style); diff --git a/src/filelist.c b/src/filelist.c index f31f05b..eaef54b 100644 --- a/src/filelist.c +++ b/src/filelist.c @@ -332,8 +332,10 @@ gib_list *feh_file_info_preload(gib_list * list) feh_display_status(0); if (remove_list) { - for (l = remove_list; l; l = l->next) + for (l = remove_list; l; l = l->next) { + feh_file_free(FEH_FILE(((gib_list *) l->data)->data)); filelist = list = gib_list_remove(list, (gib_list *) l->data); + } gib_list_free(remove_list); } diff --git a/src/gib_imlib.c b/src/gib_imlib.c index b53b1cc..8f401aa 100644 --- a/src/gib_imlib.c +++ b/src/gib_imlib.c @@ -527,13 +527,22 @@ void gib_imlib_save_image_with_error_return(Imlib_Image im, char *file, Imlib_Load_Error * error_return) { - char *tmp; - - imlib_context_set_image(im); - tmp = strrchr(file, '.'); - if (tmp) - imlib_image_set_format(tmp + 1); - imlib_save_image_with_error_return(file, error_return); + char *tmp; + + imlib_context_set_image(im); + tmp = strrchr(file, '.'); + if (tmp) { + char *p, *pp; + p = estrdup(tmp + 1); + pp = p; + while(*pp) { + *pp = tolower(*pp); + pp++; + } + imlib_image_set_format(p); + free(p); + } + imlib_save_image_with_error_return(file, error_return); } void diff --git a/src/imlib.c b/src/imlib.c index 36c8dff..10ab718 100644 --- a/src/imlib.c +++ b/src/imlib.c @@ -148,32 +148,6 @@ int feh_load_image_char(Imlib_Image * im, char *filename) return(i); } -/* - * XXX gib_imlib_save_image_with_error_return breaks with *.END and - * similar because it tries to set the image format, which only works - * with .end . - * So we leave that part out. - */ -void ungib_imlib_save_image_with_error_return(Imlib_Image im, char *file, - Imlib_Load_Error * error_return) -{ - char *tmp; - imlib_context_set_image(im); - tmp = strrchr(file, '.'); - if (tmp) { - char *p, *pp; - p = estrdup(tmp + 1); - pp = p; - while(*pp) { - *pp = tolower(*pp); - pp++; - } - imlib_image_set_format(p); - free(p); - } - imlib_save_image_with_error_return(file, error_return); -} - void feh_imlib_print_load_error(char *file, winwidget w, Imlib_Load_Error err) { if (err == IMLIB_LOAD_ERROR_OUT_OF_FILE_DESCRIPTORS) @@ -566,6 +540,8 @@ void im_weprintf(winwidget w, char *fmt, ...) if (fmt[0] != '\0' && fmt[strlen(fmt) - 1] == ':') fprintf(stderr, " %s", strerror(errno)); fputs("\n", stderr); + if (!w) + free(errstr); } @@ -1053,7 +1029,7 @@ void feh_edit_inplace(winwidget w, int op) imlib_image_flip_horizontal(); } else gib_imlib_image_orientate(old, op); - ungib_imlib_save_image_with_error_return(old, + gib_imlib_save_image_with_error_return(old, FEH_FILE(w->file->data)->filename, &err); gib_imlib_free_image(old); if (err) diff --git a/src/index.c b/src/index.c index db2c9d2..a71744d 100644 --- a/src/index.c +++ b/src/index.c @@ -327,7 +327,7 @@ void init_index_mode(void) else strncpy(output_buf, opt.output_file, 1024); - ungib_imlib_save_image_with_error_return(im_main, output_buf, &err); + gib_imlib_save_image_with_error_return(im_main, output_buf, &err); if (err) { feh_imlib_print_load_error(output_buf, im_main, err); } @@ -110,7 +110,7 @@ void real_loadables_mode(int loadable) } else { if (opt.verbose) - feh_display_status('.'); + feh_display_status('s'); ret = 1; } } diff --git a/src/options.c b/src/options.c index 8fbdbfb..120541a 100644 --- a/src/options.c +++ b/src/options.c @@ -70,6 +70,7 @@ void init_parse_options(int argc, char **argv) #ifdef HAVE_LIBXINERAMA /* if we're using xinerama, then enable it by default */ opt.xinerama = 1; + opt.xinerama_index = -1; #endif /* HAVE_LIBXINERAMA */ feh_getopt_theme(argc, argv); @@ -236,7 +237,7 @@ static void feh_parse_options_from_string(char *opts) list[num - 1] = feh_string_normalize(s); break; - } else if (*t == '\"' && last != '\\') + } else if (((*t == '\"') || (*t == '\'')) && last != '\\') inquote = !(inquote); last = *t; } @@ -265,6 +266,9 @@ char *feh_string_normalize(char *str) else if ((*s == '\"') && (last == '\\')) ret[i++] = '\"'; else if ((*s == '\"') && (last == 0)); + else if ((*s == '\'') && (last == '\\')) + ret[i++] = '\''; + else if ((*s == '\'') && (last == 0)); else if ((*s == ' ') && (last == '\\')) ret[i++] = ' '; else @@ -272,7 +276,7 @@ char *feh_string_normalize(char *str) last = *s; } - if (i && (ret[i - 1] == '\"')) + if (i && ((ret[i - 1] == '\"') || (ret[i - 1] == '\''))) ret[i - 1] = '\0'; else ret[i] = '\0'; @@ -401,6 +405,7 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun) {"no-fehbg" , 0, 0, 236}, {"keep-zoom-vp" , 0, 0, 237}, {"scroll-step" , 1, 0, 238}, + {"xinerama-index", 1, 0, 239}, {0, 0, 0, 0} }; @@ -421,6 +426,10 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun) break; case '<': XParseGeometry(optarg, &discard, &discard, &opt.max_width, &opt.max_height); + if (opt.max_width == 0) + opt.max_width = UINT_MAX; + if (opt.max_height == 0) + opt.max_height = UINT_MAX; break; case '>': XParseGeometry(optarg, &discard, &discard, &opt.min_width, &opt.min_height); @@ -737,6 +746,9 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun) case 238: opt.scroll_step = atoi(optarg); break; + case 239: + opt.xinerama_index = atoi(optarg); + break; default: break; } diff --git a/src/options.h b/src/options.h index a22cc05..923aa41 100644 --- a/src/options.h +++ b/src/options.h @@ -109,6 +109,7 @@ struct __fehoptions { int default_zoom; int zoom_mode; unsigned char adjust_reload; + int xinerama_index; /* signed in case someone wants to invert scrolling real quick */ int scroll_step; diff --git a/src/slideshow.c b/src/slideshow.c index 6c5d9c8..7636d31 100644 --- a/src/slideshow.c +++ b/src/slideshow.c @@ -669,7 +669,7 @@ void slideshow_save_image(winwidget win) if (opt.verbose) fprintf(stderr, "saving image to filename '%s'\n", tmpname); - ungib_imlib_save_image_with_error_return(win->im, tmpname, &err); + gib_imlib_save_image_with_error_return(win->im, tmpname, &err); if (err) feh_imlib_print_load_error(tmpname, win, err); diff --git a/src/thumbnail.c b/src/thumbnail.c index 1719fdc..c806ce4 100644 --- a/src/thumbnail.c +++ b/src/thumbnail.c @@ -382,7 +382,7 @@ void init_thumbnail_mode(void) snprintf(output_buf, 1024, "%s/%s", opt.output_dir, opt.output_file); else strncpy(output_buf, opt.output_file, 1024); - ungib_imlib_save_image_with_error_return(td.im_main, output_buf, &err); + gib_imlib_save_image_with_error_return(td.im_main, output_buf, &err); if (err) { feh_imlib_print_load_error(output_buf, td.im_main, err); } diff --git a/src/wallpaper.c b/src/wallpaper.c index 3e19c41..b6f2c0c 100644 --- a/src/wallpaper.c +++ b/src/wallpaper.c @@ -298,21 +298,30 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled, /* string for sticking in ~/.fehbg */ char *fehbg = NULL; + char fehbg_args[512]; + fehbg_args[0] = '\0'; char *home; char filbuf[4096]; - char fehbg_xinerama[] = "--no-xinerama"; char *bgfill = NULL; bgfill = opt.image_bg == IMAGE_BG_WHITE ? "--image-bg white" : "--image-bg black" ; +#ifdef HAVE_LIBXINERAMA + if (opt.xinerama) { + if (opt.xinerama_index >= 0) { + snprintf(fehbg_args, sizeof(fehbg_args), + "--xinerama-index %d", opt.xinerama_index); + } + } + else + snprintf(fehbg_args, sizeof(fehbg_args), "--no-xinerama"); +#endif /* HAVE_LIBXINERAMA */ + /* local display to set closedownmode on */ Display *disp2; Window root2; int depth2; int in, out, w, h; - if (opt.xinerama) - fehbg_xinerama[0] = '\0'; - D(("Falling back to XSetRootWindowPixmap\n")); /* Put the filename in filbuf between ' and escape ' in the filename */ @@ -357,16 +366,30 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled, pmap_d1 = XCreatePixmap(disp, root, scr->width, scr->height, depth); #ifdef HAVE_LIBXINERAMA - if (opt.xinerama && xinerama_screens) - for (i = 0; i < num_xinerama_screens; i++) - feh_wm_set_bg_scaled(pmap_d1, im, use_filelist, - xinerama_screens[i].x_org, xinerama_screens[i].y_org, - xinerama_screens[i].width, xinerama_screens[i].height); + if (opt.xinerama_index >= 0) { + if (opt.image_bg == IMAGE_BG_WHITE) + gcval.foreground = WhitePixel(disp, DefaultScreen(disp)); + else + gcval.foreground = BlackPixel(disp, DefaultScreen(disp)); + gc = XCreateGC(disp, root, GCForeground, &gcval); + XFillRectangle(disp, pmap_d1, gc, 0, 0, scr->width, scr->height); + XFreeGC(disp, gc); + } + + if (opt.xinerama && xinerama_screens) { + for (i = 0; i < num_xinerama_screens; i++) { + if (opt.xinerama_index < 0 || opt.xinerama_index == i) { + feh_wm_set_bg_scaled(pmap_d1, im, use_filelist, + xinerama_screens[i].x_org, xinerama_screens[i].y_org, + xinerama_screens[i].width, xinerama_screens[i].height); + } + } + } else #endif /* HAVE_LIBXINERAMA */ feh_wm_set_bg_scaled(pmap_d1, im, use_filelist, 0, 0, scr->width, scr->height); - fehbg = estrjoin(" ", "feh", fehbg_xinerama, "--bg-scale", filbuf, NULL); + fehbg = estrjoin(" ", "feh", fehbg_args, "--bg-scale", filbuf, NULL); } else if (centered) { D(("centering\n")); @@ -380,11 +403,15 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled, XFillRectangle(disp, pmap_d1, gc, 0, 0, scr->width, scr->height); #ifdef HAVE_LIBXINERAMA - if (opt.xinerama && xinerama_screens) - for (i = 0; i < num_xinerama_screens; i++) - feh_wm_set_bg_centered(pmap_d1, im, use_filelist, - xinerama_screens[i].x_org, xinerama_screens[i].y_org, - xinerama_screens[i].width, xinerama_screens[i].height); + if (opt.xinerama && xinerama_screens) { + for (i = 0; i < num_xinerama_screens; i++) { + if (opt.xinerama_index < 0 || opt.xinerama_index == i) { + feh_wm_set_bg_centered(pmap_d1, im, use_filelist, + xinerama_screens[i].x_org, xinerama_screens[i].y_org, + xinerama_screens[i].width, xinerama_screens[i].height); + } + } + } else #endif /* HAVE_LIBXINERAMA */ feh_wm_set_bg_centered(pmap_d1, im, use_filelist, @@ -392,24 +419,38 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled, XFreeGC(disp, gc); - fehbg = estrjoin(" ", "feh", fehbg_xinerama, bgfill, "--bg-center", filbuf, NULL); + fehbg = estrjoin(" ", "feh", fehbg_args, bgfill, "--bg-center", filbuf, NULL); } else if (filled == 1) { pmap_d1 = XCreatePixmap(disp, root, scr->width, scr->height, depth); #ifdef HAVE_LIBXINERAMA - if (opt.xinerama && xinerama_screens) - for (i = 0; i < num_xinerama_screens; i++) - feh_wm_set_bg_filled(pmap_d1, im, use_filelist, - xinerama_screens[i].x_org, xinerama_screens[i].y_org, - xinerama_screens[i].width, xinerama_screens[i].height); + if (opt.xinerama_index >= 0) { + if (opt.image_bg == IMAGE_BG_WHITE) + gcval.foreground = WhitePixel(disp, DefaultScreen(disp)); + else + gcval.foreground = BlackPixel(disp, DefaultScreen(disp)); + gc = XCreateGC(disp, root, GCForeground, &gcval); + XFillRectangle(disp, pmap_d1, gc, 0, 0, scr->width, scr->height); + XFreeGC(disp, gc); + } + + if (opt.xinerama && xinerama_screens) { + for (i = 0; i < num_xinerama_screens; i++) { + if (opt.xinerama_index < 0 || opt.xinerama_index == i) { + feh_wm_set_bg_filled(pmap_d1, im, use_filelist, + xinerama_screens[i].x_org, xinerama_screens[i].y_org, + xinerama_screens[i].width, xinerama_screens[i].height); + } + } + } else #endif /* HAVE_LIBXINERAMA */ feh_wm_set_bg_filled(pmap_d1, im, use_filelist , 0, 0, scr->width, scr->height); - fehbg = estrjoin(" ", "feh", fehbg_xinerama, "--bg-fill", filbuf, NULL); + fehbg = estrjoin(" ", "feh", fehbg_args, "--bg-fill", filbuf, NULL); } else if (filled == 2) { @@ -422,11 +463,15 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled, XFillRectangle(disp, pmap_d1, gc, 0, 0, scr->width, scr->height); #ifdef HAVE_LIBXINERAMA - if (opt.xinerama && xinerama_screens) - for (i = 0; i < num_xinerama_screens; i++) - feh_wm_set_bg_maxed(pmap_d1, im, use_filelist, - xinerama_screens[i].x_org, xinerama_screens[i].y_org, - xinerama_screens[i].width, xinerama_screens[i].height); + if (opt.xinerama && xinerama_screens) { + for (i = 0; i < num_xinerama_screens; i++) { + if (opt.xinerama_index < 0 || opt.xinerama_index == i) { + feh_wm_set_bg_maxed(pmap_d1, im, use_filelist, + xinerama_screens[i].x_org, xinerama_screens[i].y_org, + xinerama_screens[i].width, xinerama_screens[i].height); + } + } + } else #endif /* HAVE_LIBXINERAMA */ feh_wm_set_bg_maxed(pmap_d1, im, use_filelist, @@ -434,7 +479,7 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled, XFreeGC(disp, gc); - fehbg = estrjoin(" ", "feh", fehbg_xinerama, bgfill, "--bg-max", filbuf, NULL); + fehbg = estrjoin(" ", "feh", fehbg_args, bgfill, "--bg-max", filbuf, NULL); } else { if (use_filelist) @@ -465,8 +510,9 @@ void feh_wm_set_bg(char *fil, Imlib_Image im, int centered, int scaled, } free(path); } - free(fehbg); } + + free(fehbg); /* create new display, copy pixmap to new display */ disp2 = XOpenDisplay(NULL); diff --git a/src/winwidget.c b/src/winwidget.c index a1b78d3..65cefca 100644 --- a/src/winwidget.c +++ b/src/winwidget.c @@ -443,8 +443,8 @@ void winwidget_render_image(winwidget winwid, int resize, int force_alias) feh_calc_needed_zoom(&(winwid->zoom), winwid->im_w, winwid->im_h, winwid->w, winwid->h); - if (resize && !opt.scale_down && (winwid->full_screen - || (opt.geom_flags & (WidthValue | HeightValue)))) { + if (resize && (winwid->full_screen + || (!opt.scale_down && (opt.geom_flags & (WidthValue | HeightValue))))) { int smaller; /* Is the image smaller than screen? */ int max_w = 0, max_h = 0; |