Dear d3fault,

Here is the upstream fix.

In patch form:
 svn diff http://svn.savannah.nongnu.org/svn/fbi-improved -r 1676:1677
 (also attached)
 
In 0.6 trunk tarball:
 http://download.savannah.nongnu.org/releases/fbi-improved/fim-0.6-trunk.tar.gz
 
http://download.savannah.nongnu.org/releases/fbi-improved/fim-0.6-trunk.tar.gz.sig

Would be great if you could give it a try.

Cheers,
Michele

On 20221010@08:05, Michele Martone wrote:
> Dear d3fault,
> 
> Thanks for reporting of this defect.
> 
> Unfortunately it's also in the latest revision.
> I'll let you know here once I attack the problem.
> 
> The good news in the last weeks I'm very active with fim, so 
> *maybe* we get this solved soon-ish :-)
> 
> ciao,
> Michele
> 
> On 20221009@09:57, d3fault wrote:
> > Package: fim
> > Version: 0.5.3-9+b1
> > Severity: normal
> > X-Debbugs-Cc: [email protected]
> > 
> > Dear Maintainer,
> > 
> >    * What led up to the situation?
> >       fim --slideshow=5 ./*.jpg
> >    * What exactly did you do (or not do) that was effective (or
> >      ineffective)?
> >       I looked at the screen. I also pressed 'q'.
> >    * What was the outcome of this action?
> >       The first image of the slideshow was just all black. The 2nd+
> > images do show.
> >       Also if you press 'q' while the slideshow is still running, the
> > app doesn't quit
> >       but instead it just progresses to the next image. After all the
> > images have been
> >       shown, then 'q' will quit. I would also expect slideshow mode to
> > loop around
> >       indefinitely, but that's not really a bug.
> >    * What outcome did you expect instead?
> >       I expected to see the first image. I also expected 'q' to quit the 
> > app.
> > 
> > Also confirmed the bug exists on Bullseye.
> > It works fine in fbi.
> > 
> > 
> > -- System Information:
> > Debian Release: bookworm/sid
> >   APT prefers unstable
> >   APT policy: (500, 'unstable')
> > Architecture: amd64 (x86_64)
> > 
> > Kernel: Linux 5.10.0-18-amd64 (SMP w/4 CPU threads)
> > Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE 
> > not set
> > Shell: /bin/sh linked to /usr/bin/dash
> > Init: systemd (via /run/systemd/system)
> > 
> > Versions of packages fim depends on:
> > ii  libaa1           1.4p5-50
> > ii  libc6            2.35-3
> > ii  libdjvulibre21   3.5.28-2
> > ii  libexif12        0.6.24-1+b1
> > ii  libgcc-s1        12.2.0-5
> > ii  libgif7          5.2.1-2.5
> > ii  libjpeg62-turbo  1:2.1.2-1+b1
> > ii  libpng16-16      1.6.38-2
> > ii  libreadline8     8.2-1
> > ii  libsdl1.2debian  1.2.15+dfsg2-8
> > ii  libstdc++6       12.2.0-5
> > ii  libtiff5         4.4.0-4
> > 
> > fim recommends no packages.
> > 
> > fim suggests no packages.
> > 
> > -- no debconf information


Index: trunk/src/CommandConsole.h
===================================================================
--- trunk/src/CommandConsole.h	(revision 1676)
+++ trunk/src/CommandConsole.h	(revision 1677)
@@ -410,6 +410,7 @@
 	public:
 	void switch_if_needed(void);
 	fim::string getInfoCustom(const fim_char_t * ifsp)const;
+	fim_int show_must_go_on(void) const;
 };
 }
 
Index: trunk/src/CommandConsole.cpp
===================================================================
--- trunk/src/CommandConsole.cpp	(revision 1676)
+++ trunk/src/CommandConsole.cpp	(revision 1677)
@@ -645,7 +645,7 @@
 			else
 #endif /* FIM_ITERATED_COMMANDS */
 				status=execute_internal(getBoundAction(c).c_str(),FIM_X_NULL);
