Я пытаюсь изменить исходный код geeqie , чтобы слайд-шоу переходило к предыдущему изображению при прокрутке мыши назад в слайд-шоу, когда оно находится в начале (первое изображение слайд-шоу), оноследует перейти к последнему изображению слайд-шоу.Мне удалось заставить его работать, так что он возвращается ко второму последнему изображению.Я не могу заставить его работать, поэтому он переходит к последнему изображению.
Какие-либо предложения, чтобы он работал, чтобы он перешел к последнему изображению?
Часть исходного кода ( полная)origional slideshow.c ):
static gboolean slideshow_step(SlideShowData *ss, gboolean forward)
{
gint row;
if (!slideshow_should_continue(ss))
{
return FALSE;
}
if (forward)
{
if (!ss->list) return TRUE;
row = GPOINTER_TO_INT(ss->list->data);
ss->list_done = g_list_prepend(ss->list_done, ss->list->data);
ss->list = g_list_remove(ss->list, ss->list->data);
}
else
{
if (!ss->list_done || !ss->list_done->next) return TRUE;
ss->list = g_list_prepend(ss->list, ss->list_done->data);
ss->list_done = g_list_remove(ss->list_done, ss->list_done->data);
row = GPOINTER_TO_INT(ss->list_done->data);
}
file_data_unref(ss->slide_fd);
ss->slide_fd = NULL;
if (ss->filelist)
{
ss->slide_fd = file_data_ref((FileData *)g_list_nth_data(ss->filelist, row));
if (ss->lw)
layout_set_fd(ss->lw, ss->slide_fd);
else
image_change_fd(ss->imd, ss->slide_fd, image_zoom_get_default(ss->imd));
}
else if (ss->cd)
{
CollectInfo *info;
info = g_list_nth_data(ss->cd->list, row);
ss->slide_fd = file_data_ref(info->fd);
if (ss->lw)
image_change_from_collection(ss->lw->image, ss->cd, info, image_zoom_get_default(ss->lw->image));
else
image_change_from_collection(ss->imd, ss->cd, info, image_zoom_get_default(ss->imd));
}
else
{
ss->slide_fd = file_data_ref(layout_list_get_fd(ss->lw, row));
if (ss->from_selection)
{
layout_set_fd(ss->lw, ss->slide_fd);
layout_status_update_info(ss->lw, NULL);
}
else
{
layout_image_set_index(ss->lw, row);
}
}
if (!ss->list && options->slideshow.repeat)
{
slideshow_list_init(ss, -1);
}
if (!ss->list)
{
return FALSE;
}
/* read ahead */
if (options->image.enable_read_ahead && (!ss->lw || ss->from_selection))
{
gint r;
if (forward)
{
if (!ss->list) return TRUE;
r = GPOINTER_TO_INT(ss->list->data);
}
else
{
if (!ss->list_done || !ss->list_done->next) return TRUE;
r = GPOINTER_TO_INT(ss->list_done->next->data);
}
if (ss->filelist)
{
image_prebuffer_set(ss->imd, g_list_nth_data(ss->filelist, r));
}
else if (ss->cd)
{
CollectInfo *info;
info = g_list_nth_data(ss->cd->list, r);
if (info) image_prebuffer_set(ss->imd, info->fd);
}
else if (ss->from_selection)
{
image_prebuffer_set(ss->lw->image, layout_list_get_fd(ss->lw, r));
}
}
return TRUE;
}
То, что я изменил:
if (forward)
{
if (!ss->list) return TRUE;
row = GPOINTER_TO_INT(ss->list->data);
ss->list_done = g_list_prepend(ss->list_done, ss->list->data);
ss->list = g_list_remove(ss->list, ss->list->data);
}
else
{
if (!ss->list_done || !ss->list_done->next)
{
//this sets the slideshow back to the last image
slideshow_list_init(ss, ss->slide_count);
}
//then somehow it goes again to the second last image because of this part
ss->list = g_list_prepend(ss->list, ss->list_done->data);
ss->list_done = g_list_remove(ss->list_done, ss->list_done->data);
row = GPOINTER_TO_INT(ss->list_done->data);
}
Вещи, которые я пытался сыграть с:
if (forward)
{
if (!ss->list) return TRUE;
//slide_count: 143, row: 142, list: 0, list_done: 143
row = GPOINTER_TO_INT(ss->list->data);
ss->list_done = g_list_prepend(ss->list_done, ss->list->data);
ss->list = g_list_remove(ss->list, ss->list->data);
}
else
{
//gboolean has_scrolled_back = FALSE;
if (!ss->list_done || !ss->list_done->next)
{
slideshow_list_init(ss, ss->slide_count);
//slide_count: 143, row: 160, list: 0, list_done: 143
//row = GPOINTER_TO_INT(ss->slide_count);
//has_scrolled_back = TRUE;
//ss->list = g_list_prepend(ss->list, ss->list_done->data);
//ss->list_done = g_list_remove(ss->list_done, ss->list_done->data);
row = GPOINTER_TO_INT(ss->list_done->data);
} else {
//this goes to the bottom image - 1
ss->list = g_list_prepend(ss->list, ss->list_done->data);
ss->list_done = g_list_remove(ss->list_done, ss->list_done->data);
row = GPOINTER_TO_INT(ss->list_done->data);
}
/* if (has_scrolled_back == TRUE)
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new(GTK_WINDOW (ss->imd),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"slide_count: %d, row: %d, list: %d, list_done: %d",
GINT_TO_POINTER(ss->slide_count), row,
g_list_length(ss->list),
g_list_length(ss->list_done));
//g_error_free (error);
g_signal_connect(dialog, "response", G_CALLBACK(gtk_widget_destroy), NULL);
gtk_widget_show (dialog);
} */
/*
if (!ss->list_done || !ss->list_done->next)
{
return TRUE;
}
ss->list = g_list_prepend(ss->list, ss->list_done->data);
ss->list_done = g_list_remove(ss->list_done, ss->list_done->data);
row = GPOINTER_TO_INT(ss->list_done->data);
*/
}