diff options
-rw-r--r-- | app/gtk_util.cc | 20 | ||||
-rw-r--r-- | app/gtk_util.h | 4 | ||||
-rw-r--r-- | chrome/browser/gtk/extension_install_prompt2_gtk.cc | 22 | ||||
-rw-r--r-- | chrome/browser/gtk/options/advanced_contents_gtk.cc | 10 | ||||
-rw-r--r-- | chrome/browser/gtk/options/languages_page_gtk.cc | 10 |
5 files changed, 53 insertions, 13 deletions
diff --git a/app/gtk_util.cc b/app/gtk_util.cc index 98e5d48..5eade5b 100644 --- a/app/gtk_util.cc +++ b/app/gtk_util.cc @@ -74,6 +74,26 @@ void GetWidgetSizeFromCharacters( g_object_unref(context); } +int GetCharacterWidthForPixels(GtkWidget* widget, int pixel_width) { + DCHECK(GTK_WIDGET_REALIZED(widget)) + << " widget must be realized to compute font metrics correctly"; + + PangoContext* context = gtk_widget_create_pango_context(widget); + PangoFontMetrics* metrics = pango_context_get_metrics(context, + widget->style->font_desc, pango_context_get_language(context)); + + // This technique (max of char and digit widths) matches the code in + // gtklabel.c. + int char_width = pixel_width * PANGO_SCALE / + std::max(pango_font_metrics_get_approximate_char_width(metrics), + pango_font_metrics_get_approximate_digit_width(metrics)); + + pango_font_metrics_unref(metrics); + g_object_unref(context); + + return char_width; +} + void ApplyMessageDialogQuirks(GtkWidget* dialog) { if (gtk_window_get_modal(GTK_WINDOW(dialog))) { // Work around a KDE 3 window manager bug. diff --git a/app/gtk_util.h b/app/gtk_util.h index 6225d3e..cbb91e9 100644 --- a/app/gtk_util.h +++ b/app/gtk_util.h @@ -27,6 +27,10 @@ void GetWidgetSizeFromCharacters( GtkWidget* widget, double width_chars, double height_lines, int* width, int* height); +// Returns the approximate number of characters that can horizontally +// fit in |pixel_width| pixels. +int GetCharacterWidthForPixels(GtkWidget* widget, int pixel_width); + // A helper function for gtk_message_dialog_new() to work around a KDE 3 // window manager bugs. You should always call it after creating a dialog // with gtk_message_dialog_new. diff --git a/chrome/browser/gtk/extension_install_prompt2_gtk.cc b/chrome/browser/gtk/extension_install_prompt2_gtk.cc index 1ab571a..4a88c73 100644 --- a/chrome/browser/gtk/extension_install_prompt2_gtk.cc +++ b/chrome/browser/gtk/extension_install_prompt2_gtk.cc @@ -4,6 +4,7 @@ #include <gtk/gtk.h> +#include "app/gtk_util.h" #include "app/l10n_util.h" #include "base/string_util.h" #include "base/utf_string_conversions.h" @@ -28,6 +29,13 @@ const int kImageSize = 69; // Padding on all sides of each permission in the permissions list. const int kPermissionsPadding = 8; +void LabelRealized(GtkWidget* label, gpointer unused) { + gtk_label_set_width_chars( + GTK_LABEL(label), + gtk_util::GetCharacterWidthForPixels(label, + kRightColumnMinWidth)); +} + // Make a GtkLabel with |str| as its text, using the formatting in |format|. GtkWidget* MakeMarkupLabel(const char* format, const std::string& str) { GtkWidget* label = gtk_label_new(NULL); @@ -114,18 +122,10 @@ void ShowInstallPromptDialog2(GtkWindow* parent, SkBitmap* skia_icon, label).c_str()); gtk_label_set_line_wrap(GTK_LABEL(warning_label), TRUE); gtk_misc_set_alignment(GTK_MISC(warning_label), 0.0, 0.5); + g_signal_connect(warning_label, "realize", G_CALLBACK(LabelRealized), NULL); - // We set the size request for the right column width here so that it will - // be overridden by the title if the title is long. We use the bin because - // if we set a size request on the label itself, GTK+ uses that when - // justifying the label. Older versions of GTK+ use the label's allocation, - // but newer versions use the size request. This can lead to alignment - // problems in RTL locales. See http://crbug.com/52857 - GtkWidget* bin = gtk_event_box_new(); - gtk_container_add(GTK_CONTAINER(bin), warning_label); - gtk_widget_set_size_request(bin, kRightColumnMinWidth, -1); - - gtk_box_pack_start(GTK_BOX(right_column_area), bin, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(right_column_area), warning_label, + FALSE, FALSE, 0); GtkWidget* frame = gtk_frame_new(NULL); gtk_box_pack_start(GTK_BOX(right_column_area), frame, FALSE, FALSE, 0); diff --git a/chrome/browser/gtk/options/advanced_contents_gtk.cc b/chrome/browser/gtk/options/advanced_contents_gtk.cc index 50c5752..d31576e 100644 --- a/chrome/browser/gtk/options/advanced_contents_gtk.cc +++ b/chrome/browser/gtk/options/advanced_contents_gtk.cc @@ -76,11 +76,19 @@ const int kWrapWidth = 445; const int kWrapWidth = 475; #endif +// We can't calculate the proper width until the label is realized. +void LabelRealized(GtkWidget* label, gpointer unused) { + gtk_label_set_width_chars( + GTK_LABEL(label), + gtk_util::GetCharacterWidthForPixels(label, kWrapWidth)); +} + GtkWidget* CreateWrappedLabel(int string_id) { GtkWidget* label = gtk_label_new( l10n_util::GetStringUTF8(string_id).c_str()); + gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); - gtk_widget_set_size_request(label, kWrapWidth, -1); + g_signal_connect(label, "realize", G_CALLBACK(LabelRealized), NULL); return label; } diff --git a/chrome/browser/gtk/options/languages_page_gtk.cc b/chrome/browser/gtk/options/languages_page_gtk.cc index 2ad3496..7a4e092 100644 --- a/chrome/browser/gtk/options/languages_page_gtk.cc +++ b/chrome/browser/gtk/options/languages_page_gtk.cc @@ -9,6 +9,7 @@ #include <vector> #include "app/gtk_signal.h" +#include "app/gtk_util.h" #include "app/l10n_util.h" #include "base/command_line.h" #include "base/message_loop.h" @@ -36,6 +37,12 @@ GtkWidget* NewComboboxFromModel(ComboboxModel* model) { return combobox; } +void LabelRealized(GtkWidget* label, gpointer unused) { + gtk_label_set_width_chars( + GTK_LABEL(label), + gtk_util::GetCharacterWidthForPixels(label, kWrapWidth)); +} + //////////////////////////////////////////////////////////////////////////////// // AddLanguageDialog @@ -142,7 +149,8 @@ void LanguagesPageGtk::Init() { IDS_FONT_LANGUAGE_SETTING_LANGUAGES_INSTRUCTIONS).c_str()); gtk_misc_set_alignment(GTK_MISC(languages_instructions_label), 0, .5); gtk_label_set_line_wrap(GTK_LABEL(languages_instructions_label), TRUE); - gtk_widget_set_size_request(languages_instructions_label, kWrapWidth, -1); + g_signal_connect(languages_instructions_label, "realize", + G_CALLBACK(LabelRealized), NULL); gtk_box_pack_start(GTK_BOX(languages_vbox), languages_instructions_label, FALSE, FALSE, 0); |