|
Packit Service |
6a0f92 |
#include <gtk/gtk.h>
|
|
Packit Service |
6a0f92 |
#include <clutter/clutter.h>
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
#include <clutter-gtk/clutter-gtk.h>
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
#ifndef EXAMPLES_DATADIR
|
|
Packit Service |
6a0f92 |
#define EXAMPLES_DATADIR "."
|
|
Packit Service |
6a0f92 |
#endif
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
typedef struct {
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
GtkWidget *window;
|
|
Packit Service |
6a0f92 |
GtkWidget *popup;
|
|
Packit Service |
6a0f92 |
GtkWidget *gtk_entry;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
ClutterActor *stage;
|
|
Packit Service |
6a0f92 |
ClutterActor *hand;
|
|
Packit Service |
6a0f92 |
ClutterActor *clutter_entry;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
} EventApp;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
static gboolean
|
|
Packit Service |
6a0f92 |
on_enter_notify (GtkWidget *widget, GdkEventCrossing *event)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
g_print ("Entering widget '%s'\n", G_OBJECT_TYPE_NAME (widget));
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
return FALSE;
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
static gboolean
|
|
Packit Service |
6a0f92 |
on_leave_notify (GtkWidget *widget, GdkEventCrossing *event)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
g_print ("Leaving widget '%s'\n", G_OBJECT_TYPE_NAME (widget));
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
return FALSE;
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
static void
|
|
Packit Service |
6a0f92 |
on_gtk_entry_changed (GtkEditable *editable, EventApp *app)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
const gchar *text = gtk_entry_get_text (GTK_ENTRY (editable));
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
clutter_text_set_text (CLUTTER_TEXT (app->clutter_entry), text);
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
static void
|
|
Packit Service |
6a0f92 |
on_x_changed (GtkSpinButton *button, EventApp *app)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
clutter_actor_set_rotation_angle (app->hand, CLUTTER_X_AXIS,
|
|
Packit Service |
6a0f92 |
gtk_spin_button_get_value (button));
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
static void
|
|
Packit Service |
6a0f92 |
on_y_changed (GtkSpinButton *button, EventApp *app)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
clutter_actor_set_rotation_angle (app->hand, CLUTTER_Y_AXIS,
|
|
Packit Service |
6a0f92 |
gtk_spin_button_get_value (button));
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
static void
|
|
Packit Service |
6a0f92 |
on_z_changed (GtkSpinButton *button, EventApp *app)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
clutter_actor_set_rotation_angle (app->hand, CLUTTER_Z_AXIS,
|
|
Packit Service |
6a0f92 |
gtk_spin_button_get_value (button));
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
static void
|
|
Packit Service |
6a0f92 |
on_opacity_changed (GtkSpinButton *button, EventApp *app)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
clutter_actor_set_opacity (app->hand, gtk_spin_button_get_value (button));
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
static gboolean
|
|
Packit Service |
6a0f92 |
on_stage_capture (ClutterActor *stage,
|
|
Packit Service |
6a0f92 |
ClutterEvent *event,
|
|
Packit Service |
6a0f92 |
gpointer dummy G_GNUC_UNUSED)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
switch (event->type)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
case CLUTTER_BUTTON_PRESS:
|
|
Packit Service |
6a0f92 |
case CLUTTER_BUTTON_RELEASE:
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
gfloat x, y;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
clutter_event_get_coords (event, &x, &y);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
g_print ("Button %s captured at (%.2f, %.2f)\n",
|
|
Packit Service |
6a0f92 |
event->type == CLUTTER_BUTTON_PRESS ? "Press" : "Relase",
|
|
Packit Service |
6a0f92 |
x, y);
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
break;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
case CLUTTER_ENTER:
|
|
Packit Service |
6a0f92 |
case CLUTTER_LEAVE:
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
if (clutter_event_get_source (event) == stage &&
|
|
Packit Service |
6a0f92 |
clutter_event_get_related (event) != NULL)
|
|
Packit Service |
6a0f92 |
g_print ("%s the stage and %s '%s'\n",
|
|
Packit Service |
6a0f92 |
event->type == CLUTTER_ENTER ? "Entering" : "Leaving",
|
|
Packit Service |
6a0f92 |
event->type == CLUTTER_ENTER ? "leaving" : "entering",
|
|
Packit Service |
6a0f92 |
clutter_actor_get_name (clutter_event_get_related (event)));
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
break;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
case CLUTTER_KEY_PRESS:
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
gchar buf[8];
|
|
Packit Service |
6a0f92 |
gint n_chars;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
n_chars = g_unichar_to_utf8 (clutter_event_get_key_unicode (event), buf);
|
|
Packit Service |
6a0f92 |
buf[n_chars] = '\0';
|
|
Packit Service |
6a0f92 |
g_print ("the stage got a key press: '%s' (symbol: %d, unicode: 0x%x)\n",
|
|
Packit Service |
6a0f92 |
buf,
|
|
Packit Service |
6a0f92 |
clutter_event_get_key_symbol (event),
|
|
Packit Service |
6a0f92 |
clutter_event_get_key_unicode (event));
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
break;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
default:
|
|
Packit Service |
6a0f92 |
break;
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
return FALSE;
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
static gboolean
|
|
Packit Service |
6a0f92 |
on_hand_button_press (ClutterActor *actor,
|
|
Packit Service |
6a0f92 |
ClutterButtonEvent *event,
|
|
Packit Service |
6a0f92 |
gpointer dummy)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
g_print ("Button press on hand ('%s')\n",
|
|
Packit Service |
6a0f92 |
g_type_name (G_OBJECT_TYPE (actor)));
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
return FALSE;
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
gint
|
|
Packit Service |
6a0f92 |
main (gint argc, gchar **argv)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
EventApp *app = g_new0 (EventApp, 1);
|
|
Packit Service |
6a0f92 |
GtkWidget *widget, *vbox, *hbox, *button, *label, *box;
|
|
Packit Service |
6a0f92 |
ClutterActor *actor;
|
|
Packit Service |
6a0f92 |
GdkPixbuf *pixbuf = NULL;
|
|
Packit Service |
6a0f92 |
GtkSizeGroup *size_group;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
if (gtk_clutter_init_with_args (&argc, &argv, "- Event test", NULL, NULL, NULL) != CLUTTER_INIT_SUCCESS)
|
|
Packit Service |
6a0f92 |
g_error ("Unable to initialize GtkClutter");
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* Create the inital gtk window and widgets, just like normal */
|
|
Packit Service |
6a0f92 |
widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
Packit Service |
6a0f92 |
app->window = widget;
|
|
Packit Service |
6a0f92 |
gtk_window_set_title (GTK_WINDOW (widget), "Gtk-Clutter Interaction demo");
|
|
Packit Service |
6a0f92 |
gtk_window_set_default_size (GTK_WINDOW (widget), 800, 600);
|
|
Packit Service |
6a0f92 |
gtk_window_set_resizable (GTK_WINDOW (widget), FALSE);
|
|
Packit Service |
6a0f92 |
gtk_container_set_border_width (GTK_CONTAINER (widget), 12);
|
|
Packit Service |
6a0f92 |
g_signal_connect (widget, "destroy", G_CALLBACK (gtk_main_quit), NULL);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* Create our layout box */
|
|
Packit Service |
6a0f92 |
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
|
|
Packit Service |
6a0f92 |
gtk_container_add (GTK_CONTAINER (app->window), vbox);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
widget = gtk_entry_new ();
|
|
Packit Service |
6a0f92 |
app->gtk_entry = widget;
|
|
Packit Service |
6a0f92 |
gtk_entry_set_text (GTK_ENTRY (widget), "Enter some text");
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
|
|
Packit Service |
6a0f92 |
g_signal_connect (widget, "changed", G_CALLBACK (on_gtk_entry_changed), app);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* Set up clutter & create our stage */
|
|
Packit Service |
6a0f92 |
widget = gtk_clutter_embed_new ();
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0);
|
|
Packit Service |
6a0f92 |
gtk_widget_grab_focus (widget);
|
|
Packit Service |
6a0f92 |
app->stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (widget));
|
|
Packit Service |
6a0f92 |
gtk_widget_set_size_request (widget, 640, 480);
|
|
Packit Service |
6a0f92 |
g_signal_connect (app->stage, "captured-event",
|
|
Packit Service |
6a0f92 |
G_CALLBACK (on_stage_capture),
|
|
Packit Service |
6a0f92 |
NULL);
|
|
Packit Service |
6a0f92 |
g_signal_connect (widget, "enter-notify-event",
|
|
Packit Service |
6a0f92 |
G_CALLBACK (on_enter_notify),
|
|
Packit Service |
6a0f92 |
NULL);
|
|
Packit Service |
6a0f92 |
g_signal_connect (widget, "leave-notify-event",
|
|
Packit Service |
6a0f92 |
G_CALLBACK (on_leave_notify),
|
|
Packit Service |
6a0f92 |
NULL);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* Create the main texture that the spin buttons manipulate */
|
|
Packit Service |
6a0f92 |
pixbuf = gdk_pixbuf_new_from_file (EXAMPLES_DATADIR G_DIR_SEPARATOR_S "redhand.png", NULL);
|
|
Packit Service |
6a0f92 |
if (pixbuf == NULL)
|
|
Packit Service |
6a0f92 |
g_error ("Unable to load pixbuf\n");
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
app->hand = actor = gtk_clutter_texture_new ();
|
|
Packit Service |
6a0f92 |
gtk_clutter_texture_set_from_pixbuf (GTK_CLUTTER_TEXTURE (actor), pixbuf, NULL);
|
|
Packit Service |
6a0f92 |
clutter_actor_add_child (app->stage, actor);
|
|
Packit Service |
6a0f92 |
clutter_actor_set_pivot_point (actor, 0.5, 0.5);
|
|
Packit Service |
6a0f92 |
clutter_actor_add_constraint (actor, clutter_align_constraint_new (app->stage, CLUTTER_ALIGN_BOTH, 0.5));
|
|
Packit Service |
6a0f92 |
clutter_actor_set_reactive (actor, TRUE);
|
|
Packit Service |
6a0f92 |
clutter_actor_set_name (actor, "Red Hand");
|
|
Packit Service |
6a0f92 |
g_signal_connect (actor, "button-press-event",
|
|
Packit Service |
6a0f92 |
G_CALLBACK (on_hand_button_press),
|
|
Packit Service |
6a0f92 |
NULL);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* Setup the clutter entry */
|
|
Packit Service |
6a0f92 |
actor = clutter_text_new_full (NULL, "", CLUTTER_COLOR_Black);
|
|
Packit Service |
6a0f92 |
app->clutter_entry = actor;
|
|
Packit Service |
6a0f92 |
clutter_actor_add_child (app->stage, actor);
|
|
Packit Service |
6a0f92 |
clutter_actor_set_position (actor, 0, 0);
|
|
Packit Service |
6a0f92 |
clutter_actor_set_size (actor, 500, 20);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* Create our adjustment widgets */
|
|
Packit Service |
6a0f92 |
size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
|
|
Packit Service |
6a0f92 |
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, TRUE, 0);
|
|
Packit Service |
6a0f92 |
label = gtk_label_new ("Rotate x-axis");
|
|
Packit Service |
6a0f92 |
gtk_size_group_add_widget (size_group, label);
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
|
|
Packit Service |
6a0f92 |
button = gtk_spin_button_new_with_range (0, 360, 1);
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0);
|
|
Packit Service |
6a0f92 |
g_signal_connect (button, "value-changed", G_CALLBACK (on_x_changed), app);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, TRUE, 0);
|
|
Packit Service |
6a0f92 |
label = gtk_label_new ("Rotate y-axis");
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
|
|
Packit Service |
6a0f92 |
gtk_size_group_add_widget (size_group, label);
|
|
Packit Service |
6a0f92 |
button = gtk_spin_button_new_with_range (0, 360, 1);
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0);
|
|
Packit Service |
6a0f92 |
g_signal_connect (button, "value-changed", G_CALLBACK (on_y_changed), app);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, TRUE, 0);
|
|
Packit Service |
6a0f92 |
label = gtk_label_new ("Rotate z-axis");
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
|
|
Packit Service |
6a0f92 |
gtk_size_group_add_widget (size_group, label);
|
|
Packit Service |
6a0f92 |
button = gtk_spin_button_new_with_range (0, 360, 1);
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0);
|
|
Packit Service |
6a0f92 |
g_signal_connect (button, "value-changed", G_CALLBACK (on_z_changed), app);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, TRUE, 0);
|
|
Packit Service |
6a0f92 |
label = gtk_label_new ("Adjust opacity");
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
|
|
Packit Service |
6a0f92 |
gtk_size_group_add_widget (size_group, label);
|
|
Packit Service |
6a0f92 |
button = gtk_spin_button_new_with_range (0, 255, 1);
|
|
Packit Service |
6a0f92 |
gtk_spin_button_set_value (GTK_SPIN_BUTTON (button), 255);
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (box), button, TRUE, TRUE, 0);
|
|
Packit Service |
6a0f92 |
g_signal_connect (button, "value-changed", G_CALLBACK (on_opacity_changed), app);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
gtk_widget_show_all (app->window);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* Only show/show_all the stage after parent show. widget_show will call
|
|
Packit Service |
6a0f92 |
* show on the stage.
|
|
Packit Service |
6a0f92 |
*/
|
|
Packit Service |
6a0f92 |
clutter_actor_show (app->stage);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
gtk_main ();
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
return 0;
|
|
Packit Service |
6a0f92 |
}
|