From 94439e55265d91e0c5419306115d2af02378e75e Mon Sep 17 00:00:00 2001 From: Elliot Smith Date: Tue, 28 Sep 2010 16:53:30 +0100 Subject: [PATCH] cookbook: Example of using button press and release events A longer example of using button press and release events to draw rectangles with random colors. --- doc/cookbook/examples/Makefile.am | 2 + doc/cookbook/examples/events-buttons-lasso.c | 154 +++++++++++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 doc/cookbook/examples/events-buttons-lasso.c diff --git a/doc/cookbook/examples/Makefile.am b/doc/cookbook/examples/Makefile.am index 4ee90ee..cc58af0 100644 --- a/doc/cookbook/examples/Makefile.am +++ b/doc/cookbook/examples/Makefile.am @@ -30,6 +30,7 @@ noinst_PROGRAMS = \ script-signals \ events-buttons \ events-buttons-click \ + events-buttons-lasso \ $(NULL) INCLUDES = \ @@ -80,5 +81,6 @@ script_ui_SOURCES = script-ui.c script_signals_SOURCES = script-signals.c events_buttons_SOURCES = events-buttons.c events_buttons_click_SOURCES = events-buttons-click.c +events_buttons_lasso_SOURCES = events-buttons-lasso.c -include $(top_srcdir)/build/autotools/Makefile.am.gitignore diff --git a/doc/cookbook/examples/events-buttons-lasso.c b/doc/cookbook/examples/events-buttons-lasso.c new file mode 100644 index 0000000..6895725 --- /dev/null +++ b/doc/cookbook/examples/events-buttons-lasso.c @@ -0,0 +1,154 @@ +/* Simple rectangle drawing using button and pointer events; + * click, drag and release a mouse button to draw a rectangle + */ +#include +#include + +static const ClutterColor stage_color = { 0x33, 0x33, 0x55, 0xff }; +static const ClutterColor lasso_color = { 0xaa, 0xaa, 0xaa, 0x33 }; + +typedef struct +{ + ClutterActor *actor; + gfloat x; + gfloat y; +} Lasso; + +static guint +random_color_component () +{ + return (guint) (155 + (100.0 * rand () / (RAND_MAX + 1.0))); +} + +static gboolean +button_pressed_cb (ClutterActor *actor, + ClutterEvent *event, + gpointer user_data) +{ + Lasso *lasso = (Lasso *) user_data; + + /* start drawing the lasso actor */ + lasso->actor = clutter_rectangle_new_with_color (&lasso_color); + + /* store lasso's start coordinates */ + clutter_event_get_coords (event, &(lasso->x), &(lasso->y)); + + clutter_container_add_actor (CLUTTER_CONTAINER (actor), lasso->actor); + + return TRUE; +} + +static gboolean +button_released_cb (ClutterActor *stage, + ClutterEvent *event, + gpointer user_data) +{ + Lasso *lasso = (Lasso *) user_data; + ClutterActor *rectangle; + ClutterColor *random_color; + gfloat x; + gfloat y; + gfloat width; + gfloat height; + + if (lasso->actor == NULL) + return TRUE; + + /* create a new rectangle */ + random_color = clutter_color_new (random_color_component (), + random_color_component (), + random_color_component (), + random_color_component ()); + rectangle = clutter_rectangle_new_with_color (random_color); + + /* set the rectangle to the same size and shape as the lasso */ + clutter_actor_get_position (lasso->actor, &x, &y); + clutter_actor_get_size (lasso->actor, &width, &height); + + clutter_actor_set_position (rectangle, x, y); + clutter_actor_set_size (rectangle, width, height); + + clutter_container_add_actor (CLUTTER_CONTAINER (stage), rectangle); + + /* clear up the lasso actor */ + clutter_actor_destroy (lasso->actor); + lasso->actor = NULL; + + clutter_actor_queue_redraw (stage); + + return TRUE; + +} + +static gboolean +pointer_motion_cb (ClutterActor *stage, + ClutterEvent *event, + gpointer user_data) +{ + gfloat pointer_x; + gfloat pointer_y; + gfloat new_x; + gfloat new_y; + gfloat width; + gfloat height; + + Lasso *lasso = (Lasso *) user_data; + + if (lasso->actor == NULL) + return TRUE; + + /* redraw the lasso actor */ + clutter_event_get_coords (event, &pointer_x, &pointer_y); + + new_x = MIN (pointer_x, lasso->x); + new_y = MIN (pointer_y, lasso->y); + width = MAX (pointer_x, lasso->x) - new_x; + height = MAX (pointer_y, lasso->y) - new_y; + + clutter_actor_set_position (lasso->actor, new_x, new_y); + clutter_actor_set_size (lasso->actor, width, height); + + return TRUE; +} + +int +main (int argc, + char *argv[]) +{ + /* seed random number generator */ + srand ((unsigned int) time (NULL)); + + Lasso *lasso = g_new0 (Lasso, 1); + + ClutterActor *stage; + + clutter_init (&argc, &argv); + + stage = clutter_stage_get_default (); + clutter_actor_set_size (stage, 320, 240); + clutter_stage_set_color (CLUTTER_STAGE (stage), &stage_color); + g_signal_connect (stage, "destroy", G_CALLBACK (clutter_main_quit), NULL); + + g_signal_connect (stage, + "button-press-event", + G_CALLBACK (button_pressed_cb), + lasso); + + g_signal_connect (stage, + "button-release-event", + G_CALLBACK (button_released_cb), + lasso); + + g_signal_connect (stage, + "motion-event", + G_CALLBACK (pointer_motion_cb), + lasso); + + clutter_actor_show (stage); + + clutter_main (); + + g_free (lasso); + + return EXIT_SUCCESS; +} -- 2.7.4