fixed problen with gst
[livewp] / applet / src / livewp-scene.c
1 /* vim: set sw=4 ts=4 et: */
2 /*
3  * This file is part of Live Wallpaper (livewp)
4  * 
5  * Copyright (C) 2010 Vlad Vasiliev
6  * Copyright (C) 2010 Tanya Makova
7  *       for the code
8  * 
9  * This software is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1 of
12  * the License, or (at your option) any later version.
13  * 
14  * This software is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  * 
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this software; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
22  * 02110-1301 USA
23 */
24 /*******************************************************************************/
25 #include "livewp-scene.h" 
26
27 void 
28 destroy_scene(AWallpaperPlugin *desktop_plugin)
29 {
30     if (desktop_plugin->priv->scene){
31             GSList * tmp = desktop_plugin->priv->scene->actors;
32             while (tmp != NULL){
33                     destroy_actor(tmp->data);
34                     tmp = g_slist_next(tmp);
35             }
36             if (tmp)
37                     g_slist_free(tmp);
38             desktop_plugin->priv->scene->actors = NULL;
39             if (desktop_plugin->priv->scene){
40                     g_free(desktop_plugin->priv->scene);
41                     desktop_plugin->priv->scene = NULL;
42             }
43     }
44     if (desktop_plugin->priv->pipeline){
45         gst_element_set_state (desktop_plugin->priv->pipeline, GST_STATE_NULL);
46         gst_object_unref (GST_OBJECT (desktop_plugin->priv->pipeline));
47         desktop_plugin->priv->pipeline = NULL;
48     }
49     if (desktop_plugin->priv->podpid > 1){
50         kill (desktop_plugin->priv->podpid, SIGTERM);
51         desktop_plugin->priv->podpid = -1;
52     }
53 }
54 /*******************************************************************************/
55 void
56 reload_scene(AWallpaperPlugin *desktop_plugin)
57 {
58     fprintf(stderr,"Reload scene %s\n", desktop_plugin->priv->theme);  
59     destroy_scene(desktop_plugin);
60     init_scene_theme(desktop_plugin);
61 }
62 /*******************************************************************************/
63 void 
64 init_scene_Accel(AWallpaperPlugin *desktop_plugin)
65 {
66     Actor *actor;
67     Scene *scene;
68     GPtrArray *child;
69     gint now = time(NULL);
70     gchar *str;
71     gint sizes1[4] = {57, 76, 43, 50},
72          n, j;
73     
74     fprintf(stderr, "init scene accel\n");
75     scene = g_new0(Scene, 1);
76     scene->actors = NULL;
77     desktop_plugin->priv->scene = scene;
78     
79     actor = init_object(desktop_plugin, "background", "bg.png", 
80                       0, 0, 0, 800, 480, 
81                       TRUE, TRUE, 100, 255, 
82                       NULL, NULL, NULL);
83     scene->actors = g_slist_append(scene->actors, actor);
84
85     child = g_ptr_array_sized_new(16);
86     
87     for (j= 0; j<4; j++){
88     for (n=0; n<4; n++){
89         str = g_strdup_printf("tape%i.png", n+1);
90         actor = init_object(desktop_plugin, "tape", str,
91                             fast_rnd(800), fast_rnd(480), 2+fast_rnd(6), 800, sizes1[n],
92                             TRUE, TRUE, 100, 255,
93                             NULL, NULL, NULL);
94         scene->actors = g_slist_append(scene->actors, actor);
95         g_ptr_array_add(child, actor);
96         g_free(str);
97     }
98     }
99     actor = init_object(desktop_plugin, "tape", "", 
100                       0, 800, 5, 800, 170, 
101                       FALSE, FALSE, 100, 255, 
102                       (gpointer)&change_tape, NULL, child);
103     actor->time_start_animation = now;
104     actor->duration_animation = G_MAXINT;
105     scene->actors = g_slist_append(scene->actors, actor);
106
107     run_long_timeout(desktop_plugin);
108 }
109 /*******************************************************************************/
110 void  
111 parsestring(char *line, char **argv)
112 {
113    while (*line != '\0') {  
114           while (*line == ' ' || *line == '\n')
115                 *line++ = '\0';     /* replace white spaces with 0    */
116                  *argv++ = line;          /* save the argument position     */
117                  while (*line != '\0' && *line != ' ' && 
118                         *line != '\n') 
119                      line++;             /* skip the argument until ...    */
120    }
121                   *argv = '\0';                 /* mark the end of argument list  */
122 }
123
124 #if 0
125 GstBusSyncReply 
126 sync_handler(GstBus *bus, GstMessage *message, AWallpaperPlugin *desktop_plugin){
127
128     if (!desktop_plugin->priv->visible)
129         gst_element_set_state (desktop_plugin->priv->pipeline, GST_STATE_PAUSED);
130     if (GST_MESSAGE_TYPE(message) != GST_MESSAGE_ELEMENT){
131                 return (GST_BUS_PASS);
132         }
133     if (!gst_structure_has_name(message->structure, "prepare-xwindow-id")){
134         return (GST_BUS_PASS);
135     }
136     return (GST_BUS_DROP);
137
138 }
139 #endif
140 /*******************************************************************************/
141 static gboolean
142 bus_call (GstBus *bus, GstMessage *msg, AWallpaperPlugin *desktop_plugin)
143 {
144     switch (GST_MESSAGE_TYPE (msg))
145     {
146        case GST_MESSAGE_EOS: 
147            if (desktop_plugin->priv->rich_animation){
148
149                 GstClockTime nach   = (GstClockTime)(0 * GST_MSECOND);
150                 if (!gst_element_seek(desktop_plugin->priv->pipeline, 1.0, GST_FORMAT_TIME,
151                    (GstSeekFlags) (GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT), GST_SEEK_TYPE_SET, 
152                    nach, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE))
153                     fprintf(stderr,"ERROR in seek\n");
154
155                 gst_element_set_state (desktop_plugin->priv->pipeline, GST_STATE_PLAYING);
156
157            }else{
158                 if (desktop_plugin->priv->pipeline){
159                     gst_element_set_state (desktop_plugin->priv->pipeline, GST_STATE_NULL);
160                     gst_object_unref (GST_OBJECT (desktop_plugin->priv->pipeline));
161                 } 
162            }
163            break;
164        case GST_MESSAGE_ERROR: break;
165        default: break;
166      }
167        return TRUE;
168 }
169
170 /*******************************************************************************/
171 void
172 init_scene_Xsnow(AWallpaperPlugin *desktop_plugin){
173     fprintf(stderr,"init_scene_Xsnow\n");
174     char* child_argv[128];
175     char *run_string = NULL;
176 #if 0
177     fprintf(stderr, "PARAMETR %s\n",  desktop_plugin->priv->theme_string_parametr1);
178     run_string = g_strdup_printf("/usr/bin/mplayer -vo x11 -wid %d %s\n", \
179                                  GDK_WINDOW_XID(desktop_plugin->priv->window->window), desktop_plugin->priv->theme_string_parametr1);
180 #endif
181     if (!desktop_plugin->priv->visible)
182         return;
183     run_string= g_strdup_printf("/usr/bin/xsnow");
184     parsestring(run_string, child_argv);
185
186     desktop_plugin->priv->running = TRUE;
187     desktop_plugin->priv->podpid = fork();
188     if (desktop_plugin->priv->podpid == 0){
189         execvp("/usr/bin/xsnow", child_argv);
190         fprintf(stderr,"Problem with new podprocess");
191     }
192     g_free(run_string);
193 }
194 /*******************************************************************************/
195 gboolean cb_timeout0(AWallpaperPlugin *desktop_plugin) {
196     GstFormat fmt = GST_FORMAT_TIME;
197     gboolean test;
198     gint64 len;
199     gint len_seconds = 0;
200
201     if (!desktop_plugin || !desktop_plugin->priv->pipeline)
202         return FALSE;
203     if (desktop_plugin->priv->theme_int_parametr1 == 0){
204         if (!gst_element_seek(GST_PIPELINE (desktop_plugin->priv->pipeline), 1.0, GST_FORMAT_TIME,
205                                           GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 
206                                           desktop_plugin->priv->theme_int_parametr1 * GST_SECOND,
207                                           GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE))
208             fprintf(stderr,"Error in seek:\n");
209         return FALSE;
210     }
211        
212     if (gst_element_get_state (desktop_plugin->priv->pipeline, NULL, NULL, -1) == GST_STATE_CHANGE_FAILURE) 
213         return TRUE;
214     else{
215          if (!gst_element_seek(GST_PIPELINE (desktop_plugin->priv->pipeline), 1.0, GST_FORMAT_TIME,
216                                           GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 
217                                           desktop_plugin->priv->theme_int_parametr1 * GST_SECOND,
218                                           GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE))
219             fprintf(stderr,"Error in seek:\n");
220          return FALSE;
221     }
222
223 /*******************************************************************************/
224 void
225 init_scene_Video(AWallpaperPlugin *desktop_plugin)
226 {
227     GstElement *bin;                                                                                                                                                           
228     GstElement *videosink;                                                                                                
229     GstFormat format; 
230     gchar *file_plus_uri;
231
232
233     /* fprintf(stderr, "init scene Video \n"); */
234     desktop_plugin->priv->pipeline = gst_pipeline_new("gst-player");
235     bin = gst_element_factory_make ("playbin2", "bin");
236     videosink = gst_element_factory_make ("ximagesink", "videosink");
237     g_object_set (G_OBJECT (bin), "video-sink", videosink, NULL);
238     gst_bin_add (GST_BIN (desktop_plugin->priv->pipeline), bin);
239
240     {
241         GstBus *bus;
242         bus = gst_pipeline_get_bus (GST_PIPELINE (desktop_plugin->priv->pipeline));
243         gst_bus_add_watch(bus, bus_call, desktop_plugin);
244         gst_object_unref (bus);
245     }
246     file_plus_uri = g_strdup_printf("file://%s",desktop_plugin->priv->theme_string_parametr1);
247     g_object_set (G_OBJECT (bin), "uri", file_plus_uri, NULL );
248     g_object_set (G_OBJECT (videosink), "force-aspect-ratio", TRUE, NULL  );
249
250     if (GST_IS_X_OVERLAY (videosink))
251             gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (videosink), GDK_DRAWABLE_XID(desktop_plugin->priv->window->window));
252
253     if (desktop_plugin->priv->visible){
254         gst_element_set_state (desktop_plugin->priv->pipeline, GST_STATE_PLAYING);
255         g_timeout_add(100, cb_timeout0, desktop_plugin); 
256     }
257    
258     //gst_element_get_state(deskddtop_plugin->priv->pipeline, NULL, NULL, 100 * GST_MSECOND);
259
260 }
261 /*******************************************************************************/
262 void
263 init_scene_Matrix(AWallpaperPlugin *desktop_plugin)
264 {
265   Actor *actor;
266   Scene *scene;
267   GPtrArray *child;
268   gint now = time(NULL);
269   gint y1, y2;
270
271   if (desktop_plugin->priv->rich_animation){
272       y1 = -480;
273       y2 = -480-480;
274   }else {
275       y1 = 0;
276       y2 = -480;
277   }
278
279   /* fprintf(stderr, "init scene2 \n"); */
280   scene = g_new0(Scene, 1);
281   //scene.daytime = get_daytime();
282   scene->actors = NULL;
283   desktop_plugin->priv->scene = scene;
284   
285   actor = init_object(desktop_plugin, "background", "bg.png", 
286                       0, 0, 5, 800, 480, 
287                       TRUE, TRUE, 100, 255, 
288                       NULL, NULL, NULL);
289   scene->actors = g_slist_append(scene->actors, actor);
290
291   actor = init_object(desktop_plugin, "symbols", "symbols.png", 
292                       0, 0, 10, 800, 480, 
293                       TRUE, TRUE, 100, 255, 
294                       NULL, NULL, NULL);
295   scene->actors = g_slist_append(scene->actors, actor);
296
297   child = g_ptr_array_sized_new(4);
298   actor = init_object(desktop_plugin, "layer1", "layer1_2.png", 
299                       0, y1, 6, 800, 960, 
300                       TRUE, TRUE, 100, 255, 
301                       NULL, NULL, NULL);
302   //actor->time_start_animation = now;
303   //actor->duration_animation = G_MAXINT;
304   scene->actors = g_slist_append(scene->actors, actor);
305   g_ptr_array_add(child, actor);
306
307   actor = init_object(desktop_plugin, "layer1", "layer1_1.png", 
308                       0, y2, 7, 800, 960, 
309                       TRUE, TRUE, 100, 255, 
310                       NULL, NULL, NULL);
311   //actor->time_start_animation = now;
312   //actor->duration_animation = G_MAXINT;
313   scene->actors = g_slist_append(scene->actors, actor);
314   g_ptr_array_add(child, actor);
315
316   actor = init_object(desktop_plugin, "layer2", "layer2_2.png", 
317                       0, y1, 8, 800, 960, 
318                       TRUE, TRUE, 100, 255, 
319                       NULL, NULL, NULL);
320   //actor->time_start_animation = now;
321   //actor->duration_animation = G_MAXINT;
322   scene->actors = g_slist_append(scene->actors, actor);
323   g_ptr_array_add(child, actor);
324
325   actor = init_object(desktop_plugin, "layer2", "layer2_1.png", 
326                       0, y2, 9, 800, 960, 
327                       TRUE, TRUE, 100, 255, 
328                       NULL, NULL, NULL);
329   //actor->time_start_animation = now;
330   //actor->duration_animation = G_MAXINT;
331   scene->actors = g_slist_append(scene->actors, actor);
332   g_ptr_array_add(child, actor);
333
334   actor = init_object(desktop_plugin, "layers", "", 
335                       0, y2, 9, 800, 960, 
336                       FALSE, FALSE, 100, 255, 
337                       (gpointer)&change_layer, NULL, child);
338   actor->time_start_animation = now;
339   actor->duration_animation = G_MAXINT;
340   scene->actors = g_slist_append(scene->actors, actor);
341
342   run_long_timeout(desktop_plugin);
343
344 }
345 /*******************************************************************************/
346 /* Init Modern Scene */
347 void
348 init_scene_Modern(AWallpaperPlugin *desktop_plugin)
349 {
350   Actor *actor;
351   Scene *scene;
352   gint now = time(NULL);
353   gint i;
354   gint winds[13][2];
355   GPtrArray *child; 
356
357   /* fprintf(stderr, "init scene \n"); */
358   scene = g_new0(Scene, 1);
359   scene->daytime = get_daytime();
360   scene->actors = NULL;
361   scene->wind_orientation = -1;
362   scene->wind_angle = 0.3;
363   /* init value for random */
364   scene->seed = time(NULL);
365   scene->notification = TRUE;
366   desktop_plugin->priv->scene = scene;
367   actor = init_object(desktop_plugin, "sky", "sky0.png", 
368                       0, 0, 5, 800, 480, 
369                       TRUE , TRUE, 100, 255, 
370                       (gpointer)&change_static_actor, NULL, NULL);
371   scene->actors = g_slist_append(scene->actors, actor);
372   change_static_actor(actor, desktop_plugin);
373   
374   actor = init_object(desktop_plugin, "sun", "sun.png", 
375                       0, 0, 6, 88, 88, 
376                       FALSE, FALSE, 100, 255, 
377                       (gpointer)&change_sun, NULL, NULL);
378   actor->time_start_animation = now;
379   actor->duration_animation = G_MAXINT;
380   change_sun(actor, desktop_plugin);
381   scene->actors = g_slist_append(scene->actors, actor);
382
383   //actor = init_object(desktop_plugin, "dot", "dot1.png", 0, 0, 11, 50, 50, 
384     //                  TRUE, 100, 255, NULL, NULL);
385   //scene.actors = g_slist_append(scene.actors, actor);
386   
387   actor = init_object(desktop_plugin, "cloud1", "cloud1.png", 
388                       0, fast_rnd(300)-97, 7, 150, 97, 
389                       FALSE, FALSE, 100, 255, 
390                       (gpointer)&change_cloud, NULL, NULL);
391   actor->time_start_animation = now + fast_rnd(20);
392   actor->duration_animation = 3*60;
393   scene->actors = g_slist_append(scene->actors, actor);
394   
395   actor = init_object(desktop_plugin, "cloud2", "cloud2.png", 
396                       0, fast_rnd(300)-75, 7, 188, 75, 
397                       FALSE, FALSE, 100, 255, 
398                       (gpointer)&change_cloud, NULL, NULL);
399   actor->time_start_animation = now + fast_rnd(40)+10;
400   actor->duration_animation = 3*60;
401   scene->actors = g_slist_append(scene->actors, actor);
402
403   actor = init_object(desktop_plugin, "cloud4", "cloud4.png", 
404                       0, fast_rnd(300)-75, 7, 150, 75, 
405                       FALSE, FALSE, 100, 255, 
406                       (gpointer)&change_cloud, NULL, NULL);
407   actor->time_start_animation = now + fast_rnd(60) + 20;
408   actor->duration_animation = 5*60;
409   scene->actors = g_slist_append(scene->actors, actor);
410
411
412   actor = init_object(desktop_plugin, "town", "town0.png", 
413                       0, 0, 8, 800, 480, 
414                       TRUE, TRUE, 100, 255, 
415                       (gpointer)&change_static_actor, NULL, NULL);
416   change_static_actor(actor, desktop_plugin);
417   scene->actors = g_slist_append(scene->actors, actor);
418
419   actor = init_object(desktop_plugin, "stend", "stend0.png", 
420                       452, 166, 9, 300, 305, 
421                       TRUE, TRUE, 100, 255, 
422                       (gpointer)&change_static_actor, NULL, NULL);
423   change_static_actor(actor, desktop_plugin);
424   scene->actors = g_slist_append(scene->actors, actor);
425
426
427   child = g_ptr_array_sized_new(4);
428   actor = init_object(desktop_plugin, "call", "call.png", 
429                       480, 190, 9, 50, 58, 
430                       FALSE, TRUE, 100, 255, 
431                       NULL, NULL, NULL);
432   scene->actors = g_slist_append(scene->actors, actor);
433   g_ptr_array_add(child, actor);
434
435   actor = init_object(desktop_plugin, "chat", "chat.png", 
436                       540, 190, 9, 50, 58, 
437                       FALSE, TRUE, 100, 255, 
438                       NULL, NULL, NULL);
439   scene->actors = g_slist_append(scene->actors, actor);
440   g_ptr_array_add(child, actor);
441
442   actor = init_object(desktop_plugin, "mail", "mail.png", 
443                       600, 190, 9, 50, 58, 
444                       FALSE, TRUE, 100, 255, 
445                       NULL, NULL, NULL);
446   scene->actors = g_slist_append(scene->actors, actor);
447   g_ptr_array_add(child, actor);
448   
449   actor = init_object(desktop_plugin, "sms", "sms.png", 
450                       660, 190, 9, 50, 58, 
451                       FALSE, TRUE, 100, 255, 
452                       NULL, NULL, NULL);
453   scene->actors = g_slist_append(scene->actors, actor);
454   g_ptr_array_add(child, actor);
455
456   actor = init_object(desktop_plugin, "billboard_text", "",
457                       470, 174, 9, 300, 108,
458                       FALSE, FALSE, 100, 255,
459                       (gpointer)&change_billboard, NULL, child);
460   create_hildon_actor_text(actor, desktop_plugin);
461   //actor->time_start_animation = time(NULL) + 20;
462   change_billboard(actor, desktop_plugin);
463   scene->actors = g_slist_append(scene->actors, actor);
464
465   actor = init_object(desktop_plugin, "tram", "tram.png", 
466                       -300, 225, 10, 350, 210, 
467                       FALSE, FALSE, 100, 255, 
468                       (gpointer)&change_tram, NULL, NULL);
469   actor->time_start_animation = time(NULL) + fast_rnd(10); 
470   actor->duration_animation = 60;
471   scene->actors = g_slist_append(scene->actors, actor);
472
473   actor = init_object(desktop_plugin, "border", "border0.png", 
474                       0, 480-79, 11, 800, 79,
475                       TRUE, TRUE, 100, 255, 
476                       (gpointer)&change_static_actor_with_corner, NULL, NULL);
477   change_static_actor_with_corner(actor, desktop_plugin);
478   scene->actors = g_slist_append(scene->actors, actor);
479   
480   actor = init_object(desktop_plugin, "moon", "moon1.png", 
481                       400, 20, 6, 60, 60, 
482                       FALSE, FALSE, 100, 255, 
483                       (gpointer)&change_moon, NULL, NULL);
484   change_moon(actor, desktop_plugin);
485   scene->actors = g_slist_append(scene->actors, actor);
486
487   actor = init_object(desktop_plugin, "wind", "", 
488                       0, 0, 5, 0, 0, 
489                       FALSE, FALSE, 100, 255, 
490                       (gpointer)&change_wind, NULL, NULL);
491   change_wind(actor, desktop_plugin);
492   scene->actors = g_slist_append(scene->actors, actor);
493
494     /* windows in 4-th house  */
495
496     winds[0][0] = 482;
497     winds[0][1] = 180;
498
499     winds[1][0] = 495;
500     winds[1][1] = 179;
501
502     winds[2][0] = 482;
503     winds[2][1] = 191;
504
505     winds[3][0] = 495;
506     winds[3][1] = 190;
507     
508     winds[4][0] = 482;
509     winds[4][1] = 201;
510     
511     winds[5][0] = 495;
512     winds[5][1] = 210;
513     
514     winds[6][0] = 482;
515     winds[6][1] = 222;
516     
517     winds[7][0] = 495;
518     winds[7][1] = 221;
519     
520     winds[8][0] = 459;
521     winds[8][1] = 203;
522     
523     winds[9][0] = 495;
524     winds[9][1] = 241;
525     
526     winds[10][0] = 495;
527     winds[10][1] = 252;
528     
529     winds[11][0] = 482;
530     winds[11][1] = 273;
531     
532     winds[12][0] = 495;
533     winds[12][1] = 303;
534     for (i=0; i<13; i++){
535         actor = init_object(desktop_plugin, "window1", "window1.png", 
536                             winds[i][0], winds[i][1], 8, 8, 10, 
537                             FALSE, FALSE, 100, 255, 
538                             (gpointer)&change_window1, NULL, NULL);
539         //change_window1(actor, desktop_plugin);
540         actor->time_start_animation = now + fast_rnd(30);
541         scene->actors = g_slist_append(scene->actors, actor);
542
543     }
544     
545     /* windows in 1-th house  */
546     
547     winds[0][0] = 86;
548     winds[0][1] = 321;
549
550     winds[1][0] = 86;
551     winds[1][1] = 363;
552
553     winds[2][0] = 86;
554     winds[2][1] = 385;
555
556     winds[3][0] = 86;
557     winds[3][1] = 286;
558     
559     winds[4][0] = 94;
560     winds[4][1] = 232;
561     
562     winds[5][0] = 94;
563     winds[5][1] = 243;
564     
565     winds[6][0] = 94;
566     winds[6][1] = 265;
567     
568     winds[7][0] = 94;
569     winds[7][1] = 331;
570     for (i=0; i<8; i++){
571         actor = init_object(desktop_plugin, "window2", "window2.png", 
572                             winds[i][0], winds[i][1], 8, 8, 10, 
573                             FALSE, FALSE, 100, 255, 
574                             (gpointer)&change_window1, NULL, NULL);
575         //change_window1(actor, desktop_plugin);
576         actor->time_start_animation = now + fast_rnd(30);
577         scene->actors = g_slist_append(scene->actors, actor);
578
579     }
580     
581     /* windows in 3-th house  */
582     
583     winds[0][0] = 251;
584     winds[0][1] = 162;
585
586     winds[1][0] = 251;
587     winds[1][1] = 196;
588
589     winds[2][0] = 251;
590     winds[2][1] = 278;
591
592     winds[3][0] = 251;
593     winds[3][1] = 289;
594     
595     winds[4][0] = 313;
596     winds[4][1] = 173;
597     
598     winds[5][0] = 322;
599     winds[5][1] = 160;
600     
601     winds[6][0] = 303;
602     winds[6][1] = 217;
603     
604     winds[7][0] = 322;
605     winds[7][1] = 224;
606     
607     winds[8][0] = 323;
608     winds[8][1] = 217;
609     
610     winds[9][0] = 322;
611     winds[9][1] = 288;
612     
613     for (i=0; i<10; i++){
614         actor = init_object(desktop_plugin, "window3", "window3.png", 
615                             winds[i][0], winds[i][1], 8, 8, 10, 
616                             FALSE, FALSE, 100, 255, 
617                             (gpointer)&change_window1, NULL, NULL);
618         //change_window1(actor, desktop_plugin);
619         actor->time_start_animation = now + fast_rnd(30);
620         scene->actors = g_slist_append(scene->actors, actor);
621
622     }
623
624     /* windows in 5-th house  */
625     
626     winds[0][0] = 610;
627     winds[0][1] = 224;
628
629     winds[1][0] = 602;
630     winds[1][1] = 245;
631
632     winds[2][0] = 602;
633     winds[2][1] = 264;
634
635     winds[3][0] = 610;
636     winds[3][1] = 301;
637     
638     winds[4][0] = 610;
639     winds[4][1] = 320;
640     
641     winds[5][0] = 593;
642     winds[5][1] = 352;
643     
644     winds[6][0] = 610;
645     winds[6][1] = 368;
646     
647     for (i=0; i<7; i++){
648         actor = init_object(desktop_plugin, "window4", "window4.png", 
649                             winds[i][0], winds[i][1], 8, 8, 10, 
650                             FALSE, FALSE, 100, 255, 
651                             (gpointer)&change_window1, NULL, NULL);
652         //change_window1(actor, desktop_plugin);
653         actor->time_start_animation = now + fast_rnd(30);
654         scene->actors = g_slist_append(scene->actors, actor);
655
656     }
657
658     /* windows in 6-th house  */
659     
660     winds[0][0] = 717;
661     winds[0][1] = 283;
662
663     winds[1][0] = 698;
664     winds[1][1] = 293;
665
666     winds[2][0] = 717;
667     winds[2][1] = 315;
668
669     winds[3][0] = 717;
670     winds[3][1] = 323;
671     
672     winds[4][0] = 698;
673     winds[4][1] = 362;
674     
675     winds[5][0] = 698;
676     winds[5][1] = 400;
677     
678     for (i=0; i<6; i++){
679         actor = init_object(desktop_plugin, "window5", "window5.png", 
680                             winds[i][0], winds[i][1], 8, 8, 10, 
681                             FALSE, FALSE, 100, 255, 
682                             (gpointer)&change_window1, NULL, NULL);
683         //change_window1(actor, desktop_plugin);
684         actor->time_start_animation = now + fast_rnd(30);
685         scene->actors = g_slist_append(scene->actors, actor);
686
687     }
688     run_long_timeout(desktop_plugin);
689
690 #if 0    
691   anim = g_new0(Animation, 1);
692   anim->count = 1;
693   anim->actor = actor;
694   anim->func_change = &change_tram;
695   anim->func_time = NULL;
696   anim->timestart = time(NULL); 
697   anim->timeall = 10;
698   
699   scene.dynamic_actors = g_slist_append(scene.dynamic_actors, anim);
700 #endif  
701 }
702 /*******************************************************************************/
703 /* Init Berlin Scene */
704 void
705 init_scene_Berlin(AWallpaperPlugin *desktop_plugin)
706 {
707   Actor *actor, *actor1, *actor2;
708   Scene *scene;
709   gint now = time(NULL);
710   gint i; 
711   gint winds[13][2];
712   GPtrArray *child = NULL;
713
714   scene = g_new0(Scene, 1);
715   scene->daytime = get_daytime();
716   scene->actors = NULL;
717   scene->wind_orientation = -1;
718   scene->wind_angle = 0.3;
719   /* init value for random */
720   scene->seed = time(NULL);
721   desktop_plugin->priv->scene = scene;
722   
723   actor = init_object(desktop_plugin, "sky", "sky.png", 0, 0, 5, 800, 480, 
724                       TRUE, TRUE, 100, 255, 
725                       (gpointer)&change_static_actor, NULL, NULL);
726   change_static_actor(actor, desktop_plugin);
727   scene->actors = g_slist_append(scene->actors, actor);
728
729   
730   actor = init_object(desktop_plugin, "sun", "sun.png", 0, 0, 6, 88, 88, 
731                       FALSE, FALSE, 100, 255, 
732                       (gpointer)&change_sun, NULL, NULL);
733   actor->time_start_animation = time(NULL);
734   actor->duration_animation = G_MAXINT;
735   change_sun(actor, desktop_plugin);
736   scene->actors = g_slist_append(scene->actors, actor);
737
738 #if 0
739   actor = init_object(desktop_plugin, "dot", "dot1.png", 0, 0, 11, 50, 50, 
740                       TRUE, 100, 255, NULL, NULL);
741   scene.actors = g_slist_append(scene.actors, actor);
742 #endif
743
744   actor = init_object(desktop_plugin, "moon", "moon1.png", 400, 15, 6, 60, 60, 
745                       FALSE, FALSE, 100, 255, 
746                       (gpointer)&change_moon, NULL, NULL);
747   change_moon(actor, desktop_plugin);
748   scene->actors = g_slist_append(scene->actors, actor);
749   
750   actor = init_object(desktop_plugin, "cloud1", "cloud1.png", 0, fast_rnd(300)-97, 7, 150, 97, 
751                       FALSE, FALSE, 100, 255, 
752                       (gpointer)&change_cloud, NULL, NULL);
753   actor->time_start_animation = now + fast_rnd(30) + 10;
754   actor->duration_animation = 3*60;
755   scene->actors = g_slist_append(scene->actors, actor);
756   
757   actor = init_object(desktop_plugin, "cloud2", "cloud2.png", 0, fast_rnd(300)-75, 7, 188, 75, 
758                       FALSE, FALSE, 100, 255, 
759                       (gpointer)&change_cloud, NULL, NULL);
760   actor->time_start_animation = now + fast_rnd(10);
761   actor->duration_animation = 3*60;
762   scene->actors = g_slist_append(scene->actors, actor);
763
764   actor = init_object(desktop_plugin, "cloud4", "cloud4.png", 0, fast_rnd(300)-75, 7, 150, 75, 
765                       FALSE, FALSE, 100, 255, 
766                       (gpointer)&change_cloud, NULL, NULL);
767   actor->time_start_animation = now + fast_rnd(60) + 20;
768   actor->duration_animation = 5*60;
769   scene->actors = g_slist_append(scene->actors, actor);
770
771  
772   actor = init_object(desktop_plugin, "plane2", "plane3.png", 0, 45, 8, 160, 50, 
773                       FALSE, FALSE, 100, 255, 
774                       (gpointer)&change_plane2, NULL, NULL);
775   actor->time_start_animation = now + fast_rnd(40) + 20;
776   actor->duration_animation = 60;
777   scene->actors = g_slist_append(scene->actors, actor);
778   
779   actor = init_object(desktop_plugin, "plane1", "tu154.png", 620, 233, 9, 300, 116, 
780                       FALSE, FALSE, 100, 255, 
781                       (gpointer)&change_plane1, NULL, NULL);
782   actor->time_start_animation = now + fast_rnd(20);
783   actor->duration_animation = 30;
784   scene->actors = g_slist_append(scene->actors, actor);
785
786   actor = init_object(desktop_plugin, "town", "town.png", 0, 0, 10, 800, 480, 
787                       TRUE, TRUE, 100, 255, 
788                       (gpointer)&change_static_actor_with_corner, NULL, NULL);
789   change_static_actor_with_corner(actor, desktop_plugin);
790   scene->actors = g_slist_append(scene->actors, actor);
791
792   actor = init_object(desktop_plugin, "wind", "", 0, 0, 5, 0, 0, 
793                       FALSE, FALSE, 100, 255, 
794                       (gpointer)&change_wind, NULL, NULL);
795   change_wind(actor, desktop_plugin);
796   scene->actors = g_slist_append(scene->actors, actor);
797
798   actor1 = init_object(desktop_plugin, "signal_red", "red.png", 
799                       486, 425, 10, 18, 38, 
800                       FALSE, TRUE, 100, 255, NULL, NULL, NULL);
801   //actor->time_start_animation = now + fast_rnd(30) + 10;  
802   scene->actors = g_slist_append(scene->actors, actor1);
803    
804   actor2 = init_object(desktop_plugin, "signal_green", "green.png", 
805                       486, 425, 10, 18, 38, 
806                       TRUE, TRUE, 100, 255, NULL, NULL, NULL);
807   //actor->time_start_animation = now + fast_rnd(30) + 10;  
808   scene->actors = g_slist_append(scene->actors, actor2);
809   child = g_ptr_array_sized_new(2);
810   g_ptr_array_add(child, actor1);
811   g_ptr_array_add(child, actor2);
812   actor = init_object(desktop_plugin, "signal", "",
813                       486, 425, 10, 18, 38,
814                       FALSE, FALSE, 100, 255, 
815                       (gpointer)&change_signal, NULL, child);
816   actor->time_start_animation = now + fast_rnd(30) + 10;
817   scene->actors = g_slist_append(scene->actors, actor);
818     
819     winds[0][0] = 389;
820     winds[0][1] = 305;
821
822     winds[1][0] = 373;
823     winds[1][1] = 306;
824
825     winds[2][0] = 355;
826     winds[2][1] = 306;
827
828     winds[3][0] = 356;
829     winds[3][1] = 288;
830     
831     winds[4][0] = 337;
832     winds[4][1] = 269;
833     
834     winds[5][0] = 372;
835     winds[5][1] = 268;
836   
837     winds[6][0] = 372;
838     winds[6][1] = 249;
839     
840     winds[7][0] = 388;
841     winds[7][1] = 249;
842     
843     winds[8][0] = 387;
844     winds[8][1] = 230;
845     
846     winds[9][0] = 372;
847     winds[9][1] = 211;
848     
849     winds[10][0] = 355;
850     winds[10][1] = 159;
851     
852     winds[11][0] = 335;
853     winds[11][1] = 158;
854     
855     winds[12][0] = 386;
856     winds[12][1] = 119;
857   
858     for (i=0; i<13; i++){
859         actor = init_object(desktop_plugin, "window", "window.png", 
860                             winds[i][0], winds[i][1], 10, 8, 9, 
861                             FALSE, TRUE, 100, 255, 
862                             (gpointer)&change_window1, NULL, NULL);
863         //change_window1(actor, desktop_plugin);
864         actor->time_start_animation = now + fast_rnd(30);
865         scene->actors = g_slist_append(scene->actors, actor);
866
867     }
868     
869     run_long_timeout(desktop_plugin);
870
871 }
872 /*******************************************************************************/
873 void 
874 init_scene_theme(AWallpaperPlugin *desktop_plugin)
875 {
876     void (*func)(gpointer);
877     func = g_hash_table_lookup(desktop_plugin->priv->hash_scene_func, desktop_plugin->priv->theme);
878     if (func){
879         (*func)(desktop_plugin);
880     }
881 }