1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/gtk/wayland/gtk_ui_platform_wayland.h"
#include "base/command_line.h"
#include "base/environment.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/logging.h"
#include "ui/base/glib/glib_cast.h"
#include "ui/base/ui_base_features.h"
#include "ui/events/event_utils.h"
#include "ui/gtk/gtk_compat.h"
#include "ui/gtk/gtk_util.h"
#include "ui/gtk/input_method_context_impl_gtk.h"
#include "ui/linux/linux_ui_delegate.h"
namespace gtk {
GtkUiPlatformWayland::GtkUiPlatformWayland() {
gdk_set_allowed_backends("wayland");
// GDK_BACKEND takes precedence over gdk_set_allowed_backends(), so override
// it to ensure we get the wayland backend.
base::Environment::Create()->SetVar("GDK_BACKEND", "wayland");
}
GtkUiPlatformWayland::~GtkUiPlatformWayland() = default;
void GtkUiPlatformWayland::OnInitialized() {
// Nothing to do upon initialization for Wayland.
}
GdkWindow* GtkUiPlatformWayland::GetGdkWindow(
gfx::AcceleratedWidget window_id) {
NOTIMPLEMENTED_LOG_ONCE();
return nullptr;
}
bool GtkUiPlatformWayland::SetGtkWidgetTransientFor(
GtkWidget* widget,
gfx::AcceleratedWidget parent) {
return ui::LinuxUiDelegate::GetInstance()->ExportWindowHandle(
parent, base::BindOnce(&GtkUiPlatformWayland::OnHandleSetTransient,
weak_factory_.GetWeakPtr(), widget));
}
void GtkUiPlatformWayland::ClearTransientFor(gfx::AcceleratedWidget parent) {
// Nothing to do here.
}
void GtkUiPlatformWayland::ShowGtkWindow(GtkWindow* window) {
// TODO(crbug.com/40650162): Check if gtk_window_present_with_time is needed
// here as well, similarly to what is done in X11 impl.
gtk_window_present(window);
}
void GtkUiPlatformWayland::OnHandleSetTransient(GtkWidget* widget,
const std::string& handle) {
char* parent = const_cast<char*>(handle.c_str());
if (gtk::GtkCheckVersion(4)) {
auto* toplevel = GlibCast<GdkToplevel>(
gtk_native_get_surface(gtk_widget_get_native(widget)),
gdk_toplevel_get_type());
gdk_wayland_toplevel_set_transient_for_exported(toplevel, parent);
} else if (gtk::GtkCheckVersion(3, 22)) {
gdk_wayland_window_set_transient_for_exported(gtk_widget_get_window(widget),
parent);
} else {
LOG(WARNING) << "set_transient_for_exported not supported in GTK version "
<< gtk_get_major_version() << '.' << gtk_get_minor_version()
<< '.' << gtk_get_micro_version();
}
}
std::unique_ptr<ui::LinuxInputMethodContext>
GtkUiPlatformWayland::CreateInputMethodContext(
ui::LinuxInputMethodContextDelegate* delegate) const {
// Use text-input-v3 on Wayland.
return nullptr;
}
bool GtkUiPlatformWayland::IncludeFontScaleInDeviceScale() const {
// Assume font scaling will be handled by Ozone/Wayland when WaylandUiScale
// feature is enabled.
return base::FeatureList::IsEnabled(features::kWaylandUiScale);
}
bool GtkUiPlatformWayland::IncludeScaleInCursorSize() const {
return false;
}
} // namespace gtk
|