diff src/layout_image.c @ 220:7670d5653e1f

Honor selection while fullscreen navigation. The behavior is now consistent in full screen and windowed mode. It fixes the fact that the selection was discarded on "Next". Patch by Uwe Ohse. Cleanups by Laurent Monin.
author zas_
date Wed, 02 Apr 2008 10:40:54 +0000
parents fa0e05f985c3
children bee34a6a4aec
line wrap: on
line diff
--- a/src/layout_image.c	Tue Apr 01 07:42:31 2008 +0000
+++ b/src/layout_image.c	Wed Apr 02 10:40:54 2008 +0000
@@ -1159,6 +1159,44 @@
 		read_ahead_fd = layout_list_get_fd(lw, index + 1);
 		}
 
+ 	if (layout_selection_count(lw, 0) > 1)
+		{
+ 		GList *x = layout_selection_list_by_index(lw);
+ 	  	GList *y;
+ 	  	GList *last;
+
+ 		for (last = y = x; y; y = y->next)
+ 			last = y;
+		for (y = x; y && ((gint)y->data) != index; y = y->next)
+			;
+
+		if (y)
+			{
+			gint newindex;
+
+			if ((index > old && (index != (gint) last->data || old != (gint) x->data))
+ 	        	    || (old == (gint) last->data && index == (gint) x->data))
+			    	{
+				if (y->next)
+ 					newindex = (gint) y->next->data;
+				else
+ 					newindex = (gint) x->data;
+				}
+			else
+				{
+				if (y->prev)
+					newindex = (gint) y->prev->data;
+				else
+					newindex = (gint) last->data;
+ 	    			}
+
+			read_ahead_fd = layout_list_get_fd(lw, newindex);
+			}
+			
+		while (x)
+			x = g_list_remove(x, x->data);
+		}
+
 	layout_image_set_with_ahead(lw, fd, read_ahead_fd);
 }
 
@@ -1260,6 +1298,27 @@
 		return;
 		}
 
+	if (layout_selection_count(lw, 0) > 1)
+		{
+		GList *x = layout_selection_list_by_index(lw);
+		gint old = layout_list_get_index(lw, layout_image_get_path(lw));
+		GList *y;
+
+		for (y = x; y && ((gint) y->data) != old; y = y->next)
+			;
+		if (y)
+			{
+			if (y->next) 
+		    		layout_image_set_index(lw, (gint) y->next->data);
+		  	else
+		    		layout_image_set_index(lw, (gint) x->data);
+			}
+		while (x)
+			x = g_list_remove(x, x->data);
+		if (y) /* not dereferenced */
+			return;
+		}
+
 	cd = image_get_collection(lw->image, &info);
 
 	if (cd && info)
@@ -1309,6 +1368,30 @@
 		return;
 		}
 
+	if (layout_selection_count(lw, 0) > 1)
+		{
+		GList *x = layout_selection_list_by_index(lw);
+		gint old = layout_list_get_index(lw, layout_image_get_path(lw));
+		GList *y;
+		GList *last;
+
+		for (last = y = x; y; y = y->next)
+			last = y;
+		for (y = x; y && ((gint) y->data) != old; y = y->next)
+			;
+		if (y)
+			{
+		  	if (y->prev)
+				layout_image_set_index(lw, (gint) y->prev->data);
+			else
+				layout_image_set_index(lw, (gint) last->data);
+			}
+		while (x)
+			x = g_list_remove(x, x->data);
+		if (y) /* not dereferenced */
+			return;
+		}
+
 	cd = image_get_collection(lw->image, &info);
 
 	if (cd && info)