|
Packit Service |
6a0f92 |
#include <gtk/gtk.h>
|
|
Packit Service |
6a0f92 |
#include <clutter/clutter.h>
|
|
Packit Service |
6a0f92 |
#include <math.h>
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
#include <clutter-gtk/clutter-gtk.h>
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
#define MAX_NWIDGETS 4
|
|
Packit Service |
6a0f92 |
#define WINWIDTH 400
|
|
Packit Service |
6a0f92 |
#define WINHEIGHT 400
|
|
Packit Service |
6a0f92 |
#define RADIUS 80
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
static ClutterActor *group = NULL;
|
|
Packit Service |
6a0f92 |
static ClutterActor *widgets[MAX_NWIDGETS];
|
|
Packit Service |
6a0f92 |
static gboolean do_rotate = TRUE;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
static int nwidgets;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* Timeline handler */
|
|
Packit Service |
6a0f92 |
void
|
|
Packit Service |
6a0f92 |
frame_cb (ClutterTimeline *timeline,
|
|
Packit Service |
6a0f92 |
gint msecs,
|
|
Packit Service |
6a0f92 |
gpointer data)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
double rotation = clutter_timeline_get_progress (timeline) * 360.0;
|
|
Packit Service |
6a0f92 |
gint i;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
if (!do_rotate)
|
|
Packit Service |
6a0f92 |
return;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* Rotate everything clockwise about stage center */
|
|
Packit Service |
6a0f92 |
clutter_actor_set_rotation_angle (group, CLUTTER_Z_AXIS, rotation);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
for (i = 0; i < nwidgets; i++)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
clutter_actor_set_rotation_angle (widgets[i], CLUTTER_Z_AXIS, - 2 * rotation);
|
|
Packit Service |
6a0f92 |
clutter_actor_set_opacity (widgets[i], 50 * sin (2 * M_PI * rotation / 360) + (255 - 50));
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
static void
|
|
Packit Service |
6a0f92 |
button_clicked (GtkWidget *button,
|
|
Packit Service |
6a0f92 |
GtkWidget *vbox)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
GtkWidget *label;
|
|
Packit Service |
6a0f92 |
g_print ("button clicked\n");
|
|
Packit Service |
6a0f92 |
label = gtk_label_new ("A new label");
|
|
Packit Service |
6a0f92 |
gtk_widget_show (label);
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
static ClutterActor *
|
|
Packit Service |
6a0f92 |
create_gtk_actor (int i)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
GtkWidget *button, *vbox, *entry, *bin;
|
|
Packit Service |
6a0f92 |
ClutterActor *gtk_actor;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
gtk_actor = gtk_clutter_actor_new ();
|
|
Packit Service |
6a0f92 |
bin = gtk_clutter_actor_get_widget (GTK_CLUTTER_ACTOR (gtk_actor));
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
|
|
Packit Service |
6a0f92 |
gtk_container_add (GTK_CONTAINER (bin), vbox);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
button = gtk_button_new_with_label ("A Button");
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
g_signal_connect (button, "clicked", G_CALLBACK (button_clicked), vbox);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
button = gtk_check_button_new_with_label ("Another button");
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
entry = gtk_entry_new ();
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
gtk_widget_show_all (bin);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
return gtk_actor;
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
static void
|
|
Packit Service |
6a0f92 |
add_clutter_actor (ClutterActor *actor,
|
|
Packit Service |
6a0f92 |
ClutterActor *container,
|
|
Packit Service |
6a0f92 |
int i)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
float x, y, w, h;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* Add to our group group */
|
|
Packit Service |
6a0f92 |
clutter_actor_add_child (container, actor);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* Place around a circle */
|
|
Packit Service |
6a0f92 |
w = clutter_actor_get_width (widgets[0]);
|
|
Packit Service |
6a0f92 |
h = clutter_actor_get_height (widgets[0]);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
x = WINWIDTH / 2 + RADIUS * cosf (i * 2 * M_PI / (MAX_NWIDGETS)) - w / 2;
|
|
Packit Service |
6a0f92 |
y = WINHEIGHT / 2 + RADIUS * sinf (i * 2 * M_PI / (MAX_NWIDGETS)) - h / 2;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
clutter_actor_set_position (actor, x, y);
|
|
Packit Service |
6a0f92 |
clutter_actor_set_pivot_point (actor, 0.5, 0.5);
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
static gboolean
|
|
Packit Service |
6a0f92 |
add_or_remove_timeout (gpointer user_data)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
if (nwidgets == MAX_NWIDGETS)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
/* Removing an item */
|
|
Packit Service |
6a0f92 |
clutter_actor_remove_child (group, widgets[MAX_NWIDGETS - 1]);
|
|
Packit Service |
6a0f92 |
widgets[MAX_NWIDGETS - 1] = NULL;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
nwidgets--;
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
else
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
/* Adding an item */
|
|
Packit Service |
6a0f92 |
widgets[MAX_NWIDGETS - 1] = create_gtk_actor (MAX_NWIDGETS - 1);
|
|
Packit Service |
6a0f92 |
nwidgets++;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
add_clutter_actor (widgets[MAX_NWIDGETS - 1], group, MAX_NWIDGETS - 1);
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
return G_SOURCE_CONTINUE;
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
int
|
|
Packit Service |
6a0f92 |
main (int argc, char *argv[])
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
ClutterTimeline *timeline;
|
|
Packit Service |
6a0f92 |
ClutterActor *stage;
|
|
Packit Service |
6a0f92 |
ClutterColor stage_color = { 0x61, 0x64, 0x8c, 0xff };
|
|
Packit Service |
6a0f92 |
GtkWidget *window, *clutter;
|
|
Packit Service |
6a0f92 |
GtkWidget *button, *vbox;
|
|
Packit Service |
6a0f92 |
gint i;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
if (gtk_clutter_init_with_args (&argc, &argv, NULL, NULL, NULL, NULL) != CLUTTER_INIT_SUCCESS)
|
|
Packit Service |
6a0f92 |
g_error ("Unable to initialize GtkClutter");
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
if (argc != 1)
|
|
Packit Service |
6a0f92 |
do_rotate = FALSE;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
|
Packit Service |
6a0f92 |
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
|
|
Packit Service |
6a0f92 |
gtk_container_add (GTK_CONTAINER (window), vbox);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
clutter = gtk_clutter_embed_new ();
|
|
Packit Service |
6a0f92 |
gtk_widget_set_size_request (clutter, WINWIDTH, WINHEIGHT);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
gtk_box_pack_start (GTK_BOX (vbox), clutter, TRUE, TRUE, 0);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (clutter));
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
button = gtk_button_new_with_mnemonic ("_Quit");
|
|
Packit Service |
6a0f92 |
g_signal_connect_swapped (button, "clicked",
|
|
Packit Service |
6a0f92 |
G_CALLBACK (gtk_widget_destroy),
|
|
Packit Service |
6a0f92 |
window);
|
|
Packit Service |
6a0f92 |
gtk_box_pack_end (GTK_BOX (vbox), button, FALSE, FALSE, 0);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
clutter_actor_set_background_color (stage, &stage_color);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
nwidgets = 0;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* create a new group to hold multiple actors in a group */
|
|
Packit Service |
6a0f92 |
group = clutter_actor_new ();
|
|
Packit Service |
6a0f92 |
clutter_actor_set_pivot_point (group, 0.5, 0.5);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
for (i = 0; i < MAX_NWIDGETS; i++)
|
|
Packit Service |
6a0f92 |
{
|
|
Packit Service |
6a0f92 |
widgets[i] = create_gtk_actor (i);
|
|
Packit Service |
6a0f92 |
nwidgets++;
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
add_clutter_actor (widgets[i], group, i);
|
|
Packit Service |
6a0f92 |
}
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* Add the group to the stage and center it*/
|
|
Packit Service |
6a0f92 |
clutter_actor_add_child (stage, group);
|
|
Packit Service |
6a0f92 |
clutter_actor_add_constraint (group, clutter_align_constraint_new (stage, CLUTTER_ALIGN_BOTH, 0.5));
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
gtk_widget_show_all (window);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* Create a timeline to manage animation */
|
|
Packit Service |
6a0f92 |
timeline = clutter_timeline_new (6000);
|
|
Packit Service |
6a0f92 |
clutter_timeline_set_repeat_count (timeline, -1);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* fire a callback for frame change */
|
|
Packit Service |
6a0f92 |
g_signal_connect (timeline, "new-frame", G_CALLBACK (frame_cb), stage);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
/* and start it */
|
|
Packit Service |
6a0f92 |
clutter_timeline_start (timeline);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
g_timeout_add_seconds (3, add_or_remove_timeout, NULL);
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
gtk_main();
|
|
Packit Service |
6a0f92 |
|
|
Packit Service |
6a0f92 |
return 0;
|
|
Packit Service |
6a0f92 |
}
|