[Swfdec] 7 commits - doc/swfdec-sections.txt libswfdec/Makefile.am libswfdec/swfdec_as_object.c libswfdec/swfdec.h libswfdec/swfdec_key.h libswfdec/swfdec_marshal.list libswfdec/swfdec_player.c libswfdec/swfdec_player.h libswfdec/swfdec_player_internal.h test/trace

Benjamin Otte company at kemper.freedesktop.org
Sun Aug 5 04:59:48 PDT 2007


 doc/swfdec-sections.txt            |    3 +
 libswfdec/Makefile.am              |    1 
 libswfdec/swfdec.h                 |    1 
 libswfdec/swfdec_as_object.c       |    1 
 libswfdec/swfdec_key.h             |   32 ++++++++++++++
 libswfdec/swfdec_marshal.list      |    1 
 libswfdec/swfdec_player.c          |   83 +++++++++++++++++++++++++++++++++++--
 libswfdec/swfdec_player.h          |    5 ++
 libswfdec/swfdec_player_internal.h |    3 +
 test/trace/swfdec_interaction.c    |   34 +++++++++++++++
 test/trace/swfdec_interaction.h    |   11 +++-
 11 files changed, 168 insertions(+), 7 deletions(-)

New commits:
diff-tree ee784e2bc20dc17a4e842d70d661f228903d32ae (from parents)
Merge: 0bd1263afd1d7738eab08f2264a453f03908db3c e35c5dd07e4e4e870e0ce916919ca798ba736bc5
Author: Benjamin Otte <otte at gnome.org>
Date:   Sun Aug 5 13:54:38 2007 +0200

    Merge branch 'master' of ssh://company@git.freedesktop.org/git/swfdec/swfdec

diff-tree 0bd1263afd1d7738eab08f2264a453f03908db3c (from d19ac4b569501dae4eb5e40a6ebaadd9e6c9d318)
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Aug 3 13:04:55 2007 +0200

    guess who forgot to add a file...

diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am
index b8d2e07..1c25bee 100644
--- a/libswfdec/Makefile.am
+++ b/libswfdec/Makefile.am
@@ -130,6 +130,7 @@ public_headers = \
 	swfdec_audio.h \
 	swfdec_buffer.h \
 	swfdec_file_loader.h \
+	swfdec_key.h \
 	swfdec_loader.h \
 	swfdec_player.h \
 	swfdec_url.h
diff --git a/libswfdec/swfdec_key.h b/libswfdec/swfdec_key.h
new file mode 100644
index 0000000..f87c9ab
--- /dev/null
+++ b/libswfdec/swfdec_key.h
@@ -0,0 +1,32 @@
+/* Swfdec
+ * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, 
+ * Boston, MA  02110-1301  USA
+ */
+
+#ifndef _SWFDEC_KEY_H_
+#define _SWFDEC_KEY_H_
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+/* can't make this a guint8 because of signal handlers, but it should be a guint8 */
+typedef guint SwfdecKey;
+					 
+
+G_END_DECLS
+#endif
diff-tree d19ac4b569501dae4eb5e40a6ebaadd9e6c9d318 (from fafe076b291915253f1434b59979061a28811e5f)
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Aug 3 13:04:03 2007 +0200

    make key handling work

diff --git a/test/trace/swfdec_interaction.c b/test/trace/swfdec_interaction.c
index 40b093c..914f8ff 100644
--- a/test/trace/swfdec_interaction.c
+++ b/test/trace/swfdec_interaction.c
@@ -244,7 +244,10 @@ swfdec_interaction_advance (SwfdecIntera
 	    command->args.mouse.y, command->args.mouse.button);
 	break;
       case SWFDEC_COMMAND_PRESS:
+	swfdec_player_key_press (player, command->args.key);
+	break;
       case SWFDEC_COMMAND_RELEASE:
+	swfdec_player_key_release (player, command->args.key);
 	break;
       case SWFDEC_COMMAND_UP:
       case SWFDEC_COMMAND_DOWN:
diff-tree fafe076b291915253f1434b59979061a28811e5f (from d9c4918cbf14898f7aeedd6111d5005da9f6c171)
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Aug 3 13:02:12 2007 +0200

    the native flag is gone, no need to document it

diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c
index 2931172..f7b0e98 100644
--- a/libswfdec/swfdec_as_object.c
+++ b/libswfdec/swfdec_as_object.c
@@ -66,7 +66,6 @@
  *                                to delete this variable.
  * @SWFDEC_AS_VARIABLE_READONLY: Do not allow changing the value with
  *                               swfdec_as_object_set_variable().
- * @SWFDEC_AS_VARIABLE_NATIVE: The variable is implemented natively.
  *
  * These flags are used to describe various properties of a variable inside
  * Swfdec. You can manually set them with swfdec_as_object_set_variable_flags().
diff-tree d9c4918cbf14898f7aeedd6111d5005da9f6c171 (from e6a06ac5bf092521506a046c1624e8f6f1a45248)
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Aug 3 13:00:12 2007 +0200

    make documentation key function aware

diff --git a/doc/swfdec-sections.txt b/doc/swfdec-sections.txt
index a58478d..69d7785 100644
--- a/doc/swfdec-sections.txt
+++ b/doc/swfdec-sections.txt
@@ -91,6 +91,8 @@ swfdec_player_set_alignment
 swfdec_player_render
 swfdec_player_advance
 swfdec_player_handle_mouse
+swfdec_player_key_press
+swfdec_player_key_release
 swfdec_player_render_audio
 swfdec_player_get_audio
 <SUBSECTION Standard>
@@ -142,6 +144,7 @@ SwfdecLoaderDataType
 SwfdecLoaderRequest
 swfdec_loader_data_type_get_extension
 SwfdecAlignment
+SwfdecKey
 SwfdecMouseCursor
 SwfdecScaleMode
 </SECTION>
diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c
index 393519d..4ea85e6 100644
--- a/libswfdec/swfdec_player.c
+++ b/libswfdec/swfdec_player.c
@@ -1636,8 +1636,9 @@ swfdec_init (void)
  * probably want to call swfdec_player_advance() before to update the player to
  * the correct time when calling this function.
  *
