Hi All,

  Just wondering what i'm doing wrong int he example attached
  when trying to get "key-press-event" working?

  Any help is much appreciated.

Thanks,
Izzy.
#include <gtk/gtk.h>
//#include <clutter/clutter.h>
#include <clutter-gtk/clutter-gtk.h>

ClutterColor 	stage_color = { 128, 128, 128, 255 };
ClutterColor 	rectSelection_Color = { 255, 255, 255, 128 };
ClutterColor 	rectSelection_borderColor = { 255, 255, 255, 200 };
ClutterActor	*rectSelection1;
ClutterActor	*rectSelection2;

/*  make private  */
ClutterActor *stage1;
ClutterActor *stage2;
gboolean bButtonPress = FALSE;
gfloat rectX_Press = 0;
gfloat rectY_Press = 0;
guint nMouseMove_times = 0;

static gboolean on_stage_capture (ClutterActor *stage, ClutterEvent *event, gpointer  *dataptr);
void on_stage_key_press (ClutterStage *stage, ClutterEvent *event, gpointer data);
static uint ShowWindow(int argc, char *argv[]);

int main(int argc, char *argv[]) {

	/* Call gtk_clutter_init() to init both clutter and gtk+ */
	if (gtk_clutter_init(&argc, &argv) != CLUTTER_INIT_SUCCESS)
		g_error ("Unable to initialize GtkClutter");

	if( ShowWindow(argc, argv) != 0 )
		g_error ("Unable to initialize GtkBuilder UI");

	gtk_main();

	return 0;
}

static uint ShowWindow(int argc, char *argv[])
{
	GtkWidget* window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
	g_signal_connect( G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL );
	gtk_window_set_default_size( GTK_WINDOW( window ), 800, 600 );

	// Create ClutterEmbed widget for the stage:
	GtkWidget *embed1 = gtk_clutter_embed_new();
	gtk_widget_set_size_request( embed1, 400, 300);
	gtk_widget_show( embed1 );

	// get the Default Stage from ClutterEmbed widget:
	stage1 = gtk_clutter_embed_get_stage(GTK_CLUTTER_EMBED (embed1));
	clutter_stage_set_title( CLUTTER_STAGE( stage1 ), "MyDrawArea" );
	clutter_stage_set_color(CLUTTER_STAGE (stage1), &stage_color);
	clutter_actor_set_size(stage1, 400, 300);
	clutter_actor_set_position(stage1, 0, 0);

	// Load image from first command line argument and add it to texture:
	//ClutterActor *texture1 = clutter_texture_new_from_file( "/home/izzy/Pictures/stage1.png", NULL );	// was argv[1]
	//clutter_container_add_actor( CLUTTER_CONTAINER( stage1 ), texture1 );
	//clutter_actor_set_position( texture1, 0, 0 );

	// Create ClutterEmbed widget for the stage:
	GtkWidget *embed2 = gtk_clutter_embed_new();
	gtk_widget_set_size_request( embed2, 400, 300);
	gtk_widget_show( embed2 );

	// get the Default Stage from ClutterEmbed widget:
	stage2 = gtk_clutter_embed_get_stage(GTK_CLUTTER_EMBED (embed2));
	clutter_stage_set_title( CLUTTER_STAGE( stage2 ), "MyDrawArea2" );
	clutter_stage_set_color(CLUTTER_STAGE (stage2), &stage_color);
	clutter_actor_set_size(stage2, 400, 300);
	clutter_actor_set_position(stage2, 0, 0);

	// Load image from first command line argument and add it to texture:
	//ClutterActor *texture2 = clutter_texture_new_from_file( "/home/izzy/Pictures/stage2.png", NULL );	// was argv[2]
	//clutter_container_add_actor( CLUTTER_CONTAINER( stage2 ), texture2 );
	//clutter_actor_set_position( texture2, 0, 0 );

	/* Must be added LAST.. has to be topmost in stage */
	rectSelection1 = clutter_rectangle_new_with_color( &rectSelection_Color );
	clutter_rectangle_set_border_width( CLUTTER_RECTANGLE( rectSelection1 ) , 1 );
	clutter_rectangle_set_border_color( CLUTTER_RECTANGLE( rectSelection1 ) , &rectSelection_borderColor );
	clutter_actor_set_position( rectSelection1, 0.f, 0.f );
	clutter_actor_set_size( rectSelection1, 1.f, 1.f );
	clutter_actor_show( rectSelection1 );
	clutter_container_add_actor( CLUTTER_CONTAINER( stage1 ), rectSelection1 );

	/* Must be added LAST.. has to be topmost in stage */
	rectSelection2 = clutter_rectangle_new_with_color( &rectSelection_Color );
	clutter_rectangle_set_border_width( CLUTTER_RECTANGLE( rectSelection2 ) , 1 );
	clutter_rectangle_set_border_color( CLUTTER_RECTANGLE( rectSelection2 ) , &rectSelection_borderColor );
	clutter_actor_set_position( rectSelection2, 0.f, 0.f );
	clutter_actor_set_size( rectSelection2, 1.f, 1.f );
	clutter_actor_show( rectSelection2 );
	clutter_container_add_actor( CLUTTER_CONTAINER( stage2 ), rectSelection2 );

	GtkWidget* vPaned = gtk_vpaned_new();
	gtk_paned_add1( GTK_PANED(vPaned), embed1 );
	gtk_paned_add2( GTK_PANED(vPaned), embed2 );
	gtk_widget_show( vPaned );

	g_signal_connect( stage1, "key-press-event", G_CALLBACK (on_stage_key_press), "key-press-event" );
	g_signal_connect( stage1, "captured-event", G_CALLBACK (on_stage_capture), rectSelection1 );

	g_signal_connect( stage2, "key-press-event", G_CALLBACK (on_stage_key_press), "key-press-event" );
	g_signal_connect( stage2, "captured-event", G_CALLBACK (on_stage_capture), rectSelection2 );

	gtk_container_add( GTK_CONTAINER( window ), vPaned );

	gtk_widget_show(window);

	return 0;
}

