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