修改geeqie幻灯片以从头开始向后导航

时间:2019-05-29 18:38:49

标签: c raspberry-pi3 raspbian

我正在尝试修改geeqie source code,以便在幻灯片中向后滚动鼠标时将幻灯片转到上一张图像,当幻灯片开始时(幻灯片的第一张图像),应该转到幻灯片的最后一张图片。我设法将其恢复为工作状态,以便返回到倒数第二个图像。我无法正常工作,所以它转到了最后一张图片。

有什么建议可以使其工作到最后一张图像吗?

原始代码部分(full 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);
            */

        }

0 个答案:

没有答案