Commit afb06600 authored by Tom Anderson's avatar Tom Anderson Committed by Commit Bot

Add GTK4 build option and fix GTK4 build

BUG=876586
R=sky

Change-Id: I97d58a1fcb333781dfa2bceb4c3363b5c914e5df
Reviewed-on: https://chromium-review.googlesource.com/1187197Reviewed-by: default avatarScott Violet <sky@chromium.org>
Commit-Queue: Thomas Anderson <thomasanderson@chromium.org>
Cr-Commit-Position: refs/heads/master@{#585646}
parent f57a1c98
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be # Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file. # found in the LICENSE file.
import("//build/config/linux/gtk/gtk.gni")
import("//build/config/linux/pkg_config.gni") import("//build/config/linux/pkg_config.gni")
assert(is_linux, "This file should only be referenced on Linux") assert(is_linux, "This file should only be referenced on Linux")
...@@ -14,7 +15,7 @@ pkg_config("gtk_internal_config") { ...@@ -14,7 +15,7 @@ pkg_config("gtk_internal_config") {
# misconfigured systems. # misconfigured systems.
packages = [ packages = [
"gmodule-2.0", "gmodule-2.0",
"gtk+-3.0", "gtk+-${gtk_version}.0",
"gthread-2.0", "gthread-2.0",
] ]
} }
...@@ -42,7 +43,7 @@ group("gtk") { ...@@ -42,7 +43,7 @@ group("gtk") {
# Depend on "gtkprint" to get this. # Depend on "gtkprint" to get this.
pkg_config("gtkprint_internal_config") { pkg_config("gtkprint_internal_config") {
packages = [ "gtk+-unix-print-3.0" ] packages = [ "gtk+-unix-print-${gtk_version}.0" ]
} }
group("gtkprint") { group("gtkprint") {
......
# Copyright 2018 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.
declare_args() {
# The (major) version of GTK to build against.
gtk_version = 3
}
assert(gtk_version >= 3 && gtk_version <= 4)
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
assert(is_linux, "This file should only be referenced on Linux") assert(is_linux, "This file should only be referenced on Linux")
import("//build/config/features.gni") import("//build/config/features.gni")
import("//build/config/linux/gtk/gtk.gni")
import("//printing/buildflags/buildflags.gni") import("//printing/buildflags/buildflags.gni")
component("libgtkui") { component("libgtkui") {
...@@ -13,8 +14,6 @@ component("libgtkui") { ...@@ -13,8 +14,6 @@ component("libgtkui") {
"app_indicator_icon.h", "app_indicator_icon.h",
"app_indicator_icon_menu.cc", "app_indicator_icon_menu.cc",
"app_indicator_icon_menu.h", "app_indicator_icon_menu.h",
"chrome_gtk_frame.cc",
"chrome_gtk_frame.h",
"chrome_gtk_menu_subclasses.cc", "chrome_gtk_menu_subclasses.cc",
"chrome_gtk_menu_subclasses.h", "chrome_gtk_menu_subclasses.h",
"gtk_background_painter.cc", "gtk_background_painter.cc",
...@@ -24,8 +23,6 @@ component("libgtkui") { ...@@ -24,8 +23,6 @@ component("libgtkui") {
"gtk_key_bindings_handler.cc", "gtk_key_bindings_handler.cc",
"gtk_key_bindings_handler.h", "gtk_key_bindings_handler.h",
"gtk_signal.h", "gtk_signal.h",
"gtk_status_icon.cc",
"gtk_status_icon.h",
"gtk_ui.cc", "gtk_ui.cc",
"gtk_ui.h", "gtk_ui.h",
"gtk_util.cc", "gtk_util.cc",
...@@ -57,6 +54,13 @@ component("libgtkui") { ...@@ -57,6 +54,13 @@ component("libgtkui") {
"x11_input_method_context_impl_gtk.h", "x11_input_method_context_impl_gtk.h",
] ]
if (gtk_version <= 3) {
sources += [
"gtk_status_icon.cc",
"gtk_status_icon.h",
]
}
configs += [ configs += [
"//build/config/linux/pangocairo", "//build/config/linux/pangocairo",
"//build/config/linux:x11", "//build/config/linux:x11",
......
// Copyright (c) 2012 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 "chrome/browser/ui/libgtkui/chrome_gtk_frame.h"
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
G_BEGIN_DECLS
// MetaFrames declaration
G_DEFINE_TYPE(MetaFrames, meta_frames, GTK_TYPE_WINDOW)
static void meta_frames_class_init(MetaFramesClass* frames_class) {
// Noop since we don't declare anything.
}
static void meta_frames_init(MetaFrames* button) {
}
// ChromeGtkFrame declaration
G_DEFINE_TYPE(ChromeGtkFrame, chrome_gtk_frame, meta_frames_get_type())
static void chrome_gtk_frame_class_init(ChromeGtkFrameClass* frame_class) {
GtkWidgetClass* widget_class = reinterpret_cast<GtkWidgetClass*>(frame_class);
// Frame tints:
gtk_widget_class_install_style_property(
widget_class,
g_param_spec_boxed(
"frame-color",
"Frame Color",
"The color that the chrome frame will be. (If unspecified, "
" Chrome will take ChromeGtkFrame::bg[SELECTED] and slightly darken"
" it.)",
GDK_TYPE_COLOR,
G_PARAM_READABLE));
gtk_widget_class_install_style_property(
widget_class,
g_param_spec_boxed(
"inactive-frame-color",
"Inactive Frame Color",
"The color that the inactive chrome frame will be. (If"
" unspecified, Chrome will take ChromeGtkFrame::bg[INSENSITIVE]"
" and slightly darken it.)",
GDK_TYPE_COLOR,
G_PARAM_READABLE));
gtk_widget_class_install_style_property(
widget_class,
g_param_spec_boxed(
"incognito-frame-color",
"Incognito Frame Color",
"The color that the incognito frame will be. (If unspecified,"
" Chrome will take the frame color and tint it by Chrome's default"
" incognito tint.)",
GDK_TYPE_COLOR,
G_PARAM_READABLE));
gtk_widget_class_install_style_property(
widget_class,
g_param_spec_boxed(
"incognito-inactive-frame-color",
"Incognito Inactive Frame Color",
"The color that the inactive incognito frame will be. (If"
" unspecified, Chrome will take the frame color and tint it by"
" Chrome's default incognito tint.)",
GDK_TYPE_COLOR,
G_PARAM_READABLE));
// Frame gradient control:
gtk_widget_class_install_style_property(
widget_class,
g_param_spec_int(
"frame-gradient-size",
"Chrome Frame Gradient Size",
"The size of the gradient on top of the frame image. Specify 0 to"
" make the frame a solid color.",
0, // 0 disables the gradient
128, // The frame image is only up to 128 pixels tall.
16, // By default, gradients are 16 pixels high.
G_PARAM_READABLE));
gtk_widget_class_install_style_property(
widget_class,
g_param_spec_boxed(
"frame-gradient-color",
"Frame Gradient Color",
"The top color of the chrome frame gradient. (If unspecified,"
" chrome will create a lighter tint of frame-color",
GDK_TYPE_COLOR,
G_PARAM_READABLE));
gtk_widget_class_install_style_property(
widget_class,
g_param_spec_boxed(
"inactive-frame-gradient-color",
"Inactive Frame Gradient Color",
"The top color of the inactive chrome frame gradient. (If"
" unspecified, chrome will create a lighter tint of frame-color",
GDK_TYPE_COLOR,
G_PARAM_READABLE));
gtk_widget_class_install_style_property(
widget_class,
g_param_spec_boxed(
"incognito-frame-gradient-color",
"Incognito Frame Gradient Color",
"The top color of the incognito chrome frame gradient. (If"
" unspecified, chrome will create a lighter tint of frame-color",
GDK_TYPE_COLOR,
G_PARAM_READABLE));
gtk_widget_class_install_style_property(
widget_class,
g_param_spec_boxed(
"incognito-inactive-frame-gradient-color",
"Incognito Inactive Frame Gradient Color",
"The top color of the incognito inactive chrome frame gradient. (If"
" unspecified, chrome will create a lighter tint of frame-color",
GDK_TYPE_COLOR,
G_PARAM_READABLE));
// Scrollbar color properties:
gtk_widget_class_install_style_property(
widget_class,
g_param_spec_boxed(
"scrollbar-slider-prelight-color",
"Scrollbar Slider Prelight Color",
"The color applied to the mouse is above the tab",
GDK_TYPE_COLOR,
G_PARAM_READABLE));
gtk_widget_class_install_style_property(
widget_class,
g_param_spec_boxed(
"scrollbar-slider-normal-color",
"Scrollbar Slider Normal Color",
"The color applied to the slider normally",
GDK_TYPE_COLOR,
G_PARAM_READABLE));
gtk_widget_class_install_style_property(
widget_class,
g_param_spec_boxed(
"scrollbar-trough-color",
"Scrollbar Trough Color",
"The background color of the slider track",
GDK_TYPE_COLOR,
G_PARAM_READABLE));
}
static void chrome_gtk_frame_init(ChromeGtkFrame* frame) {
}
GtkWidget* chrome_gtk_frame_new(void) {
return GTK_WIDGET(g_object_new(chrome_gtk_frame_get_type(), "type",
GTK_WINDOW_TOPLEVEL, nullptr));
}
G_END_DECLS
// Copyright (c) 2012 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.
#ifndef CHROME_BROWSER_UI_LIBGTKUI_CHROME_GTK_FRAME_H_
#define CHROME_BROWSER_UI_LIBGTKUI_CHROME_GTK_FRAME_H_
#include <gtk/gtk.h>
G_BEGIN_DECLS
// This file declares two subclasses of GtkWindow for easier gtk+ theme
// integration.
//
// The first is "MetaFrames," which is (was?) the name of a gobject class in
// the metacity window manager. To actually get at those values, we need to
// have an object whose gobject class name string matches the definitions in
// the gtkrc file. MetaFrames derives from GtkWindow.
//
// Metaframes can not be instantiated. It has no constructor; instantiate
// ChromeGtkFrame instead.
typedef struct _MetaFrames MetaFrames;
typedef struct _MetaFramesClass MetaFramesClass;
struct _MetaFrames {
GtkWindow window;
};
struct _MetaFramesClass {
GtkWindowClass parent_class;
};
// The second is ChromeGtkFrame, which defines a number of optional style
// properties so theme authors can control how chromium appears in gtk-theme
// mode. It derives from MetaFrames in chrome so older themes that declare a
// MetaFrames theme will still work. New themes should target this class.
typedef struct _ChromeGtkFrame ChromeGtkFrame;
typedef struct _ChromeGtkFrameClass ChromeGtkFrameClass;
struct _ChromeGtkFrame {
MetaFrames frames;
};
struct _ChromeGtkFrameClass {
MetaFramesClass frames_class;
};
// Creates a GtkWindow object the the class name "ChromeGtkFrame".
GtkWidget* chrome_gtk_frame_new();
G_END_DECLS
#endif // CHROME_BROWSER_UI_LIBGTKUI_CHROME_GTK_FRAME_H_
...@@ -28,10 +28,22 @@ using ui::TextEditCommand; ...@@ -28,10 +28,22 @@ using ui::TextEditCommand;
// linking requirements regarding GTK+ as we don't have a libgtkui_unittests // linking requirements regarding GTK+ as we don't have a libgtkui_unittests
// yet. http://crbug.com/358297. // yet. http://crbug.com/358297.
namespace {
GtkWidget* CreateInvisibleWindow() {
#if GTK_CHECK_VERSION(3, 90, 0)
return gtk_invisible_new();
#else
return gtk_offscreen_window_new();
#endif
}
} // namespace
namespace libgtkui { namespace libgtkui {
GtkKeyBindingsHandler::GtkKeyBindingsHandler() GtkKeyBindingsHandler::GtkKeyBindingsHandler()
: fake_window_(gtk_offscreen_window_new()), : fake_window_(CreateInvisibleWindow()),
handler_(CreateNewHandler()), handler_(CreateNewHandler()),
has_xkb_(false) { has_xkb_(false) {
gtk_container_add(GTK_CONTAINER(fake_window_), handler_); gtk_container_add(GTK_CONTAINER(fake_window_), handler_);
...@@ -65,11 +77,7 @@ bool GtkKeyBindingsHandler::MatchEvent( ...@@ -65,11 +77,7 @@ bool GtkKeyBindingsHandler::MatchEvent(
// will be emitted. // will be emitted.
gtk_bindings_activate_event( gtk_bindings_activate_event(
#if GDK_MAJOR_VERSION >= 3
G_OBJECT(handler_), G_OBJECT(handler_),
#else
GTK_OBJECT(handler_),
#endif
&gdk_event); &gdk_event);
bool matched = !edit_commands_.empty(); bool matched = !edit_commands_.empty();
...@@ -90,7 +98,9 @@ GtkWidget* GtkKeyBindingsHandler::CreateNewHandler() { ...@@ -90,7 +98,9 @@ GtkWidget* GtkKeyBindingsHandler::CreateNewHandler() {
// Prevents it from handling any events by itself. // Prevents it from handling any events by itself.
gtk_widget_set_sensitive(GTK_WIDGET(handler), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(handler), FALSE);
#if !GTK_CHECK_VERSION(3, 90, 0)
gtk_widget_set_events(GTK_WIDGET(handler), 0); gtk_widget_set_events(GTK_WIDGET(handler), 0);
#endif
gtk_widget_set_can_focus(GTK_WIDGET(handler), TRUE); gtk_widget_set_can_focus(GTK_WIDGET(handler), TRUE);
return GTK_WIDGET(handler); return GTK_WIDGET(handler);
...@@ -145,7 +155,6 @@ void GtkKeyBindingsHandler::HandlerInit(Handler* self) { ...@@ -145,7 +155,6 @@ void GtkKeyBindingsHandler::HandlerInit(Handler* self) {
void GtkKeyBindingsHandler::HandlerClassInit(HandlerClass* klass) { void GtkKeyBindingsHandler::HandlerClassInit(HandlerClass* klass) {
GtkTextViewClass* text_view_class = GTK_TEXT_VIEW_CLASS(klass); GtkTextViewClass* text_view_class = GTK_TEXT_VIEW_CLASS(klass);
GtkWidgetClass* widget_class = GTK_WIDGET_CLASS(klass);
// Overrides all virtual methods related to editor key bindings. // Overrides all virtual methods related to editor key bindings.
text_view_class->backspace = BackSpace; text_view_class->backspace = BackSpace;
...@@ -157,7 +166,10 @@ void GtkKeyBindingsHandler::HandlerClassInit(HandlerClass* klass) { ...@@ -157,7 +166,10 @@ void GtkKeyBindingsHandler::HandlerClassInit(HandlerClass* klass) {
text_view_class->paste_clipboard = PasteClipboard; text_view_class->paste_clipboard = PasteClipboard;
text_view_class->set_anchor = SetAnchor; text_view_class->set_anchor = SetAnchor;
text_view_class->toggle_overwrite = ToggleOverwrite; text_view_class->toggle_overwrite = ToggleOverwrite;
#if !GTK_CHECK_VERSION(3, 90, 0)
GtkWidgetClass* widget_class = GTK_WIDGET_CLASS(klass);
widget_class->show_help = ShowHelp; widget_class->show_help = ShowHelp;
#endif
// "move-focus", "move-viewport", "select-all" and "toggle-cursor-visible" // "move-focus", "move-viewport", "select-all" and "toggle-cursor-visible"
// have no corresponding virtual methods. Since glib 2.18 (gtk 2.14), // have no corresponding virtual methods. Since glib 2.18 (gtk 2.14),
...@@ -418,11 +430,13 @@ void GtkKeyBindingsHandler::ToggleOverwrite(GtkTextView* text_view) { ...@@ -418,11 +430,13 @@ void GtkKeyBindingsHandler::ToggleOverwrite(GtkTextView* text_view) {
// Not supported by webkit. // Not supported by webkit.
} }
#if !GTK_CHECK_VERSION(3, 90, 0)
gboolean GtkKeyBindingsHandler::ShowHelp(GtkWidget* widget, gboolean GtkKeyBindingsHandler::ShowHelp(GtkWidget* widget,
GtkWidgetHelpType arg1) { GtkWidgetHelpType arg1) {
// Just for disabling the default handler. // Just for disabling the default handler.
return FALSE; return FALSE;
} }
#endif
void GtkKeyBindingsHandler::MoveFocus(GtkWidget* widget, void GtkKeyBindingsHandler::MoveFocus(GtkWidget* widget,
GtkDirectionType arg1) { GtkDirectionType arg1) {
......
...@@ -128,8 +128,10 @@ class GtkKeyBindingsHandler { ...@@ -128,8 +128,10 @@ class GtkKeyBindingsHandler {
// Handler of "toggle-overwrite" signal. // Handler of "toggle-overwrite" signal.
static void ToggleOverwrite(GtkTextView* text_view); static void ToggleOverwrite(GtkTextView* text_view);
#if !GTK_CHECK_VERSION(3, 90, 0)
// Handler of "show-help" signal. // Handler of "show-help" signal.
static gboolean ShowHelp(GtkWidget* widget, GtkWidgetHelpType arg1); static gboolean ShowHelp(GtkWidget* widget, GtkWidgetHelpType arg1);
#endif
// Handler of "move-focus" signal. // Handler of "move-focus" signal.
static void MoveFocus(GtkWidget* widget, GtkDirectionType arg1); static void MoveFocus(GtkWidget* widget, GtkDirectionType arg1);
......
...@@ -30,7 +30,6 @@ ...@@ -30,7 +30,6 @@
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "chrome/browser/themes/theme_properties.h" #include "chrome/browser/themes/theme_properties.h"
#include "chrome/browser/ui/libgtkui/app_indicator_icon.h" #include "chrome/browser/ui/libgtkui/app_indicator_icon.h"
#include "chrome/browser/ui/libgtkui/chrome_gtk_frame.h"
#include "chrome/browser/ui/libgtkui/gtk_event_loop.h" #include "chrome/browser/ui/libgtkui/gtk_event_loop.h"
#include "chrome/browser/ui/libgtkui/gtk_key_bindings_handler.h" #include "chrome/browser/ui/libgtkui/gtk_key_bindings_handler.h"
#include "chrome/browser/ui/libgtkui/gtk_status_icon.h" #include "chrome/browser/ui/libgtkui/gtk_status_icon.h"
...@@ -149,6 +148,7 @@ class GtkButtonImageSource : public gfx::ImageSkiaSource { ...@@ -149,6 +148,7 @@ class GtkButtonImageSource : public gfx::ImageSkiaSource {
if (focus_) { if (focus_) {
gfx::Rect focus_rect(width, height); gfx::Rect focus_rect(width, height);
#if !GTK_CHECK_VERSION(3, 90, 0)
if (!GtkVersionCheck(3, 14)) { if (!GtkVersionCheck(3, 14)) {
gint focus_pad; gint focus_pad;
gtk_style_context_get_style(context, "focus-padding", &focus_pad, gtk_style_context_get_style(context, "focus-padding", &focus_pad,
...@@ -166,10 +166,15 @@ class GtkButtonImageSource : public gfx::ImageSkiaSource { ...@@ -166,10 +166,15 @@ class GtkButtonImageSource : public gfx::ImageSkiaSource {
focus_rect.Offset(child_displacement_x, child_displacement_y); focus_rect.Offset(child_displacement_x, child_displacement_y);
} }
} }
#endif
if (!GtkVersionCheck(3, 20)) { if (!GtkVersionCheck(3, 20)) {
GtkBorder border; GtkBorder border;
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_style_context_get_border(context, &border);
#else
gtk_style_context_get_border(context, state_flags, &border); gtk_style_context_get_border(context, state_flags, &border);
#endif
focus_rect.Inset(border.left, border.top, border.right, border.bottom); focus_rect.Inset(border.left, border.top, border.right, border.bottom);
} }
...@@ -216,17 +221,23 @@ struct GObjectDeleter { ...@@ -216,17 +221,23 @@ struct GObjectDeleter {
}; };
struct GtkIconInfoDeleter { struct GtkIconInfoDeleter {
void operator()(GtkIconInfo* ptr) { void operator()(GtkIconInfo* ptr) {
#if GTK_CHECK_VERSION(3, 90, 0)
g_object_unref(ptr);
#else
G_GNUC_BEGIN_IGNORE_DEPRECATIONS G_GNUC_BEGIN_IGNORE_DEPRECATIONS
gtk_icon_info_free(ptr); gtk_icon_info_free(ptr);
G_GNUC_END_IGNORE_DEPRECATIONS G_GNUC_END_IGNORE_DEPRECATIONS
#endif
} }
}; };
typedef std::unique_ptr<GIcon, GObjectDeleter> ScopedGIcon; typedef std::unique_ptr<GIcon, GObjectDeleter> ScopedGIcon;
typedef std::unique_ptr<GtkIconInfo, GtkIconInfoDeleter> ScopedGtkIconInfo; typedef std::unique_ptr<GtkIconInfo, GtkIconInfoDeleter> ScopedGtkIconInfo;
typedef std::unique_ptr<GdkPixbuf, GObjectDeleter> ScopedGdkPixbuf; typedef std::unique_ptr<GdkPixbuf, GObjectDeleter> ScopedGdkPixbuf;
#if !GTK_CHECK_VERSION(3, 90, 0)
// Prefix for app indicator ids // Prefix for app indicator ids
const char kAppIndicatorIdPrefix[] = "chrome_app_indicator_"; const char kAppIndicatorIdPrefix[] = "chrome_app_indicator_";
#endif
// Number of app indicators used (used as part of app-indicator id). // Number of app indicators used (used as part of app-indicator id).
int indicators_count; int indicators_count;
...@@ -574,12 +585,26 @@ void GtkUi::SetProgressFraction(float percentage) const { ...@@ -574,12 +585,26 @@ void GtkUi::SetProgressFraction(float percentage) const {
} }
bool GtkUi::IsStatusIconSupported() const { bool GtkUi::IsStatusIconSupported() const {
#if GTK_CHECK_VERSION(3, 90, 0)
// TODO(thomasanderson): Provide some sort of status icon for GTK4. The GTK3
// config has two options. The first is to use GTK status icons, but these
// were removed in GTK4. The second is to use libappindicator. However, that
// library has a dependency on GTK3, and loading multiple versions of GTK into
// the same process is explicitly unsupported.
NOTIMPLEMENTED();
return false;
#else
return true; return true;
#endif
} }
std::unique_ptr<views::StatusIconLinux> GtkUi::CreateLinuxStatusIcon( std::unique_ptr<views::StatusIconLinux> GtkUi::CreateLinuxStatusIcon(
const gfx::ImageSkia& image, const gfx::ImageSkia& image,
const base::string16& tool_tip) const { const base::string16& tool_tip) const {
#if GTK_CHECK_VERSION(3, 90, 0)
NOTIMPLEMENTED();
return nullptr;
#else
if (AppIndicatorIcon::CouldOpen()) { if (AppIndicatorIcon::CouldOpen()) {
++indicators_count; ++indicators_count;
return std::unique_ptr<views::StatusIconLinux>(new AppIndicatorIcon( return std::unique_ptr<views::StatusIconLinux>(new AppIndicatorIcon(
...@@ -589,6 +614,7 @@ std::unique_ptr<views::StatusIconLinux> GtkUi::CreateLinuxStatusIcon( ...@@ -589,6 +614,7 @@ std::unique_ptr<views::StatusIconLinux> GtkUi::CreateLinuxStatusIcon(
return std::unique_ptr<views::StatusIconLinux>( return std::unique_ptr<views::StatusIconLinux>(
new GtkStatusIcon(image, tool_tip)); new GtkStatusIcon(image, tool_tip));
} }
#endif
} }
gfx::Image GtkUi::GetIconForContentType(const std::string& content_type, gfx::Image GtkUi::GetIconForContentType(const std::string& content_type,
......
...@@ -33,8 +33,10 @@ namespace { ...@@ -33,8 +33,10 @@ namespace {
const char kAuraTransientParent[] = "aura-transient-parent"; const char kAuraTransientParent[] = "aura-transient-parent";
void CommonInitFromCommandLine(const base::CommandLine& command_line, void CommonInitFromCommandLine(const base::CommandLine& command_line) {
void (*init_func)(gint*, gchar***)) { #if GTK_CHECK_VERSION(3, 90, 0)
gtk_init();
#else
const std::vector<std::string>& args = command_line.argv(); const std::vector<std::string>& args = command_line.argv();
int argc = args.size(); int argc = args.size();
std::unique_ptr<char* []> argv(new char*[argc + 1]); std::unique_ptr<char* []> argv(new char*[argc + 1]);
...@@ -49,11 +51,12 @@ void CommonInitFromCommandLine(const base::CommandLine& command_line, ...@@ -49,11 +51,12 @@ void CommonInitFromCommandLine(const base::CommandLine& command_line,
{ {
// http://crbug.com/423873 // http://crbug.com/423873
ANNOTATE_SCOPED_MEMORY_LEAK; ANNOTATE_SCOPED_MEMORY_LEAK;
init_func(&argc, &argv_pointer); gtk_init(&argc, &argv_pointer);
} }
for (size_t i = 0; i < args.size(); ++i) { for (size_t i = 0; i < args.size(); ++i) {
free(argv[i]); free(argv[i]);
} }
#endif
} }
} // namespace } // namespace
...@@ -115,7 +118,7 @@ SkColor SelectedURLColor(SkColor foreground, SkColor background) { ...@@ -115,7 +118,7 @@ SkColor SelectedURLColor(SkColor foreground, SkColor background) {
} }
void GtkInitFromCommandLine(const base::CommandLine& command_line) { void GtkInitFromCommandLine(const base::CommandLine& command_line) {
CommonInitFromCommandLine(command_line, gtk_init); CommonInitFromCommandLine(command_line);
} }
// TODO(erg): This method was copied out of shell_integration_linux.cc. Because // TODO(erg): This method was copied out of shell_integration_linux.cc. Because
...@@ -494,8 +497,12 @@ SkColor GdkRgbaToSkColor(const GdkRGBA& color) { ...@@ -494,8 +497,12 @@ SkColor GdkRgbaToSkColor(const GdkRGBA& color) {
SkColor GetFgColorFromStyleContext(GtkStyleContext* context) { SkColor GetFgColorFromStyleContext(GtkStyleContext* context) {
GdkRGBA color; GdkRGBA color;
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_style_context_get_color(context, &color);
#else
gtk_style_context_get_color(context, gtk_style_context_get_state(context), gtk_style_context_get_color(context, gtk_style_context_get_state(context),
&color); &color);
#endif
return GdkRgbaToSkColor(color); return GdkRgbaToSkColor(color);
} }
...@@ -524,9 +531,13 @@ SkColor GetFgColor(const std::string& css_selector) { ...@@ -524,9 +531,13 @@ SkColor GetFgColor(const std::string& css_selector) {
ScopedCssProvider GetCssProvider(const std::string& css) { ScopedCssProvider GetCssProvider(const std::string& css) {
GtkCssProvider* provider = gtk_css_provider_new(); GtkCssProvider* provider = gtk_css_provider_new();
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_css_provider_load_from_data(provider, css.c_str(), -1);
#else
GError* error = nullptr; GError* error = nullptr;
gtk_css_provider_load_from_data(provider, css.c_str(), -1, &error); gtk_css_provider_load_from_data(provider, css.c_str(), -1, &error);
DCHECK(!error); DCHECK(!error);
#endif
return ScopedCssProvider(provider); return ScopedCssProvider(provider);
} }
...@@ -574,8 +585,12 @@ SkColor GetSelectionBgColor(const std::string& css_selector) { ...@@ -574,8 +585,12 @@ SkColor GetSelectionBgColor(const std::string& css_selector) {
// This is verbatim how Gtk gets the selection color on versions before 3.20. // This is verbatim how Gtk gets the selection color on versions before 3.20.
GdkRGBA selection_color; GdkRGBA selection_color;
G_GNUC_BEGIN_IGNORE_DEPRECATIONS; G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_style_context_get_background_color(context, &selection_color);
#else
gtk_style_context_get_background_color( gtk_style_context_get_background_color(
context, gtk_style_context_get_state(context), &selection_color); context, gtk_style_context_get_state(context), &selection_color);
#endif
G_GNUC_END_IGNORE_DEPRECATIONS; G_GNUC_END_IGNORE_DEPRECATIONS;
return GdkRgbaToSkColor(selection_color); return GdkRgbaToSkColor(selection_color);
} }
...@@ -595,9 +610,14 @@ SkColor GetSeparatorColor(const std::string& css_selector) { ...@@ -595,9 +610,14 @@ SkColor GetSeparatorColor(const std::string& css_selector) {
gtk_style_context_get(context, gtk_style_context_get_state(context), gtk_style_context_get(context, gtk_style_context_get_state(context),
"min-width", &w, "min-height", &h, nullptr); "min-width", &w, "min-height", &h, nullptr);
GtkBorder border, padding; GtkBorder border, padding;
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_style_context_get_border(context, &border);
gtk_style_context_get_padding(context, &padding);
#else
GtkStateFlags state = gtk_style_context_get_state(context); GtkStateFlags state = gtk_style_context_get_state(context);
gtk_style_context_get_border(context, state, &border); gtk_style_context_get_border(context, state, &border);
gtk_style_context_get_padding(context, state, &padding); gtk_style_context_get_padding(context, state, &padding);
#endif
w += border.left + padding.left + padding.right + border.right; w += border.left + padding.left + padding.right + border.right;
h += border.top + padding.top + padding.bottom + border.bottom; h += border.top + padding.top + padding.bottom + border.bottom;
......
...@@ -12,14 +12,19 @@ ...@@ -12,14 +12,19 @@
#include "ui/base/accelerators/menu_label_accelerator_util_linux.h" #include "ui/base/accelerators/menu_label_accelerator_util_linux.h"
#include "ui/base/models/menu_model.h" #include "ui/base/models/menu_model.h"
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
namespace libgtkui { namespace libgtkui {
GtkWidget* BuildMenuItemWithImage(const std::string& label, GtkWidget* image) { GtkWidget* BuildMenuItemWithImage(const std::string& label, GtkWidget* image) {
// GTK4 removed support for image menu items.
#if GTK_CHECK_VERSION(3, 90, 0)
return gtk_menu_item_new_with_mnemonic(label.c_str());
#else
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
GtkWidget* menu_item = gtk_image_menu_item_new_with_mnemonic(label.c_str()); GtkWidget* menu_item = gtk_image_menu_item_new_with_mnemonic(label.c_str());
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), image);
G_GNUC_END_IGNORE_DEPRECATIONS;
return menu_item; return menu_item;
#endif
} }
GtkWidget* BuildMenuItemWithImage(const std::string& label, GtkWidget* BuildMenuItemWithImage(const std::string& label,
...@@ -140,10 +145,14 @@ void BuildSubmenuFromModel(ui::MenuModel* model, ...@@ -140,10 +145,14 @@ void BuildSubmenuFromModel(ui::MenuModel* model,
menu_item = BuildMenuItemWithImage(label, icon); menu_item = BuildMenuItemWithImage(label, icon);
else else
menu_item = BuildMenuItemWithLabel(label); menu_item = BuildMenuItemWithLabel(label);
#if !GTK_CHECK_VERSION(3, 90, 0)
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
if (GTK_IS_IMAGE_MENU_ITEM(menu_item)) { if (GTK_IS_IMAGE_MENU_ITEM(menu_item)) {
gtk_image_menu_item_set_always_show_image( gtk_image_menu_item_set_always_show_image(
GTK_IMAGE_MENU_ITEM(menu_item), TRUE); GTK_IMAGE_MENU_ITEM(menu_item), TRUE);
} }
G_GNUC_END_IGNORE_DEPRECATIONS;
#endif
break; break;
} }
...@@ -233,17 +242,21 @@ void SetMenuItemInfo(GtkWidget* widget, void* block_activation_ptr) { ...@@ -233,17 +242,21 @@ void SetMenuItemInfo(GtkWidget* widget, void* block_activation_ptr) {
base::UTF16ToUTF8(model->GetLabelAt(id))); base::UTF16ToUTF8(model->GetLabelAt(id)));
gtk_menu_item_set_label(GTK_MENU_ITEM(widget), label.c_str()); gtk_menu_item_set_label(GTK_MENU_ITEM(widget), label.c_str());
#if !GTK_CHECK_VERSION(3, 90, 0)
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
if (GTK_IS_IMAGE_MENU_ITEM(widget)) { if (GTK_IS_IMAGE_MENU_ITEM(widget)) {
gfx::Image icon; gfx::Image icon;
if (model->GetIconAt(id, &icon)) { if (model->GetIconAt(id, &icon)) {
GdkPixbuf* pixbuf = GdkPixbufFromSkBitmap(*icon.ToSkBitmap()); GdkPixbuf* pixbuf = GdkPixbufFromSkBitmap(*icon.ToSkBitmap());
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(widget), gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(widget),
gtk_image_new_from_pixbuf(pixbuf)); gtk_image_new_from_pixbuf(pixbuf));
g_object_unref(pixbuf); g_object_unref(pixbuf);
} else { } else {
gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(widget), nullptr); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(widget), nullptr);
} }
} }
G_GNUC_END_IGNORE_DEPRECATIONS;
#endif
} }
gtk_widget_show(widget); gtk_widget_show(widget);
......
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include "chrome/browser/ui/libgtkui/chrome_gtk_frame.h"
#include "chrome/browser/ui/libgtkui/chrome_gtk_menu_subclasses.h" #include "chrome/browser/ui/libgtkui/chrome_gtk_menu_subclasses.h"
#include "chrome/browser/ui/libgtkui/gtk_util.h" #include "chrome/browser/ui/libgtkui/gtk_util.h"
#include "chrome/browser/ui/libgtkui/skia_utils_gtk.h" #include "chrome/browser/ui/libgtkui/skia_utils_gtk.h"
...@@ -159,9 +158,9 @@ SkColor SkColorFromColorId(ui::NativeTheme::ColorId color_id) { ...@@ -159,9 +158,9 @@ SkColor SkColorFromColorId(ui::NativeTheme::ColorId color_id) {
return GetFgColor("GtkLabel.link:link:hover:active"); return GetFgColor("GtkLabel.link:link:hover:active");
FALLTHROUGH; FALLTHROUGH;
case ui::NativeTheme::kColorId_LinkEnabled: { case ui::NativeTheme::kColorId_LinkEnabled: {
if (GtkVersionCheck(3, 12)) { if (GtkVersionCheck(3, 12))
return GetFgColor("GtkLabel.link:link"); return GetFgColor("GtkLabel.link:link");
} #if !GTK_CHECK_VERSION(3, 90, 0)
auto link_context = GetStyleContextFromCss("GtkLabel.view"); auto link_context = GetStyleContextFromCss("GtkLabel.view");
GdkColor* color; GdkColor* color;
gtk_style_context_get_style(link_context, "link-color", &color, nullptr); gtk_style_context_get_style(link_context, "link-color", &color, nullptr);
...@@ -175,6 +174,7 @@ SkColor SkColorFromColorId(ui::NativeTheme::ColorId color_id) { ...@@ -175,6 +174,7 @@ SkColor SkColorFromColorId(ui::NativeTheme::ColorId color_id) {
G_GNUC_END_IGNORE_DEPRECATIONS; G_GNUC_END_IGNORE_DEPRECATIONS;
return ret_color; return ret_color;
} }
#endif
// Default color comes from gtklinkbutton.c. // Default color comes from gtklinkbutton.c.
return SkColorSetRGB(0x00, 0x00, 0xEE); return SkColorSetRGB(0x00, 0x00, 0xEE);
...@@ -607,9 +607,15 @@ void NativeThemeGtk::PaintMenuSeparator( ...@@ -607,9 +607,15 @@ void NativeThemeGtk::PaintMenuSeparator(
"GtkMenu#menu GtkSeparator#separator.horizontal"); "GtkMenu#menu GtkSeparator#separator.horizontal");
GtkBorder margin, border, padding; GtkBorder margin, border, padding;
GtkStateFlags state = gtk_style_context_get_state(context); GtkStateFlags state = gtk_style_context_get_state(context);
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_style_context_get_margin(context, &margin);
gtk_style_context_get_border(context, &border);
gtk_style_context_get_padding(context, &padding);
#else
gtk_style_context_get_margin(context, state, &margin); gtk_style_context_get_margin(context, state, &margin);
gtk_style_context_get_border(context, state, &border); gtk_style_context_get_border(context, state, &border);
gtk_style_context_get_padding(context, state, &padding); gtk_style_context_get_padding(context, state, &padding);
#endif
int min_height = 1; int min_height = 1;
gtk_style_context_get(context, state, "min-height", &min_height, nullptr); gtk_style_context_get(context, state, "min-height", &min_height, nullptr);
int w = rect.width() - margin.left - margin.right; int w = rect.width() - margin.left - margin.right;
...@@ -620,6 +626,7 @@ void NativeThemeGtk::PaintMenuSeparator( ...@@ -620,6 +626,7 @@ void NativeThemeGtk::PaintMenuSeparator(
int y = separator_offset(h); int y = separator_offset(h);
PaintWidget(canvas, gfx::Rect(x, y, w, h), context, BG_RENDER_NORMAL, true); PaintWidget(canvas, gfx::Rect(x, y, w, h), context, BG_RENDER_NORMAL, true);
} else { } else {
#if !GTK_CHECK_VERSION(3, 90, 0)
auto context = GetStyleContextFromCss( auto context = GetStyleContextFromCss(
"GtkMenu#menu GtkMenuItem#menuitem.separator.horizontal"); "GtkMenu#menu GtkMenuItem#menuitem.separator.horizontal");
gboolean wide_separators = false; gboolean wide_separators = false;
...@@ -644,6 +651,7 @@ void NativeThemeGtk::PaintMenuSeparator( ...@@ -644,6 +651,7 @@ void NativeThemeGtk::PaintMenuSeparator(
flags.setStrokeWidth(1); flags.setStrokeWidth(1);
canvas->drawLine(x + 0.5f, y + 0.5f, x + w + 0.5f, y + 0.5f, flags); canvas->drawLine(x + 0.5f, y + 0.5f, x + w + 0.5f, y + 0.5f, flags);
} }
#endif
} }
} }
......
...@@ -79,21 +79,33 @@ gfx::Insets InsetsFromGtkBorder(const GtkBorder& border) { ...@@ -79,21 +79,33 @@ gfx::Insets InsetsFromGtkBorder(const GtkBorder& border) {
gfx::Insets PaddingFromStyleContext(GtkStyleContext* context, gfx::Insets PaddingFromStyleContext(GtkStyleContext* context,
GtkStateFlags state) { GtkStateFlags state) {
GtkBorder padding; GtkBorder padding;
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_style_context_get_padding(context, &padding);
#else
gtk_style_context_get_padding(context, state, &padding); gtk_style_context_get_padding(context, state, &padding);
#endif
return InsetsFromGtkBorder(padding); return InsetsFromGtkBorder(padding);
} }
gfx::Insets BorderFromStyleContext(GtkStyleContext* context, gfx::Insets BorderFromStyleContext(GtkStyleContext* context,
GtkStateFlags state) { GtkStateFlags state) {
GtkBorder border; GtkBorder border;
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_style_context_get_border(context, &border);
#else
gtk_style_context_get_border(context, state, &border); gtk_style_context_get_border(context, state, &border);
#endif
return InsetsFromGtkBorder(border); return InsetsFromGtkBorder(border);
} }
gfx::Insets MarginFromStyleContext(GtkStyleContext* context, gfx::Insets MarginFromStyleContext(GtkStyleContext* context,
GtkStateFlags state) { GtkStateFlags state) {
GtkBorder margin; GtkBorder margin;
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_style_context_get_margin(context, &margin);
#else
gtk_style_context_get_margin(context, state, &margin); gtk_style_context_get_margin(context, state, &margin);
#endif
return InsetsFromGtkBorder(margin); return InsetsFromGtkBorder(margin);
} }
...@@ -299,8 +311,12 @@ void NavButtonProviderGtk::RedrawImages(int top_area_height, ...@@ -299,8 +311,12 @@ void NavButtonProviderGtk::RedrawImages(int top_area_height,
auto header_context = CreateHeaderContext(maximized); auto header_context = CreateHeaderContext(maximized);
GtkBorder header_padding; GtkBorder header_padding;
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_style_context_get_padding(header_context, &header_padding);
#else
gtk_style_context_get_padding(header_context, GTK_STATE_FLAG_NORMAL, gtk_style_context_get_padding(header_context, GTK_STATE_FLAG_NORMAL,
&header_padding); &header_padding);
#endif
double scale = 1.0f; double scale = 1.0f;
std::map<chrome::FrameButtonDisplayType, gfx::Size> button_sizes; std::map<chrome::FrameButtonDisplayType, gfx::Size> button_sizes;
......
...@@ -301,14 +301,8 @@ void PrintDialogGtk::UpdateSettings(printing::PrintSettings* settings) { ...@@ -301,14 +301,8 @@ void PrintDialogGtk::UpdateSettings(printing::PrintSettings* settings) {
gtk_page_setup_set_paper_size(page_setup_, custom_size); gtk_page_setup_set_paper_size(page_setup_, custom_size);
gtk_paper_size_free(custom_size); gtk_paper_size_free(custom_size);
} }
#if GTK_CHECK_VERSION(2, 28, 0)
g_list_free_full(gtk_paper_sizes, g_list_free_full(gtk_paper_sizes,
reinterpret_cast<GDestroyNotify>(gtk_paper_size_free)); reinterpret_cast<GDestroyNotify>(gtk_paper_size_free));
#else
g_list_foreach(gtk_paper_sizes,
reinterpret_cast<GFunc>(gtk_paper_size_free), nullptr);
g_list_free(gtk_paper_sizes);
#endif
} }
} else { } else {
VLOG(1) << "Using default paper size"; VLOG(1) << "Using default paper size";
......
...@@ -34,6 +34,23 @@ ...@@ -34,6 +34,23 @@
namespace { namespace {
#if GTK_CHECK_VERSION(3, 90, 0)
// GTK stock items have been deprecated. The docs say to switch to using the
// strings "_Open", etc. However this breaks i18n. We could supply our own
// internationalized strings, but the "_" in these strings is significant: it's
// the keyboard shortcut to select these actions. TODO(thomasanderson): Provide
// internationalized strings when GTK provides support for it.
const char kCancelLabel[] = "_Cancel";
const char kOpenLabel[] = "_Open";
const char kSaveLabel[] = "_Save";
#else
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
const char* kCancelLabel = GTK_STOCK_CANCEL;
const char* kOpenLabel = GTK_STOCK_OPEN;
const char* kSaveLabel = GTK_STOCK_SAVE;
G_GNUC_END_IGNORE_DEPRECATIONS;
#endif
// Makes sure that .jpg also shows .JPG. // Makes sure that .jpg also shows .JPG.
gboolean FileFilterCaseInsensitive(const GtkFileFilterInfo* file_info, gboolean FileFilterCaseInsensitive(const GtkFileFilterInfo* file_info,
std::string* file_extension) { std::string* file_extension) {
...@@ -188,7 +205,9 @@ void SelectFileDialogImplGTK::SelectFileImpl( ...@@ -188,7 +205,9 @@ void SelectFileDialogImplGTK::SelectFileImpl(
} }
} }
#if !GTK_CHECK_VERSION(3, 90, 0)
gtk_widget_show_all(dialog); gtk_widget_show_all(dialog);
#endif
// We need to call gtk_window_present after making the widgets visible to make // We need to call gtk_window_present after making the widgets visible to make
// sure window gets correctly raised and gets focus. // sure window gets correctly raised and gets focus.
...@@ -296,11 +315,9 @@ GtkWidget* SelectFileDialogImplGTK::CreateFileOpenHelper( ...@@ -296,11 +315,9 @@ GtkWidget* SelectFileDialogImplGTK::CreateFileOpenHelper(
const std::string& title, const std::string& title,
const base::FilePath& default_path, const base::FilePath& default_path,
gfx::NativeWindow parent) { gfx::NativeWindow parent) {
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
GtkWidget* dialog = gtk_file_chooser_dialog_new( GtkWidget* dialog = gtk_file_chooser_dialog_new(
title.c_str(), nullptr, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, title.c_str(), nullptr, GTK_FILE_CHOOSER_ACTION_OPEN, kCancelLabel,
GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); GTK_RESPONSE_CANCEL, kOpenLabel, GTK_RESPONSE_ACCEPT, nullptr);
G_GNUC_END_IGNORE_DEPRECATIONS;
SetGtkTransientForAura(dialog, parent); SetGtkTransientForAura(dialog, parent);
AddFilters(GTK_FILE_CHOOSER(dialog)); AddFilters(GTK_FILE_CHOOSER(dialog));
...@@ -333,18 +350,16 @@ GtkWidget* SelectFileDialogImplGTK::CreateSelectFolderDialog( ...@@ -333,18 +350,16 @@ GtkWidget* SelectFileDialogImplGTK::CreateSelectFolderDialog(
? l10n_util::GetStringUTF8(IDS_SELECT_UPLOAD_FOLDER_DIALOG_TITLE) ? l10n_util::GetStringUTF8(IDS_SELECT_UPLOAD_FOLDER_DIALOG_TITLE)
: l10n_util::GetStringUTF8(IDS_SELECT_FOLDER_DIALOG_TITLE); : l10n_util::GetStringUTF8(IDS_SELECT_FOLDER_DIALOG_TITLE);
} }
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
std::string accept_button_label = std::string accept_button_label =
(type == SELECT_UPLOAD_FOLDER) (type == SELECT_UPLOAD_FOLDER)
? l10n_util::GetStringUTF8( ? l10n_util::GetStringUTF8(
IDS_SELECT_UPLOAD_FOLDER_DIALOG_UPLOAD_BUTTON) IDS_SELECT_UPLOAD_FOLDER_DIALOG_UPLOAD_BUTTON)
: GTK_STOCK_OPEN; : kOpenLabel;
GtkWidget* dialog = gtk_file_chooser_dialog_new( GtkWidget* dialog = gtk_file_chooser_dialog_new(
title_string.c_str(), nullptr, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, title_string.c_str(), nullptr, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, accept_button_label.c_str(), kCancelLabel, GTK_RESPONSE_CANCEL, accept_button_label.c_str(),
GTK_RESPONSE_ACCEPT, nullptr); GTK_RESPONSE_ACCEPT, nullptr);
G_GNUC_END_IGNORE_DEPRECATIONS;
SetGtkTransientForAura(dialog, parent); SetGtkTransientForAura(dialog, parent);
GtkFileChooser* chooser = GTK_FILE_CHOOSER(dialog); GtkFileChooser* chooser = GTK_FILE_CHOOSER(dialog);
if (type == SELECT_UPLOAD_FOLDER || type == SELECT_EXISTING_FOLDER) if (type == SELECT_UPLOAD_FOLDER || type == SELECT_EXISTING_FOLDER)
...@@ -407,12 +422,9 @@ GtkWidget* SelectFileDialogImplGTK::CreateSaveAsDialog( ...@@ -407,12 +422,9 @@ GtkWidget* SelectFileDialogImplGTK::CreateSaveAsDialog(
!title.empty() ? title !title.empty() ? title
: l10n_util::GetStringUTF8(IDS_SAVE_AS_DIALOG_TITLE); : l10n_util::GetStringUTF8(IDS_SAVE_AS_DIALOG_TITLE);
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
GtkWidget* dialog = gtk_file_chooser_dialog_new( GtkWidget* dialog = gtk_file_chooser_dialog_new(
title_string.c_str(), nullptr, GTK_FILE_CHOOSER_ACTION_SAVE, title_string.c_str(), nullptr, GTK_FILE_CHOOSER_ACTION_SAVE, kCancelLabel,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_CANCEL, kSaveLabel, GTK_RESPONSE_ACCEPT, nullptr);
GTK_RESPONSE_ACCEPT, nullptr);
G_GNUC_END_IGNORE_DEPRECATIONS;
SetGtkTransientForAura(dialog, parent); SetGtkTransientForAura(dialog, parent);
AddFilters(GTK_FILE_CHOOSER(dialog)); AddFilters(GTK_FILE_CHOOSER(dialog));
......
...@@ -26,6 +26,10 @@ std::string GetGtkSettingsStringProperty(GtkSettings* settings, ...@@ -26,6 +26,10 @@ std::string GetGtkSettingsStringProperty(GtkSettings* settings,
} }
std::string GetDecorationLayoutFromGtkWindow() { std::string GetDecorationLayoutFromGtkWindow() {
#if GTK_CHECK_VERSION(3, 90, 0)
NOTREACHED();
return kDefaultGtkLayout;
#else
static ScopedStyleContext context; static ScopedStyleContext context;
if (!context) { if (!context) {
context = GetStyleContextFromCss(""); context = GetStyleContextFromCss("");
...@@ -39,6 +43,7 @@ std::string GetDecorationLayoutFromGtkWindow() { ...@@ -39,6 +43,7 @@ std::string GetDecorationLayoutFromGtkWindow() {
std::string layout(layout_c); std::string layout(layout_c);
g_free(layout_c); g_free(layout_c);
return layout; return layout;
#endif
} }
void ParseActionString(const std::string& value, void ParseActionString(const std::string& value,
......
...@@ -17,6 +17,7 @@ namespace libgtkui { ...@@ -17,6 +17,7 @@ namespace libgtkui {
// To get back, we can just right shift by eight // To get back, we can just right shift by eight
// (or, formulated differently, i == (i*257)/256 for all i < 256). // (or, formulated differently, i == (i*257)/256 for all i < 256).
#if !GTK_CHECK_VERSION(3, 90, 0)
SkColor GdkColorToSkColor(GdkColor color) { SkColor GdkColorToSkColor(GdkColor color) {
return SkColorSetRGB(color.red >> 8, color.green >> 8, color.blue >> 8); return SkColorSetRGB(color.red >> 8, color.green >> 8, color.blue >> 8);
} }
...@@ -28,6 +29,7 @@ GdkColor SkColorToGdkColor(SkColor color) { ...@@ -28,6 +29,7 @@ GdkColor SkColorToGdkColor(SkColor color) {
static_cast<guint16>(SkColorGetB(color) * kSkiaToGDKMultiplier)}; static_cast<guint16>(SkColorGetB(color) * kSkiaToGDKMultiplier)};
return gdk_color; return gdk_color;
} }
#endif
const SkBitmap GdkPixbufToImageSkia(GdkPixbuf* pixbuf) { const SkBitmap GdkPixbufToImageSkia(GdkPixbuf* pixbuf) {
// TODO(erg): What do we do in the case where the pixbuf fails these dchecks? // TODO(erg): What do we do in the case where the pixbuf fails these dchecks?
......
...@@ -5,15 +5,19 @@ ...@@ -5,15 +5,19 @@
#ifndef CHROME_BROWSER_UI_LIBGTKUI_SKIA_UTILS_GTK_H_ #ifndef CHROME_BROWSER_UI_LIBGTKUI_SKIA_UTILS_GTK_H_
#define CHROME_BROWSER_UI_LIBGTKUI_SKIA_UTILS_GTK_H_ #define CHROME_BROWSER_UI_LIBGTKUI_SKIA_UTILS_GTK_H_
#include <gtk/gtk.h>
#include <stdint.h> #include <stdint.h>
#include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkColor.h"
#if !GTK_CHECK_VERSION(3, 90, 0)
typedef struct _GdkColor GdkColor; typedef struct _GdkColor GdkColor;
#endif
typedef struct _GdkPixbuf GdkPixbuf; typedef struct _GdkPixbuf GdkPixbuf;
class SkBitmap; class SkBitmap;
#if !GTK_CHECK_VERSION(3, 90, 0)
// Define a macro for creating GdkColors from RGB values. This is a macro to // Define a macro for creating GdkColors from RGB values. This is a macro to
// allow static construction of literals, etc. Use this like: // allow static construction of literals, etc. Use this like:
// GdkColor white = GDK_COLOR_RGB(0xff, 0xff, 0xff); // GdkColor white = GDK_COLOR_RGB(0xff, 0xff, 0xff);
...@@ -24,9 +28,11 @@ class SkBitmap; ...@@ -24,9 +28,11 @@ class SkBitmap;
g * ::libgtkui::kSkiaToGDKMultiplier, \ g * ::libgtkui::kSkiaToGDKMultiplier, \
b * ::libgtkui::kSkiaToGDKMultiplier, \ b * ::libgtkui::kSkiaToGDKMultiplier, \
} }
#endif
namespace libgtkui { namespace libgtkui {
#if !GTK_CHECK_VERSION(3, 90, 0)
// Multiply uint8_t color components by this. // Multiply uint8_t color components by this.
const int kSkiaToGDKMultiplier = 257; const int kSkiaToGDKMultiplier = 257;
...@@ -35,6 +41,7 @@ SkColor GdkColorToSkColor(GdkColor color); ...@@ -35,6 +41,7 @@ SkColor GdkColorToSkColor(GdkColor color);
// Converts ARGB to GdkColor. // Converts ARGB to GdkColor.
GdkColor SkColorToGdkColor(SkColor color); GdkColor SkColorToGdkColor(SkColor color);
#endif
const SkBitmap GdkPixbufToImageSkia(GdkPixbuf* pixbuf); const SkBitmap GdkPixbufToImageSkia(GdkPixbuf* pixbuf);
......
...@@ -71,7 +71,12 @@ bool X11InputMethodContextImplGtk::DispatchKeyEvent( ...@@ -71,7 +71,12 @@ bool X11InputMethodContextImplGtk::DispatchKeyEvent(
} }
if (event->key.window != gdk_last_set_client_window_) { if (event->key.window != gdk_last_set_client_window_) {
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_im_context_set_client_widget(gtk_context_,
GTK_WIDGET(event->key.window));
#else
gtk_im_context_set_client_window(gtk_context_, event->key.window); gtk_im_context_set_client_window(gtk_context_, event->key.window);
#endif
gdk_last_set_client_window_ = event->key.window; gdk_last_set_client_window_ = event->key.window;
} }
...@@ -209,19 +214,11 @@ GdkEvent* X11InputMethodContextImplGtk::GdkEventFromNativeEvent( ...@@ -209,19 +214,11 @@ GdkEvent* X11InputMethodContextImplGtk::GdkEventFromNativeEvent(
g_free(keyvals); g_free(keyvals);
keyvals = nullptr; keyvals = nullptr;
// Get a GdkWindow. // Get a GdkWindow.
#if GTK_CHECK_VERSION(2, 24, 0)
GdkWindow* window = gdk_x11_window_lookup_for_display(display, xkey.window); GdkWindow* window = gdk_x11_window_lookup_for_display(display, xkey.window);
#else
GdkWindow* window = gdk_window_lookup_for_display(display, xkey.window);
#endif
if (window) if (window)
g_object_ref(window); g_object_ref(window);
else else
#if GTK_CHECK_VERSION(2, 24, 0)
window = gdk_x11_window_foreign_new_for_display(display, xkey.window); window = gdk_x11_window_foreign_new_for_display(display, xkey.window);
#else
window = gdk_window_foreign_new_for_display(display, xkey.window);
#endif
if (!window) { if (!window) {
LOG(ERROR) << "Cannot get a GdkWindow for a key event."; LOG(ERROR) << "Cannot get a GdkWindow for a key event.";
return nullptr; return nullptr;
......
...@@ -99,12 +99,21 @@ void ContinueWindowGtk::CreateWindow() { ...@@ -99,12 +99,21 @@ void ContinueWindowGtk::CreateWindow() {
gtk_label_new(l10n_util::GetStringUTF8(IDS_CONTINUE_PROMPT).c_str()); gtk_label_new(l10n_util::GetStringUTF8(IDS_CONTINUE_PROMPT).c_str());
gtk_label_set_line_wrap(GTK_LABEL(text_label), TRUE); gtk_label_set_line_wrap(GTK_LABEL(text_label), TRUE);
// TODO(lambroslambrou): Fix magic numbers, as in disconnect_window_gtk.cc. // TODO(lambroslambrou): Fix magic numbers, as in disconnect_window_gtk.cc.
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_widget_set_margin_start(GTK_WIDGET(text_label), 12);
gtk_widget_set_margin_end(GTK_WIDGET(text_label), 12);
gtk_widget_set_margin_top(GTK_WIDGET(text_label), 12);
gtk_widget_set_margin_bottom(GTK_WIDGET(text_label), 12);
#else
G_GNUC_BEGIN_IGNORE_DEPRECATIONS; G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
gtk_misc_set_padding(GTK_MISC(text_label), 12, 12); gtk_misc_set_padding(GTK_MISC(text_label), 12, 12);
G_GNUC_END_IGNORE_DEPRECATIONS; G_GNUC_END_IGNORE_DEPRECATIONS;
#endif
gtk_container_add(GTK_CONTAINER(content_area), text_label); gtk_container_add(GTK_CONTAINER(content_area), text_label);
#if !GTK_CHECK_VERSION(3, 90, 0)
gtk_widget_show_all(content_area); gtk_widget_show_all(content_area);
#endif
} }
void ContinueWindowGtk::OnResponse(GtkDialog* dialog, int response_id) { void ContinueWindowGtk::OnResponse(GtkDialog* dialog, int response_id) {
......
...@@ -186,7 +186,9 @@ void DisconnectWindowGtk::Start( ...@@ -186,7 +186,9 @@ void DisconnectWindowGtk::Start(
gtk_window_set_deletable(window, FALSE); gtk_window_set_deletable(window, FALSE);
// Allow custom rendering of the background pixmap. // Allow custom rendering of the background pixmap.
#if !GTK_CHECK_VERSION(3, 90, 0)
gtk_widget_set_app_paintable(disconnect_window_, TRUE); gtk_widget_set_app_paintable(disconnect_window_, TRUE);
#endif
g_signal_connect(disconnect_window_, "draw", G_CALLBACK(OnDrawThunk), this); g_signal_connect(disconnect_window_, "draw", G_CALLBACK(OnDrawThunk), this);
// Handle window resizing, to regenerate the background pixmap and window // Handle window resizing, to regenerate the background pixmap and window
...@@ -199,7 +201,9 @@ void DisconnectWindowGtk::Start( ...@@ -199,7 +201,9 @@ void DisconnectWindowGtk::Start(
G_CALLBACK(OnConfigureThunk), this); G_CALLBACK(OnConfigureThunk), this);
// Handle mouse events to allow the user to drag the window around. // Handle mouse events to allow the user to drag the window around.
#if !GTK_CHECK_VERSION(3, 90, 0)
gtk_widget_set_events(disconnect_window_, GDK_BUTTON_PRESS_MASK); gtk_widget_set_events(disconnect_window_, GDK_BUTTON_PRESS_MASK);
#endif
g_signal_connect(disconnect_window_, "button-press-event", g_signal_connect(disconnect_window_, "button-press-event",
G_CALLBACK(OnButtonPressThunk), this); G_CALLBACK(OnButtonPressThunk), this);
...@@ -207,24 +211,40 @@ void DisconnectWindowGtk::Start( ...@@ -207,24 +211,40 @@ void DisconnectWindowGtk::Start(
// The alignment sets narrow margins at the top and bottom, compared with // The alignment sets narrow margins at the top and bottom, compared with
// left and right. The left margin is made larger to accommodate the // left and right. The left margin is made larger to accommodate the
// window movement gripper. // window movement gripper.
GtkWidget* button_row = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
gtk_box_set_homogeneous(GTK_BOX(button_row), FALSE);
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_widget_set_margin_start(GTK_WIDGET(button_row), 24);
gtk_widget_set_margin_end(GTK_WIDGET(button_row), 12);
gtk_widget_set_margin_top(GTK_WIDGET(button_row), 8);
gtk_widget_set_margin_bottom(GTK_WIDGET(button_row), 8);
gtk_container_add(GTK_CONTAINER(window), button_row);
#else
G_GNUC_BEGIN_IGNORE_DEPRECATIONS; G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
GtkWidget* align = gtk_alignment_new(0, 0, 1, 1); GtkWidget* align = gtk_alignment_new(0, 0, 1, 1);
gtk_alignment_set_padding(GTK_ALIGNMENT(align), 8, 8, 24, 12); gtk_alignment_set_padding(GTK_ALIGNMENT(align), 8, 8, 24, 12);
G_GNUC_END_IGNORE_DEPRECATIONS; G_GNUC_END_IGNORE_DEPRECATIONS;
gtk_container_add(GTK_CONTAINER(window), align); gtk_container_add(GTK_CONTAINER(window), align);
GtkWidget* button_row = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 12);
gtk_box_set_homogeneous(GTK_BOX(button_row), FALSE);
gtk_container_add(GTK_CONTAINER(align), button_row); gtk_container_add(GTK_CONTAINER(align), button_row);
#endif
button_ = gtk_button_new_with_label( button_ = gtk_button_new_with_label(
l10n_util::GetStringUTF8(IDS_STOP_SHARING_BUTTON).c_str()); l10n_util::GetStringUTF8(IDS_STOP_SHARING_BUTTON).c_str());
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_box_pack_end(GTK_BOX(button_row), button_);
#else
gtk_box_pack_end(GTK_BOX(button_row), button_, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(button_row), button_, FALSE, FALSE, 0);
#endif
g_signal_connect(button_, "clicked", G_CALLBACK(OnClickedThunk), this); g_signal_connect(button_, "clicked", G_CALLBACK(OnClickedThunk), this);
message_ = gtk_label_new(nullptr); message_ = gtk_label_new(nullptr);
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_box_pack_end(GTK_BOX(button_row), message_);
#else
gtk_box_pack_end(GTK_BOX(button_row), message_, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(button_row), message_, FALSE, FALSE, 0);
#endif
// Override any theme setting for the text color, so that the text is // Override any theme setting for the text color, so that the text is
// readable against the window's background pixmap. // readable against the window's background pixmap.
...@@ -234,13 +254,16 @@ void DisconnectWindowGtk::Start( ...@@ -234,13 +254,16 @@ void DisconnectWindowGtk::Start(
gtk_label_set_attributes(GTK_LABEL(message_), attributes); gtk_label_set_attributes(GTK_LABEL(message_), attributes);
pango_attr_list_unref(attributes); pango_attr_list_unref(attributes);
#if !GTK_CHECK_VERSION(3, 90, 0)
// GTK4 always uses an RGBA visual for windows.
GdkScreen* screen = gtk_widget_get_screen(disconnect_window_); GdkScreen* screen = gtk_widget_get_screen(disconnect_window_);
GdkVisual* visual = gdk_screen_get_rgba_visual(screen); GdkVisual* visual = gdk_screen_get_rgba_visual(screen);
if (visual) if (visual)
gtk_widget_set_visual(disconnect_window_, visual); gtk_widget_set_visual(disconnect_window_, visual);
// GTK4 shows windows by default.
gtk_widget_show_all(disconnect_window_); gtk_widget_show_all(disconnect_window_);
#endif
// Extract the user name from the JID. // Extract the user name from the JID.
std::string client_jid = client_session_control_->client_jid(); std::string client_jid = client_session_control_->client_jid();
......
...@@ -123,12 +123,21 @@ void It2MeConfirmationDialogLinux::CreateWindow( ...@@ -123,12 +123,21 @@ void It2MeConfirmationDialogLinux::CreateWindow(
remote_user_email); remote_user_email);
GtkWidget* text_label = gtk_label_new(base::UTF16ToUTF8(dialog_text).c_str()); GtkWidget* text_label = gtk_label_new(base::UTF16ToUTF8(dialog_text).c_str());
gtk_label_set_line_wrap(GTK_LABEL(text_label), true); gtk_label_set_line_wrap(GTK_LABEL(text_label), true);
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_widget_set_margin_start(GTK_WIDGET(text_label), 12);
gtk_widget_set_margin_end(GTK_WIDGET(text_label), 12);
gtk_widget_set_margin_top(GTK_WIDGET(text_label), 12);
gtk_widget_set_margin_bottom(GTK_WIDGET(text_label), 12);
#else
G_GNUC_BEGIN_IGNORE_DEPRECATIONS; G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
gtk_misc_set_padding(GTK_MISC(text_label), 12, 12); gtk_misc_set_padding(GTK_MISC(text_label), 12, 12);
G_GNUC_END_IGNORE_DEPRECATIONS; G_GNUC_END_IGNORE_DEPRECATIONS;
#endif
gtk_container_add(GTK_CONTAINER(content_area), text_label); gtk_container_add(GTK_CONTAINER(content_area), text_label);
#if !GTK_CHECK_VERSION(3, 90, 0)
gtk_widget_show_all(content_area); gtk_widget_show_all(content_area);
#endif
gtk_window_set_urgency_hint(GTK_WINDOW(confirmation_window_), true); gtk_window_set_urgency_hint(GTK_WINDOW(confirmation_window_), true);
gtk_window_present(GTK_WINDOW(confirmation_window_)); gtk_window_present(GTK_WINDOW(confirmation_window_));
......
...@@ -109,7 +109,11 @@ int It2MeNativeMessagingHostMain(int argc, char** argv) { ...@@ -109,7 +109,11 @@ int It2MeNativeMessagingHostMain(int argc, char** argv) {
// Required for any calls into GTK functions, such as the Disconnect and // Required for any calls into GTK functions, such as the Disconnect and
// Continue windows. Calling with nullptr arguments because we don't have // Continue windows. Calling with nullptr arguments because we don't have
// any command line arguments for gtk to consume. // any command line arguments for gtk to consume.
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_init();
#else
gtk_init(nullptr, nullptr); gtk_init(nullptr, nullptr);
#endif
// Need to prime the host OS version value for linux to prevent IO on the // Need to prime the host OS version value for linux to prevent IO on the
// network thread. base::GetLinuxDistro() caches the result. // network thread. base::GetLinuxDistro() caches the result.
......
...@@ -1713,7 +1713,11 @@ int HostProcessMain() { ...@@ -1713,7 +1713,11 @@ int HostProcessMain() {
// Required for any calls into GTK functions, such as the Disconnect and // Required for any calls into GTK functions, such as the Disconnect and
// Continue windows, though these should not be used for the Me2Me case // Continue windows, though these should not be used for the Me2Me case
// (crbug.com/104377). // (crbug.com/104377).
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_init();
#else
gtk_init(nullptr, nullptr); gtk_init(nullptr, nullptr);
#endif
} }
// Need to prime the host OS version value for linux to prevent IO on the // Need to prime the host OS version value for linux to prevent IO on the
......
...@@ -28,7 +28,11 @@ int main(int argc, const char** argv) { ...@@ -28,7 +28,11 @@ int main(int argc, const char** argv) {
// Required for any calls into GTK functions, such as the Disconnect and // Required for any calls into GTK functions, such as the Disconnect and
// Continue windows. Calling with nullptr arguments because we don't have // Continue windows. Calling with nullptr arguments because we don't have
// any command line arguments for gtk to consume. // any command line arguments for gtk to consume.
#if GTK_CHECK_VERSION(3, 90, 0)
gtk_init();
#else
gtk_init(nullptr, nullptr); gtk_init(nullptr, nullptr);
#endif
// Need to prime the host OS version value for linux to prevent IO on the // Need to prime the host OS version value for linux to prevent IO on the
// network thread. base::GetLinuxDistro() caches the result. // network thread. base::GetLinuxDistro() caches the result.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment