1 /*vim: set sw=4 ts=4 et: */
3 * This file is part of Live Wallpaper (livewp)
5 * Copyright (C) 2010 Vlad Vasiliev
6 * Copyright (C) 2010 Tanya Makova
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.
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.
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
24 /*******************************************************************************/
25 #include "livewp-actor.h"
28 init_object(AWallpaperPlugin *desktop_plugin,
40 void (*pfunc_change)(Actor*),
41 void (*pfunc_probability)(Actor*),
46 actor = g_new0(Actor, 1);
51 actor->height = height;
52 actor->visible = visible;
54 actor->opacity = opacity;
55 actor->filename = g_strdup(filename);
56 actor->name = g_strdup(name);
57 actor->func_change = (gpointer)pfunc_change;
58 actor->func_probability = (gpointer)pfunc_probability;
61 create_hildon_actor(actor, desktop_plugin);
64 actor->time_start_animation = 0;
65 actor->duration_animation = 0;
70 destroy_actor(Actor *actor)
74 g_ptr_array_free(actor->child, TRUE);
77 g_free(actor->filename);
80 gtk_widget_destroy(actor->widget);
81 //actor->widget = NULL;
86 path_line(gint x0, gint x1, double t)
89 return ((x1 - x0) * t + x0);
92 set_actor_scale(Actor *actor, double scalex, double scaley)
94 hildon_animation_actor_set_scale(
95 HILDON_ANIMATION_ACTOR(actor->widget),
103 set_actor_visible(Actor *actor, gboolean visible)
105 hildon_animation_actor_set_show(HILDON_ANIMATION_ACTOR(actor->widget), visible);
109 set_actor_position(Actor *actor, gint x, gint y, gint z, AWallpaperPlugin *desktop_plugin)
111 hildon_animation_actor_set_position_full(HILDON_ANIMATION_ACTOR (actor->widget),
112 x-desktop_plugin->priv->xapplet,
113 y-desktop_plugin->priv->yapplet,
117 int get_notify_count(gchar *notify_type)
121 gint rc = 0, result = 0;
124 rc = sqlite3_open("/home/user/.config/hildon-desktop/notifications.db", &db);
126 fprintf(stderr, "error open db %d %s\n", rc, sqlite3_errmsg(db));
128 snprintf(sql, sizeof(sql)-1, "select count(id) from notifications where icon_name='%s'", notify_type);
129 rc = sqlite3_prepare(db, sql, sizeof(sql)-1, &res, NULL);
130 if (rc != SQLITE_OK){
131 fprintf(stderr, "error prepare %d %s\n", rc, sql);
133 if (sqlite3_step(res) != SQLITE_ROW){
134 fprintf(stderr, "not sqlite_row\n");
136 result = sqlite3_column_int(res, 0);
137 //fprintf(stderr, "count missing calls = %d\n", call_count);
138 sqlite3_finalize(res);
144 gchar * read_notification()
149 fprintf(stderr, "read notification \n");
150 count = get_notify_count("general_missed");
152 message = g_strdup_printf("%s: %d", _("Missed calls"), count);
154 count = get_notify_count("general_sms");
157 message = g_strdup_printf("%s \n%s: %d", message, _("Missed sms"), count);
159 message = g_strdup_printf("%s: %d", _("Missed sms"), count);
162 count = get_notify_count("general_chat");
165 message = g_strdup_printf("%s \n%s: %d", message, _("Missed chat"), count);
167 message = g_strdup_printf("%s: %d", _("Missed chat"), count);
170 count = get_notify_count("qgn_list_messagin");
173 message = g_strdup_printf("%s \n%s: %d", message, _("Missed mail"), count);
175 message = g_strdup_printf("%s: %d", _("Missed mail"), count);
178 fprintf(stderr, "notify=%s\n", message);
183 change_billboard(Actor * actor, AWallpaperPlugin *desktop_plugin)
186 gchar *mes = NULL, *message = NULL;
187 PangoFontDescription *pfd = NULL;
191 fprintf(stderr, "change_billboard\n");
193 if (desktop_plugin->priv->scene->notification < time(NULL)){
194 count = get_notify_count("general_missed");
195 a = g_ptr_array_index(actor->child, 0);
197 set_actor_visible(a, TRUE);
199 set_actor_visible(a, FALSE);
201 count = get_notify_count("general_sms");
202 a = g_ptr_array_index(actor->child, 3);
204 set_actor_visible(a, TRUE);
206 set_actor_visible(a, FALSE);
208 count = get_notify_count("general_chat");
209 a = g_ptr_array_index(actor->child, 1);
211 set_actor_visible(a, TRUE);
213 set_actor_visible(a, FALSE);
215 count = get_notify_count("qgn_list_messagin");
216 a = g_ptr_array_index(actor->child, 2);
218 set_actor_visible(a, TRUE);
220 set_actor_visible(a, FALSE);
224 message = read_notification();
225 label = actor->image;
226 mes = g_markup_printf_escaped("<span bgcolor=\"%s\" foreground=\"%s\">%s</span>", "#FFFFFF", "#000000", message);
227 gtk_label_set_markup(GTK_LABEL(label), mes);
228 pfd = pango_font_description_from_string("Sans 16");
229 gtk_widget_modify_font(GTK_WIDGET(label), NULL);
230 gtk_widget_modify_font(GTK_WIDGET(label), pfd);
231 pango_font_description_free(pfd);
233 desktop_plugin->priv->scene->notification = FALSE;
235 actor->time_start_animation = time(NULL) + 20;
240 change_billboard1(Actor * actor, AWallpaperPlugin *desktop_plugin)
244 sqlite3_stmt *res = NULL;
245 gchar *errMsg = NULL, *message;
247 gint call_count=0, sms_count=0, rc=0;
248 GtkListStore *list = NULL;
249 PangoFontDescription *pfd = NULL;
251 rc = sqlite3_open("/home/user/.rtcom-eventlogger/el.db", &db);
253 fprintf(stderr, "error open db %d %s\n", rc, sqlite3_errmsg(db));
255 snprintf(sql, sizeof(sql)-1, "select count(id) from Events where event_type_id=%d", 3);
257 rc = sqlite3_prepare(db, sql, sizeof(sql)-1, &res, NULL);
258 if (rc != SQLITE_OK){
259 fprintf(stderr, "error prepare %d %s\n", rc, sql);
261 if (sqlite3_step(res) != SQLITE_ROW){
262 fprintf(stderr, "not sqlite_row\n");
264 call_count = sqlite3_column_int(res, 0);
265 //fprintf(stderr, "count missing calls = %d\n", call_count);
266 sqlite3_finalize(res);
268 snprintf(sql, sizeof(sql)-1, "select count(id) from Events where event_type_id=%d and is_read=%d", 7, 0);
269 rc = sqlite3_prepare(db, sql, sizeof(sql)-1, &res, NULL);
270 if (rc != SQLITE_OK){
271 fprintf(stderr, "error prepare %d %s\n", rc, sql);
273 if (sqlite3_step(res) != SQLITE_ROW){
274 fprintf(stderr, "not sqlite_row\n");
276 sms_count = sqlite3_column_int(res, 0);
277 //fprintf(stderr, "count sms = %d\n", sms_count);
278 sqlite3_finalize(res);
283 label = actor->image;
284 message = g_markup_printf_escaped("<span bgcolor=\"%s\" foreground=\"%s\">Missed calls: %d Unread sms: %d</span>", "#FFFFFF", "#000000", call_count, sms_count);
285 gtk_label_set_markup(GTK_LABEL(label), message);
287 pfd = pango_font_description_from_string("Sans 14");
288 gtk_widget_modify_font(GTK_WIDGET(label), NULL);
289 gtk_widget_modify_font(GTK_WIDGET(label), pfd);
290 pango_font_description_free(pfd);
291 actor->time_start_animation = time(NULL) + 20;
296 change_moon(Actor * actor, AWallpaperPlugin *desktop_plugin)
310 a = (double)(y2 - (double)(x2*(y1-y0) + x1*y0 - x0*y1)/(x1-x0))/(x2*(x2-x0-x1)+x0*x1);
311 b = (double)(y1-y0)/(x1-x0) - (double)a*(x0+x1);
312 c = (double)(x1*y0 - x0*y1)/(x1-x0) + (double)a*x0*x1;
313 fprintf(stderr, "a=%f, b=%f, c=%f\n", a, b, c);
315 gettimeofday(&tvb, NULL);
321 if (desktop_plugin->priv->scene->daytime == TIME_NIGHT){
322 if (!actor->visible){
323 actor->visible = TRUE;
324 phase = get_moon_phase();
325 newfile = g_strdup_printf( "%s%d.png", actor->name, phase);
327 g_free(actor->filename);
328 actor->filename = newfile;
329 actor->time_start_animation = sec - fast_rnd(60 * 60);
330 actor->duration_animation = 1 * 60 * 60;
331 create_hildon_actor(actor, desktop_plugin);
334 t = (double)((double)sec+(double)ms/1000000 - actor->time_start_animation) / actor->duration_animation;
336 x = path_line(x0, x1, t);
338 x = path_line(x1, x0, t-1);
339 y = 0.001920*x*x - 1.536*x + 337.2;
340 //y = a*x*x + b*x + c;
342 set_actor_position(actor, x, y, actor->z, desktop_plugin);
345 actor->time_start_animation = sec;
348 }else if (actor->visible){
349 actor->visible = FALSE;
350 fprintf(stderr, "destroy moon \n");
351 destroy_hildon_actor(actor);
352 actor->time_start_animation = 0;
359 change_sun(Actor * actor, AWallpaperPlugin *desktop_plugin)
364 //fprintf(stderr, "change sun\n");
366 if (desktop_plugin->priv->scene->daytime != TIME_NIGHT){
367 if (!actor->visible){
368 actor->visible = TRUE;
369 create_hildon_actor(actor, desktop_plugin);
371 get_sun_pos(&alt, &azm);
372 get_sun_screen_pos(alt, azm, &x, &y);
375 set_actor_position(actor, x, y, actor->z, desktop_plugin);
376 actor->time_start_animation = time(NULL) + 60;
377 }else if (actor->visible){
378 actor->visible = FALSE;
379 destroy_hildon_actor(actor);
380 actor->time_start_animation = 0;
387 change_tram(Actor * actor, AWallpaperPlugin *desktop_plugin)
389 gint x0 = -300, y0 = 225, scale0 = 100,
390 x1 = 800, y1 = 162, scale1 = 130,
397 //fprintf(stderr, "change tram\n");
398 gettimeofday(&tvb, NULL);
403 if (!actor->visible){
404 actor->visible = TRUE;
405 if (desktop_plugin->priv->scene->daytime == TIME_NIGHT){
407 g_free(actor->filename);
408 actor->filename = g_strdup("tram_dark.png");
411 g_free(actor->filename);
412 actor->filename = g_strdup("tram.png");
414 create_hildon_actor(actor, desktop_plugin);
416 t = (double)((double)sec+(double)ms/1000000 - actor->time_start_animation) / actor->duration_animation;
417 x = path_line(x0, x1, t);
418 y = path_line(y0, y1, t);
419 scale = path_line(scale0, scale1, t);
420 set_actor_position(actor, x, y, actor->z, desktop_plugin);
421 set_actor_scale(actor, (double)scale/100, (double)scale/100);
424 actor->visible = FALSE;
425 destroy_hildon_actor(actor);
426 actor->time_start_animation = sec + fast_rnd(60);
431 change_plane1(Actor *actor, AWallpaperPlugin *desktop_plugin)
433 gint x0 = 620, y0 = 233,
441 gettimeofday(&tvb, NULL);
445 // fprintf(stderr, "1 %f - %d\n", sec+(double)ms/100000, now);
447 if (desktop_plugin->priv->scene->daytime != TIME_NIGHT){
448 if (actor->time_start_animation == 0){
449 actor->time_start_animation = sec + fast_rnd(180);
453 if (!actor->visible){
454 actor->visible = TRUE;
455 create_hildon_actor(actor, desktop_plugin);
457 t = (double)((double)sec+(double)ms/1000000 - actor->time_start_animation) / actor->duration_animation;
458 x = path_line(x0, x1, t);
459 y = path_line(y0, y1, t);
460 //scale = path_line(scale0, scale1, t);
461 set_actor_position(actor, x, y, actor->z, desktop_plugin);
464 actor->visible = FALSE;
465 destroy_hildon_actor(actor);
466 if (desktop_plugin->priv->scene->daytime == TIME_NIGHT)
467 actor->time_start_animation = 0;
469 actor->time_start_animation = sec + fast_rnd(180);
475 change_plane2(Actor *actor, AWallpaperPlugin *desktop_plugin)
477 gint x0 = -actor->width, y0 = 45,
485 gettimeofday(&tvb, NULL);
489 // fprintf(stderr, "1 %f - %d\n", sec+(double)ms/100000, now);
490 if (desktop_plugin->priv->scene->daytime != TIME_NIGHT){
491 if (actor->time_start_animation == 0){
492 actor->time_start_animation = sec + fast_rnd(180);
496 if (!actor->visible){
497 actor->visible = TRUE;
498 create_hildon_actor(actor, desktop_plugin);
501 t = (double)((double)sec+(double)ms/1000000 - actor->time_start_animation) / actor->duration_animation;
502 x = path_line(x0, x1, t);
503 y = path_line(y0, y1, t);
504 //scale = path_line(scale0, scale1, t);
505 set_actor_position(actor, x, y, actor->z, desktop_plugin);
508 actor->visible = FALSE;
509 destroy_hildon_actor(actor);
510 if (desktop_plugin->priv->scene->daytime == TIME_NIGHT)
511 actor->time_start_animation = 0;
513 actor->time_start_animation = sec + fast_rnd(180);
519 change_cloud(Actor *actor, AWallpaperPlugin *desktop_plugin)
521 gint x0, y0 = 300, scale0 = 100,
522 x1, y1 = -actor->height, scale1 = 150,
530 //fprintf(stderr, "change cloud\n");
531 gettimeofday(&tvb, NULL);
536 if (!actor->visible){
537 actor->visible = TRUE;
538 if (desktop_plugin->priv->scene->daytime == TIME_NIGHT){
539 newfile = g_strdup_printf("%s_dark.png", actor->name);
541 newfile = g_strdup_printf("%s.png", actor->name);
544 g_free(actor->filename);
545 actor->filename = newfile;
547 create_hildon_actor(actor, desktop_plugin);
549 t = (double)((double)sec+(double)ms/1000000 - actor->time_start_animation) / actor->duration_animation;
551 if (desktop_plugin->priv->scene->wind_orientation == 1){
560 x = path_line(x0, x1, t);
561 y = -desktop_plugin->priv->scene->wind_angle * (x - x0) + actor->y;
562 scale = path_line(scale0, scale1, (double)(y - y0)/(y1 - y0));
564 set_actor_position(actor, x, y, actor->z, desktop_plugin);
565 set_actor_scale(actor, (double)scale/100, (double)scale/100);
566 if ((y < y1 || y > y0) || t >= 1){
568 actor->visible = FALSE;
569 destroy_hildon_actor(actor);
570 actor->time_start_animation = sec + fast_rnd(300);
571 actor->y = fast_rnd(300);
577 change_wind(Actor *actor, AWallpaperPlugin *desktop_plugin)
579 desktop_plugin->priv->scene->wind_orientation = fast_rnd(2);
580 if (desktop_plugin->priv->scene->wind_orientation == 0) desktop_plugin->priv->scene->wind_orientation = -1;
581 desktop_plugin->priv->scene->wind_angle = (double)(fast_rnd(200) - 100) / 100;
582 actor->time_start_animation = time(NULL) + (fast_rnd(10) + 10) * 60;
583 //fprintf(stderr, "change wind orient = %d angle = %f after = %d\n", scene.wind_orientation, scene.wind_angle, actor->time_start_animation-time(NULL));
587 change_window1(Actor * actor, AWallpaperPlugin *desktop_plugin)
589 gint now = time(NULL);
590 if (desktop_plugin->priv->scene->daytime == TIME_DAY){
592 actor->visible = FALSE;
593 destroy_hildon_actor(actor);
595 actor->time_start_animation = 0;
599 create_hildon_actor(actor, desktop_plugin);
600 if (actor->time_start_animation == 0){
601 actor->time_start_animation = now + fast_rnd(30);
607 actor->visible = TRUE;
609 actor->visible = FALSE;
610 set_actor_visible(actor, actor->visible);
611 actor->time_start_animation = now + fast_rnd(60) + 10;
616 change_signal(Actor * actor, AWallpaperPlugin *desktop_plugin)
618 gint now = time(NULL);
620 a = g_ptr_array_index(actor->child, 0);
625 set_actor_visible(a, a->visible);
627 a = g_ptr_array_index(actor->child, 1);
632 set_actor_visible(a, a->visible);
634 actor->time_start_animation = now + fast_rnd(30) + 10;
638 change_layer(Actor * actor, AWallpaperPlugin *desktop_plugin)
640 gint y, speed1 = 8, speed2 = 16;
643 if (!desktop_plugin->priv->rich_animation) return;
645 a = g_ptr_array_index(actor->child, 0);
647 if (y > 480) y = -480;
648 set_actor_position(a, a->x, y, a->z, desktop_plugin);
651 a = g_ptr_array_index(actor->child, 1);
653 if (y > 480) y = -480;
654 set_actor_position(a, a->x, y, a->z, desktop_plugin);
657 a = g_ptr_array_index(actor->child, 2);
659 if (y > 480) y = -480;
660 set_actor_position(a, a->x, y, a->z, desktop_plugin);
663 a = g_ptr_array_index(actor->child, 3);
665 if (y > 480) y = -480;
666 set_actor_position(a, a->x, y, a->z, desktop_plugin);
671 change_static_actor(Actor * actor, AWallpaperPlugin *desktop_plugin)
674 newfile = g_strdup_printf("%s%d.png", actor->name, desktop_plugin->priv->scene->daytime);
676 g_free(actor->filename);
677 actor->filename = newfile;
678 change_hildon_actor(actor, desktop_plugin);
682 change_static_actor_with_corner(Actor * actor, AWallpaperPlugin *desktop_plugin)
686 if (desktop_plugin->priv->right_corner)
687 gtk_widget_destroy(desktop_plugin->priv->right_corner);
688 snprintf(buffer, sizeof(buffer) - 1, "%s/%s/town%i_right_corner.png", \
689 THEME_PATH, desktop_plugin->priv->theme, desktop_plugin->priv->scene->daytime);
690 desktop_plugin->priv->right_corner = gtk_image_new_from_file (buffer);
691 if (desktop_plugin->priv->right_corner){
692 gtk_fixed_put(GTK_FIXED(desktop_plugin->priv->main_widget), desktop_plugin->priv->right_corner, 0, 0);
693 gtk_widget_show (desktop_plugin->priv->right_corner);
695 change_static_actor(actor, desktop_plugin);