* An area 640x480 in the top-left corner will be updated with an animation
* to show how to modify the area. */
+#define DO_ANIM 1 /* whether to animate the area defined below */
+
#define ANIM_X 0
#define ANIM_Y 0
#define ANIM_WIDTH 640
#define ANIM_HEIGHT 480
#define ANIM_FRAMES 64
+/* this could come from ftol, but we hardcode it for this example */
static key_t shm_key = 0xCAFEBEEF;
+
static gint bpp, width, height;
-static guchar *shm = 0; /* shared mem */
+static guchar *shm = 0; /* shared mem area */
static int anim_frame = 0;
static double scale = 1;
{
HildonRemoteTexture *actor = HILDON_REMOTE_TEXTURE (obj);
- if (shm) {
+ if (shm && DO_ANIM) {
gint x,y;
for (y=0;y<ANIM_HEIGHT;y++)
if (!pressed)
{
- x += x_inc;
- y += y_inc;
- x_inc = x_inc * 0.8;
- y_inc = y_inc * 0.8;
- hildon_remote_texture_set_position (actor, x, y);
-
- scale_smooth = scale_smooth*0.9 + scale*0.1;
- hildon_remote_texture_set_scale (actor, scale_smooth, scale_smooth);
+ if (fabs(x_inc)>0.01 || fabs(y_inc)>0.01)
+ {
+ x += x_inc;
+ y += y_inc;
+ x_inc = x_inc * 0.8;
+ y_inc = y_inc * 0.8;
+ hildon_remote_texture_set_offset (actor, x, y);
+ }
+
+ if (fabs(scale - scale_smooth)>0.01)
+ {
+ scale_smooth = scale_smooth*0.9 + scale*0.1;
+ hildon_remote_texture_set_scale (actor, scale_smooth, scale_smooth);
+ }
}
}
x += x_inc;
y += y_inc;
- hildon_remote_texture_set_position (actor, x, y);
+ hildon_remote_texture_set_offset (actor, x, y);
}
last_x = event->x;
bpp = gdk_pixbuf_get_n_channels (pixbuf); /* assume 8 bit */
gpixels = gdk_pixbuf_get_pixels (pixbuf);
g_debug("Creating Shared Memory");
-
-
size_t shm_size = width*height*bpp;
int shmid;
}
memcpy(shm, gpixels, shm_size);
-
g_debug("Done.");
-
-
+ /* Craete the program with the remote texture */
HildonProgram *program = hildon_program_get_instance ();
-
HildonWindow *window = HILDON_WINDOW(
hildon_window_new());
hildon_program_add_window (program, window);
- gtk_window_set_decorated (GTK_WINDOW (window), FALSE);
gtk_widget_show (GTK_WIDGET(window));
HildonRemoteTexture *actor = HILDON_REMOTE_TEXTURE
(hildon_remote_texture_new ());
- gtk_window_resize(GTK_WINDOW(actor), W, H);
g_set_application_name ("Animation");
- g_signal_connect (G_OBJECT (actor),
+ g_signal_connect (G_OBJECT (window),
"delete_event",
G_CALLBACK (gtk_main_quit), NULL);
- g_signal_connect (G_OBJECT (actor),
+ g_signal_connect (G_OBJECT (window),
"button-press-event",
G_CALLBACK (press_cb),
actor);
- g_signal_connect (G_OBJECT (actor),
+ g_signal_connect (G_OBJECT (window),
"button-release-event",
G_CALLBACK (release_cb),
actor);
- g_signal_connect (G_OBJECT (actor),
+ g_signal_connect (G_OBJECT (window),
"motion-notify-event",
G_CALLBACK (motion_cb),
actor);
- gtk_widget_add_events (GTK_WIDGET(actor),
+ gtk_widget_add_events (GTK_WIDGET(window),
GDK_BUTTON_PRESS_MASK|
GDK_BUTTON_MOTION_MASK|
GDK_BUTTON_RELEASE_MASK);
gtk_widget_show_all (GTK_WIDGET (actor));
gdk_flush ();
+ /* vital: add this remote texture to a proper window */
hildon_remote_texture_set_parent(actor, GTK_WINDOW(window));
+ /* Set the actual data we'll be displaying, via the shm key */
hildon_remote_texture_set_image(actor, shm_key, width, height, bpp);
- hildon_remote_texture_set_position (actor, x, y);
+ /* Set the actual position on the screen */
+ hildon_remote_texture_set_position (actor, 0, 56, W, H-56);
hildon_remote_texture_set_show (actor, 1);
g_timeout_add (25, (GSourceFunc)timeout_cb, actor);
static guint32 damage_atom;
static guint32 show_atom;
static guint32 position_atom;
+static guint32 offset_atom;
static guint32 scale_atom;
static guint32 parent_atom;
static guint32 ready_atom;
position_atom =
gdk_x11_get_xatom_by_name_for_display
(display, "_HILDON_TEXTURE_CLIENT_MESSAGE_POSITION");
+ offset_atom =
+ gdk_x11_get_xatom_by_name_for_display
+ (display, "_HILDON_TEXTURE_CLIENT_MESSAGE_OFFSET");
scale_atom =
gdk_x11_get_xatom_by_name_for_display
(display, "_HILDON_TEXTURE_CLIENT_MESSAGE_SCALE");
g_debug ("damage atom = %lu\n", damage_atom);
g_debug ("show atom = %lu\n", show_atom);
g_debug ("position atom = %lu\n", position_atom);
+ g_debug ("offset atom = %lu\n", offset_atom);
g_debug ("scale atom = %lu\n", scale_atom);
g_debug ("parent atom = %lu\n", parent_atom);
g_debug ("ready atom = %lu\n", ready_atom);
if (priv->set_position)
hildon_remote_texture_set_position (self,
- priv->position_x,
- priv->position_y);
+ priv->x,
+ priv->y,
+ priv->width,
+ priv->height);
+
+ if (priv->set_offset)
+ hildon_remote_texture_set_offset (self,
+ priv->offset_x,
+ priv->offset_y);
if (priv->set_scale)
hildon_remote_texture_set_scale (self,
if (GTK_WIDGET_MAPPED (widget) && priv->ready)
{
+ /* Defer messages until the remote texture is parented
+ * and the parent window is mapped */
+ if (!priv->parent || !GTK_WIDGET_MAPPED (GTK_WIDGET (priv->parent)))
+ return;
hildon_remote_texture_send_message (self,
shm_atom,
priv->shm_key,
if (GTK_WIDGET_MAPPED (widget) && priv->ready)
{
+ /* Defer messages until the remote texture is parented
+ * and the parent window is mapped */
+ if (!priv->parent || !GTK_WIDGET_MAPPED (GTK_WIDGET (priv->parent)))
+ return;
hildon_remote_texture_send_message (self,
damage_atom,
priv->damage_x1,
{
/* Defer show messages until the remote texture is parented
* and the parent window is mapped */
-
if (!priv->parent || !GTK_WIDGET_MAPPED (GTK_WIDGET (priv->parent)))
return;
-
hildon_remote_texture_send_message (self,
show_atom,
show, opacity,
}
/**
- * hildon_remote_texture_set_position_full:
+ * hildon_remote_texture_set_position:
* @self: A #HildonRemoteTexture
* @x: Desired X coordinate
* @y: Desired Y coordinate
- * @depth: Desired window depth (Z coordinate)
+ * @width: Desired width
+ * @height: Desired height
*
* Send a message to the window manager setting the offset of the remote
* texture in the window (in Remote texture's pixels). The texture
**/
void
hildon_remote_texture_set_position (HildonRemoteTexture *self,
+ gint x,
+ gint y,
+ gint width,
+ gint height)
+{
+ HildonRemoteTexturePrivate
+ *priv = HILDON_REMOTE_TEXTURE_GET_PRIVATE (self);
+ GtkWidget *widget = GTK_WIDGET (self);
+
+ priv->x = x;
+ priv->y = y;
+ priv->width = width;
+ priv->height = height;
+ priv->set_position = 1;
+
+ if (GTK_WIDGET_MAPPED (widget) && priv->ready)
+ {
+ /* Defer messages until the remote texture is parented
+ * and the parent window is mapped */
+
+ if (!priv->parent || !GTK_WIDGET_MAPPED (GTK_WIDGET (priv->parent)))
+ return;
+ hildon_remote_texture_send_message (self,
+ position_atom,
+ x, y,
+ width, height, 0);
+ priv->set_position = 0;
+ }
+}
+
+/**
+ * hildon_remote_texture_set_offset:
+ * @self: A #HildonRemoteTexture
+ * @x: Desired X offset
+ * @y: Desired Y offset
+ *
+ * Send a message to the window manager setting the offset of the remote
+ * texture in the window (in Remote texture's pixels). The texture
+ * is also subject to the animation effects rendered by the compositing
+ * window manager on that window (like those by task switcher).
+ *
+ * If the remote texture WM-counterpart is not ready, the show message
+ * will be queued until the WM is ready for it.
+ **/
+void
+hildon_remote_texture_set_offset (HildonRemoteTexture *self,
double x,
double y)
{
*priv = HILDON_REMOTE_TEXTURE_GET_PRIVATE (self);
GtkWidget *widget = GTK_WIDGET (self);
- priv->position_x = x;
- priv->position_y = y;
- priv->set_position = 1;
+ priv->offset_x = x;
+ priv->offset_y = y;
+ priv->set_offset = 1;
if (GTK_WIDGET_MAPPED (widget) && priv->ready)
{
- hildon_remote_texture_send_message (self,
- position_atom,
- (gint)(x*65536), (gint)(y*65536),
- 0, 0, 0);
- priv->set_position = 0;
+ /* Defer messages until the remote texture is parented
+ * and the parent window is mapped */
+
+ if (!priv->parent || !GTK_WIDGET_MAPPED (GTK_WIDGET (priv->parent)))
+ return;
+ hildon_remote_texture_send_message (self,
+ offset_atom,
+ (gint)(x*65536), (gint)(y*65536),
+ 0, 0, 0);
+ priv->set_offset = 0;
}
}
if (GTK_WIDGET_MAPPED (widget) && priv->ready)
{
- hildon_remote_texture_send_message (self,
- scale_atom,
- priv->scale_x * (1 << 16),
- priv->scale_y * (1 << 16),
- 0, 0, 0);
- priv->set_scale = 0;
+ /* Defer messages until the remote texture is parented
+ * and the parent window is mapped */
+ if (!priv->parent || !GTK_WIDGET_MAPPED (GTK_WIDGET (priv->parent)))
+ return;
+ hildon_remote_texture_send_message (self,
+ scale_atom,
+ priv->scale_x * (1 << 16),
+ priv->scale_y * (1 << 16),
+ 0, 0, 0);
+ priv->set_scale = 0;
}
}