debuging
[livewp] / applet / src / livewp-actor.c
index f8d4009..ad6ffcd 100644 (file)
@@ -23,8 +23,6 @@
 */
 /*******************************************************************************/
 #include "livewp-actor.h"
-#include <sys/time.h>
-#include "livewp-rules.h"
 
 Actor* 
 init_object(AWallpaperPlugin *desktop_plugin, 
@@ -68,12 +66,267 @@ init_object(AWallpaperPlugin *desktop_plugin,
     return actor;
 }
 
+void 
+destroy_actor(Actor *actor)
+{
+    if (actor){
+        if (actor->child){
+            g_ptr_array_free(actor->child, TRUE);
+        }
+        if (actor->filename)
+            g_free(actor->filename);
+        if (actor->name)
+            g_free(actor->name);
+        gtk_widget_destroy(actor->widget);
+        //actor->widget = NULL;
+        g_free(actor);
+    }
+}
 static gint 
 path_line(gint x0, gint x1, double t)
 {
     // уравниение прямой
     return ((x1 - x0) * t + x0);
 }
+void
+set_actor_scale(Actor *actor, double scalex, double scaley)
+{
+    hildon_animation_actor_set_scale(
+            HILDON_ANIMATION_ACTOR(actor->widget), 
+            scalex, 
+            scaley
+    );
+
+}
+void
+set_actor_rotation(Actor *actor, gint axis, double degrees, gint x, gint y, gint z)
+{
+    hildon_animation_actor_set_rotation(
+            HILDON_ANIMATION_ACTOR(actor->widget),
+            axis,
+            degrees,
+            x,
+            y,
+            z
+    );
+}
+void 
+set_actor_visible(Actor *actor, gboolean visible)
+{
+    hildon_animation_actor_set_show(HILDON_ANIMATION_ACTOR(actor->widget), visible);
+}
+
+void
+set_actor_position(Actor *actor, gint x, gint y, gint z, AWallpaperPlugin *desktop_plugin)
+{
+    hildon_animation_actor_set_position_full(HILDON_ANIMATION_ACTOR (actor->widget), 
+                                             x-desktop_plugin->priv->xapplet, 
+                                             y-desktop_plugin->priv->yapplet, 
+                                             z);
+}
+
+int get_notify_count(gchar *notify_type)
+{
+    sqlite3 *db = NULL;
+    sqlite3_stmt *res = NULL;
+    gint rc = 0, result = 0;
+    gchar sql[1024];
+
+    rc = sqlite3_open("/home/user/.config/hildon-desktop/notifications.db", &db);
+    if (rc){
+        fprintf(stderr, "error open db %d %s\n", rc, sqlite3_errmsg(db));
+    }else {
+        snprintf(sql, sizeof(sql)-1, "select count(id) from notifications where icon_name='%s'", notify_type);
+        rc = sqlite3_prepare(db, sql, sizeof(sql)-1, &res, NULL);
+        if (rc != SQLITE_OK){
+            fprintf(stderr, "error prepare %d %s\n", rc, sql);
+        }
+        if (sqlite3_step(res) != SQLITE_ROW){
+            fprintf(stderr, "not sqlite_row\n");
+        }
+        result = sqlite3_column_int(res, 0);
+        //fprintf(stderr, "count missing calls = %d\n", call_count);
+        sqlite3_finalize(res);
+
+        sqlite3_close(db);
+    }
+    return result;
+}
+gchar * read_notification()
+{
+    gchar *message = "";
+    gint count = 0;
+    
+    fprintf(stderr, "read notification \n");
+    count = get_notify_count("general_missed");
+    if (count > 0){
+        message = g_strdup_printf("%s: %d", _("Missed calls"), count);
+    }
+    count = get_notify_count("general_sms");
+    if (count > 0){
+        if (message){
+            message = g_strdup_printf("%s \n%s: %d", message, _("Missed sms"), count);
+        }else {
+            message = g_strdup_printf("%s: %d", _("Missed sms"), count);
+        }
+    }
+    count = get_notify_count("general_chat");
+    if (count > 0){
+        if (message){
+            message = g_strdup_printf("%s \n%s: %d", message, _("Missed chat"), count);
+        }else {
+            message = g_strdup_printf("%s: %d", _("Missed chat"), count);
+        }
+    }
+    count = get_notify_count("qgn_list_messagin");
+    if (count > 0){
+        if (message){
+            message = g_strdup_printf("%s \n%s: %d", message, _("Missed mail"), count);
+        }else {
+            message = g_strdup_printf("%s: %d", _("Missed mail"), count);
+        }
+    }
+    fprintf(stderr, "notify=%s\n", message);
+    return message;
+}
+
+void
+change_obj(Actor *actor, AWallpaperPlugin *desktop_plugin)
+{
+    char * accel_filename = "/sys/class/i2c-adapter/i2c-3/3-001d/coord";
+    //char * accel_filename = "/home/tanya/coord";
+
+    FILE *fd = NULL;
+    int rs, ax, ay, az, dx, dy;
+    fd = fopen(accel_filename, "r");
+    if (fd == NULL){
+        fprintf(stderr, "cannot open file\n");
+        return;
+    }
+    rs = fscanf((FILE*)fd, "%i %i %i", &ax, &ay, &az);
+    fclose(fd);
+    if (rs != 3){
+        fprintf(stderr, "cannot read information from file\n");
+        return;
+    }
+
+    fprintf(stderr, "change obj %i %i %i\n", ax, ay, az);
+    dx = -ax / 100;
+    dy = -ay / 100;
+
+    actor->x = actor->x + dx;
+    actor->y = actor->y + dy;
+
+    if (actor->x > 800) actor->x = 0;
+    if (actor->x < 0) actor->x = 800;
+
+    if (actor->y > 480) actor->y = 0;
+    if (actor->y < 0) actor->y = 480;
+
+    set_actor_position(actor, actor->x, actor->y, actor->z, desktop_plugin);
+
+
+}
+
+void 
+change_billboard(Actor * actor, AWallpaperPlugin *desktop_plugin)
+{
+    gint count = 0;
+    Actor *a = NULL;
+     
+    //fprintf(stderr, "change_billboard\n");   
+    
+    if (desktop_plugin->priv->scene->notification < time(NULL)){
+        count = get_notify_count("general_missed");
+        a = g_ptr_array_index(actor->child, 0);
+        if (count > 0){
+            set_actor_visible(a, TRUE);            
+        }else {
+            set_actor_visible(a, FALSE);
+        }
+        count = get_notify_count("general_sms");
+        a = g_ptr_array_index(actor->child, 3);
+        if (count > 0){
+            set_actor_visible(a, TRUE);            
+        }else {
+            set_actor_visible(a, FALSE);
+        }
+        count = get_notify_count("general_chat");
+        a = g_ptr_array_index(actor->child, 1);
+        if (count > 0){
+            set_actor_visible(a, TRUE);            
+        }else {
+            set_actor_visible(a, FALSE);
+        }
+        count = get_notify_count("qgn_list_messagin");
+        a = g_ptr_array_index(actor->child, 2);
+        if (count > 0){
+            set_actor_visible(a, TRUE);            
+        }else {
+            set_actor_visible(a, FALSE);
+        }
+
+        desktop_plugin->priv->scene->notification = FALSE;
+    }
+    actor->time_start_animation = time(NULL) + 20;    
+}
+
+#if 0
+void 
+change_billboard1(Actor * actor, AWallpaperPlugin *desktop_plugin)
+{
+    GtkWidget *label;
+    sqlite3 *db = NULL;
+    sqlite3_stmt *res = NULL;
+    gchar *errMsg = NULL, *message;
+    gchar sql[1024];
+    gint call_count=0, sms_count=0, rc=0;
+    GtkListStore *list = NULL;
+    PangoFontDescription *pfd = NULL;
+    
+    rc = sqlite3_open("/home/user/.rtcom-eventlogger/el.db", &db);
+    if (rc){
+        fprintf(stderr, "error open db %d %s\n", rc, sqlite3_errmsg(db));
+    }else {
+        snprintf(sql, sizeof(sql)-1, "select count(id) from Events where event_type_id=%d", 3);
+
+        rc = sqlite3_prepare(db, sql, sizeof(sql)-1, &res, NULL);
+        if (rc != SQLITE_OK){
+            fprintf(stderr, "error prepare %d %s\n", rc, sql);
+        }
+        if (sqlite3_step(res) != SQLITE_ROW){
+            fprintf(stderr, "not sqlite_row\n");
+        }
+        call_count = sqlite3_column_int(res, 0);
+        //fprintf(stderr, "count missing calls = %d\n", call_count);
+        sqlite3_finalize(res);
+
+        snprintf(sql, sizeof(sql)-1, "select count(id) from Events where event_type_id=%d and is_read=%d", 7, 0);
+        rc = sqlite3_prepare(db, sql, sizeof(sql)-1, &res, NULL);
+        if (rc != SQLITE_OK){
+            fprintf(stderr, "error prepare %d %s\n", rc, sql);
+        }
+        if (sqlite3_step(res) != SQLITE_ROW){
+            fprintf(stderr, "not sqlite_row\n");
+        }
+        sms_count = sqlite3_column_int(res, 0);
+        //fprintf(stderr, "count sms = %d\n", sms_count);
+        sqlite3_finalize(res);
+
+
+        sqlite3_close(db);
+    }
+    label = actor->image;
+    message = g_markup_printf_escaped("<span bgcolor=\"%s\" foreground=\"%s\">Missed calls: %d Unread sms: %d</span>", "#FFFFFF", "#000000", call_count, sms_count);
+    gtk_label_set_markup(GTK_LABEL(label), message);
+    g_free(message);
+    pfd = pango_font_description_from_string("Sans 14");
+    gtk_widget_modify_font(GTK_WIDGET(label), NULL);
+    gtk_widget_modify_font(GTK_WIDGET(label), pfd);
+    pango_font_description_free(pfd);
+    actor->time_start_animation = time(NULL) + 20;    
+}
+#endif
 
 void 
 change_moon(Actor * actor, AWallpaperPlugin *desktop_plugin)
@@ -122,7 +375,7 @@ change_moon(Actor * actor, AWallpaperPlugin *desktop_plugin)
             y = 0.001920*x*x - 1.536*x + 337.2;
             //y = a*x*x + b*x + c;
 
-            actor_set_position_full(actor->widget, x, y, actor->z);
+            set_actor_position(actor, x, y, actor->z, desktop_plugin);
 
             if (t>=2){
                 actor->time_start_animation = sec;
@@ -155,7 +408,7 @@ change_sun(Actor * actor, AWallpaperPlugin *desktop_plugin)
             get_sun_screen_pos(alt, azm, &x, &y);
             actor->x = x;
             actor->y = y;
-            actor_set_position_full(actor->widget, x, y, actor->z);
+            set_actor_position(actor, x, y, actor->z, desktop_plugin);
             actor->time_start_animation = time(NULL) + 60;
          }else if (actor->visible){
             actor->visible = FALSE;
@@ -200,7 +453,7 @@ change_tram(Actor * actor, AWallpaperPlugin *desktop_plugin)
     x = path_line(x0, x1, t);
     y = path_line(y0, y1, t);
     scale = path_line(scale0, scale1, t);
-    actor_set_position_full(actor->widget, x, y, actor->z);
+    set_actor_position(actor, x, y, actor->z, desktop_plugin);
     set_actor_scale(actor, (double)scale/100, (double)scale/100);
     if (t >= 1){
         /* stop animation */
@@ -241,7 +494,7 @@ change_plane1(Actor *actor, AWallpaperPlugin *desktop_plugin)
     x = path_line(x0, x1, t);
     y = path_line(y0, y1, t);
     //scale = path_line(scale0, scale1, t);
-    actor_set_position_full(actor->widget, x, y, actor->z);
+    set_actor_position(actor, x, y, actor->z, desktop_plugin);
     if (t >= 1){
         /* stop animation */
         actor->visible = FALSE;
@@ -285,7 +538,7 @@ change_plane2(Actor *actor, AWallpaperPlugin *desktop_plugin)
     x = path_line(x0, x1, t);
     y = path_line(y0, y1, t);
     //scale = path_line(scale0, scale1, t);
-    actor_set_position_full(actor->widget, x, y, actor->z);
+    set_actor_position(actor, x, y, actor->z, desktop_plugin);
     if (t >= 1){
         /* stop animation */
         actor->visible = FALSE;
@@ -344,7 +597,7 @@ change_cloud(Actor *actor, AWallpaperPlugin *desktop_plugin)
     y = -desktop_plugin->priv->scene->wind_angle * (x - x0) + actor->y;
     scale = path_line(scale0, scale1, (double)(y - y0)/(y1 - y0));
 
-    actor_set_position_full(actor->widget, x, y, actor->z);
+    set_actor_position(actor, x, y, actor->z, desktop_plugin);
     set_actor_scale(actor, (double)scale/100, (double)scale/100);
     if ((y < y1 || y > y0) || t >= 1){
         /* stop animation */
@@ -418,18 +671,142 @@ change_signal(Actor * actor, AWallpaperPlugin *desktop_plugin)
 }
 
 void
-set_actor_scale(Actor *actor, double scalex, double scaley)
+change_tape(Actor *actor, AWallpaperPlugin *desktop_plugin)
 {
-    hildon_animation_actor_set_scale(
-            HILDON_ANIMATION_ACTOR(actor->widget), 
-            scalex, 
-            scaley
-    );
+    gint x, y, i;
+    Actor *a;
+
+    if (!desktop_plugin->priv->rich_animation) return;
+    
+    char * accel_filename = "/sys/class/i2c-adapter/i2c-3/3-001d/coord";
+    //char * accel_filename = "/home/tanya/coord";
+
+    FILE *fd = NULL;
+    int rs, ax, ay, az;
+    fd = fopen(accel_filename, "r");
+    if (fd == NULL){
+        //fprintf(stderr, "cannot open file\n");
+        fd = fopen("/home/user/coord", "r"); 
+    }
+    rs = fscanf((FILE*)fd, "%i %i %i", &ax, &ay, &az);
+    fclose(fd);
+    if (rs != 3){
+        fprintf(stderr, "cannot read information from file\n");
+        return;
 
+    }
+
+    //fprintf(stderr, "change obj %i %i %i angle rad=%f, deg=%f\n", ax, ay, az, atan2(ax, -ay), atan2(ax, -ay)*180/M_PI);
+    int ang = (int)floor(atan2(ay, ax)*180/M_PI);
+    if (ang < 0) ang = 360+ang;
+
+    if (!desktop_plugin->priv->rich_animation) return;
+
+    for (i=0; i<16; i++){
+        a = g_ptr_array_index(actor->child, i);
+        if (a->scale == 100) a->scale = ang;
+        if (abs(a->scale - ang) > 10){
+            if (a->scale > ang){
+                if ((a->scale - ang) < (ang + (360-a->scale))) a->scale--;
+                else a->scale++;
+            }
+            if (a->scale < ang) {
+                if (ang - a->scale < (a->scale+(360-ang))) a->scale++;
+                else a->scale--;
+            }
+            if (a->scale > 360) a->scale = 0;
+            if (a->scale < 0) a->scale = 360;
+        }
+    
+        x = a->x - (float)cos(a->scale*M_PI/180)*a->z;
+        y = a->y - (float)sin(a->scale*M_PI/180)*a->z;
+        //x = round(a->x - (float)cos(a->scale*M_PI/180)*a->z);
+        //y = round(a->y - (float)sin(a->scale*M_PI/180)*a->z);
+        //x = a->x - cos(angle)*a->z;
+        //y = a->y - sin(angle)*a->z;
+        if ((a->scale > 270 || a->scale < 90) && x < -a->width*cos(a->scale*M_PI/180)){ 
+            x = 800; 
+            y = fast_rnd(480);
+        } 
+        if ((a->scale > 90 && a->scale < 270) && x > 800 - a->width*cos(a->scale*M_PI/180)){
+            x = 0;
+            y = fast_rnd(480);
+        }
+        if (a->scale > 0 && a->scale < 180 && y < -a->width*sin(a->scale*M_PI/180)){
+            y = 480;
+            x = fast_rnd(800);
+        }
+        if (a->scale < 360 && a->scale > 180 && y > 480 - a->width*sin(a->scale*M_PI/180)){
+            y = 0;
+            x = fast_rnd(800);
+        }
+        //if (i ==0) fprintf(stderr, "x=%d y=%d ang=%d speed=%d\n", x, y, a->scale, a->z);
+        set_actor_rotation(a, HILDON_AA_Z_AXIS, a->scale, 0, 0, 0);
+        set_actor_position(a, x, y, a->z, desktop_plugin);
+        a->x = x;
+        a->y = y;
+    }
+    
+}
+
+void
+change_layer(Actor * actor, AWallpaperPlugin *desktop_plugin)
+{
+    gint y, speed1 = 8, speed2 = 16;
+    Actor *a;
+
+    if (!desktop_plugin->priv->rich_animation) return;
+
+    a = g_ptr_array_index(actor->child, 0);
+    y = a->y + speed1;
+    if (y > 480) y = -480;
+    set_actor_position(a, a->x, y, a->z, desktop_plugin);
+    a->y = y;
+    
+    a = g_ptr_array_index(actor->child, 1);
+    y = a->y + speed1;
+    if (y > 480) y = -480;
+    set_actor_position(a, a->x, y, a->z, desktop_plugin);
+    a->y = y;
+
+    a = g_ptr_array_index(actor->child, 2);
+    y = a->y + speed2;
+    if (y > 480) y = -480;
+    set_actor_position(a, a->x, y, a->z, desktop_plugin);
+    a->y = y;
+
+    a = g_ptr_array_index(actor->child, 3);
+    y = a->y + speed2;
+    if (y > 480) y = -480;
+    set_actor_position(a, a->x, y, a->z, desktop_plugin);
+    a->y = y;
 }
 
 void 
-set_actor_visible(Actor *actor, gboolean visible)
+change_static_actor(Actor * actor, AWallpaperPlugin *desktop_plugin)
 {
-    hildon_animation_actor_set_show(HILDON_ANIMATION_ACTOR(actor->widget), visible);
+    gchar *newfile;
+    newfile = g_strdup_printf("%s%d.png", actor->name, desktop_plugin->priv->scene->daytime); 
+    if (actor->filename)
+            g_free(actor->filename);
+    actor->filename = newfile;
+    change_hildon_actor(actor, desktop_plugin);
+}
+
+void 
+change_static_actor_with_corner(Actor * actor, AWallpaperPlugin *desktop_plugin)
+{
+    gchar buffer[2048];
+
+    if (desktop_plugin->priv->right_corner)
+        gtk_widget_destroy(desktop_plugin->priv->right_corner);
+    snprintf(buffer, sizeof(buffer) - 1, "%s/%s/town%i_right_corner.png", \
+                                  THEME_PATH, desktop_plugin->priv->theme, desktop_plugin->priv->scene->daytime);
+    desktop_plugin->priv->right_corner = gtk_image_new_from_file (buffer);
+    if (desktop_plugin->priv->right_corner){
+        gtk_fixed_put(GTK_FIXED(desktop_plugin->priv->main_widget), desktop_plugin->priv->right_corner, 0, 0);
+        gtk_widget_show (desktop_plugin->priv->right_corner);
+    }
+    change_static_actor(actor, desktop_plugin);
+
 }