なんとなく退屈だったので久々にGtkのソースでもいじろうと思って、debianのsidにあるイメージビューア(gpicview)にスライドショー機能を適当につけてみた。

スライドショーで表示する時間が3秒固定だったりして色々アレであるが、一応スライドショーにはなるしこれで良いや( ̄ー ̄)ニヤリ

diff -uprN old/gpicview-0.2.0/src/main-win.c new/gpicview-0.2.0/src/main-win.c
--- old/gpicview-0.2.0/src/main-win.c   2009-05-30 02:19:04.000000000 +0900
+++ new/gpicview-0.2.0/src/main-win.c   2009-07-06 21:12:25.000000000 +0900
@@ -98,6 +98,21 @@ void on_flip_horizontal( GtkWidget* btn,
 static int trans_angle_to_id(int i);
 static int get_new_angle( int orig_angle, int rotate_angle );

+// for slide show
+static gboolean is_slide_show = FALSE;
+static gint slide_show_tag = -1;
+
+struct slide_show_data_ {
+       GtkWidget *btn;
+       MainWin *mw;
+} slide_show_data;
+
+static void set_slide_show_timeout(gpointer data);
+static gint slide_show_callback(gpointer data);
+static void on_slide_show(GtkWidget *btn, MainWin *mw);
+static void slide_show_start(GtkWidget *btn, MainWin *mw);
+static void slide_show_stop(GtkWidget *btn, MainWin *mw);
+
 // Begin of GObject-related stuff

 G_DEFINE_TYPE( MainWin, main_win, GTK_TYPE_WINDOW )
@@ -1329,6 +1344,7 @@ void show_popup_menu( MainWin* mw, GdkEv
         PTK_SEPARATOR_MENU_ITEM,
         PTK_IMG_MENU_ITEM( N_("Preferences"), GTK_STOCK_PREFERENCES, G_CALLBACK(on_preference), GDK_P, 0 ),
         PTK_STOCK_MENU_ITEM( GTK_STOCK_ABOUT, on_about ),
+       PTK_IMG_MENU_ITEM( N_("SlideShow"), GTK_STOCK_QUIT, G_CALLBACK(on_slide_show), GDK_V, 0 ),
         PTK_SEPARATOR_MENU_ITEM,
         PTK_IMG_MENU_ITEM( N_("Quit"), GTK_STOCK_QUIT, G_CALLBACK(on_quit), GDK_Q, 0 ),
         PTK_MENU_END
@@ -1444,3 +1460,49 @@ void on_drag_data_received( GtkWidget* w
         g_free( file );
     }
 }
+
+void on_slide_show(GtkWidget *btn, MainWin *mw)
+{
+       slide_show_start(btn, mw);
+}
+
+void slide_show_start(GtkWidget *btn, MainWin *mw)
+{
+       // if slide show has been working, slide show is going to stop
+       if (is_slide_show) {
+               slide_show_stop(btn, mw);
+               return ;
+       }
+
+       g_print("slide show start\n");
+
+       slide_show_data.btn = btn;
+       slide_show_data.mw = mw;
+
+       is_slide_show = TRUE;
+       set_slide_show_timeout((gpointer) &slide_show_data);
+}
+
+void slide_show_stop(GtkWidget *btn, MainWin *mw)
+{
+       g_print("slide show stop\n");
+
+       is_slide_show = FALSE;
+       gtk_timeout_remove(slide_show_tag);
+       slide_show_tag = -1;
+}
+
+gint slide_show_callback(gpointer data)
+{
+       struct slide_show_data_ *tmp =  (struct slide_show_data_ *) data;
+
+       on_next(tmp->btn, tmp->mw);
+       set_slide_show_timeout(data);
+
+       return 0;
+}
+
+void set_slide_show_timeout(gpointer data)
+{
+       slide_show_tag = gtk_timeout_add(3000, &slide_show_callback, data);
+}