patches/libgnomeui-01-icon-a11y.diff
author rohinis
Tue, 29 Nov 2011 17:32:55 +0000
branchs11express-2010-11
changeset 22234 c23e64da3e06
parent 13207 39c8b743a7db
permissions -rw-r--r--
2011-11-29 Rohini S <[email protected]> * patches/Python26-22-audio.diff: Fixes CVE-2010-1634 * specs/SUNWPython26.spec: Fixes CR 7085446

--- libgnomeui-2.21.5/libgnomeui/gnome-icon-item.c	2004-01-18 20:19:19.000000000 +0530
+++ libgnomeui-2.21.5-new/libgnomeui/gnome-icon-item.c	2004-10-28 18:46:41.085005808 +0530
@@ -31,6 +31,10 @@
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 #include <gdk/gdk.h>
+#include <atk/atk.h>
+#include <libgnomeui-access.h>
+#include <libgail-util/gailtextutil.h>
+#include <libgail-util/gailmisc.h>
 #include <libart_lgpl/art_rgb_affine.h>
 #include <libart_lgpl/art_rgb_rgba_affine.h>
 #include <string.h>
@@ -65,6 +69,10 @@ struct _GnomeIconTextItemPrivate {
 
 	GdkGC *cursor_gc;
 
+	/* Image description */
+	char *image_description;
+	GdkPixbuf *pixbuf;
+
 	/* Whether the user pressed the mouse while the item was unselected */
 	guint unselected_click : 1;
 
@@ -103,6 +103,10 @@
 
 static guint iti_signals [LAST_SIGNAL] = { 0 };
 
+static GType gnome_icon_text_item_accessible_factory_get_type (void);
+void gnome_icon_text_item_accessible_factory_class_init (AtkObjectFactoryClass *klass);
+static gpointer accessible_parent_class = NULL;
+
 GNOME_CLASS_BOILERPLATE (GnomeIconTextItem, gnome_icon_text_item,
 			 GnomeCanvasItem, GNOME_TYPE_CANVAS_ITEM)
 
@@ -999,12 +1011,406 @@ gnome_icon_text_item_class_init (GnomeIc
 	canvas_item_class->event = gnome_icon_text_item_event;
 	canvas_item_class->realize = gnome_icon_text_item_realize;
 	canvas_item_class->unrealize = gnome_icon_text_item_unrealize;
+
+	atk_registry_set_factory_type (atk_get_default_registry (),
+				       GNOME_TYPE_ICON_TEXT_ITEM,
+				       gnome_icon_text_item_accessible_factory_get_type ());				       
+
+}
+
+static GType
+gnome_icon_text_item_accessible_factory_get_type (void)
+{
+	static GType type = 0;
+	if (!type) {
+		static const GTypeInfo tinfo = {
+			sizeof (AtkObjectFactoryClass),
+			NULL, 
+			NULL, 
+			(GClassInitFunc)  gnome_icon_text_item_accessible_factory_class_init,
+      			NULL,
+			NULL, 
+			sizeof (AtkObjectFactory),
+			0, 
+			(GInstanceInitFunc)NULL,
+			NULL
+		};
+		type = g_type_register_static (
+			ATK_TYPE_OBJECT_FACTORY,
+			"GnomeIconTextItemAccessibilityFactory",
+			&tinfo, 0);
+	}
+	return type;
+}
+
+static G_CONST_RETURN gchar *
+gnome_icon_text_item_accessible_get_name (AtkObject *accessible)
+{
+	GnomeIconTextItem *iti;
+        iti = _accessibility_get_gobject (accessible);
+
+	if (!iti) {
+		return NULL;
+	}
+
+	return iti->text;
+}
+
+static G_CONST_RETURN gchar *
+gnome_icon_text_item_accessible_get_description (AtkObject *accessible)
+{
+	GnomeIconTextItem *iti;
+	iti = _accessibility_get_gobject (accessible);
+
+	if (!iti) {
+		return NULL;
+	}
+
+	return iti->text;
+}
+
+static AtkStateSet *
+gnome_icon_text_item_accessible_ref_state_set (AtkObject *accessible)
+{
+	GnomeIconTextItem *iti;
+	AtkStateSet *state_set;
+
+	iti = _accessibility_get_gobject (accessible);
+
+	state_set = ATK_OBJECT_CLASS (accessible_parent_class)->ref_state_set (accessible);
+
+	if (!iti) {
+		atk_state_set_add_state (state_set, ATK_STATE_DEFUNCT);
+		return state_set;
+	}
+
+	if (iti->selected)
+		atk_state_set_add_state (state_set, ATK_STATE_FOCUSED);
+	return state_set;
+}
+
+static void
+gnome_icon_text_item_accessible_class_init (AtkObjectClass *klass)
+{
+	accessible_parent_class = g_type_class_peek_parent (klass);
+	klass->get_name = gnome_icon_text_item_accessible_get_name;
+	klass->get_description = gnome_icon_text_item_accessible_get_description;
+	klass->ref_state_set = gnome_icon_text_item_accessible_ref_state_set;
+}
+
+static void
+gnome_icon_text_item_accessible_get_image_position (AtkImage  *obj,
+						    gint *x, gint *y,
+						    AtkCoordType coord_type)
+{
+	atk_component_get_position (ATK_COMPONENT (obj), x, y, coord_type);
 }
 
 static void
+gnome_icon_text_item_accessible_get_image_size (AtkImage *obj,
+						gint *width,
+						gint *height)
+{
+	GnomeIconTextItem *iti;
+	GnomeIconTextItemPrivate *priv;
+
+	iti = _accessibility_get_gobject (ATK_OBJECT (obj));
+	priv = iti->_priv;
+
+	if (!priv || !priv->pixbuf) {
+		*width = *height = 0;
+	} else {
+		*width = gdk_pixbuf_get_width (priv->pixbuf);
+		*height = gdk_pixbuf_get_height (priv->pixbuf);
+	}
+}
+
+static gboolean
+gnome_icon_text_item_accessible_set_image_description (AtkImage *obj,
+						       const gchar *description)
+{
+	GnomeIconTextItem *iti;
+	GnomeIconTextItemPrivate *priv;
+
+	iti = _accessibility_get_gobject (ATK_OBJECT (obj));
+	priv = iti->_priv;
+
+	if (priv->image_description)
+		g_free (priv->image_description);
+
+	priv->image_description = g_strdup (description);
+
+	return TRUE;
+}
+
+static G_CONST_RETURN gchar *
+gnome_icon_text_item_accessible_get_image_description (AtkImage *obj)
+{
+	GnomeIconTextItem *iti;
+	GnomeIconTextItemPrivate *priv;
+
+	iti = _accessibility_get_gobject (ATK_OBJECT (obj));
+	priv = iti->_priv;
+
+	return priv->image_description;
+}
+
+static void
+gnome_icon_text_item_accessible_image_interface_init (AtkImageIface *iface)
+{
+	iface->get_image_description = gnome_icon_text_item_accessible_get_image_description;
+	iface->set_image_description = gnome_icon_text_item_accessible_set_image_description;
+	iface->get_image_size        = gnome_icon_text_item_accessible_get_image_size;
+	iface->get_image_position    = gnome_icon_text_item_accessible_get_image_position;
+}
+
+static gchar*
+gnome_icon_text_item_accessible_get_text (AtkText *text,
+					  gint start_pos,
+					  gint end_pos)
+{
+	GailTextUtil *util;
+	GnomeIconTextItem *iti;
+
+	iti = _accessibility_get_gobject (ATK_OBJECT (text));
+	util = gail_text_util_new();
+
+	gail_text_util_text_setup(util, iti->text);
+
+	return gail_text_util_get_substring (util, start_pos, end_pos);
+}
+
+static gunichar
+gnome_icon_text_item_accessible_get_character_at_offset (AtkText *text,
+							 gint offset)
+{
+	GnomeIconTextItem *iti;
+	gchar *index;
+
+	iti = _accessibility_get_gobject (ATK_OBJECT (text));
+	index =  g_utf8_offset_to_pointer (iti->text, offset);
+
+	return g_utf8_get_char (index);
+}
+
+static gchar*
+gnome_icon_text_item_accessible_get_text_before_offset (AtkText *text,
+							gint offset,
+							AtkTextBoundary boundary_type,
+							gint *start_offset,
+							gint *end_offset)
+{
+	GailTextUtil *util;
+	GnomeIconTextItem *iti;
+
+	iti = _accessibility_get_gobject (ATK_OBJECT (text));
+	util = gail_text_util_new ();
+
+	gail_text_util_text_setup(util, iti->text);
+
+	return gail_text_util_get_text (util, NULL, GAIL_BEFORE_OFFSET,
+					boundary_type, offset, start_offset,
+					end_offset);
+}
+
+static gchar*
+gnome_icon_text_item_accessible_get_text_at_offset (AtkText *text,
+						    gint offset,
+						    AtkTextBoundary boundary_type,
+						    gint *start_offset,
+						    gint *end_offset)
+{
+	GailTextUtil *util;
+	GnomeIconTextItem *iti;
+
+	iti = _accessibility_get_gobject (ATK_OBJECT (text));
+	util = gail_text_util_new ();
+
+	gail_text_util_text_setup(util, iti->text);
+
+	return gail_text_util_get_text (util, NULL, GAIL_AT_OFFSET,
+					boundary_type, offset, start_offset,
+					end_offset);
+	return NULL;
+}
+
+static gchar*
+gnome_icon_text_item_accessible_get_text_after_offset (AtkText *text,
+						       gint offset,
+						       AtkTextBoundary boundary_type,
+						       gint *start_offset,
+						       gint *end_offset)
+{
+	GailTextUtil *util;
+	GnomeIconTextItem *iti;
+
+	iti = _accessibility_get_gobject (ATK_OBJECT (text));
+	util = gail_text_util_new ();
+
+	gail_text_util_text_setup(util, iti->text);
+
+	return gail_text_util_get_text (util, NULL, GAIL_AFTER_OFFSET,
+					boundary_type, offset, start_offset,
+					end_offset);
+}
+
+static gint
+gnome_icon_text_item_accessible_get_character_count (AtkText *text)
+{
+	GnomeIconTextItem *iti;
+
+	iti = _accessibility_get_gobject (ATK_OBJECT (text));
+	return g_utf8_strlen (iti->text, -1);
+}
+
+static gint
+gnome_icon_text_item_accessible_get_offset_at_point (AtkText *text,
+						     gint x,
+						     gint y,
+						     AtkCoordType coords)
+{
+	AtkObject *parent;
+	GtkWidget *widget;
+	GnomeIconTextItem *iti;
+	GnomeIconTextItemPrivate *priv;
+	PangoRectangle logical_rect;
+	gint index;
+
+	parent = atk_object_get_parent (ATK_OBJECT (text));
+	widget = GTK_ACCESSIBLE (parent)->widget;
+
+	iti = _accessibility_get_gobject (ATK_OBJECT (text));
+	priv = iti->_priv;
+
+	pango_layout_get_extents (priv->layout, NULL, &logical_rect);
+
+	index = gail_misc_get_index_at_point_in_layout (widget, priv->layout,
+							logical_rect.x,
+							logical_rect.y,
+							x, y, coords);
+
+	if (index == -1)
+		return index;
+	else
+		return g_utf8_pointer_to_offset (iti->text, iti->text + index);
+
+}
+
+static void
+gnome_icon_text_item_accessible_text_interface_init (AtkTextIface *iface)
+{
+	iface->get_text                = gnome_icon_text_item_accessible_get_text;
+	iface->get_character_at_offset = gnome_icon_text_item_accessible_get_character_at_offset;
+	iface->get_text_before_offset  = gnome_icon_text_item_accessible_get_text_before_offset;
+	iface->get_text_at_offset      = gnome_icon_text_item_accessible_get_text_at_offset;
+	iface->get_text_after_offset   = gnome_icon_text_item_accessible_get_text_after_offset;
+	iface->get_character_count     = gnome_icon_text_item_accessible_get_character_count;
+	iface->get_offset_at_point     = gnome_icon_text_item_accessible_get_offset_at_point;
+}
+
+static GType
+gnome_icon_text_item_accessible_get_type (void)
+{
+	static GType type = 0;
+
+	if (!type) {
+		static const GInterfaceInfo atk_image_info = {
+			(GInterfaceInitFunc) 
+			gnome_icon_text_item_accessible_image_interface_init,
+			(GInterfaceFinalizeFunc) NULL,
+			NULL
+		};
+
+		static const GInterfaceInfo atk_text_info = {
+			(GInterfaceInitFunc) 
+			gnome_icon_text_item_accessible_text_interface_init,
+			(GInterfaceFinalizeFunc) NULL,
+			NULL
+		};
+
+		type = _accessibility_create_derived_type (
+			"GnomeIconTextItemAccessibility",
+			GNOME_TYPE_CANVAS_ITEM,
+			gnome_icon_text_item_accessible_class_init);
+
+		if (type != G_TYPE_INVALID) {
+			g_type_add_interface_static (type, ATK_TYPE_IMAGE,
+						     &atk_image_info);
+			g_type_add_interface_static (type, ATK_TYPE_TEXT,
+						     &atk_text_info);
+		}
+				
+	}
+	return type;
+}
+
+static AtkObject *
+gnome_icon_text_item_accessible_create (GObject *for_object)
+{
+	GType type;
+	AtkObject *accessible;
+	GnomeIconTextItem *iti;
+
+	iti = GNOME_ICON_TEXT_ITEM (for_object);
+	g_return_val_if_fail (iti != NULL, NULL);
+
+	type = gnome_icon_text_item_accessible_get_type ();
+
+	accessible = g_object_new (type, NULL);
+	accessible = _accessibility_set_atk_object_return (for_object,
+                                                           accessible);
+	atk_object_set_role (accessible, ATK_ROLE_ICON);
+	return accessible;
+}
+
+static AtkObject*
+gnome_icon_text_item_accessible_factory_create_accessible (GObject *obj)   
+{
+	AtkObject *accessible;
+	g_return_val_if_fail (G_IS_OBJECT (obj), NULL);
+
+	accessible = gnome_icon_text_item_accessible_create (obj);
+
+	return accessible;
+}
+
+static GType                                                                    
+gnome_icon_text_item_accessible_factory_get_accessible_type (void)
+{
+	return gnome_icon_text_item_accessible_get_type ();
+}
+
+static void
+gnome_icon_text_item_accessible_factory_finalize (GObject *object)
+{
+	GnomeIconTextItem *iti;
+	GnomeIconTextItemPrivate *priv;
+
+        iti = GNOME_ICON_TEXT_ITEM(object);
+	priv = iti->_priv;
+
+	g_free (priv->image_description);
+
+	if (priv->pixbuf)
+		g_object_unref (G_OBJECT (priv->pixbuf));
+}
+
+void
+gnome_icon_text_item_accessible_factory_class_init (AtkObjectFactoryClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  klass->create_accessible   = gnome_icon_text_item_accessible_factory_create_accessible;
+  klass->get_accessible_type = gnome_icon_text_item_accessible_factory_get_accessible_type;
+  gobject_class->finalize = gnome_icon_text_item_accessible_factory_finalize;
+}
+
+
+static void
 gnome_icon_text_item_instance_init (GnomeIconTextItem *item)
 {
 	item->_priv = g_new0 (GnomeIconTextItemPrivate, 1);
+	item->_priv->image_description = NULL;
 }
 
 /**
@@ -1083,6 +1489,16 @@ gnome_icon_text_item_configure (GnomeIco
 	gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (iti));
 }
 
+void 
+gnome_icon_text_item_pixbuf (GnomeIconTextItem *iti, GdkPixbuf *im)
+{
+	GnomeIconTextItemPrivate *priv = iti->_priv;	
+
+	priv->pixbuf = im;
+	if (priv->pixbuf)
+		g_object_ref (priv->pixbuf);
+}
+
 /**
  * gnome_icon_text_item_setxy:
  * @iti:  An icon text item.
--- libgnomeui-2.6.1.1/libgnomeui/gnome-icon-item.h	2002-02-22 18:40:45.000000000 +0530
+++ libgnomeui-2.6.1.1-new/libgnomeui/gnome-icon-item.h	2004-10-28 18:43:29.958061520 +0530
@@ -106,6 +106,9 @@ void         gnome_icon_text_item_config
 						 gboolean           is_editable,
 						 gboolean           is_static);
 
+void         gnome_icon_text_item_pixbuf        (GnomeIconTextItem *iti,
+						 GdkPixbuf         *im);
+
 void         gnome_icon_text_item_setxy         (GnomeIconTextItem *iti,
 						 int                x,
 						 int                y);
--- libgnomeui-2.6.1.1/libgnomeui/gnome-icon-list.c	2004-02-24 07:20:11.000000000 +0530
+++ libgnomeui-2.6.1.1-new/libgnomeui/gnome-icon-list.c	2004-10-28 18:43:29.960061216 +0530
@@ -1006,6 +1006,7 @@ icon_new_from_pixbuf (GnomeIconList *gil
 		GNOME_TYPE_ICON_TEXT_ITEM,
 		NULL));
 
+	gnome_icon_text_item_pixbuf (icon->text, im);
 	gnome_icon_text_item_configure (icon->text,
 					0, 0, priv->icon_width, NULL,
 					text, priv->is_editable, priv->static_text);
--- libgnomeui-2.22.1/configure.in	2005-03-07 01:42:42.000000000 -1200
+++ libgnomeui-2.22.1-hacked/configure.in	2005-04-28 16:01:01.419756952 -1200
@@ -29,6 +29,7 @@
 m4_define([gnomevfs_required_version],       [2.7.3])
 m4_define([libglade_required_version],       [2.0.0])
 m4_define([gnome_keyring_required_version],  [0.4])
+m4_define([gail_required_version],           [0.16])
 
 dnl libtool versioning from libgnome
 
@@ -207,6 +208,7 @@
   glib-2.0 >= glib_required_version
   gio-2.0 >= gio_required_version
   gnome-vfs-2.0 >= gnomevfs_required_version dnl
+  gail >= gail_required_version
   $gnome_keyring_requirement"
 PKG_CHECK_MODULES(LIBGNOMEUI, [$GNOMEUI_MODULES])
 LIBGNOMEUI_CFLAGS="$X_CFLAGS $LIBGNOMEUI_CFLAGS"