-			if( show_must_go_on_ )
+			if( show_must_go_on_ > 0 )
 				FIM_AUTOCMD_EXEC_POST(FIM_ACM_POSTINTERACTIVECOMMAND);
 		}
 
@@ -901,10 +901,14 @@
 		 *	Allows user to press any key during loop.
 		 *	Loop will continue its execution, unless pressed key is exitBinding_.
 		 *	If not, and if the key is bound to some action, this action is executed.
-		 *	returns 1 if loop has to be broken.
+		 *	If loop has to be broken, returns 1 and changes show_must_go_on_ to 2.
 		 */
 		fim_key_t c;
 
+		if ( !show_must_go_on_ )
+		       	goto err;
+		show_must_go_on_ = 1;
+
 		if ( exitBinding_ == 0 )
 		       	goto err;	/* any key triggers an exit */
 
@@ -931,7 +935,8 @@
 		}
 		return 0;	/* no chars read  */
 err:
-		return 1;	/* loop shall be broken */
+		show_must_go_on_ = 2;
+		return 1;	/* break any enclosing loop */
 	}
 		
 #ifdef	FIM_USE_GPM
@@ -1174,6 +1179,7 @@
 #if FIM_WANT_BACKGROUND_LOAD
 		blt_.join();
 #endif /* FIM_WANT_BACKGROUND_LOAD */
+		show_must_go_on_ = -1; /* without this it would break loops in postExecutionCommand_ aka -F */
 		FIM_AUTOCMD_EXEC(FIM_ACM_POSTEXECUTIONCYCLE,initial);
 		return quit(return_code_);
 	}
@@ -2675,4 +2681,9 @@
 labeldone:
 	return linebuffer;
 }
+
+fim_int CommandConsole::show_must_go_on(void) const
+{
+	return show_must_go_on_;
+}
 } /* namespace fim */
Index: trunk/src/fim.h
===================================================================
--- trunk/src/fim.h	(revision 1676)
+++ trunk/src/fim.h	(revision 1677)
@@ -1082,7 +1082,7 @@
 #define FIM_FLT_HELP_DISPLAY FIM_FLT_DISPLAY " ['reinit' {string}]|'resize' {w} {h}]: display the current file contents." FIM_CNS_CMDSEP "If 'reinit' switch is supplied, the '{string}' specifier will be used to reinitialize (e.g.: change resolution, window system options) the display device." FIM_CNS_CMDSEP "See documentation for the --" FIM_OSW_OUTPUT_DEVICE " command line switch for allowed values of {string}." FIM_CNS_CMDSEP "If 'resize' and no argument, will ask the window manager to size the window like the image." FIM_CNS_CMDSEP "If 'resize' and two arguments, these will be used as width and height of window, to set."
 
 /*  */
