/* Posted by someone who may or may not want their name on this gcc -Wall -o parent-test parent-test.c \ `pkg-config --cflags --libs gtk+-2.0 hildon-1` */ #include <cairo.h> #include <gtk/gtk.h> #include <glib.h> #include <math.h> #include <stdlib.h> #include <hildon/hildon.h> static gint X_SIZE = 320; static gint Y_SIZE = 240; static gint X_POS = 0; static gint Y_POS = 56; static gint X_FULL = 800; static gint Y_FULL = 424; static gdouble X_SCALE = 2.5; /* X_FULL / X_SIZE */ static gdouble Y_SCALE = 1.77; /* Y_FULL / Y_SIZE */ /** Simple drawing widget **/ static void drawing_button_event (GtkWidget *drawing, GdkEventButton *event, cairo_t *context) { cairo_new_path (context); cairo_move_to (context, event->x + 5, event->y); cairo_arc (context, event->x, event->y, 5, 0, 2 * M_PI); if (event->type == GDK_BUTTON_PRESS) cairo_set_source_rgb (context, 1.0, 0.0, 0.0); else cairo_set_source_rgb (context, 0.0, 0.0, 1.0); cairo_fill (context); } static void drawing_realize (GtkWidget *drawing, gpointer user_data) { cairo_t *context; context = gdk_cairo_create (GDK_DRAWABLE (drawing->window)); gtk_widget_add_events (drawing, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); g_signal_connect (drawing, "button-press-event", G_CALLBACK (drawing_button_event), context); g_signal_connect (drawing, "button-release-event", G_CALLBACK (drawing_button_event), context); } static GtkWidget * get_drawing_widget (void) { GtkWidget *drawing = gtk_drawing_area_new (); GtkRequisition *req; g_signal_connect (drawing, "realize", G_CALLBACK (drawing_realize), NULL); return drawing; } /** Test application **/ static void window_button_proxy (GtkWidget *widget, GdkEventButton *event, GtkWidget *proxy) { GdkEventButton *newev = (GdkEventButton *) gdk_event_copy ((GdkEvent *) event); newev->window = proxy->window; newev->x = (gint) (newev->x / X_SCALE); newev->y = (gint) (newev->y / Y_SCALE); gdk_event_put ((GdkEvent *) newev); } static void button_clicked (GtkWidget *widget, HildonAnimationActor *actor) { static gboolean fullscreen = FALSE; if (fullscreen) { hildon_animation_actor_set_scale (actor, 1.0, 1.0); fullscreen = FALSE; } else { hildon_animation_actor_set_scale (actor, X_SCALE, Y_SCALE); fullscreen = TRUE; } } int main (int argc, char *argv[]) { HildonAnimationActor *actor; GtkWidget *window, *drawing; HildonProgram *program; GdkColor pink = { .red = 0xffff, .green = 0x9999, .blue = 0x9999 }; gtk_init (&argc, &argv); window = hildon_stackable_window_new (); gtk_widget_modify_bg (GTK_WIDGET (window), GTK_STATE_NORMAL, &pink); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), NULL); gtk_widget_add_events (window, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); actor = HILDON_ANIMATION_ACTOR (hildon_animation_actor_new()); gtk_widget_add_events (GTK_WIDGET (actor), GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); gtk_window_resize (GTK_WINDOW (actor), X_SIZE, Y_SIZE); hildon_animation_actor_set_position (actor, X_POS, Y_POS); hildon_animation_actor_set_parent (actor, GTK_WINDOW (window)); hildon_animation_actor_set_scale (actor, X_SCALE, Y_SCALE); drawing = get_drawing_widget (); gtk_container_add (GTK_CONTAINER (actor), drawing); g_signal_connect (window, "button-press-event", G_CALLBACK (window_button_proxy), drawing); g_signal_connect (window, "button-release-event", G_CALLBACK (window_button_proxy), drawing); gtk_widget_show_all (GTK_WIDGET (actor)); gtk_widget_show_all (GTK_WIDGET (window)); gtk_main (); return 0; }