X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtklinkbutton.c;h=b5981c741f5ea55192dd40ddbeb9d8fb5e7b5f94;hb=1c796018d1dcba002766673c4070c9d98e95fadb;hp=fde6d273e9d653a014d8256a52d7d41ec04bd1e1;hpb=b123bc41fdce1e2cbf4ab6f998b3dd372aab515f;p=~andy%2Fgtk diff --git a/gtk/gtklinkbutton.c b/gtk/gtklinkbutton.c index fde6d273e..b5981c741 100644 --- a/gtk/gtklinkbutton.c +++ b/gtk/gtklinkbutton.c @@ -18,8 +18,7 @@ * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Cambridge, MA 02139, USA. + * License along with this library. If not, see . */ /** @@ -55,7 +54,7 @@ #include "gtkdnd.h" #include "gtkimagemenuitem.h" #include "gtklabel.h" -#include "gtkmainprivate.h" +#include "gtkmain.h" #include "gtkmarshalers.h" #include "gtkmenu.h" #include "gtkmenuitem.h" @@ -63,9 +62,10 @@ #include "gtkstock.h" #include "gtkshow.h" #include "gtktooltip.h" - +#include "gtkprivate.h" #include "gtkintl.h" +#include "a11y/gtklinkbuttonaccessible.h" struct _GtkLinkButtonPrivate { @@ -106,6 +106,7 @@ static gboolean gtk_link_button_button_press (GtkWidget *widget, static void gtk_link_button_clicked (GtkButton *button); static gboolean gtk_link_button_popup_menu (GtkWidget *widget); static void gtk_link_button_style_updated (GtkWidget *widget); +static void gtk_link_button_unrealize (GtkWidget *widget); static gboolean gtk_link_button_enter_cb (GtkWidget *widget, GdkEventCrossing *event, gpointer user_data); @@ -153,6 +154,7 @@ gtk_link_button_class_init (GtkLinkButtonClass *klass) widget_class->button_press_event = gtk_link_button_button_press; widget_class->popup_menu = gtk_link_button_popup_menu; widget_class->style_updated = gtk_link_button_style_updated; + widget_class->unrealize = gtk_link_button_unrealize; container_class->add = gtk_link_button_add; @@ -161,9 +163,9 @@ gtk_link_button_class_init (GtkLinkButtonClass *klass) klass->activate_link = gtk_link_button_activate_link; /** - * GtkLinkButton:uri - * - * The URI bound to this button. + * GtkLinkButton:uri: + * + * The URI bound to this button. * * Since: 2.10 */ @@ -175,8 +177,8 @@ gtk_link_button_class_init (GtkLinkButtonClass *klass) NULL, G_PARAM_READWRITE)); /** - * GtkLinkButton:visited - * + * GtkLinkButton:visited: + * * The 'visited' state of this button. A visited link is drawn in a * different color. * @@ -214,6 +216,8 @@ gtk_link_button_class_init (GtkLinkButtonClass *klass) _gtk_boolean_handled_accumulator, NULL, _gtk_marshal_BOOLEAN__VOID, G_TYPE_BOOLEAN, 0); + + gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LINK_BUTTON_ACCESSIBLE); } static void @@ -302,6 +306,7 @@ set_link_color (GtkLinkButton *link_button) { GdkColor *link_color = NULL; GtkWidget *label; + GdkRGBA rgba; label = gtk_bin_get_child (GTK_BIN (link_button)); if (!GTK_IS_LABEL (label)) @@ -322,10 +327,14 @@ set_link_color (GtkLinkButton *link_button) link_color = (GdkColor *) &default_link_color; } - gtk_widget_modify_fg (label, GTK_STATE_NORMAL, link_color); - gtk_widget_modify_fg (label, GTK_STATE_ACTIVE, link_color); - gtk_widget_modify_fg (label, GTK_STATE_PRELIGHT, link_color); - gtk_widget_modify_fg (label, GTK_STATE_SELECTED, link_color); + rgba.red = link_color->red / 65535.; + rgba.green = link_color->green / 65535.; + rgba.blue = link_color->blue / 65535.; + rgba.alpha = 1; + gtk_widget_override_color (label, GTK_STATE_FLAG_NORMAL, &rgba); + gtk_widget_override_color (label, GTK_STATE_FLAG_ACTIVE, &rgba); + gtk_widget_override_color (label, GTK_STATE_FLAG_PRELIGHT, &rgba); + gtk_widget_override_color (label, GTK_STATE_FLAG_SELECTED, &rgba); if (link_color != &default_link_color && link_color != &default_visited_link_color) @@ -366,9 +375,9 @@ gtk_link_button_add (GtkContainer *container, static void gtk_link_button_style_updated (GtkWidget *widget) { - GtkLinkButton *link_button = GTK_LINK_BUTTON (widget); + GTK_WIDGET_CLASS (gtk_link_button_parent_class)->style_updated (widget); - set_link_color (link_button); + set_link_color (GTK_LINK_BUTTON (widget)); } static void @@ -391,6 +400,14 @@ set_hand_cursor (GtkWidget *widget, g_object_unref (cursor); } +static void +gtk_link_button_unrealize (GtkWidget *widget) +{ + set_hand_cursor (widget, FALSE); + + GTK_WIDGET_CLASS (gtk_link_button_parent_class)->unrealize (widget); +} + static void popup_menu_detach (GtkWidget *attach_widget, GtkMenu *menu) @@ -428,7 +445,7 @@ popup_position_func (GtkMenu *menu, monitor_num = gdk_screen_get_monitor_at_point (screen, *x, *y); gtk_menu_set_monitor (menu, monitor_num); - gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); + gdk_screen_get_monitor_workarea (screen, monitor_num, &monitor); *x = CLAMP (*x, monitor.x, monitor.x + MAX (0, monitor.width - req.width)); *y = CLAMP (*y, monitor.y, monitor.y + MAX (0, monitor.height - req.height)); @@ -509,10 +526,13 @@ gtk_link_button_button_press (GtkWidget *widget, if (!gtk_widget_has_focus (widget)) gtk_widget_grab_focus (widget); - if ((event->button == 3) && (event->type == GDK_BUTTON_PRESS)) + /* Don't popup the menu if there's no URI set, + * otherwise the menu item will trigger a warning */ + if (gdk_event_triggers_context_menu ((GdkEvent *) event) && + GTK_LINK_BUTTON (widget)->priv->uri != NULL) { gtk_link_button_do_popup (GTK_LINK_BUTTON (widget), event); - + return TRUE; } @@ -752,7 +772,7 @@ gtk_link_button_set_uri (GtkLinkButton *link_button, * * Since: 2.10 */ -G_CONST_RETURN gchar * +const gchar * gtk_link_button_get_uri (GtkLinkButton *link_button) { g_return_val_if_fail (GTK_IS_LINK_BUTTON (link_button), NULL);