-#define FIM_CNS_SLIDESHOW_CMD "while(" FIM_VID_FILEINDEX "<" FIM_VID_FILELISTLEN "){sleep " FIM_VID_WANT_SLEEPS "; next;}"
+#define FIM_CNS_SLIDESHOW_CMD FIM_FLT_RELOAD "; i:fresh=1; while(" FIM_VID_FILEINDEX "<" FIM_VID_FILELISTLEN "){sleep " FIM_VID_WANT_SLEEPS "; next;}"
 #define FIM_CNS_QUIET_CMD FIM_VID_DISPLAY_STATUS "=0;" FIM_VID_DISPLAY_BUSY "=0;"
 
 /*
Index: trunk/src/testdir/test13.in
===================================================================
--- trunk/src/testdir/test13.in	(revision 1676)
+++ trunk/src/testdir/test13.in	(revision 1677)
@@ -1,6 +1,6 @@
 # file browsing test
 # in order for this test to terminate, we need some files ..
-if(_filelistlen>1){stdout "at least one file in the list.";quit 1;}
+if(_filelistlen>1){stdout "at least one file in the list.";}
 if(_filelistlen<1){stdout "probable problems with file browser.";quit 1;}
 while(_filelistlen>1){list "pop";}
 stdout _filelistlen;
Index: trunk/src/fim.cpp
===================================================================
--- trunk/src/fim.cpp	(revision 1676)
+++ trunk/src/fim.cpp	(revision 1677)
@@ -263,7 +263,11 @@
     },
     {"slideshow",     required_argument, FIM_NULL, 0x7373,
 	"interruptible slideshow mode", FIM_CNS_EX_NUM_STRING,
-	"Interruptible slideshow mode; will wait for " FIM_CNS_EX_NUM_STRING " of seconds (assigned to the " FIM_VID_WANT_SLEEPS " variable after each loading; implemented by executing " FIM_CNS_SLIDESHOW_CMD " as a first command."
+	"Interruptible slideshow mode. "
+	"Wait for " FIM_CNS_EX_NUM_STRING " of seconds (assigned to the " FIM_VID_WANT_SLEEPS " variable) after each image. "
+	"Implemented by executing " FIM_CNS_SLIDESHOW_CMD " as a first command. "
+	"Can be interrupted by " FIM_KBD_COLON " or " FIM_KBD_ESC ". "
+	"The other keys will execute accordingly to their function but will not interrupt the slideshow."
     },
     {"sanity-check",      no_argument,       FIM_NULL, 0x70617363,
 	"only perform a sanity check", FIM_NULL, /* Was -S until r1001 */
Index: trunk/src/fim_interpreter.cpp
===================================================================
--- trunk/src/fim_interpreter.cpp	(revision 1676)
+++ trunk/src/fim_interpreter.cpp	(revision 1677)
@@ -67,7 +67,7 @@
 #define FIM_EC(CMD,ARGS) /* fim::cc.execute(CMD,ARGS) */ "result" /*Var((fim_int)1)*/ /* FIXME: shall return Arg or Var or Val */
 typedef nodeType * NodeType;
 #else /* FIM_INDEPENDENT_NAMESPACE */
-#define FIM_NO_BREAK fim::cc.catchLoopBreakingCommand(0)==0
+#define FIM_NO_BREAK ( abs(fim::cc.show_must_go_on()) == 1 && ( fim::cc.catchLoopBreakingCommand(0)==0) )
 #define FIM_OPRND(P,N) ((P)->opr.op[(N)])
 #define FIM_FACC(O)  (O)->fid.f
 #define FIM_SACC(O)  (O)->scon.s
Index: trunk/doc/fim.man.in
===================================================================
--- trunk/doc/fim.man.in	(revision 1676)
+++ trunk/doc/fim.man.in	(revision 1677)
@@ -207,7 +207,7 @@
 Set scroll steps for internal variable _steps (default is 20%).
 .TP
 .B  --slideshow {number}
-Interruptible slideshow mode; will wait for {number} of seconds (assigned to the _want_sleep_seconds variable after each loading; implemented by executing while(_fileindex<_filelistlen){sleep _want_sleep_seconds; next;} as a first command.
+Interruptible slideshow mode. Wait for {number} of seconds (assigned to the _want_sleep_seconds variable) after each image. Implemented by executing reload; i:fresh=1; while(_fileindex<_filelistlen){sleep _want_sleep_seconds; next;} as a first command. Can be interrupted by : or Esc. The other keys will execute accordingly to their function but will not interrupt the slideshow.
 .TP
 .B  --sanity-check
 Perform a quick sanity check, just after the initialization, and terminate.
Index: trunk/NEWS
===================================================================
--- trunk/NEWS	(revision 1676)
+++ trunk/NEWS	(revision 1677)
@@ -3,6 +3,8 @@
 
                 Version 0.6-trunk
 
+# (r1677)
+ * Slideshow function (e.g `fim --slideshow=5 *.jpg`) now more responsive.
 # (r1662)
  * Arrow keys are now working in aalib (-o aa).
 # (r1649)

Attachment: signature.asc
Description: PGP signature

Reply via email to