*
* By default, GtkLinkButton calls gtk_show_uri() when the button is
* clicked. This behaviour can be overridden by connecting to the
- * #GtkButton::clicked signal.
+ * #GtkLinkButton::activate-link signal and returning %TRUE from the
+ * signal handler.
*/
#include "config.h"
#include "gtkimagemenuitem.h"
#include "gtklabel.h"
#include "gtkmain.h"
+#include "gtkmarshalers.h"
#include "gtkmenu.h"
#include "gtkmenuitem.h"
#include "gtksizerequest.h"
PROP_VISITED
};
+enum
+{
+ ACTIVATE_LINK,
+
+ LAST_SIGNAL
+};
static void gtk_link_button_finalize (GObject *object);
static void gtk_link_button_get_property (GObject *object,
gboolean keyboard_tip,
GtkTooltip *tooltip,
gpointer data);
-
+static gboolean gtk_link_button_activate_link (GtkLinkButton *link_button);
static const GtkTargetEntry link_drop_types[] = {
{ "text/uri-list", 0, 0 },
static const GdkColor default_link_color = { 0, 0, 0, 0xeeee };
static const GdkColor default_visited_link_color = { 0, 0x5555, 0x1a1a, 0x8b8b };
+static guint link_signals[LAST_SIGNAL] = { 0, };
+
G_DEFINE_TYPE (GtkLinkButton, gtk_link_button, GTK_TYPE_BUTTON)
static void
button_class->clicked = gtk_link_button_clicked;
+ klass->activate_link = gtk_link_button_activate_link;
+
/**
* GtkLinkButton:uri
*
G_PARAM_READWRITE));
g_type_class_add_private (gobject_class, sizeof (GtkLinkButtonPrivate));
+
+ /**
+ * GtkLinkButton::activate-link:
+ * @button: the #GtkLinkButton that emitted the signal
+ *
+ * The ::activate-link signal is emitted each time the #GtkLinkButton
+ * has been clicked.
+ *
+ * The default handler will call gtk_show_uri() with the URI stored inside
+ * the #GtkLinkButton:uri property.
+ *
+ * To override the default behavior, you can connect to the ::activate-link
+ * signal and stop the propagation of the signal by returning %TRUE from
+ * your handler.
+ */
+ link_signals[ACTIVATE_LINK] =
+ g_signal_new (I_("activate-link"),
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GtkLinkButtonClass, activate_link),
+ _gtk_boolean_handled_accumulator, NULL,
+ _gtk_marshal_BOOLEAN__VOID,
+ G_TYPE_BOOLEAN, 0);
}
static void
return FALSE;
}
-static void
-gtk_link_button_clicked (GtkButton *button)
+static gboolean
+gtk_link_button_activate_link (GtkLinkButton *link_button)
{
- GtkLinkButton *link_button = GTK_LINK_BUTTON (button);
GdkScreen *screen;
GError *error;
- if (gtk_widget_has_screen (GTK_WIDGET (button)))
- screen = gtk_widget_get_screen (GTK_WIDGET (button));
+ if (gtk_widget_has_screen (GTK_WIDGET (link_button)))
+ screen = gtk_widget_get_screen (GTK_WIDGET (link_button));
else
screen = NULL;
link_button->priv->uri,
error->message);
g_error_free (error);
+
+ return FALSE;
}
gtk_link_button_set_visited (link_button, TRUE);
+
+ return TRUE;
+}
+
+static void
+gtk_link_button_clicked (GtkButton *button)
+{
+ gboolean retval = FALSE;
+
+ g_signal_emit (button, link_signals[ACTIVATE_LINK], 0, &retval);
}
static gboolean
typedef struct _GtkLinkButtonClass GtkLinkButtonClass;
typedef struct _GtkLinkButtonPrivate GtkLinkButtonPrivate;
+/**
+ * GtkLinkButton:
+ *
+ * The <structname>GtkLinkButton</structname> structure contains only
+ * private data and should be accessed using the provided API.
+ */
struct _GtkLinkButton
{
+ /*< private >*/
GtkButton parent_instance;
GtkLinkButtonPrivate *priv;
};
+/**
+ * GtkLinkButtonClass:
+ * @activate_link: class handler for the #GtkLinkButton::activate-link signal
+ *
+ * The <structname>GtkLinkButtonClass</structname> structure contains only
+ * private data.
+ */
struct _GtkLinkButtonClass
{
+ /*< private >*/
GtkButtonClass parent_class;
+ /*< public >*/
+ gboolean (* activate_link) (GtkLinkButton *button);
+
+ /*< private >*/
void (*_gtk_padding1) (void);
void (*_gtk_padding2) (void);
void (*_gtk_padding3) (void);