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