[clutter] a11y: cally-util: use password-char to fill a key_event if required
- From: Alejandro Piñeiro Iglesias <apinheiro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [clutter] a11y: cally-util: use password-char to fill a key_event if required
- Date: Tue, 5 Mar 2013 19:22:23 +0000 (UTC)
commit 78a3590fd67338b63651fcf935aeeee4254ef1e1
Author: Alejandro Piñeiro <apinheiro igalia com>
Date: Mon Sep 24 15:09:43 2012 +0200
a11y: cally-util: use password-char to fill a key_event if required
clutter/cally/cally-util.c | 69 ++++++++++++++++++++++++++++++++++++++-----
1 files changed, 61 insertions(+), 8 deletions(-)
---
diff --git a/clutter/cally/cally-util.c b/clutter/cally/cally-util.c
index 0a81471..fdef295 100644
--- a/clutter/cally/cally-util.c
+++ b/clutter/cally/cally-util.c
@@ -50,6 +50,8 @@
#include "cally-root.h"
#include "cally-stage.h"
+#define DEFAULT_PASSWORD_CHAR '*'
+
/* atkutil.h */
static guint cally_util_add_key_event_listener (AtkKeySnoopFunc listener,
@@ -77,8 +79,6 @@ static gboolean notify_hf (gpointer k
static void insert_hf (gpointer key,
gpointer value,
gpointer data);
-static AtkKeyEventStruct * atk_key_event_from_clutter_event_key (ClutterKeyEvent *event);
-
/* This is just a copy of the Gail one, a shared library or place to
define it could be a good idea. */
@@ -249,7 +249,8 @@ cally_util_simulate_snooper_remove (void)
}
static AtkKeyEventStruct *
-atk_key_event_from_clutter_event_key (ClutterKeyEvent *clutter_event)
+atk_key_event_from_clutter_event_key (ClutterKeyEvent *clutter_event,
+ gunichar password_char)
{
AtkKeyEventStruct *atk_event = g_new0 (AtkKeyEventStruct, 1);
gunichar key_unichar;
@@ -267,7 +268,10 @@ atk_key_event_from_clutter_event_key (ClutterKeyEvent *clutter_event)
return NULL;
}
- atk_event->state = clutter_event->modifier_state;
+ if (password_char)
+ atk_event->state = 0;
+ else
+ atk_event->state = clutter_event->modifier_state;
/* We emit the clutter keyval. This is not exactly the one expected
by AtkKeyEventStruct, as it expects a Gdk-like event, with the
@@ -275,7 +279,10 @@ atk_key_event_from_clutter_event_key (ClutterKeyEvent *clutter_event)
that on the AT application.
More information: Bug 1952 and bug 2072
*/
- atk_event->keyval = clutter_event->keyval;
+ if (password_char)
+ atk_event->keyval = clutter_unicode_to_keysym (password_char);
+ else
+ atk_event->keyval = clutter_event->keyval;
/* It is expected to store a key defining string here (ie "Space" in
case you press a space). Anyway, there are no function on clutter
@@ -286,7 +293,10 @@ atk_key_event_from_clutter_event_key (ClutterKeyEvent *clutter_event)
More information: Bug 1952 and 2072
*/
- key_unichar = clutter_event_get_key_unicode ((ClutterEvent *) clutter_event);
+ if (password_char)
+ key_unichar = password_char;
+ else
+ key_unichar = clutter_event_get_key_unicode ((ClutterEvent *) clutter_event);
if (g_unichar_validate (key_unichar) && !g_unichar_iscntrl (key_unichar))
{
@@ -302,7 +312,15 @@ atk_key_event_from_clutter_event_key (ClutterKeyEvent *clutter_event)
atk_event->length = 0;
- atk_event->keycode = clutter_event->hardware_keycode;
+ /* Computing the hardware keycode from the password-char is
+ difficult. But we are in a password situation. We are already a
+ unichar that it is not the original one. Providing a "almost
+ real" keycode is irrelevant */
+ if (password_char)
+ atk_event->keycode = 0;
+ else
+ atk_event->keycode = clutter_event->hardware_keycode;
+
atk_event->timestamp = clutter_event->time;
#ifdef CALLY_DEBUG
@@ -335,6 +353,37 @@ insert_hf (gpointer key, gpointer value, gpointer data)
g_hash_table_insert (new_table, key, value);
}
+
+/*
+ * 0 if the key of that event is visible, in other case the password
+ * char
+ */
+static gunichar
+check_key_visibility (ClutterEvent *event)
+{
+ ClutterKeyEvent *key_event = (ClutterKeyEvent *)event;
+ AtkObject *accessible = clutter_actor_get_accessible (key_event->source);
+
+ g_return_val_if_fail (accessible != NULL, 0);
+
+ if (atk_object_get_role (accessible) != ATK_ROLE_PASSWORD_TEXT)
+ return 0;
+
+ /* If it is a clutter text, we use his password char. Note that
+ although at Clutter toolkit itself, only ClutterText exposes a
+ password role, nothing prevents on any derived toolkit (like st)
+ to create a new actor that can behave like a password entry. And
+ the key event will still be emitted here. Although in that case
+ we would lose any password char from the derived toolkit, it is
+ still better fill this with a default unichar that the original
+ one */
+
+ if (CLUTTER_IS_TEXT (key_event->source))
+ return clutter_text_get_password_char (CLUTTER_TEXT (key_event->source));
+ else
+ return DEFAULT_PASSWORD_CHAR;
+}
+
static gboolean
cally_key_snooper (ClutterActor *actor,
ClutterEvent *event,
@@ -342,6 +391,7 @@ cally_key_snooper (ClutterActor *actor,
{
AtkKeyEventStruct *key_event = NULL;
gint consumed = 0;
+ gunichar password_char = 0;
/* filter key events */
if ((event->type != CLUTTER_KEY_PRESS) && (event->type != CLUTTER_KEY_RELEASE))
@@ -349,12 +399,15 @@ cally_key_snooper (ClutterActor *actor,
return FALSE;
}
+ password_char = check_key_visibility (event);
+
if (key_listener_list)
{
GHashTable *new_hash = g_hash_table_new (NULL, NULL);
g_hash_table_foreach (key_listener_list, insert_hf, new_hash);
- key_event = atk_key_event_from_clutter_event_key ((ClutterKeyEvent *)event);
+ key_event = atk_key_event_from_clutter_event_key ((ClutterKeyEvent *)event,
+ password_char);
/* func data is inside the hash table */
consumed = g_hash_table_foreach_steal (new_hash, notify_hf, key_event);
g_hash_table_destroy (new_hash);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]