diff -Nau feh-1.3.4/src/events.c feh-1.3.4_mod/src/events.c --- feh-1.3.4/src/events.c 2005-07-14 07:59:03.000000000 -0400 +++ feh-1.3.4_mod/src/events.c 2008-02-23 03:48:22.000000000 -0500 @@ -51,6 +51,7 @@ ev_handler[i] = NULL; ev_handler[KeyPress] = feh_event_handle_keypress; + ev_handler[KeyRelease] = feh_event_handle_keyrelease; ev_handler[ButtonPress] = feh_event_handle_ButtonPress; ev_handler[ButtonRelease] = feh_event_handle_ButtonRelease; ev_handler[ConfigureNotify] = feh_event_handle_ConfigureNotify; diff -Nau feh-1.3.4/src/feh.h feh-1.3.4_mod/src/feh.h --- feh-1.3.4/src/feh.h 2005-07-14 07:59:03.000000000 -0400 +++ feh-1.3.4_mod/src/feh.h 2008-02-23 03:48:22.000000000 -0500 @@ -106,6 +106,7 @@ void show_version(void); int feh_main_iteration(int block); void feh_handle_event(XEvent * ev); +void feh_set_color_modifier( void ); void init_x_and_imlib(void); #ifdef HAVE_LIBXINERAMA void init_xinerama(void); @@ -126,6 +127,7 @@ char *slideshow_create_name(feh_file * file); char *chop_file_from_full_path(char *str); void feh_event_handle_keypress(XEvent * ev); +void feh_event_handle_keyrelease(XEvent * ev); void feh_action_run(feh_file * file, char *action); char *feh_printf(char *str, feh_file * file); void feh_draw_zoom(winwidget w); diff -Nau feh-1.3.4/src/imlib.c feh-1.3.4_mod/src/imlib.c --- feh-1.3.4/src/imlib.c 2005-07-14 07:59:03.000000000 -0400 +++ feh-1.3.4_mod/src/imlib.c 2008-02-23 03:48:22.000000000 -0500 @@ -66,6 +66,23 @@ } #endif /* HAVE_LIBXINERAMA */ + +void +feh_set_color_modifier( void ) +{ + Imlib_Color_Modifier cmod = imlib_create_color_modifier(); + if( cmod ) { + if( imlib_context_get_color_modifier() ) + imlib_free_color_modifier(); + imlib_context_set_color_modifier( cmod ); + imlib_modify_color_modifier_brightness(opt.brightness); + imlib_modify_color_modifier_contrast(opt.contrast); + imlib_modify_color_modifier_gamma(opt.gamma); + } +} + + + void init_x_and_imlib(void) { @@ -101,6 +118,9 @@ imlib_add_path_to_font_path(PREFIX "/share/feh/fonts"); imlib_add_path_to_font_path("./ttfonts"); + if( opt.flag&(FEH_FLAG_BRIGHTNESS|FEH_FLAG_CONTRAST|FEH_FLAG_GAMMA) ) + feh_set_color_modifier(); + D_RETURN_(4); } @@ -250,6 +270,7 @@ D_RETURN(4, 0); } + opt.flag |= FEH_FLAG_INITIAL_POSITION; D(3, ("Loaded ok\n")); D_RETURN(4, 1); } diff -Nau feh-1.3.4/src/keyevents.c feh-1.3.4_mod/src/keyevents.c --- feh-1.3.4/src/keyevents.c 2005-07-14 07:59:03.000000000 -0400 +++ feh-1.3.4_mod/src/keyevents.c 2008-02-23 04:36:57.000000000 -0500 @@ -29,6 +29,8 @@ #include "winwidget.h" #include "options.h" +extern int panpixel; + void feh_event_invoke_action(winwidget winwid, char *action) { @@ -58,6 +60,49 @@ } void +feh_event_handle_keyrelease(XEvent * ev) +{ + switch( XKeycodeToKeysym( disp, ev->xkey.keycode, 0 ) ) { + case XK_Shift_L : case XK_Shift_R: + panpixel = opt.normal_pan; + } +} + +static void +feh_apply_color_modifier( winwidget winwid ) +{ + feh_set_color_modifier(); + winwidget_render_image(winwid, 0, 0); + if( opt.flag&FEH_FLAG_ECHO_COLOR_MODIFIER ) + printf( "brightness=%f, contrast=%f, gamma=%f\n", + opt.brightness, opt.contrast, opt.gamma ); +} + +static void +feh_increase_reload_delay( void ) +{ + if( !(opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING) ) { + if (opt.reload < SLIDESHOW_RELOAD_MAX) + opt.reload++; + else if (opt.verbose) + weprintf("Cannot set RELOAD higher than %d seconds.", opt.reload); + } +} + + +static void +feh_decrease_reload_delay( void ) +{ + if( !(opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING) ) { + if (opt.reload > 1) + opt.reload--; + else if (opt.verbose) + weprintf("Cannot set RELOAD lower than 1 second."); + } +} + + +void feh_event_handle_keypress(XEvent * ev) { int len; @@ -188,27 +233,75 @@ D_RETURN_(4); } - switch (keysym) { + int orig_x, orig_y; + case XK_Shift_L: + case XK_Shift_R: + panpixel = opt.fast_pan; + break; case XK_Left: - if (opt.slideshow) - slideshow_change_image(winwid, SLIDE_PREV); + if( opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING ) { + orig_x = winwid->im_x; + winwid->im_x -= panpixel; + winwidget_sanitise_offsets(winwid); + if( winwid->im_x != orig_x ) + winwidget_render_image(winwid, 0, 0); + } + else { + if (opt.slideshow) + slideshow_change_image(winwid, SLIDE_PREV); + } break; case XK_Right: - if (opt.slideshow) - slideshow_change_image(winwid, SLIDE_NEXT); + if( opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING ) { + orig_x = winwid->im_x; + winwid->im_x += panpixel; + winwidget_sanitise_offsets(winwid); + if( winwid->im_x != orig_x ) + winwidget_render_image(winwid, 0, 0); + } + else { + if (opt.slideshow) + slideshow_change_image(winwid, SLIDE_NEXT); + } + break; + case XK_Up: + if( opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING ) { + orig_y = winwid->im_y; + winwid->im_y -= panpixel; + winwidget_sanitise_offsets(winwid); + if( winwid->im_y != orig_y ) + winwidget_render_image(winwid, 0, 0); + } + break; + case XK_Down: + if( opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING ) { + orig_y = winwid->im_y; + winwid->im_y += panpixel; + winwidget_sanitise_offsets(winwid); + if ( winwid->im_y != orig_y ) + winwidget_render_image(winwid, 0, 0); + } break; case XK_Page_Up: - if (opt.slideshow) - slideshow_change_image(winwid, SLIDE_JUMP_BACK); + if (opt.slideshow) { + if( opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING ) + slideshow_change_image(winwid, SLIDE_PREV ); + else + slideshow_change_image(winwid, SLIDE_JUMP_BACK); + } break; case XK_Escape: winwidget_destroy_all(); break; case XK_Page_Down: - if (opt.slideshow) - slideshow_change_image(winwid, SLIDE_JUMP_FWD); + if (opt.slideshow) { + if( opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING ) + slideshow_change_image(winwid, SLIDE_NEXT ); + else + slideshow_change_image(winwid, SLIDE_JUMP_FWD); + } break; case XK_Delete: /* Holding ctrl gets you a filesystem deletion and removal from the * @@ -282,33 +375,83 @@ feh_event_invoke_action(winwid,opt.actions[9]); break; case XK_KP_Left: - winwid->im_x = winwid->im_x - 10; - winwidget_render_image(winwid, 0, 0); + if( opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING ) { + if (opt.slideshow) + slideshow_change_image(winwid, SLIDE_PREV); + } + else { + winwid->im_x = winwid->im_x - 10; + winwidget_render_image(winwid, 0, 0); + } break; case XK_KP_Right: - winwid->im_x = winwid->im_x + 10; - winwidget_render_image(winwid, 0, 0); + if( opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING ) { + if (opt.slideshow) + slideshow_change_image(winwid, SLIDE_NEXT); + } + else { + winwid->im_x = winwid->im_x + 10; + winwidget_render_image(winwid, 0, 0); + } break; case XK_KP_Up: - winwid->im_y = winwid->im_y - 10; - winwidget_render_image(winwid, 0, 0); + if( opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING ) { + if (opt.slideshow) + slideshow_change_image(winwid, SLIDE_JUMP_BACK); + } + else { + winwid->im_y = winwid->im_y - 10; + winwidget_render_image(winwid, 0, 0); + } break; case XK_KP_Down: - winwid->im_y = winwid->im_y + 10; - winwidget_render_image(winwid, 0, 0); + if( opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING ) { + if (opt.slideshow) + slideshow_change_image(winwid, SLIDE_JUMP_FWD); + } + else { + winwid->im_y = winwid->im_y + 10; + winwidget_render_image(winwid, 0, 0); + } break; case XK_KP_Add: - winwid->zoom = winwid->zoom * 1.25; - winwidget_render_image(winwid, 0, 0); + if( opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING ) { + feh_increase_reload_delay(); + } + else { + winwid->zoom = winwid->zoom * 1.25; + winwidget_render_image(winwid, 0, 0); + } break; case XK_KP_Subtract: - winwid->zoom = winwid->zoom * 0.75; - winwidget_render_image(winwid, 0, 0); + if( opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING ) { + feh_decrease_reload_delay(); + } + else { + winwid->zoom = winwid->zoom * 0.75; + winwidget_render_image(winwid, 0, 0); + } + break; + case '+': case '=': // acdsee rule + if( opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING ) { + winwid->zoom = winwid->zoom * 1.25; + winwidget_render_image(winwid, 0, 0); + } + break; + case '-': case '_': // acdsee rule + if( opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING ) { + winwid->zoom = winwid->zoom * 0.75; + winwidget_render_image(winwid, 0, 0); + } break; + case '/': /* acdsee rule */ + if( !(opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING) ) break; case XK_KP_Multiply: winwid->zoom = 1; winwidget_render_image(winwid, 0, 0); break; + case '*': /* acdsee rule */ + if( !(opt.flag&FEH_FLAG_ACDSEE_KEY_BINDING) ) break; case XK_KP_Divide: feh_calc_needed_zoom(&winwid->zoom, winwid->im_w, winwid->im_h, winwid->w, winwid->h); winwidget_render_image(winwid, 0, 0); @@ -323,6 +466,30 @@ switch (*kbuf) { + case 'b': + opt.brightness -= opt.brightness_inc; + feh_apply_color_modifier(winwid); + break; + case 'B': + opt.brightness += opt.brightness_inc; + feh_apply_color_modifier(winwid); + break; + case 'g': + opt.gamma -= opt.gamma_inc; + feh_apply_color_modifier(winwid); + break; + case 'G': + opt.gamma += opt.gamma_inc; + feh_apply_color_modifier(winwid); + break; + case 't': + opt.contrast -= opt.contrast_inc; + feh_apply_color_modifier(winwid); + break; + case 'T': + opt.contrast += opt.contrast_inc; + feh_apply_color_modifier(winwid); + break; case 'n': case 'N': case ' ': @@ -426,17 +593,11 @@ #endif /* HAVE_LIBXINERAMA */ case '=': case '+': - if (opt.reload < SLIDESHOW_RELOAD_MAX) - opt.reload++; - else if (opt.verbose) - weprintf("Cannot set RELOAD higher than %d seconds.", opt.reload); + feh_increase_reload_delay(); break; case '-': case '_': - if (opt.reload > 1) - opt.reload--; - else if (opt.verbose) - weprintf("Cannot set RELOAD lower than 1 second."); + feh_decrease_reload_delay(); break; default: break; diff -Nau feh-1.3.4/src/main.c feh-1.3.4_mod/src/main.c --- feh-1.3.4/src/main.c 2005-07-14 07:59:03.000000000 -0400 +++ feh-1.3.4_mod/src/main.c 2008-02-23 03:48:22.000000000 -0500 @@ -35,6 +35,7 @@ int cmdargc = 0; int call_level = 0; char *mode = NULL; +int panpixel; int main(int argc, char **argv) @@ -81,6 +82,7 @@ init_slideshow_mode(); } + panpixel = opt.normal_pan; /* main event loop */ while (feh_main_iteration(1)); @@ -210,6 +212,9 @@ { D_ENTER(4); + if( imlib_context_get_color_modifier() ) + imlib_free_color_modifier(); + delete_rm_files(); if (opt.filelistfile) diff -Nau feh-1.3.4/src/options.c feh-1.3.4_mod/src/options.c --- feh-1.3.4/src/options.c 2005-07-14 07:59:03.000000000 -0400 +++ feh-1.3.4_mod/src/options.c 2008-02-23 04:09:43.000000000 -0500 @@ -27,6 +27,9 @@ #include "filelist.h" #include "options.h" +#define FEH_DEFAULT_NORMAL_PAN 10 +#define FEH_DEFAULT_FAST_PAN 30 + static void check_options(void); static void feh_parse_option_array(int argc, char **argv); static void feh_parse_environment_options(void); @@ -82,6 +85,14 @@ #endif /* HAVE_LIBXINERAMA */ opt.fmmode = 0; + + opt.normal_pan = FEH_DEFAULT_NORMAL_PAN; + opt.fast_pan = FEH_DEFAULT_FAST_PAN; + opt.brightness = 0.; + opt.contrast = 1.; + opt.gamma = 1.; + opt.brightness_inc = opt.contrast_inc = opt.gamma_inc = 0.05; + opt.flag = 0; D(3, ("About to parse env options (if any)\n")); /* Check for and parse any options in FEH_OPTIONS */ @@ -410,6 +421,20 @@ {"draw-actions", 0, 0, 222}, {"cache-thumbnails", 0, 0, 223}, {"cycle-once", 0, 0, 224}, + {"normal-pan", 1, 0, 225 }, + {"fast-pan",1,0,226 }, + {"antialias",0,0,227 }, + {"right",0,0,228}, + {"bottom",0,0,229}, + {"brightness",1,0,230}, + {"contrast",1,0,231}, + {"gamma",1,0,232}, + {"brightness-inc",1,0,233}, + {"contrast-inc",1,0,234}, + {"gamma-inc",1,0,235}, + {"echo-color-modifier",0,0,236}, + {"full-screen-only",0,0,237}, + {"acdsee",0,0,238}, {0, 0, 0, 0} }; int optch = 0, cmdx = 0, i = 0; @@ -738,6 +763,51 @@ case 224: opt.cycle_once = 1; break; + case 225: /* normal pan */ + opt.normal_pan = atoi(optarg); + break; + case 226: /* fast pan */ + opt.fast_pan = atoi(optarg); + break; + case 227: /* antialias */ + opt.flag |= FEH_FLAG_ANTIALIAS; + break; + case 228: /* right */ + opt.flag |= FEH_FLAG_RIGHT; + break; + case 229: /* bottom */ + opt.flag |= FEH_FLAG_BOTTOM; + break; + case 230: /* brightness */ + opt.brightness = atof(optarg); + opt.flag |= FEH_FLAG_BRIGHTNESS; + break; + case 231: /* contrast */ + opt.contrast = atof(optarg); + opt.flag |= FEH_FLAG_CONTRAST; + break; + case 232: /* gamma */ + opt.gamma = atof(optarg); + opt.flag |= FEH_FLAG_GAMMA; + break; + case 233: /* brightness inc */ + opt.brightness_inc = atof(optarg); + break; + case 234: /* contrast inc */ + opt.contrast_inc = atof(optarg); + break; + case 235: /* gamma inc */ + opt.gamma_inc = atof(optarg); + break; + case 236: /* echo color modifier */ + opt.flag |= FEH_FLAG_ECHO_COLOR_MODIFIER; + break; + case 237: /* full screen only */ + opt.flag |= FEH_FLAG_FULL_SCREEN_ONLY; + break; + case 238: /* acdsee */ + opt.flag |= FEH_FLAG_ACDSEE_KEY_BINDING; + break; default: break; } diff -Nau feh-1.3.4/src/options.h feh-1.3.4_mod/src/options.h --- feh-1.3.4/src/options.h 2005-07-14 07:59:03.000000000 -0400 +++ feh-1.3.4_mod/src/options.h 2008-02-23 04:08:23.000000000 -0500 @@ -126,8 +126,25 @@ double slideshow_delay; Imlib_Font menu_fn; + int normal_pan; + int fast_pan; + double brightness, brightness_inc; + double contrast, contrast_inc; + double gamma, gamma_inc; + unsigned flag; }; +#define FEH_FLAG_ANTIALIAS 0x00000001 +#define FEH_FLAG_RIGHT 0x00000002 +#define FEH_FLAG_BOTTOM 0x00000004 +#define FEH_FLAG_BRIGHTNESS 0x00000008 +#define FEH_FLAG_CONTRAST 0x00000010 +#define FEH_FLAG_GAMMA 0x00000020 +#define FEH_FLAG_ECHO_COLOR_MODIFIER 0x00000040 +#define FEH_FLAG_FULL_SCREEN_ONLY 0x00000080 +#define FEH_FLAG_INITIAL_POSITION 0x00000100 +#define FEH_FLAG_ACDSEE_KEY_BINDING 0x00000200 + void init_parse_options(int argc, char **argv); char *feh_string_normalize(char *str); void feh_create_default_config(char *rcfile); Common subdirectories: feh-1.3.4/src/ttfonts and feh-1.3.4_mod/src/ttfonts diff -Nau feh-1.3.4/src/winwidget.c feh-1.3.4_mod/src/winwidget.c --- feh-1.3.4/src/winwidget.c 2005-07-14 07:59:03.000000000 -0400 +++ feh-1.3.4_mod/src/winwidget.c 2008-02-23 03:48:22.000000000 -0500 @@ -355,11 +355,20 @@ D_ENTER(4); - if (!winwid->full_screen && resize) { + if( opt.flag&FEH_FLAG_ANTIALIAS ) + alias = 1; + + if ( !winwid->full_screen && resize) { winwidget_resize(winwid, winwid->im_w, winwid->im_h); winwidget_reset_image(winwid); } + if( opt.flag&FEH_FLAG_INITIAL_POSITION ) { + if( opt.flag&FEH_FLAG_RIGHT ) winwid->im_x = winwid->w - winwid->im_w; + if( opt.flag&FEH_FLAG_BOTTOM ) winwid->im_y = winwid->h - winwid->im_h; + opt.flag &= ~FEH_FLAG_INITIAL_POSITION; + } + /* bounds checks for panning */ if (winwid->im_x > winwid->w) winwid->im_x = winwid->w; @@ -388,8 +397,11 @@ if (resize && (winwid->full_screen || opt.geom_flags)) { int smaller; /* Is the image smaller than screen? */ int max_w, max_h; + int full_screen_only = 0; if (winwid->full_screen) { + if( opt.flag&FEH_FLAG_FULL_SCREEN_ONLY ) + full_screen_only = 1; max_w = scr->width; max_h = scr->height; #ifdef HAVE_LIBXINERAMA @@ -410,7 +422,7 @@ D(4, ("Calculating for fullscreen/fixed geom render\n")); smaller = ((winwid->im_w < max_w) && (winwid->im_h < max_h)); - if (!smaller || opt.auto_zoom) { + if ( ( !full_screen_only && !smaller ) || opt.auto_zoom) { double ratio = 0.0; /* Image is larger than the screen (so wants shrinking), or it's @@ -464,8 +476,10 @@ winwid->zoom = 1.0; } /* Just center the image in the window */ - winwid->im_x = (int)(max_w - (winwid->im_w * winwid->zoom)) >> 1; - winwid->im_y = (int)(max_h - (winwid->im_h * winwid->zoom)) >> 1; + if( winwid->im_w < max_w ) + winwid->im_x = (int)(max_w - (winwid->im_w * winwid->zoom)) >> 1; + if( winwid->im_h < max_h ) + winwid->im_y = (int)(max_h - (winwid->im_h * winwid->zoom)) >> 1; } } @@ -518,12 +532,21 @@ winwid-> im_angle, 1, 1, alias); - else - gib_imlib_render_image_part_on_drawable_at_size(winwid->bg_pmap, + else { + /* maybe there is a bug in gib_imlib, color modifiers are not applied + in some part of image when gib_imlib_render_image_part_on_drawable_at_size + option, so use gib_imlib_render_image_on_drawable if scaling is not needed */ + if( sw==dw && sh==dh ) + gib_imlib_render_image_on_drawable( winwid->bg_pmap, winwid->im, + -sx+dx, -sy+dy, 1, gib_imlib_image_has_alpha(winwid->im), alias); + else + gib_imlib_render_image_part_on_drawable_at_size(winwid->bg_pmap, winwid->im, sx, sy, sw, sh, dx, dy, dw, dh, 1, gib_imlib_image_has_alpha (winwid->im), alias); + } + if (opt.caption_path) { /* cache bg pixmap. during caption entry, multiple redraws are done * because the caption overlay changes - the image doesn't though, so re-