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 = &gtk_chrome_link_button_expose;
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  button_class->enter = &gtk_chrome_link_button_enter;
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  button_class->leave = &gtk_chrome_link_button_leave;
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  object_class->destroy = &gtk_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