static gboolean on_stage_capture (ClutterActor *stage, ClutterEvent *event, gpointer  *dataptr)
{
	guint button_pressed = 0;
	gfloat stage_x, stage_y;
	gfloat newX = 0, newY = 0;
	gfloat newW = 0, newH = 0;
	ClutterActor *rectangle = CLUTTER_ACTOR(dataptr);

	switch (event->type)
	{
	case CLUTTER_BUTTON_PRESS:

		if( bButtonPress == TRUE )
			break;

		clutter_event_get_coords( event, &stage_x, &stage_y );
		button_pressed = clutter_event_get_button (event);
		g_debug ("button %d Press", button_pressed);
		rectX_Press = stage_x;
		rectY_Press = stage_y;
		clutter_actor_set_position( rectangle, stage_x, stage_y );
		clutter_actor_set_size( rectangle, 1.f, 1.f );
		clutter_actor_show( rectangle );

		//clutter_grab_pointer( stage );

		bButtonPress = TRUE;
		break;

	case CLUTTER_BUTTON_RELEASE:

		if( bButtonPress == FALSE )
			break;

		button_pressed = clutter_event_get_button (event);
		g_debug ("button %d Release", button_pressed);
		rectX_Press = 0;
		rectY_Press = 0;
		bButtonPress = FALSE;

		clutter_actor_hide( rectangle );

		//clutter_ungrab_pointer();

		clutter_actor_queue_redraw( stage1 );
		clutter_actor_queue_redraw( stage2 );

		break;

	case CLUTTER_MOTION:

		if( bButtonPress )
		{
			if( nMouseMove_times < 2 )
			{
				nMouseMove_times++;
				break;
			}

			clutter_event_get_coords( event, &stage_x, &stage_y );
			//g_debug ("mouse moved..");

			if( stage_x > rectX_Press && stage_y > rectY_Press )		// bottom-right
			{
				newX = rectX_Press;
				newY = rectY_Press;
				newW = stage_x - rectX_Press;
				newH = stage_y - rectY_Press;
			}
			else if( stage_x < rectX_Press && stage_y < rectY_Press )	// top-left
			{
				newX = stage_x;
				newY = stage_y;
				newW = rectX_Press - stage_x;
				newH = rectY_Press - stage_y;
			}
			else if( stage_x > rectX_Press && stage_y < rectY_Press )		// top-right
			{
				newX = rectX_Press;
				newY = stage_y;
				newW = stage_x - rectX_Press;
				newH = rectY_Press - stage_y;
			}
			else if( stage_x < rectX_Press && stage_y > rectY_Press )		// bottom-left
			{
				newX = stage_x;
				newY = rectY_Press;
				newW = rectX_Press- stage_x;
				newH = stage_y - rectY_Press;
			}
			else
				break;

			clutter_actor_set_position( rectangle, newX, newY );
			clutter_actor_set_size( rectangle, newW, newH );

			nMouseMove_times = 0;
		}
		break;

	default:
		break;
	}

	return TRUE;
}

void on_stage_key_press (ClutterStage *stage, ClutterEvent *event, gpointer data)
{
	if (event->type == CLUTTER_KEY_PRESS)
	{
		guint key_symbol = clutter_event_get_key_symbol (event);
		g_print ("*** key press event (key:%c) ***\n", key_symbol);

		if( key_symbol == CLUTTER_q )
			g_print( "Q was pressed!" );
	}
}

_______________________________________________
clutter-app-devel-list mailing list
[email protected]
http://lists.clutter-project.org/listinfo/clutter-app-devel-list

Reply via email to