2009-07-02 19 views
1

Dies ist einer der Standard Gnome Bildschirmschoner - "persönliche Diashow". Es zeigt Bilder von einem Ort an und pausiert ~ 10s zwischen den Bildern. Wer weiß, wie es sich dreht & pausieren?Herausfinden einer C-Schleife

Ich versuche, die Verzögerung zu erhöhen, aber ich zögere, Schlaf hinzuzufügen() ohne zuerst zu wissen, wie es geht.

Dank

#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

Sie sind an der falschen Stelle. Die Verzögerung wird an anderer Stelle angepasst. –

+0

Es sieht für mich aus, als wäre die Schleife in gtk_main ... – Thomas

Antwort

6

Es sieht so aus, als ob dieses Programm eine Slideshow-Engine von GStreamer verwendet. Darauf zeigt die Variable engine. GStreamer ist ein Framework für die Medienverarbeitung, das viele wiederverwendbare Komponenten für Audio und Video enthält. In diesem Fall liest die Diashow-Engine Bilder aus einem Verzeichnis und zeigt sie an.

Sie können sehen, das Programm verschiedene Einstellungen des Motors mit g_object_set zwicken. Vielleicht gibt es eine andere Einstellung, die Sie ändern können, um die Verzögerung zu ändern?

BEARBEITEN: Die relevante Quelle für die Diashow ist gste-slideshow.c. Es sieht aus wie der Schlüssel start_new_load Funktion, die normalerweise mit IMAGE_LOAD_TIMEOUT aufgerufen wird, eine Konstante auf 10000 (Millisekunden) festgelegt. Es scheint keinen Weg zu geben, diesen Wert von außen einzustellen.

+0

Ja, ich habe sie gerade gesehen. Ich denke, ich kann mit denen ein bisschen spielen, aber es ist immer noch nicht klar, wie es sich dreht. – MercerKernel

+0

Dafür müssen Sie sich die GLib-Dokumentation ansehen. Es gibt einige Aufrufe von Timer-Funktionen wie g_timeout_add_full, die nach einer bestimmten Verzögerung einen Callback aufrufen. Es ist keine Schleife in dem Sinne, dass es eine Weile oder irgendwo gibt, aber der gleiche Code wird wiederholt aufgerufen. –

2

Die Show/Verzögerung/Schalter-Schleife nicht im Code ist, dass Sie hier gepostet haben, ist es an anderer Stelle.

0

Ich würde denken, es ist wahrscheinlich eine Art Timer in der beinhaltet:

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

Es gibt nichts in diesem Code, der etwas über eine Verzögerung hat. Überprüfen Sie die Implementierung der Engine und überprüfen Sie den Code im Slideshow-Include.

1

Sobald Sie finden, wo der Timer implementiert ist, sollten Sie den Wert dort ändern. Ich würde ungern Schlaf() für die Verzögerung verwenden. Suchen Sie nach der Schleife und ändern Sie die Verzögerungsmethode, die sich bereits im Code befindet. Das Hinzufügen von zusätzlichen Betten kann dazu führen, dass Ihr Bildschirmschoner manchmal nicht mehr reagiert, insbesondere wenn Sie sich nicht sicher sind, was Sie tun.

2

Die Show/Verzögerung/Schalter durch die GTK Diashow gesteuert, die hier instanziiert wird:

engine = g_object_new (GSTE_TYPE_SLIDESHOW, NULL);

Die Verzögerung wird tatsächlich in der gste_slideshow.c Datei gefunden here. Die gste_slideshow_real_show Funktion befindet sich in der Zeile 890.

Genießen.

1

Die Hauptereignisschleife ist fast sicher innerhalb der gtk_main() Funktion. Allerdings bellst du den falschen Baum an. Der Job gtk_main() ist Pumpenereignisse - er erkennt Ereignisse auf niedriger Ebene (z. B. Tastatur-/Mauseingabe und OS-Timer), konvertiert sie in Ereignisse auf höherer Ebene und übergibt diese an den Anwendungscode. In diesem Fall ist die Anwendung das Objekt engine, das ein Objekt vom Typ GSTE_TYPE_SLIDESHOW ist. Betrachtet man die source code, sehen wir, dass in der Funktion start_new_load() ein Timer-Objekt erstellt wird, das letztendlich für die Verzögerungen zwischen Bildern verantwortlich ist. Dies wird durch einen hartcodierten Wert von 10000 ms initialisiert.

Wenn Sie das Zeitlimit ändern möchten, müssen Sie das Projekt neu kompilieren und das Timeout irgendwie konfigurierbar machen.

Verwandte Themen