summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2011-02-17 21:00:35 -0500
committerMatthias Clasen <mclasen@redhat.com>2011-02-17 21:01:07 -0500
commitedeb6aaf88e5985187a33207b61ded9e0dd0fa6f (patch)
treeb6c36434f233f5c4afb0e0dbe69f35543e6656e3 /modules
parentd6e3855f95c8e7c442e84ac0bd6b3b40b6c08190 (diff)
downloadgtk+-edeb6aaf88e5985187a33207b61ded9e0dd0fa6f.tar.gz
Hypertext does not really make sense for GtkLinkButton
Instead, implement HyperLinkImpl and return the single link object. This commit also adds an AtkAction implementation for the link object.
Diffstat (limited to 'modules')
-rw-r--r--modules/other/gail/gaillinkbutton.c145
1 files changed, 106 insertions, 39 deletions
diff --git a/modules/other/gail/gaillinkbutton.c b/modules/other/gail/gaillinkbutton.c
index cfb212c5f0..16671f8279 100644
--- a/modules/other/gail/gaillinkbutton.c
+++ b/modules/other/gail/gaillinkbutton.c
@@ -30,6 +30,7 @@ struct _GailLinkButtonLink
AtkHyperlink parent;
GailLinkButton *button;
+ gchar *description;
};
struct _GailLinkButtonLinkClass
@@ -37,7 +38,10 @@ struct _GailLinkButtonLinkClass
AtkHyperlinkClass parent_class;
};
-G_DEFINE_TYPE (GailLinkButtonLink, gail_link_button_link, ATK_TYPE_HYPERLINK)
+static void atk_action_interface_init (AtkActionIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (GailLinkButtonLink, gail_link_button_link, ATK_TYPE_HYPERLINK,
+ G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init))
static gchar *
gail_link_button_link_get_uri (AtkHyperlink *link,
@@ -91,13 +95,27 @@ gail_link_button_link_get_end_index (AtkHyperlink *link)
static void
gail_link_button_link_init (GailLinkButtonLink *link)
{
+ link->description = NULL;
+}
+
+static void
+gail_link_button_link_finalize (GObject *obj)
+{
+ GailLinkButtonLink *link = (GailLinkButtonLink *)obj;
+
+ g_free (link->description);
+
+ G_OBJECT_CLASS (gail_link_button_link_parent_class)->finalize (obj);
}
static void
gail_link_button_link_class_init (GailLinkButtonLinkClass *class)
{
+ GObjectClass *object_class = G_OBJECT_CLASS (class);
AtkHyperlinkClass *hyperlink_class = ATK_HYPERLINK_CLASS (class);
+ object_class->finalize = gail_link_button_link_finalize;
+
hyperlink_class->get_uri = gail_link_button_link_get_uri;
hyperlink_class->get_n_anchors = gail_link_button_link_get_n_anchors;
hyperlink_class->is_valid = gail_link_button_link_is_valid;
@@ -107,6 +125,80 @@ gail_link_button_link_class_init (GailLinkButtonLinkClass *class)
}
static gboolean
+gail_link_button_link_do_action (AtkAction *action,
+ gint i)
+{
+ GailLinkButtonLink *link = (GailLinkButtonLink *)action;
+ GtkWidget *widget;
+
+ widget = GTK_WIDGET (link->button);
+ if (widget == NULL)
+ /*
+ * State is defunct
+ */
+ return FALSE;
+
+ if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_visible (widget))
+ return FALSE;
+
+ gtk_button_clicked (GTK_BUTTON (widget));
+
+ return TRUE;
+}
+
+static gint
+gail_link_button_link_get_n_actions (AtkAction *action)
+{
+ return 1;
+}
+
+static const gchar *
+gail_link_button_link_get_name (AtkAction *action,
+ gint i)
+{
+ g_return_val_if_fail (i == 0, NULL);
+
+ return "activate";
+}
+
+static const gchar *
+gail_link_button_link_get_description (AtkAction *action,
+ gint i)
+{
+ GailLinkButtonLink *link = (GailLinkButtonLink *)action;
+
+ g_return_val_if_fail (i == 0, NULL);
+
+ return link->description;
+}
+
+static gboolean
+gail_link_button_link_set_description (AtkAction *action,
+ gint i,
+ const gchar *description)
+{
+ GailLinkButtonLink *link = (GailLinkButtonLink *)action;
+
+ g_return_val_if_fail (i == 0, FALSE);
+
+ g_free (link->description);
+ link->description = g_strdup (description);
+
+ return TRUE;
+}
+
+
+static void
+atk_action_interface_init (AtkActionIface *iface)
+{
+ iface->do_action = gail_link_button_link_do_action;
+ iface->get_n_actions = gail_link_button_link_get_n_actions;
+ iface->get_name = gail_link_button_link_get_name;
+ iface->get_description = gail_link_button_link_get_description;
+ iface->set_description = gail_link_button_link_set_description;
+}
+
+static gboolean
activate_link (GtkLinkButton *button, AtkHyperlink *link)
{
g_signal_emit_by_name (link, "link-activated");
@@ -115,22 +207,24 @@ activate_link (GtkLinkButton *button, AtkHyperlink *link)
}
static AtkHyperlink *
-gail_link_button_link_new (GailLinkButton *button)
+gail_link_button_get_hyperlink (AtkHyperlinkImpl *impl)
{
- GailLinkButtonLink *link;
+ GailLinkButton *button = GAIL_LINK_BUTTON (impl);
- link = g_object_new (gail_link_button_link_get_type (), NULL);
- link->button = button;
- g_signal_connect (gtk_accessible_get_widget (GTK_ACCESSIBLE (button)),
- "activate-link", G_CALLBACK (activate_link), link);
+ if (!button->link)
+ {
+ button->link = g_object_new (gail_link_button_link_get_type (), NULL);
+ g_signal_connect (gtk_accessible_get_widget (GTK_ACCESSIBLE (button)),
+ "activate-link", G_CALLBACK (activate_link), button->link);
+ }
- return ATK_HYPERLINK (link);
+ return button->link;
}
-static void atk_hypertext_interface_init (AtkHypertextIface *iface);
+static void atk_hypertext_impl_interface_init (AtkHyperlinkImplIface *iface);
G_DEFINE_TYPE_WITH_CODE (GailLinkButton, gail_link_button, GAIL_TYPE_BUTTON,
- G_IMPLEMENT_INTERFACE (ATK_TYPE_HYPERTEXT, atk_hypertext_interface_init))
+ G_IMPLEMENT_INTERFACE (ATK_TYPE_HYPERLINK_IMPL, atk_hypertext_impl_interface_init))
static void
gail_link_button_init (GailLinkButton *button)
@@ -154,35 +248,8 @@ gail_link_button_class_init (GailLinkButtonClass *klass)
G_OBJECT_CLASS (klass)->finalize = gail_link_button_finalize;
}
-static gint
-gail_link_button_get_n_links (AtkHypertext *hypertext)
-{
- return 1;
-}
-
-static gint
-gail_link_button_get_link_index (AtkHypertext *hypertext,
- gint char_index)
-{
- return 0;
-}
-
-static AtkHyperlink *
-gail_link_button_get_link (AtkHypertext *hypertext,
- gint link_index)
-{
- GailLinkButton *button = GAIL_LINK_BUTTON (hypertext);
-
- if (!button->link)
- button->link = gail_link_button_link_new (button);
-
- return button->link;
-}
-
static void
-atk_hypertext_interface_init (AtkHypertextIface *iface)
+atk_hypertext_impl_interface_init (AtkHyperlinkImplIface *iface)
{
- iface->get_link = gail_link_button_get_link;
- iface->get_n_links = gail_link_button_get_n_links;
- iface->get_link_index = gail_link_button_get_link_index;
+ iface->get_hyperlink = gail_link_button_get_hyperlink;
}