X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=applet%2Fsrc%2Flivewp-actor.c;fp=applet%2Fsrc%2Flivewp-actor.c;h=b12a2c535e4a2d7560e1010f62aaffa66a5161df;hb=9c465d9bd80c62dd68c586c372b0568198084d48;hp=30f8002b11e8c95b4c82bdb2df95bfccbb4dc15e;hpb=ee7b56f652bfd13e3b0e49499ad6324752287f1c;p=livewp diff --git a/applet/src/livewp-actor.c b/applet/src/livewp-actor.c index 30f8002..b12a2c5 100644 --- a/applet/src/livewp-actor.c +++ b/applet/src/livewp-actor.c @@ -1,21 +1,21 @@ /*vim: set sw=4 ts=4 et: */ /* * This file is part of Live Wallpaper (livewp) - * + * * Copyright (C) 2010 Vlad Vasiliev * Copyright (C) 2010 Tanya Makova * for the code - * + * * This software is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. - * + * * This software is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA @@ -38,7 +38,7 @@ expose_event (GtkWidget *widget,GdkEventExpose *event, { cairo_t *cr; GdkPixbuf *pixbuf = (GdkPixbuf *) data; - + cr = gdk_cairo_create(widget->window); if (cr){ gdk_cairo_region(cr, event->region); @@ -59,23 +59,23 @@ destroy_hildon_actor(Actor *actor) } void -create_hildon_actor_text(Actor *actor, AWallpaperPlugin *desktop_plugin) +create_hildon_actor_text(Actor *actor, AWallpaperPlugin *desktop_plugin) { GtkWidget *ha = NULL; GtkWidget *label = NULL; ha = hildon_animation_actor_new(); - label = gtk_label_new(NULL); + label = gtk_label_new(NULL); if (label){ //g_signal_connect(G_OBJECT(label), "expose_event", G_CALLBACK(expose_event), NULL); gtk_container_add (GTK_CONTAINER (ha), label); - } + } realize(ha); gtk_widget_show(label); gtk_widget_show_all(ha); - + /* TO DO check it */ /* gdk_flush (); */ @@ -89,7 +89,7 @@ create_hildon_actor_text(Actor *actor, AWallpaperPlugin *desktop_plugin) } void -create_hildon_actor(Actor *actor, AWallpaperPlugin *desktop_plugin) +create_hildon_actor(Actor *actor, AWallpaperPlugin *desktop_plugin) { GtkWidget *ha = NULL; GdkPixbuf *pixbuf = NULL; @@ -99,12 +99,13 @@ create_hildon_actor(Actor *actor, AWallpaperPlugin *desktop_plugin) ha = hildon_animation_actor_new(); if (!strcmp(actor->name, "original")) str = g_strdup(actor->filename); - else - str = g_strdup_printf( "%s/%s/%s", THEME_PATH, + else + str = g_strdup_printf( "%s/%s/%s", THEME_PATH, desktop_plugin->priv->theme, actor->filename); - pixbuf = gdk_pixbuf_new_from_file_at_size (str, - actor->width, - actor->height, + /* fprintf(stderr, "create hildon actor file=%s\n", str); */ + pixbuf = gdk_pixbuf_new_from_file_at_size (str, + actor->width, + actor->height, NULL); if (str) g_free(str); @@ -116,10 +117,10 @@ create_hildon_actor(Actor *actor, AWallpaperPlugin *desktop_plugin) g_signal_connect(G_OBJECT(image), "expose_event", G_CALLBACK(expose_event), pixbuf); gtk_container_add (GTK_CONTAINER (ha), image); - } + } realize(ha); gtk_widget_show_all(ha); - + /* TO DO check it */ /* gdk_flush (); */ @@ -140,12 +141,12 @@ change_hildon_actor(Actor *actor, AWallpaperPlugin *desktop_plugin) GdkPixbuf *pixbuf = NULL; gchar *str = NULL; - str = g_strdup_printf( "%s/%s/%s", THEME_PATH, + str = g_strdup_printf( "%s/%s/%s", THEME_PATH, desktop_plugin->priv->theme, actor->filename); - - pixbuf = gdk_pixbuf_new_from_file_at_size (str, - actor->width, - actor->height, + + pixbuf = gdk_pixbuf_new_from_file_at_size (str, + actor->width, + actor->height, NULL); if(str) g_free(str); @@ -153,12 +154,12 @@ change_hildon_actor(Actor *actor, AWallpaperPlugin *desktop_plugin) image = gtk_image_new_from_pixbuf (pixbuf); g_object_unref(G_OBJECT(pixbuf)); } - if (image){ + if (image){ g_signal_connect(G_OBJECT(image), "expose_event", G_CALLBACK(expose_event), pixbuf); //if (g_object_get_data(G_OBJECT(actor->widget), "image")){ if (actor->image){ - gtk_container_remove(GTK_CONTAINER(actor->widget), actor->image); + gtk_container_remove(GTK_CONTAINER(actor->widget), actor->image); } //g_object_set_data(G_OBJECT(actor->widget), "image", image); actor->image = image; @@ -172,19 +173,19 @@ change_hildon_actor(Actor *actor, AWallpaperPlugin *desktop_plugin) } } -Actor* -init_object(AWallpaperPlugin *desktop_plugin, - gchar * name, - gchar * filename, - gint x, - gint y, - gint z, - gint width, - gint height, - gboolean visible, +Actor* +init_object(AWallpaperPlugin *desktop_plugin, + gchar * name, + gchar * filename, + gint x, + gint y, + gint z, + gint width, + gint height, + gboolean visible, gboolean load_image, - gint scale, - gint opacity, + gint scale, + gint opacity, void (*pfunc_change)(Actor*), void (*pfunc_probability)(Actor*), GPtrArray *child @@ -202,20 +203,20 @@ init_object(AWallpaperPlugin *desktop_plugin, actor->opacity = opacity; actor->filename = g_strdup(filename); actor->name = g_strdup(name); - actor->func_change = (gpointer)pfunc_change; + actor->func_change = (gpointer)pfunc_change; actor->func_probability = (gpointer)pfunc_probability; actor->child = child; if (load_image){ create_hildon_actor(actor, desktop_plugin); } - else + else actor->widget = NULL; actor->time_start_animation = 0; actor->duration_animation = 0; return actor; } -void +void destroy_actor(Actor *actor) { if (actor){ @@ -231,7 +232,7 @@ destroy_actor(Actor *actor) g_free(actor); } } -static gint +static gint path_line(gint x0, gint x1, double t) { // уравниение прямой @@ -241,8 +242,8 @@ void set_actor_scale(Actor *actor, double scalex, double scaley) { hildon_animation_actor_set_scale( - HILDON_ANIMATION_ACTOR(actor->widget), - scalex, + HILDON_ANIMATION_ACTOR(actor->widget), + scalex, scaley ); @@ -259,7 +260,7 @@ set_actor_rotation(Actor *actor, gint axis, double degrees, gint x, gint y, gint z ); } -void +void set_actor_visible(Actor *actor, gboolean visible) { hildon_animation_actor_set_show(HILDON_ANIMATION_ACTOR(actor->widget), visible); @@ -269,9 +270,9 @@ void set_actor_position(Actor *actor, gint x, gint y, gint z, AWallpaperPlugin *desktop_plugin) { //fprintf(stderr, "set actor position %d, %d, %d\n", x, y, z); - hildon_animation_actor_set_position_full(HILDON_ANIMATION_ACTOR (actor->widget), - x-desktop_plugin->priv->xapplet, - y-desktop_plugin->priv->yapplet, + hildon_animation_actor_set_position_full(HILDON_ANIMATION_ACTOR (actor->widget), + x-desktop_plugin->priv->xapplet, + y-desktop_plugin->priv->yapplet, z); } @@ -306,7 +307,7 @@ gchar * read_notification() { gchar *message = ""; gint count = 0; - + fprintf(stderr, "read notification \n"); count = get_notify_count("general_missed"); if (count > 0){ @@ -378,51 +379,51 @@ change_obj(Actor *actor, AWallpaperPlugin *desktop_plugin) } -void +void change_billboard(Actor * actor, AWallpaperPlugin *desktop_plugin) { gint count = 0; Actor *a = NULL; - - //fprintf(stderr, "change_billboard\n"); - + + //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); + 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); + 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); + 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); + set_actor_visible(a, TRUE); }else { set_actor_visible(a, FALSE); } desktop_plugin->priv->scene->notification = FALSE; } - actor->time_start_animation = time(NULL) + 20; + actor->time_start_animation = time(NULL) + 20; } #if 0 -void +void change_billboard1(Actor * actor, AWallpaperPlugin *desktop_plugin) { GtkWidget *label; @@ -433,7 +434,7 @@ change_billboard1(Actor * actor, AWallpaperPlugin *desktop_plugin) 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)); @@ -474,19 +475,19 @@ change_billboard1(Actor * actor, AWallpaperPlugin *desktop_plugin) 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; + actor->time_start_animation = time(NULL) + 20; } #endif -void +void change_moon(Actor * actor, AWallpaperPlugin *desktop_plugin) { gint phase; char *newfile; gint x0 = 150, - x1 = 650, + x1 = 650, x, y; - struct timeval tvb; + struct timeval tvb; suseconds_t ms; long sec; double t; @@ -499,7 +500,7 @@ change_moon(Actor * actor, AWallpaperPlugin *desktop_plugin) fprintf(stderr, "a=%f, b=%f, c=%f\n", a, b, c); #endif gettimeofday(&tvb, NULL); - + ms = tvb.tv_usec; sec = tvb.tv_sec; @@ -520,7 +521,7 @@ change_moon(Actor * actor, AWallpaperPlugin *desktop_plugin) t = (double)((double)sec+(double)ms/1000000 - actor->time_start_animation) / actor->duration_animation; if (t <= 1) x = path_line(x0, x1, t); - else + else x = path_line(x1, x0, t-1); y = 0.001920*x*x - 1.536*x + 337.2; //y = a*x*x + b*x + c; @@ -536,12 +537,12 @@ change_moon(Actor * actor, AWallpaperPlugin *desktop_plugin) fprintf(stderr, "destroy moon \n"); destroy_hildon_actor(actor); actor->time_start_animation = 0; - } + } } - + } -void +void change_sun(Actor * actor, AWallpaperPlugin *desktop_plugin) { double alt, azm; @@ -564,28 +565,28 @@ change_sun(Actor * actor, AWallpaperPlugin *desktop_plugin) actor->visible = FALSE; destroy_hildon_actor(actor); actor->time_start_animation = 0; - } + } } - + } -void +void change_tram(Actor * actor, AWallpaperPlugin *desktop_plugin) { gint x0 = -300, y0 = 225, scale0 = 100, - x1 = 800, y1 = 162, scale1 = 130, + x1 = 800, y1 = 162, scale1 = 130, x, y, scale; - struct timeval tvb; + struct timeval tvb; suseconds_t ms; long sec; double t; //fprintf(stderr, "change tram\n"); gettimeofday(&tvb, NULL); - + ms = tvb.tv_usec; sec = tvb.tv_sec; - + if (!actor->visible){ actor->visible = TRUE; if (desktop_plugin->priv->scene->daytime == TIME_NIGHT){ @@ -617,19 +618,19 @@ void change_plane1(Actor *actor, AWallpaperPlugin *desktop_plugin) { gint x0 = 620, y0 = 233, - x1 = 79, y1 = -146, + x1 = 79, y1 = -146, x, y; - struct timeval tvb; + struct timeval tvb; suseconds_t ms; long sec; double t; gettimeofday(&tvb, NULL); - + ms = tvb.tv_usec; sec = tvb.tv_sec; // fprintf(stderr, "1 %f - %d\n", sec+(double)ms/100000, now); - + if (desktop_plugin->priv->scene->daytime != TIME_NIGHT){ if (actor->time_start_animation == 0){ actor->time_start_animation = sec + fast_rnd(180); @@ -649,9 +650,9 @@ change_plane1(Actor *actor, AWallpaperPlugin *desktop_plugin) /* stop animation */ actor->visible = FALSE; destroy_hildon_actor(actor); - if (desktop_plugin->priv->scene->daytime == TIME_NIGHT) + if (desktop_plugin->priv->scene->daytime == TIME_NIGHT) actor->time_start_animation = 0; - else + else actor->time_start_animation = sec + fast_rnd(180); } @@ -661,15 +662,15 @@ void change_plane2(Actor *actor, AWallpaperPlugin *desktop_plugin) { gint x0 = -actor->width, y0 = 45, - x1 = 800, y1 = 20, + x1 = 800, y1 = 20, x, y; - struct timeval tvb; + struct timeval tvb; suseconds_t ms; long sec; double t; gettimeofday(&tvb, NULL); - + ms = tvb.tv_usec; sec = tvb.tv_sec; // fprintf(stderr, "1 %f - %d\n", sec+(double)ms/100000, now); @@ -693,9 +694,9 @@ change_plane2(Actor *actor, AWallpaperPlugin *desktop_plugin) /* stop animation */ actor->visible = FALSE; destroy_hildon_actor(actor); - if (desktop_plugin->priv->scene->daytime == TIME_NIGHT) + if (desktop_plugin->priv->scene->daytime == TIME_NIGHT) actor->time_start_animation = 0; - else + else actor->time_start_animation = sec + fast_rnd(180); } @@ -705,9 +706,9 @@ void change_cloud(Actor *actor, AWallpaperPlugin *desktop_plugin) { gint x0, y0 = 300, scale0 = 100, - x1, y1 = -actor->height, scale1 = 150, + x1, y1 = -actor->height, scale1 = 150, x, y, scale; - struct timeval tvb; + struct timeval tvb; suseconds_t ms; long sec; double t; @@ -715,25 +716,25 @@ change_cloud(Actor *actor, AWallpaperPlugin *desktop_plugin) //fprintf(stderr, "change cloud\n"); gettimeofday(&tvb, NULL); - + ms = tvb.tv_usec; sec = tvb.tv_sec; - + if (!actor->visible){ actor->visible = TRUE; if (desktop_plugin->priv->scene->daytime == TIME_NIGHT){ newfile = g_strdup_printf("%s_dark.png", actor->name); }else{ newfile = g_strdup_printf("%s.png", actor->name); - } + } if (actor->filename) g_free(actor->filename); actor->filename = newfile; - + create_hildon_actor(actor, desktop_plugin); } t = (double)((double)sec+(double)ms/1000000 - actor->time_start_animation) / actor->duration_animation; - + if (desktop_plugin->priv->scene->wind_orientation == 1){ x0 = -actor->width; x1 = 800; @@ -743,7 +744,7 @@ change_cloud(Actor *actor, AWallpaperPlugin *desktop_plugin) x1 = -actor->width; } - x = path_line(x0, x1, t); + x = path_line(x0, x1, t); y = -desktop_plugin->priv->scene->wind_angle * (x - x0) + actor->y; scale = path_line(scale0, scale1, (double)(y - y0)/(y1 - y0)); @@ -769,7 +770,7 @@ change_wind(Actor *actor, AWallpaperPlugin *desktop_plugin) //fprintf(stderr, "change wind orient = %d angle = %f after = %d\n", scene.wind_orientation, scene.wind_angle, actor->time_start_animation-time(NULL)); } -void +void change_window1(Actor * actor, AWallpaperPlugin *desktop_plugin) { gint now = time(NULL); @@ -791,14 +792,14 @@ change_window1(Actor * actor, AWallpaperPlugin *desktop_plugin) if (!actor->visible) actor->visible = TRUE; - else + else actor->visible = FALSE; set_actor_visible(actor, actor->visible); actor->time_start_animation = now + fast_rnd(60) + 10; } -void +void change_signal(Actor * actor, AWallpaperPlugin *desktop_plugin) { gint now = time(NULL); @@ -806,14 +807,14 @@ change_signal(Actor * actor, AWallpaperPlugin *desktop_plugin) a = g_ptr_array_index(actor->child, 0); if (a->visible) a->visible = FALSE; - else + else a->visible = TRUE; set_actor_visible(a, a->visible); - + a = g_ptr_array_index(actor->child, 1); if (a->visible) a->visible = FALSE; - else + else a->visible = TRUE; set_actor_visible(a, a->visible); @@ -827,7 +828,7 @@ change_tape(Actor *actor, AWallpaperPlugin *desktop_plugin) 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"; @@ -836,7 +837,7 @@ change_tape(Actor *actor, AWallpaperPlugin *desktop_plugin) fd = fopen(accel_filename, "r"); if (fd == NULL){ //fprintf(stderr, "cannot open file\n"); - fd = fopen("/home/user/coord", "r"); + fd = fopen("/home/user/coord", "r"); } rs = fscanf((FILE*)fd, "%i %i %i", &ax, &ay, &az); fclose(fd); @@ -867,17 +868,17 @@ change_tape(Actor *actor, AWallpaperPlugin *desktop_plugin) 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; + 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); @@ -896,7 +897,38 @@ change_tape(Actor *actor, AWallpaperPlugin *desktop_plugin) a->x = x; a->y = y; } - + +} + +void +change_slideshow(Actor *actor, AWallpaperPlugin *desktop_plugin) +{ + gint num, next, prev, now; + Actor *a; + num = actor->scale; + prev = actor->opacity; + now = time(NULL); + srand(now); + next = rand()%num; + while (num > 1 && next == prev) + next = rand()%num; + + fprintf(stderr, "change slideshow num=%d prev=%d next=%d\n", num, prev, next); + + if (prev > -1){ + //hide prev + fprintf(stderr, "desctory %d\n", prev); + a = g_ptr_array_index(actor->child, prev); + a->visible = FALSE; + destroy_hildon_actor(a); + } + //show next + fprintf(stderr, "show %d\n", next); + a = g_ptr_array_index(actor->child, next); + a->visible = TRUE; + create_hildon_actor(a, desktop_plugin); + actor->opacity = next; + actor->time_start_animation = now + 5; } void @@ -912,7 +944,7 @@ change_layer(Actor * actor, AWallpaperPlugin *desktop_plugin) 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; @@ -932,18 +964,18 @@ change_layer(Actor * actor, AWallpaperPlugin *desktop_plugin) a->y = y; } -void +void change_static_actor(Actor * actor, AWallpaperPlugin *desktop_plugin) { gchar *newfile; - newfile = g_strdup_printf("%s%d.png", actor->name, desktop_plugin->priv->scene->daytime); + 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 +void change_static_actor_with_corner(Actor * actor, AWallpaperPlugin *desktop_plugin) { gchar buffer[2048];