2009-07-02 6 views
1

これはデフォルトのgnomeスクリーンセーバーの1つです - 「個人的なスライドショー」。ある場所からの画像を表示し、画像間で〜10秒間停止します。誰もがループする方法を知っている&一時停止?Cループの図解

私は遅延を増やそうとしていますが、どうやってそれをやっているのかわからずにsleep()を追加することを躊躇しています。

おかげ

#include "config.h" 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 

#include <glib.h> 
#include <glib/gi18n.h> 
#include <glib/gstdio.h> 
#include <gtk/gtk.h> 

#include "gs-theme-window.h" 
#include "gs-theme-engine.h" 
#include "gste-slideshow.h" 

#include "xdg-user-dir-lookup.h" 

int 
main (int argc, char **argv) 
{ 
     GSThemeEngine *engine; 
     GtkWidget  *window; 
     GError  *error; 
     gboolean  ret; 
     char   *location = NULL; 
     char   *background_color = NULL; 
     gboolean  sort_images = FALSE; 
     gboolean  no_stretch = FALSE; 
     GOptionEntry entries [] = { 
       { "location", 0, 0, G_OPTION_ARG_STRING, &location, 
        N_("Location to get images from"), N_("PATH") }, 
       { "background-color", 0, 0, G_OPTION_ARG_STRING, &background_color, 
        N_("Color to use for images background"), N_("\"#rrggbb\"") }, 
       { "sort-images", 0, 0, G_OPTION_ARG_NONE, &sort_images, 
        N_("Do not randomize pictures from location"), NULL }, 
       { "no-stretch", 0, 0, G_OPTION_ARG_NONE, &no_stretch, 
        N_("Do not try to stretch images on screen"), NULL }, 
       { NULL } 
     }; 

     bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); 
     bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); 
     textdomain (GETTEXT_PACKAGE); 

     error = NULL; 

     g_thread_init (NULL); 
     ret = gtk_init_with_args (&argc, &argv, 
            NULL, 
            entries, 
            NULL, 
            &error); 
     if (! ret) { 
       g_message ("%s", error->message); 
       g_error_free (error); 
       exit (1); 
     } 

     g_chdir (g_get_home_dir()); 

     g_set_prgname ("slideshow"); 

     window = gs_theme_window_new(); 
     g_signal_connect (G_OBJECT (window), "delete-event", 
          G_CALLBACK (gtk_main_quit), NULL); 

     engine = g_object_new (GSTE_TYPE_SLIDESHOW, NULL); 

     if (location == NULL) { 
       location = xdg_user_dir_lookup ("PICTURES"); 
       if (location == NULL || 
        strcmp (location, "/tmp") == 0 || 
        strcmp (location, g_get_home_dir()) == 0) { 
         free (location); 
         location = g_build_filename (g_get_home_dir(), "Pictures", NULL); 
       } 
     } 

     if (location != NULL) { 
       g_object_set (engine, "images-location", location, NULL); 
     } 

     if (sort_images) { 
       g_object_set (engine, "sort-images", sort_images, NULL); 
     } 

     if (background_color != NULL) { 
       g_object_set (engine, "background-color", background_color, NULL); 
     } 

     if (no_stretch) { 
       g_object_set (engine, "no-stretch", no_stretch, NULL); 
     } 

     gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (engine)); 

     gtk_widget_show (GTK_WIDGET (engine)); 

     gtk_window_set_default_size (GTK_WINDOW (window), 640, 480); 
     gtk_widget_show (window); 

     gtk_main(); 

     return 0; 
} 
+2

あなたは間違った場所にいます。遅延は他の場所で調整されます。 –

+0

ループがgtk_mainにあるように見えます... – Thomas

答えて

6

このプログラムはGStreamerのスライドショーエンジンを使用しているようです。これは変数engineによって示されます。 GStreamerは、オーディオとビデオのための再利用可能なコンポーネントがたくさんあるメディア処理フレームワークです。この場合、スライドショーエンジンはディレクトリから画像を読み取り、表示します。

g_object_setを使用して、エンジンのさまざまな設定を調整するプログラムを見ることができます。遅れを変えるために微調整できる別の設定がありますか?

編集:スライドショーの関連元はgste-slideshow.cです。キーはstart_new_loadのように見えますが、これは通常IMAGE_LOAD_TIMEOUTで呼び出され、定数は10000(ミリ秒)に設定されています。この値を外部から設定する方法はないようです。

+0

ええ、私はちょうどそれらを見ました。私はそれらで少しでも遊ぶことができますが、それがどのようにループしているのかはまだ分かりません。 – MercerKernel

+0

そのためには、GLibのドキュメントを参照する必要があります。特定の遅延の後にコールバックを呼び出すg_timeout_add_fullのようなタイマー関数の呼び出しがいくつかあります。しばらく時間がかかっているという意味ではループではありませんが、同じコードが繰り返し呼び出されます。 –

2

ショー/ディレイ/スイッチループはあなたがここに掲載したコードではありませんが、それは別の場所です。

0

私は、タイマのいくつかの並べ替え、おそらくあると思います:

#include "gs-theme-window.h" 
#include "gs-theme-engine.h" 
#include "gste-slideshow.h" 

遅延については何も持っている。このコードでは何もありませんが。エンジンの実装を確認し、スライドショーのコードを確認してください。

1

タイマーが実装されている場所を見つけたら、そこで値を変更する必要があります。私は遅延のためにsleep()を使うことを嫌っています。ループがどこにあるのかを見つけて、すでにコード内にある遅延方法を変更します。余分なスリープを追加すると、特にあなたが何をやっているのかわからない場合は、スクリーンセーバーが応答しなくなることがあります。

2

ショー/ディレイ/スイッチは、ここでインスタンス化されるGTKスライドショー、によって制御されます。

engine = g_object_new (GSTE_TYPE_SLIDESHOW, NULL);

遅延が実際にgste_slideshow.cファイルに設定されている、hereを発見しました。 gste_slideshow_real_show機能は、890という行にあります。

お楽しみください。

1

メインイベントループは、ほぼ確実にgtk_main()関数内にあります。しかし、あなたは間違った木を吠えている。 gtk_main()の仕事は、低レベルのイベント(キーボード/マウス入力やOSタイマーなど)を検出し、それらをより高いレベルのイベントに変換し、それらをアプリケーションコードに渡すポンプイベントです。

この場合、アプリケーションはGSTE_TYPE_SLIDESHOWのオブジェクトであるengineオブジェクトです。 source codeを見ると、start_new_load()関数では、最終的にピクチャ間の遅延の原因となるタイマーオブジェクトが作成されています。これは、10000ミリ秒のハードコードされた値によって初期化されます。

タイムアウトを変更する場合は、プロジェクトを再コンパイルして、何とかタイムアウトを設定する必要があります。