172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/gtk_chrome_link_button.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <stdlib.h> 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/gtk_util.h" 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/gtk_util.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic const gchar* kLinkMarkup = "<u><span color=\"%s\">%s</span></u>"; 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Set the GTK style on our custom link button. We don't want any border around 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the link text. 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid SetLinkButtonStyle() { 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static bool style_was_set = false; 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (style_was_set) 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch style_was_set = true; 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_rc_parse_string( 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "style \"chrome-link-button\" {" 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch " GtkButton::inner-border = {0, 0, 0, 0}" 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch " GtkButton::child-displacement-x = 0" 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch " GtkButton::child-displacement-y = 0" 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch " xthickness = 0" 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch " ythickness = 0" 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "}" 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "widget_class \"*.<GtkChromeLinkButton>\" style \"chrome-link-button\""); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void gtk_chrome_link_button_destroy_text_resources( 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkChromeLinkButton* button) { 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_free(button->native_markup); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->native_markup = NULL; 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_free(button->normal_markup); 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->normal_markup = NULL; 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_free(button->pressed_markup); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->pressed_markup = NULL; 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_free(button->text); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->text = NULL; 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochG_BEGIN_DECLS 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochG_DEFINE_TYPE(GtkChromeLinkButton, gtk_chrome_link_button, GTK_TYPE_BUTTON) 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void gtk_chrome_link_button_set_text(GtkChromeLinkButton* button) { 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If we were called before we were realized, abort. We'll be called for 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // real when |button| is realized. 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!GTK_WIDGET_REALIZED(button)) 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_free(button->native_markup); 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->native_markup = NULL; 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_free(button->normal_markup); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->normal_markup = NULL; 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_free(button->pressed_markup); 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->pressed_markup = NULL; 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gchar* text = button->text; 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gboolean uses_markup = button->uses_markup; 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!uses_markup) { 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->normal_markup = g_markup_printf_escaped(kLinkMarkup, 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->normal_color, 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch text); 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->pressed_markup = g_markup_printf_escaped(kLinkMarkup, "red", text); 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->normal_markup = g_strdup_printf(kLinkMarkup, button->normal_color, 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch text); 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->pressed_markup = g_strdup_printf(kLinkMarkup, "red", text); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Get the current GTK theme's link button text color. 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkColor* native_color = NULL; 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_widget_style_get(GTK_WIDGET(button), "link-color", &native_color, NULL); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (native_color) { 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gchar color_spec[9]; 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch snprintf(color_spec, 9, "#%02X%02X%02X", native_color->red / 257, 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch native_color->green / 257, native_color->blue / 257); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gdk_color_free(native_color); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!uses_markup) { 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->native_markup = g_markup_printf_escaped(kLinkMarkup, 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch color_spec, text); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->native_markup = g_strdup_printf(kLinkMarkup, color_spec, text); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If the theme doesn't have a link color, just use blue. This matches the 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // default for GtkLinkButton. 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->native_markup = g_strdup(button->normal_markup); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_label_set_markup(GTK_LABEL(button->label), 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->using_native_theme ? button->native_markup : 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->normal_markup); 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void gtk_chrome_link_button_style_changed(GtkChromeLinkButton* button) { 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Regenerate the link with the possibly new colors after the user has 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // changed his GTK style. 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_chrome_link_button_set_text(button); 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (GTK_WIDGET_VISIBLE(button)) 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_widget_queue_draw(GTK_WIDGET(button)); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic gboolean gtk_chrome_link_button_expose(GtkWidget* widget, 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GdkEventExpose* event) { 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkChromeLinkButton* button = GTK_CHROME_LINK_BUTTON(widget); 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkWidget* label = button->label; 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (GTK_WIDGET_STATE(widget) == GTK_STATE_ACTIVE && button->is_normal) { 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_label_set_markup(GTK_LABEL(label), button->pressed_markup); 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->is_normal = FALSE; 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (GTK_WIDGET_STATE(widget) != GTK_STATE_ACTIVE && 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch !button->is_normal) { 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_label_set_markup(GTK_LABEL(label), 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->using_native_theme ? button->native_markup : 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->normal_markup); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->is_normal = TRUE; 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Draw the link inside the button. 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_container_propagate_expose(GTK_CONTAINER(widget), label, event); 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Draw the focus rectangle. 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (GTK_WIDGET_HAS_FOCUS(widget)) { 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_paint_focus(widget->style, widget->window, 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<GtkStateType>(GTK_WIDGET_STATE(widget)), 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &event->area, widget, NULL, 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch widget->allocation.x, widget->allocation.y, 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch widget->allocation.width, widget->allocation.height); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return TRUE; 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void gtk_chrome_link_button_enter(GtkButton* button) { 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkWidget* widget = GTK_WIDGET(button); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkChromeLinkButton* link_button = GTK_CHROME_LINK_BUTTON(button); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gdk_window_set_cursor(widget->window, link_button->hand_cursor); 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void gtk_chrome_link_button_leave(GtkButton* button) { 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkWidget* widget = GTK_WIDGET(button); 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gdk_window_set_cursor(widget->window, NULL); 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void gtk_chrome_link_button_destroy(GtkObject* object) { 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkChromeLinkButton* button = GTK_CHROME_LINK_BUTTON(object); 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_chrome_link_button_destroy_text_resources(button); 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 165201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch button->hand_cursor = NULL; 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTK_OBJECT_CLASS(gtk_chrome_link_button_parent_class)->destroy(object); 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void gtk_chrome_link_button_class_init( 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkChromeLinkButtonClass* link_button_class) { 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkWidgetClass* widget_class = 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch reinterpret_cast<GtkWidgetClass*>(link_button_class); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkButtonClass* button_class = 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch reinterpret_cast<GtkButtonClass*>(link_button_class); 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkObjectClass* object_class = 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch reinterpret_cast<GtkObjectClass*>(link_button_class); 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch widget_class->expose_event = >k_chrome_link_button_expose; 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button_class->enter = >k_chrome_link_button_enter; 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button_class->leave = >k_chrome_link_button_leave; 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch object_class->destroy = >k_chrome_link_button_destroy; 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void gtk_chrome_link_button_init(GtkChromeLinkButton* button) { 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetLinkButtonStyle(); 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We put a label in a button so we can connect to the click event. We don't 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // let the button draw itself; catch all expose events to the button and pass 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // them through to the label. 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->label = gtk_label_new(NULL); 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->normal_markup = NULL; 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->pressed_markup = NULL; 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->is_normal = TRUE; 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch strncpy(button->normal_color, "blue", 9); 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->native_markup = NULL; 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->using_native_theme = TRUE; 197201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch button->hand_cursor = gfx::GetCursor(GDK_HAND2); 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->text = NULL; 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_container_add(GTK_CONTAINER(button), button->label); 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_widget_set_app_paintable(GTK_WIDGET(button), TRUE); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_signal_connect(button, "realize", 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch G_CALLBACK(gtk_chrome_link_button_set_text), NULL); 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_signal_connect(button, "style-set", 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch G_CALLBACK(gtk_chrome_link_button_style_changed), NULL); 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGtkWidget* gtk_chrome_link_button_new(const char* text) { 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkWidget* lb = GTK_WIDGET(g_object_new(GTK_TYPE_CHROME_LINK_BUTTON, NULL)); 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTK_CHROME_LINK_BUTTON(lb)->text = g_strdup(text); 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTK_CHROME_LINK_BUTTON(lb)->uses_markup = FALSE; 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return lb; 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochGtkWidget* gtk_chrome_link_button_new_with_markup(const char* markup) { 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GtkWidget* lb = GTK_WIDGET(g_object_new(GTK_TYPE_CHROME_LINK_BUTTON, NULL)); 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTK_CHROME_LINK_BUTTON(lb)->text = g_strdup(markup); 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GTK_CHROME_LINK_BUTTON(lb)->uses_markup = TRUE; 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return lb; 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid gtk_chrome_link_button_set_use_gtk_theme(GtkChromeLinkButton* button, 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gboolean use_gtk) { 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (use_gtk != button->using_native_theme) { 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->using_native_theme = use_gtk; 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (GTK_WIDGET_VISIBLE(button)) 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_widget_queue_draw(GTK_WIDGET(button)); 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid gtk_chrome_link_button_set_label(GtkChromeLinkButton* button, 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* text) { 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_free(button->text); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch button->text = g_strdup(text); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_chrome_link_button_set_text(button); 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (GTK_WIDGET_VISIBLE(button)) 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_widget_queue_draw(GTK_WIDGET(button)); 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid gtk_chrome_link_button_set_normal_color(GtkChromeLinkButton* button, 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GdkColor* color) { 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (color) { 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch snprintf(button->normal_color, 9, "#%02X%02X%02X", color->red / 257, 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch color->green / 257, color->blue / 257); 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch strncpy(button->normal_color, "blue", 9); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_chrome_link_button_set_text(button); 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (GTK_WIDGET_VISIBLE(button)) 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gtk_widget_queue_draw(GTK_WIDGET(button)); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochG_END_DECLS 260