many views almost done
[livewp] / applet / src / livewp-home-widget.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 General Public License
11  * as published by the Free Software Foundation; either version 2 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-common.h" 
26 #include "livewp-home-widget.h"
27 #include <gconf/gconf-client.h>
28 #include "livewp-rules.h"
29 #include "livewp-scene.h"
30 #include <sys/time.h>
31 #include <stdlib.h>
32 #include <unistd.h>
33 #include <sys/wait.h>
34
35 #define GCONF_KEY_POSITION "/apps/osso/hildon-desktop/applets/livewp-home-widget.desktop-%i/position"
36 #define GCONF_KEY_MODIFIED "/apps/osso/hildon-desktop/applets/livewp-home-widget.desktop-%i/modified"
37 #define GCONF_KEY_VIEW     "/apps/osso/hildon-desktop/applets/livewp-home-widget.desktop-%i/view"
38
39 HD_DEFINE_PLUGIN_MODULE (AWallpaperPlugin, animation_wallpaper_plugin, HD_TYPE_HOME_PLUGIN_ITEM)
40 #define Animation_Wallpaper_HOME_PLUGIN_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE (obj,\
41                                                           Animation_Wallpaper_TYPE_HOME_PLUGIN,\
42                                                           Animation_WallpaperPrivate))
43 static void
44 lw_applet_realize (GtkWidget *widget)
45 {
46     GdkScreen *screen;
47     gchar * strid; 
48     gint id; 
49     AWallpaperPlugin *desktop_plugin = (AWallpaperPlugin *)widget;
50     char* child_argv[] =  {"/usr/bin/livewp", "0", (char *) 0 };
51
52
53     strid = g_strdup(hd_plugin_item_get_plugin_id (HD_PLUGIN_ITEM (widget)));
54
55     id = strid[strlen(strid)-1] - '0';
56     desktop_plugin->priv->view = id;
57     g_free(strid); 
58
59     switch (id){
60             case 0: child_argv[1] = "1";
61                 break;
62             case 1: child_argv[1] = "2";
63                 break;
64             case 2: child_argv[1] = "3";
65                 break;
66             case 3: child_argv[1] = "4";
67                 break;
68             case 4: child_argv[1] = "5";
69                 break;
70             case 5: child_argv[1] = "6";
71                 break;
72             case 6: child_argv[1] = "7";
73                 break;
74             case 7: child_argv[1] = "8";
75                 break;
76             case 8: child_argv[1] = "9";
77                 break;
78
79     }
80     desktop_plugin->priv->one_in_all_view = get_one_in_all_views_from_config();
81     /* Check one theme in all view mode */
82     if (!desktop_plugin->priv->one_in_all_view || 
83         (desktop_plugin->priv->one_in_all_view && id == 0)){
84             /* Start a new process */
85             desktop_plugin->priv->pid = fork();
86             if (desktop_plugin->priv->pid == 0){
87                 execvp("/usr/bin/livewp", child_argv);
88                 fprintf(stderr,"Problem with new process");
89             }
90     }
91
92     desktop_plugin_visible_notify((GObject *)widget, NULL, desktop_plugin);
93
94     screen = gtk_widget_get_screen (widget);
95     gtk_widget_set_colormap (widget,
96                                 gdk_screen_get_rgba_colormap (screen));
97     gtk_widget_set_app_paintable (widget,
98                                 TRUE);
99     GTK_WIDGET_CLASS (animation_wallpaper_plugin_parent_class)->realize (widget);
100 }
101
102 /* Set position of widget on desktop */
103 static void
104 init_applet_position(gint *xapplet, gint *yapplet)
105 {
106   GSList *position = NULL;
107   gchar *position_key;
108   gchar *modified_key;
109   gchar *modified;
110   GError *error = NULL;
111   gint i;
112   GConfClient   *gconf_client = gconf_client_get_default ();
113   for (i=0;i<9;i++){
114       position_key = g_strdup_printf (GCONF_KEY_POSITION, i);
115       position = gconf_client_get_list (gconf_client,
116                                         position_key,
117                                         GCONF_VALUE_INT,
118                                         NULL);
119       if (position && position->data && position->next->data){
120         *xapplet = GPOINTER_TO_INT (position->data);
121         *yapplet = GPOINTER_TO_INT (position->next->data);
122       }else{
123         position = g_slist_prepend (g_slist_prepend (NULL,
124                                           GINT_TO_POINTER (Ystartposition)),
125                               GINT_TO_POINTER (Xstartposition));
126         gconf_client_set_list (gconf_client,
127                                    position_key,
128                                    GCONF_VALUE_INT,
129                                position,
130                        &error);
131         *xapplet = Xstartposition;
132         *yapplet = Ystartposition;
133       }
134       g_free (position_key);
135       modified = g_strdup_printf ("%i", 0);
136       modified_key = g_strdup_printf (GCONF_KEY_MODIFIED, i);
137       gconf_client_set_string (gconf_client,
138                                modified_key,
139                                modified,
140                                &error);
141       g_free(modified);
142       g_free(modified_key);
143       modified_key = g_strdup_printf (GCONF_KEY_VIEW, i);
144       gconf_client_set_int (gconf_client,
145                                modified_key,
146                                (i+1),
147                                &error);
148       g_free(modified_key);
149
150   }
151   gconf_client_clear_cache(gconf_client);
152   g_object_unref(gconf_client);
153 }
154
155 void
156 desktop_plugin_visible_notify (GObject    *object,
157                                           GParamSpec *spec,
158                                           AWallpaperPlugin *desktop_plugin)
159 {
160     gboolean visible;
161     Animation_WallpaperPrivate *priv = desktop_plugin->priv;
162     g_object_get (object, "is-on-current-desktop", &visible, NULL);
163     fprintf (stderr, "LWP is-on-current-desktop changed. visible: %u", visible); 
164     if (priv){
165              if (priv->one_in_all_view){
166                      if (visible)
167                         send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
168                                           LIVEWP_SIGNAL_PATH, LIVEWP_PLAY_LIVEBG_ON_VIEW1);
169                      else{
170                         /* start any application on current view */
171                         if ((priv->view + 1) == current_active_view())
172                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
173                                           LIVEWP_SIGNAL_PATH, LIVEWP_PAUSE_LIVEBG_ON_VIEW1);
174                      }
175                      return;
176              }
177              switch (priv->view + 1){
178                 case 1: if (visible)
179                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
180                                           LIVEWP_SIGNAL_PATH, LIVEWP_PLAY_LIVEBG_ON_VIEW1);
181                         else
182                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
183                                           LIVEWP_SIGNAL_PATH, LIVEWP_PAUSE_LIVEBG_ON_VIEW1);
184                         break;
185                 case 2: if (visible)
186                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
187                                           LIVEWP_SIGNAL_PATH, LIVEWP_PLAY_LIVEBG_ON_VIEW2);
188                         else
189                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
190                                           LIVEWP_SIGNAL_PATH, LIVEWP_PAUSE_LIVEBG_ON_VIEW2);
191                         break;
192                 case 3: if (visible)
193                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
194                                           LIVEWP_SIGNAL_PATH, LIVEWP_PLAY_LIVEBG_ON_VIEW3);
195                         else
196                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
197                                           LIVEWP_SIGNAL_PATH, LIVEWP_PAUSE_LIVEBG_ON_VIEW3);
198                         break;
199                 case 4: if (visible)
200                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
201                                           LIVEWP_SIGNAL_PATH, LIVEWP_PLAY_LIVEBG_ON_VIEW4);
202                         else
203                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
204                                           LIVEWP_SIGNAL_PATH, LIVEWP_PAUSE_LIVEBG_ON_VIEW4);
205                         break;
206                case 5: if (visible)
207                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
208                                           LIVEWP_SIGNAL_PATH, LIVEWP_PLAY_LIVEBG_ON_VIEW5);
209                         else
210                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
211                                           LIVEWP_SIGNAL_PATH, LIVEWP_PAUSE_LIVEBG_ON_VIEW5);
212                         break;
213                case 6: if (visible)
214                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
215                                           LIVEWP_SIGNAL_PATH, LIVEWP_PLAY_LIVEBG_ON_VIEW6);
216                         else
217                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
218                                           LIVEWP_SIGNAL_PATH, LIVEWP_PAUSE_LIVEBG_ON_VIEW6);
219                         break;
220                case 7: if (visible)
221                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
222                                           LIVEWP_SIGNAL_PATH, LIVEWP_PLAY_LIVEBG_ON_VIEW7);
223                         else
224                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
225                                           LIVEWP_SIGNAL_PATH, LIVEWP_PAUSE_LIVEBG_ON_VIEW7);
226                         break;
227                case 8: if (visible)
228                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
229                                           LIVEWP_SIGNAL_PATH, LIVEWP_PLAY_LIVEBG_ON_VIEW8);
230                         else
231                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
232                                           LIVEWP_SIGNAL_PATH, LIVEWP_PAUSE_LIVEBG_ON_VIEW8);
233                         break;
234                case 9: if (visible)
235                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
236                                           LIVEWP_SIGNAL_PATH, LIVEWP_PLAY_LIVEBG_ON_VIEW9);
237                         else
238                                 send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
239                                           LIVEWP_SIGNAL_PATH, LIVEWP_PAUSE_LIVEBG_ON_VIEW9);
240                         break;
241
242              }
243
244      }
245     
246 }
247
248 gboolean
249 send_alive_event(Animation_WallpaperPrivate *priv) 
250 {
251     switch (priv->view + 1){
252         case 1: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
253                                   LIVEWP_SIGNAL_PATH, LIVEWP_ALIVE_LIVEBG_ON_VIEW1);
254                 break;
255         case 2: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
256                                   LIVEWP_SIGNAL_PATH, LIVEWP_ALIVE_LIVEBG_ON_VIEW2);
257                 break;
258         case 3: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
259                                   LIVEWP_SIGNAL_PATH, LIVEWP_ALIVE_LIVEBG_ON_VIEW3);
260                 break;
261         case 4: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
262                                   LIVEWP_SIGNAL_PATH, LIVEWP_ALIVE_LIVEBG_ON_VIEW4);
263                 break;
264         case 5: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
265                                   LIVEWP_SIGNAL_PATH, LIVEWP_ALIVE_LIVEBG_ON_VIEW5);
266                 break;
267         case 6: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
268                                   LIVEWP_SIGNAL_PATH, LIVEWP_ALIVE_LIVEBG_ON_VIEW6);
269                 break;
270         case 7: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
271                                   LIVEWP_SIGNAL_PATH, LIVEWP_ALIVE_LIVEBG_ON_VIEW7);
272                 break;
273         case 8: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
274                                   LIVEWP_SIGNAL_PATH, LIVEWP_ALIVE_LIVEBG_ON_VIEW8);
275                 break;
276         case 9: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
277                                   LIVEWP_SIGNAL_PATH, LIVEWP_ALIVE_LIVEBG_ON_VIEW9);
278                 break;
279
280
281     }
282
283     return TRUE;
284 }
285
286 static void
287 animation_wallpaper_plugin_init (AWallpaperPlugin *desktop_plugin)
288 {
289
290     //fprintf(stderr, "!!!!!!!plugin init \n");
291     Animation_WallpaperPrivate *priv =  Animation_Wallpaper_HOME_PLUGIN_GET_PRIVATE (desktop_plugin);
292     desktop_plugin->priv =  Animation_Wallpaper_HOME_PLUGIN_GET_PRIVATE (desktop_plugin);
293     priv->osso = osso_initialize(PACKAGE, VERSION, TRUE, NULL);
294
295         /* Initialize DBUS */
296     livewp_initialize_dbus(priv);
297
298     priv->desktop_plugin = desktop_plugin;
299     priv->window = (GtkWidget *)desktop_plugin;
300     priv->visible = FALSE;
301     priv->short_timer = 0;
302     priv->xapplet = 0;
303     priv->yapplet = 0;
304     priv->scene = NULL;
305     priv->pid = 0;
306     priv->theme = g_strdup("Modern");
307     //priv->theme = g_strdup("Accel");
308     desktop_plugin->priv->main_widget = gtk_fixed_new();
309
310     gtk_widget_set_size_request(desktop_plugin->priv->main_widget, 1, 1);
311     gtk_widget_show (desktop_plugin->priv->main_widget);
312     gtk_container_add (GTK_CONTAINER (desktop_plugin), desktop_plugin->priv->main_widget);
313     init_applet_position(&(priv->xapplet), &(priv->yapplet));
314
315     
316     priv->scene = NULL;
317     g_signal_connect (desktop_plugin, "notify::is-on-current-desktop",
318                    G_CALLBACK (desktop_plugin_visible_notify), desktop_plugin);
319
320     priv->alive_timer = g_timeout_add(60000*3, (GtkFunction)send_alive_event, priv);  /* One per 3 minute */ 
321 }
322
323 static void
324 lw_applet_finalize (GObject *object)
325 {
326      int status = 0; int wpid; 
327 fprintf(stderr,"lw_applet_finalize\n");
328      AWallpaperPlugin *desktop_plugin = Animation_Wallpaper_HOME_PLUGIN (object);
329      Animation_WallpaperPrivate *priv = desktop_plugin->priv;
330 /*
331      
332      if (priv){
333              livewp_deinitialize_dbus(priv);
334              fprintf(stderr,"finalaze %i\n", priv->long_timer);
335              if (priv->long_timer){
336                 g_source_remove(priv->long_timer);
337                 priv->long_timer = 0;
338              }
339              if (priv->short_timer){
340                 g_source_remove(priv->short_timer);
341                 priv->short_timer = 0;
342              }
343
344              destroy_scene(desktop_plugin);
345      }
346 */    
347      if (priv){
348              switch (priv->view + 1){
349                 case 1: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
350                                           LIVEWP_SIGNAL_PATH, LIVEWP_STOP_LIVEBG_ON_VIEW1);
351                         break;
352                 case 2: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
353                                           LIVEWP_SIGNAL_PATH, LIVEWP_STOP_LIVEBG_ON_VIEW2);
354                         break;
355                 case 3: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
356                                           LIVEWP_SIGNAL_PATH, LIVEWP_STOP_LIVEBG_ON_VIEW3);
357                         break;
358                 case 4: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
359                                           LIVEWP_SIGNAL_PATH, LIVEWP_STOP_LIVEBG_ON_VIEW4);
360                         break;
361                 case 5: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
362                                           LIVEWP_SIGNAL_PATH, LIVEWP_STOP_LIVEBG_ON_VIEW5);
363                         break;
364                 case 6: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
365                                           LIVEWP_SIGNAL_PATH, LIVEWP_STOP_LIVEBG_ON_VIEW6);
366                         break;
367                 case 7: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
368                                           LIVEWP_SIGNAL_PATH, LIVEWP_STOP_LIVEBG_ON_VIEW7);
369                         break;
370                 case 8: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
371                                           LIVEWP_SIGNAL_PATH, LIVEWP_STOP_LIVEBG_ON_VIEW8);
372                         break;
373                 case 9: send_dbus_signal (priv, LIVEWP_SIGNAL_INTERFACE, 
374                                           LIVEWP_SIGNAL_PATH, LIVEWP_STOP_LIVEBG_ON_VIEW9);
375                         break;
376              }
377      }
378      if(priv->alive_timer > 0) 
379          g_source_remove(priv->alive_timer);
380
381      livewp_deinitialize_dbus(priv);
382
383      if (priv->pid >0){
384              while (TRUE){
385                  wpid = wait(&status);
386                  if (wpid == priv->pid)
387                      break;
388              }
389      }
390 }
391
392 static void
393 desktop_widget_finalize (GObject *object)
394 {
395 fprintf(stderr,"desktop lw_applet_finalize\n");
396       /* Call the base class's implementation: */
397      G_OBJECT_CLASS (animation_wallpaper_plugin_parent_class)->finalize (object);
398 }
399
400 static void
401 animation_wallpaper_plugin_class_init (AWallpaperPluginClass *klass) {
402
403     GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
404     GtkObjectClass *gobject_class = GTK_OBJECT_CLASS (klass);
405     GObjectClass *object_class = G_OBJECT_CLASS (klass);
406
407     /* gobject */
408     gobject_class->destroy = (gpointer)lw_applet_finalize;
409     object_class->finalize = desktop_widget_finalize;
410     widget_class->realize = lw_applet_realize;
411
412     g_type_class_add_private (klass, sizeof (Animation_WallpaperPrivate));
413
414 }
415
416 static void
417 animation_wallpaper_plugin_class_finalize (AWallpaperPluginClass *class) {
418 }
419
420 Animation_WallpaperPrivate*
421 animation_wallpaper_plugin_new (void)
422 {
423   return g_object_new (Animation_Wallpaper_TYPE_HOME_PLUGIN , NULL);
424 }
425