View Single Post
ArnimS's Avatar
Posts: 1,107 | Thanked: 720 times | Joined on Mar 2007 @ Germany
#1
Code:
/*
   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;
}
 

The Following 6 Users Say Thank You to ArnimS For This Useful Post: