Emit key focus signal when stage state changes
authorRaymond Liu <raymond.liu@intel.com>
Thu, 7 May 2009 10:20:19 +0000 (18:20 +0800)
committerEmmanuele Bassi <ebassi@linux.intel.com>
Tue, 12 May 2009 12:47:17 +0000 (13:47 +0100)
When the stage state changes between active/deactive, send out
key-focus-in/key-focus-out signal for the current key focused
actor on the stage.

Fixes bug:

  http://bugzilla.openedhand.com/show_bug.cgi?id=1503

Signed-off-by: Emmanuele Bassi <ebassi@linux.intel.com>
clutter/clutter-stage.c

index 22e891a..3d9dd5b 100644 (file)
@@ -331,6 +331,33 @@ clutter_stage_hide (ClutterActor *self)
 }
 
 static void
+clutter_stage_emit_key_focus_event (ClutterStage *stage,
+                                    gboolean      focus_in)
+{
+  ClutterStagePrivate *priv = stage->priv;
+
+  if (priv->key_focused_actor == NULL)
+    return;
+
+  if (focus_in)
+    g_signal_emit_by_name (priv->key_focused_actor, "key-focus-in");
+  else
+    g_signal_emit_by_name (priv->key_focused_actor, "key-focus-out");
+}
+
+static void
+clutter_stage_real_activate (ClutterStage *stage)
+{
+  clutter_stage_emit_key_focus_event (stage, TRUE);
+}
+
+static void
+clutter_stage_real_deactivate (ClutterStage *stage)
+{
+  clutter_stage_emit_key_focus_event (stage, FALSE);
+}
+
+static void
 clutter_stage_real_fullscreen (ClutterStage *stage)
 {
   ClutterStagePrivate *priv = stage->priv;
@@ -822,6 +849,8 @@ clutter_stage_class_init (ClutterStageClass *klass)
                  G_TYPE_NONE, 0);
 
   klass->fullscreen = clutter_stage_real_fullscreen;
+  klass->activate = clutter_stage_real_activate;
+  klass->deactivate = clutter_stage_real_deactivate;
 
   g_type_class_add_private (gobject_class, sizeof (ClutterStagePrivate));
 }