- * Returns: TRUE if the mouse event was handled. A mouse event may not be 
- *          handled if the user clicked on a translucent area for example.
+ * Returns: %TRUE if the mouse event was handled. %FALSE to propagate the event
+ *          further. A mouse event may not be handled if the user clicked on a 
+ *          translucent area.
  **/
 gboolean
 swfdec_player_handle_mouse (SwfdecPlayer *player, 
@@ -1653,6 +1654,17 @@ swfdec_player_handle_mouse (SwfdecPlayer
   return ret;
 }
 
+/**
+ * swfdec_player_key_press:
+ * @player: a #SwfdecPlayer
+ * @key: the key that was pressed
+ *
+ * Call this function to make the @player react to a key press. Be sure to
+ * transform the keycode to the right #SwfdecKey.
+ *
+ * Returns: %TRUE if the key press was handled by the @player, %FALSE if it
+ *          should be propagated further
+ **/
 gboolean
 swfdec_player_key_press (SwfdecPlayer *player, SwfdecKey key)
 {
@@ -1666,6 +1678,17 @@ swfdec_player_key_press (SwfdecPlayer *p
   return ret;
 }
 
+/**
+ * swfdec_player_key_release:
+ * @player: a #SwfdecPlayer
+ * @key: the key that was released
+ *
+ * Call this function to make the @player react to a key being released. Be 
+ * sure to transform the keycode to the right #SwfdecKey.
+ *
+ * Returns: %TRUE if the key press was handled by the @player, %FALSE if it
+ *          should be propagated further
+ **/
 gboolean
 swfdec_player_key_release (SwfdecPlayer *player, SwfdecKey key)
 {
diff-tree e6a06ac5bf092521506a046c1624e8f6f1a45248 (from fcd20f5796889b82472ac54a08be02b4a9c45ec0)
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Aug 3 12:54:06 2007 +0200

    add infrastructure for handling key events

diff --git a/libswfdec/swfdec.h b/libswfdec/swfdec.h
index d49dc69..9a82dd1 100644
--- a/libswfdec/swfdec.h
+++ b/libswfdec/swfdec.h
@@ -31,6 +31,7 @@
 #include <libswfdec/swfdec_buffer.h>
 #include <libswfdec/swfdec_enums.h>
 #include <libswfdec/swfdec_file_loader.h>
+#include <libswfdec/swfdec_key.h>
 #include <libswfdec/swfdec_loader.h>
 #include <libswfdec/swfdec_player.h>
 #include <libswfdec/swfdec_url.h>
diff --git a/libswfdec/swfdec_marshal.list b/libswfdec/swfdec_marshal.list
index e2322a3..e04f7f5 100644
--- a/libswfdec/swfdec_marshal.list
+++ b/libswfdec/swfdec_marshal.list
@@ -1,4 +1,5 @@
 BOOLEAN:DOUBLE,DOUBLE,INT
+BOOLEAN:UINT,BOOLEAN
 VOID:DOUBLE,DOUBLE,DOUBLE,DOUBLE
 VOID:STRING,STRING
 VOID:UINT,UINT
diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c
index ff786ce..393519d 100644
--- a/libswfdec/swfdec_player.c
+++ b/libswfdec/swfdec_player.c
@@ -407,6 +407,7 @@ swfdec_player_remove_all_external_action
 enum {
   INVALIDATE,
   ADVANCE,
+  HANDLE_KEY,
   HANDLE_MOUSE,
   AUDIO_ADDED,
   AUDIO_REMOVED,
@@ -890,6 +891,14 @@ swfdec_player_emit_signals (SwfdecPlayer
 }
 
 static gboolean
+swfdec_player_do_handle_key (SwfdecPlayer *player, SwfdecKey key, gboolean down)
+{
+  g_assert (key < 256);
+
+  return TRUE;
+}
+
+static gboolean
 swfdec_player_do_handle_mouse (SwfdecPlayer *player, 
     double x, double y, int button)
 {
@@ -1155,13 +1164,31 @@ swfdec_player_class_init (SwfdecPlayerCl
       NULL, NULL, swfdec_marshal_VOID__UINT_UINT,
       G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT);
   /**
+   * SwfdecPlayer::handle-key:
+   * @player: the #SwfdecPlayer affected
+   * @key: #SwfdecKey that was pressed or released
+   * @pressed: %TRUE if the @key was pressed or %FALSE if it was released
+   *
+   * This signal is emitted whenever @player should respond to a key event. If
+   * any of the handlers returns TRUE, swfdec_player_key_press() or 
+   * swfdec_player_key_release() will return TRUE. Note that unlike many event 
+   * handlers in gtk, returning TRUE will not stop further event handlers from 
+   * being invoked. Use g_signal_stop_emission() in that case.
+   *
+   * Returns: TRUE if this handler handles the event. 
+   **/
+  signals[HANDLE_KEY] = g_signal_new ("handle-key", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (SwfdecPlayerClass, handle_key), 
+      swfdec_accumulate_or, NULL, swfdec_marshal_BOOLEAN__UINT_BOOLEAN,
+      G_TYPE_BOOLEAN, 2, G_TYPE_UINT, G_TYPE_BOOLEAN);
+  /**
    * SwfdecPlayer::handle-mouse:
    * @player: the #SwfdecPlayer affected
    * @x: new x coordinate of the mouse
    * @y: new y coordinate of the mouse
    * @button: 1 if the button is pressed, 0 if not
    *
-   * this signal is emitted whenever @player should respond to a mouse event. If
+   * This signal is emitted whenever @player should respond to a mouse event. If
    * any of the handlers returns TRUE, swfdec_player_handle_mouse() will return 
    * TRUE. Note that unlike many event handlers in gtk, returning TRUE will not 
    * stop further event handlers from being invoked. Use g_signal_stop_emission()
@@ -1244,6 +1271,7 @@ swfdec_player_class_init (SwfdecPlayerCl
   context_class->get_time = swfdec_player_get_time;
 
   klass->advance = swfdec_player_do_advance;
+  klass->handle_key = swfdec_player_do_handle_key;
   klass->handle_mouse = swfdec_player_do_handle_mouse;
 }
 
@@ -1625,6 +1653,32 @@ swfdec_player_handle_mouse (SwfdecPlayer
   return ret;
 }
 
+gboolean
+swfdec_player_key_press (SwfdecPlayer *player, SwfdecKey key)
+{
+  gboolean ret;
+
+  g_return_val_if_fail (SWFDEC_IS_PLAYER (player), FALSE);
+  g_return_val_if_fail (key >= 256, FALSE);
+
+  g_signal_emit (player, signals[HANDLE_KEY], 0, key, TRUE, &ret);
+
+  return ret;
+}
+
+gboolean
+swfdec_player_key_release (SwfdecPlayer *player, SwfdecKey key)
+{
+  gboolean ret;
+
+  g_return_val_if_fail (SWFDEC_IS_PLAYER (player), FALSE);
+  g_return_val_if_fail (key >= 256, FALSE);
+
+  g_signal_emit (player, signals[HANDLE_KEY], 0, key, FALSE, &ret);
+
+  return ret;
+}
+
 /**
  * swfdec_player_render:
  * @player: a #SwfdecPlayer
diff --git a/libswfdec/swfdec_player.h b/libswfdec/swfdec_player.h
index e712583..11333b0 100644
--- a/libswfdec/swfdec_player.h
+++ b/libswfdec/swfdec_player.h
@@ -22,6 +22,7 @@
 
 #include <glib-object.h>
 #include <cairo.h>
+#include <libswfdec/swfdec_key.h>
 #include <libswfdec/swfdec_loader.h>
 
 G_BEGIN_DECLS
@@ -111,6 +112,10 @@ gboolean	swfdec_player_handle_mouse	(Swf
 						 double		x,
 						 double		y,
 						 int		button);
+gboolean	swfdec_player_key_press		(SwfdecPlayer *	player,
+						 SwfdecKey	key);
+gboolean	swfdec_player_key_release	(SwfdecPlayer *	player,
+						 SwfdecKey	key);
 /* audio - see swfdec_audio.c */
 void		swfdec_player_render_audio	(SwfdecPlayer *	player,
 						 gint16 *	dest, 
diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h
index 0667e20..b02e573 100644
--- a/libswfdec/swfdec_player_internal.h
+++ b/libswfdec/swfdec_player_internal.h
@@ -121,6 +121,9 @@ struct _SwfdecPlayerClass
   void			(* advance)		(SwfdecPlayer *		player,
 						 guint			msecs,
 						 guint			audio_samples);
+  gboolean		(* handle_key)		(SwfdecPlayer *		player,
+						 SwfdecKey		key,
+						 gboolean		down);
   gboolean		(* handle_mouse)	(SwfdecPlayer *		player,
 						 double			x,
 						 double			y,
diff-tree fcd20f5796889b82472ac54a08be02b4a9c45ec0 (from 6c9bb2836becc35805d599c3f4e942c97fbe09f1)
Author: Benjamin Otte <otte at gnome.org>
Date:   Fri Aug 3 09:55:30 2007 +0200

    add initial support for tracking key presses and releases

diff --git a/test/trace/swfdec_interaction.c b/test/trace/swfdec_interaction.c
index 371d786..40b093c 100644
--- a/test/trace/swfdec_interaction.c
+++ b/test/trace/swfdec_interaction.c
@@ -81,6 +81,16 @@ swfdec_command_append_mouse (SwfdecInter
 }
 
 static void
+swfdec_command_append_key (SwfdecInteraction *inter, guint key, SwfdecCommandType type)
+{
+  SwfdecCommand command;
+
+  command.command = type;
+  command.args.key = key;
+  g_array_append_val (inter->commands, command);
+}
+
+static void
 swfdec_command_append_wait (SwfdecInteraction *inter, int msecs)
 {
   SwfdecCommand command;
@@ -108,6 +118,8 @@ swfdec_interaction_new (const char *data
   g_scanner_scope_add_symbol (scanner, 0, "move", GINT_TO_POINTER (SWFDEC_COMMAND_MOVE));
   g_scanner_scope_add_symbol (scanner, 0, "down", GINT_TO_POINTER (SWFDEC_COMMAND_DOWN));
   g_scanner_scope_add_symbol (scanner, 0, "up", GINT_TO_POINTER (SWFDEC_COMMAND_UP));
+  g_scanner_scope_add_symbol (scanner, 0, "press", GINT_TO_POINTER (SWFDEC_COMMAND_PRESS));
+  g_scanner_scope_add_symbol (scanner, 0, "release", GINT_TO_POINTER (SWFDEC_COMMAND_RELEASE));
   g_scanner_input_text (scanner, data, length);
 
   /* setup inter */
@@ -146,6 +158,22 @@ swfdec_interaction_new (const char *data
       case SWFDEC_COMMAND_UP:
 	swfdec_command_append_mouse (inter, inter->mouse_x, inter->mouse_y, 0);
 	break;
+      case SWFDEC_COMMAND_PRESS:
+	token = g_scanner_get_next_token (scanner);
+	if (token != G_TOKEN_INT) {
+	  g_scanner_unexp_token (scanner, G_TOKEN_INT, NULL, NULL, NULL, NULL, TRUE);
+	  goto error;
+	}
+	swfdec_command_append_key (inter, scanner->value.v_int, SWFDEC_COMMAND_PRESS);
+	break;
+      case SWFDEC_COMMAND_RELEASE:
+	token = g_scanner_get_next_token (scanner);
+	if (token != G_TOKEN_INT) {
+	  g_scanner_unexp_token (scanner, G_TOKEN_INT, NULL, NULL, NULL, NULL, TRUE);
+	  goto error;
+	}
+	swfdec_command_append_key (inter, scanner->value.v_int, SWFDEC_COMMAND_RELEASE);
+	break;
       default:
 	g_scanner_unexp_token (scanner, SWFDEC_COMMAND_WAIT, NULL, NULL, NULL, NULL, TRUE);
 	goto error;
@@ -215,6 +243,9 @@ swfdec_interaction_advance (SwfdecIntera
 	swfdec_player_handle_mouse (player, command->args.mouse.x, 
 	    command->args.mouse.y, command->args.mouse.button);
 	break;
+      case SWFDEC_COMMAND_PRESS:
+      case SWFDEC_COMMAND_RELEASE:
+	break;
       case SWFDEC_COMMAND_UP:
       case SWFDEC_COMMAND_DOWN:
 	/* these 2 get synthetisized into SWFDEC_COMMAND_MOVE */
diff --git a/test/trace/swfdec_interaction.h b/test/trace/swfdec_interaction.h
index c7d5d9b..0258474 100644
--- a/test/trace/swfdec_interaction.h
+++ b/test/trace/swfdec_interaction.h
@@ -29,10 +29,14 @@ typedef enum {
   SWFDEC_COMMAND_WAIT = G_TOKEN_LAST + 1,
   /* move (int x, int y) */
   SWFDEC_COMMAND_MOVE,
-  /* press (void) */
+  /* mouse press (void) */
   SWFDEC_COMMAND_DOWN,
-  /* release (void) */
-  SWFDEC_COMMAND_UP
+  /* mouse release (void) */
+  SWFDEC_COMMAND_UP,
+  /* key press (int key) */
+  SWFDEC_COMMAND_PRESS,
+  /* key release (int key) */
+  SWFDEC_COMMAND_RELEASE
 } SwfdecCommandType;
 
 typedef struct _SwfdecCommand SwfdecCommand;
@@ -45,6 +49,7 @@ struct _SwfdecCommand {
       int		button;
     }			mouse;
     guint		time;
+    guint		key;
   }			args;
 };
 


More information about the Swfdec mailing list