| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/gtk/gtk_util.h" | 5 #include "chrome/browser/ui/gtk/gtk_util.h" |
| 6 | 6 |
| 7 #include <cairo/cairo.h> | 7 #include <cairo/cairo.h> |
| 8 #include <gdk/gdkx.h> | 8 #include <gdk/gdkx.h> |
| 9 #include <gtk/gtk.h> | 9 #include <gtk/gtk.h> |
| 10 | 10 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 #include "content/browser/disposition_utils.h" | 30 #include "content/browser/disposition_utils.h" |
| 31 #include "content/browser/renderer_host/render_view_host.h" | 31 #include "content/browser/renderer_host/render_view_host.h" |
| 32 #include "content/browser/tab_contents/tab_contents.h" | 32 #include "content/browser/tab_contents/tab_contents.h" |
| 33 #include "content/public/common/renderer_preferences.h" | 33 #include "content/public/common/renderer_preferences.h" |
| 34 #include "googleurl/src/gurl.h" | 34 #include "googleurl/src/gurl.h" |
| 35 #include "grit/theme_resources.h" | 35 #include "grit/theme_resources.h" |
| 36 #include "grit/theme_resources_standard.h" | 36 #include "grit/theme_resources_standard.h" |
| 37 #include "third_party/skia/include/core/SkBitmap.h" | 37 #include "third_party/skia/include/core/SkBitmap.h" |
| 38 #include "third_party/skia/include/core/SkColor.h" | 38 #include "third_party/skia/include/core/SkColor.h" |
| 39 #include "ui/base/events.h" | 39 #include "ui/base/events.h" |
| 40 #include "ui/base/gtk/gtk_compat.h" |
| 40 #include "ui/base/gtk/gtk_hig_constants.h" | 41 #include "ui/base/gtk/gtk_hig_constants.h" |
| 41 #include "ui/base/l10n/l10n_util.h" | 42 #include "ui/base/l10n/l10n_util.h" |
| 42 #include "ui/base/resource/resource_bundle.h" | 43 #include "ui/base/resource/resource_bundle.h" |
| 43 #include "ui/base/text/text_elider.h" | 44 #include "ui/base/text/text_elider.h" |
| 44 #include "ui/base/x/x11_util.h" | 45 #include "ui/base/x/x11_util.h" |
| 45 #include "ui/gfx/gtk_util.h" | 46 #include "ui/gfx/gtk_util.h" |
| 46 #include "ui/gfx/image/image.h" | 47 #include "ui/gfx/image/image.h" |
| 47 | 48 |
| 48 #if defined(OS_CHROMEOS) | 49 #if defined(OS_CHROMEOS) |
| 49 #include "chrome/browser/chromeos/frame/browser_view.h" | 50 #include "chrome/browser/chromeos/frame/browser_view.h" |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 gint button_mask = GPOINTER_TO_INT(userdata); | 95 gint button_mask = GPOINTER_TO_INT(userdata); |
| 95 if (button_mask && (1 << event->button)) | 96 if (button_mask && (1 << event->button)) |
| 96 gtk_button_released(GTK_BUTTON(widget)); | 97 gtk_button_released(GTK_BUTTON(widget)); |
| 97 | 98 |
| 98 return TRUE; | 99 return TRUE; |
| 99 } | 100 } |
| 100 | 101 |
| 101 // Returns the approximate number of characters that can horizontally fit in | 102 // Returns the approximate number of characters that can horizontally fit in |
| 102 // |pixel_width| pixels. | 103 // |pixel_width| pixels. |
| 103 int GetCharacterWidthForPixels(GtkWidget* widget, int pixel_width) { | 104 int GetCharacterWidthForPixels(GtkWidget* widget, int pixel_width) { |
| 104 DCHECK(GTK_WIDGET_REALIZED(widget)) | 105 DCHECK(gtk_widget_get_realized(widget)) |
| 105 << " widget must be realized to compute font metrics correctly"; | 106 << " widget must be realized to compute font metrics correctly"; |
| 106 | 107 |
| 107 PangoContext* context = gtk_widget_create_pango_context(widget); | 108 PangoContext* context = gtk_widget_create_pango_context(widget); |
| 108 PangoFontMetrics* metrics = pango_context_get_metrics(context, | 109 PangoFontMetrics* metrics = pango_context_get_metrics(context, |
| 109 widget->style->font_desc, pango_context_get_language(context)); | 110 widget->style->font_desc, pango_context_get_language(context)); |
| 110 | 111 |
| 111 // This technique (max of char and digit widths) matches the code in | 112 // This technique (max of char and digit widths) matches the code in |
| 112 // gtklabel.c. | 113 // gtklabel.c. |
| 113 int char_width = pixel_width * PANGO_SCALE / | 114 int char_width = pixel_width * PANGO_SCALE / |
| 114 std::max(pango_font_metrics_get_approximate_char_width(metrics), | 115 std::max(pango_font_metrics_get_approximate_char_width(metrics), |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 char* markup = g_markup_printf_escaped(kBoldLabelMarkup, text.c_str()); | 268 char* markup = g_markup_printf_escaped(kBoldLabelMarkup, text.c_str()); |
| 268 gtk_label_set_markup(GTK_LABEL(label), markup); | 269 gtk_label_set_markup(GTK_LABEL(label), markup); |
| 269 g_free(markup); | 270 g_free(markup); |
| 270 | 271 |
| 271 return LeftAlignMisc(label); | 272 return LeftAlignMisc(label); |
| 272 } | 273 } |
| 273 | 274 |
| 274 void GetWidgetSizeFromCharacters( | 275 void GetWidgetSizeFromCharacters( |
| 275 GtkWidget* widget, double width_chars, double height_lines, | 276 GtkWidget* widget, double width_chars, double height_lines, |
| 276 int* width, int* height) { | 277 int* width, int* height) { |
| 277 DCHECK(GTK_WIDGET_REALIZED(widget)) | 278 DCHECK(gtk_widget_get_realized(widget)) |
| 278 << " widget must be realized to compute font metrics correctly"; | 279 << " widget must be realized to compute font metrics correctly"; |
| 279 PangoContext* context = gtk_widget_create_pango_context(widget); | 280 PangoContext* context = gtk_widget_create_pango_context(widget); |
| 280 PangoFontMetrics* metrics = pango_context_get_metrics(context, | 281 PangoFontMetrics* metrics = pango_context_get_metrics(context, |
| 281 widget->style->font_desc, pango_context_get_language(context)); | 282 widget->style->font_desc, pango_context_get_language(context)); |
| 282 if (width) { | 283 if (width) { |
| 283 *width = static_cast<int>( | 284 *width = static_cast<int>( |
| 284 pango_font_metrics_get_approximate_char_width(metrics) * | 285 pango_font_metrics_get_approximate_char_width(metrics) * |
| 285 width_chars / PANGO_SCALE); | 286 width_chars / PANGO_SCALE); |
| 286 } | 287 } |
| 287 if (height) { | 288 if (height) { |
| 288 *height = static_cast<int>( | 289 *height = static_cast<int>( |
| 289 (pango_font_metrics_get_ascent(metrics) + | 290 (pango_font_metrics_get_ascent(metrics) + |
| 290 pango_font_metrics_get_descent(metrics)) * | 291 pango_font_metrics_get_descent(metrics)) * |
| 291 height_lines / PANGO_SCALE); | 292 height_lines / PANGO_SCALE); |
| 292 } | 293 } |
| 293 pango_font_metrics_unref(metrics); | 294 pango_font_metrics_unref(metrics); |
| 294 g_object_unref(context); | 295 g_object_unref(context); |
| 295 } | 296 } |
| 296 | 297 |
| 297 void GetWidgetSizeFromResources( | 298 void GetWidgetSizeFromResources( |
| 298 GtkWidget* widget, int width_chars, int height_lines, | 299 GtkWidget* widget, int width_chars, int height_lines, |
| 299 int* width, int* height) { | 300 int* width, int* height) { |
| 300 DCHECK(GTK_WIDGET_REALIZED(widget)) | 301 DCHECK(gtk_widget_get_realized(widget)) |
| 301 << " widget must be realized to compute font metrics correctly"; | 302 << " widget must be realized to compute font metrics correctly"; |
| 302 | 303 |
| 303 double chars = 0; | 304 double chars = 0; |
| 304 if (width) | 305 if (width) |
| 305 base::StringToDouble(l10n_util::GetStringUTF8(width_chars), &chars); | 306 base::StringToDouble(l10n_util::GetStringUTF8(width_chars), &chars); |
| 306 | 307 |
| 307 double lines = 0; | 308 double lines = 0; |
| 308 if (height) | 309 if (height) |
| 309 base::StringToDouble(l10n_util::GetStringUTF8(height_lines), &lines); | 310 base::StringToDouble(l10n_util::GetStringUTF8(height_lines), &lines); |
| 310 | 311 |
| (...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 834 GValue true_value = { 0 }; | 835 GValue true_value = { 0 }; |
| 835 g_value_init(&true_value, G_TYPE_BOOLEAN); | 836 g_value_init(&true_value, G_TYPE_BOOLEAN); |
| 836 g_value_set_boolean(&true_value, TRUE); | 837 g_value_set_boolean(&true_value, TRUE); |
| 837 g_object_set_property(G_OBJECT(image_menu_item), "always-show-image", | 838 g_object_set_property(G_OBJECT(image_menu_item), "always-show-image", |
| 838 &true_value); | 839 &true_value); |
| 839 } | 840 } |
| 840 #endif | 841 #endif |
| 841 } | 842 } |
| 842 | 843 |
| 843 gfx::Rect GetWidgetRectRelativeToToplevel(GtkWidget* widget) { | 844 gfx::Rect GetWidgetRectRelativeToToplevel(GtkWidget* widget) { |
| 844 DCHECK(GTK_WIDGET_REALIZED(widget)); | 845 DCHECK(gtk_widget_get_realized(widget)); |
| 845 | 846 |
| 846 GtkWidget* toplevel = gtk_widget_get_toplevel(widget); | 847 GtkWidget* toplevel = gtk_widget_get_toplevel(widget); |
| 847 DCHECK(toplevel); | 848 DCHECK(toplevel); |
| 848 DCHECK(GTK_WIDGET_REALIZED(toplevel)); | 849 DCHECK(gtk_widget_get_realized(toplevel)); |
| 849 | 850 |
| 850 gint x = 0, y = 0; | 851 gint x = 0, y = 0; |
| 851 gtk_widget_translate_coordinates(widget, | 852 gtk_widget_translate_coordinates(widget, |
| 852 toplevel, | 853 toplevel, |
| 853 0, 0, | 854 0, 0, |
| 854 &x, &y); | 855 &x, &y); |
| 855 return gfx::Rect(x, y, widget->allocation.width, widget->allocation.height); | 856 return gfx::Rect(x, y, widget->allocation.width, widget->allocation.height); |
| 856 } | 857 } |
| 857 | 858 |
| 858 void SuppressDefaultPainting(GtkWidget* container) { | 859 void SuppressDefaultPainting(GtkWidget* container) { |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1138 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); | 1139 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); |
| 1139 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | 1140 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
| 1140 | 1141 |
| 1141 // Do the simple thing in LTR because the bug only affects right-aligned | 1142 // Do the simple thing in LTR because the bug only affects right-aligned |
| 1142 // text. Also, when using the workaround, the label tries to maintain | 1143 // text. Also, when using the workaround, the label tries to maintain |
| 1143 // uniform line-length, which we don't really want. | 1144 // uniform line-length, which we don't really want. |
| 1144 if (gtk_widget_get_direction(label) == GTK_TEXT_DIR_LTR) { | 1145 if (gtk_widget_get_direction(label) == GTK_TEXT_DIR_LTR) { |
| 1145 gtk_widget_set_size_request(label, pixel_width, -1); | 1146 gtk_widget_set_size_request(label, pixel_width, -1); |
| 1146 } else { | 1147 } else { |
| 1147 // The label has to be realized before we can adjust its width. | 1148 // The label has to be realized before we can adjust its width. |
| 1148 if (GTK_WIDGET_REALIZED(label)) { | 1149 if (gtk_widget_get_realized(label)) { |
| 1149 OnLabelRealize(label, GINT_TO_POINTER(pixel_width)); | 1150 OnLabelRealize(label, GINT_TO_POINTER(pixel_width)); |
| 1150 } else { | 1151 } else { |
| 1151 g_signal_connect(label, "realize", G_CALLBACK(OnLabelRealize), | 1152 g_signal_connect(label, "realize", G_CALLBACK(OnLabelRealize), |
| 1152 GINT_TO_POINTER(pixel_width)); | 1153 GINT_TO_POINTER(pixel_width)); |
| 1153 } | 1154 } |
| 1154 } | 1155 } |
| 1155 } | 1156 } |
| 1156 | 1157 |
| 1157 void InitLabelSizeRequestAndEllipsizeMode(GtkWidget* label) { | 1158 void InitLabelSizeRequestAndEllipsizeMode(GtkWidget* label) { |
| 1158 GtkRequisition size; | 1159 GtkRequisition size; |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1201 | 1202 |
| 1202 void DoCopy(BrowserWindow* window) { | 1203 void DoCopy(BrowserWindow* window) { |
| 1203 DoCutCopyPaste(window, &RenderViewHost::Copy, "copy-clipboard"); | 1204 DoCutCopyPaste(window, &RenderViewHost::Copy, "copy-clipboard"); |
| 1204 } | 1205 } |
| 1205 | 1206 |
| 1206 void DoPaste(BrowserWindow* window) { | 1207 void DoPaste(BrowserWindow* window) { |
| 1207 DoCutCopyPaste(window, &RenderViewHost::Paste, "paste-clipboard"); | 1208 DoCutCopyPaste(window, &RenderViewHost::Paste, "paste-clipboard"); |
| 1208 } | 1209 } |
| 1209 | 1210 |
| 1210 } // namespace gtk_util | 1211 } // namespace gtk_util |
| OLD | NEW |