blob: b2aab1a2b9a1a31bdb7765c88945f4d5bbc2ad57 [file] [log] [blame]
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "app/gtk_util.h"
#include <gtk/gtk.h>
#include "app/l10n_util.h"
#include "base/linux_util.h"
#include "base/logging.h"
#include "base/string_util.h"
namespace gtk_util {
void GetWidgetSizeFromResources(
GtkWidget* widget, int width_chars, int height_lines,
int* width, int* height) {
DCHECK(GTK_WIDGET_REALIZED(widget))
<< " widget must be realized to compute font metrics correctly";
double chars = 0;
if (width)
StringToDouble(l10n_util::GetStringUTF8(width_chars), &chars);
double lines = 0;
if (height)
StringToDouble(l10n_util::GetStringUTF8(height_lines), &lines);
GetWidgetSizeFromCharacters(widget, chars, lines, width, height);
}
void GetWidgetSizeFromCharacters(
GtkWidget* widget, double width_chars, double height_lines,
int* width, int* height) {
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));
if (width) {
*width = static_cast<int>(
pango_font_metrics_get_approximate_char_width(metrics) *
width_chars / PANGO_SCALE);
}
if (height) {
*height = static_cast<int>(
(pango_font_metrics_get_ascent(metrics) +
pango_font_metrics_get_descent(metrics)) *
height_lines / PANGO_SCALE);
}
pango_font_metrics_unref(metrics);
g_object_unref(context);
}
void ApplyMessageDialogQuirks(GtkWidget* dialog) {
if (gtk_window_get_modal(GTK_WINDOW(dialog))) {
// Work around a KDE 3 window manager bug.
scoped_ptr<base::EnvironmentVariableGetter> env(
base::EnvironmentVariableGetter::Create());
if (base::DESKTOP_ENVIRONMENT_KDE3 == GetDesktopEnvironment(env.get()))
gtk_window_set_skip_taskbar_hint(GTK_WINDOW(dialog), FALSE);
}
}
} // namespace gtk_util