diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-05-19 17:48:22 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-05-19 17:48:22 +0200 |
commit | 85e7fa7f9a002e7c0708af7a99d165a23753ecf4 (patch) | |
tree | c6c1ab0973a595e26f3f29f9b88a5602ed1138d9 /src/core/ozone | |
parent | b2e11595e167fd51095720af286eb21447f80d20 (diff) | |
parent | 8f7e7cfb75f821c802ed4189530f675608507ba8 (diff) |
Merge remote-tracking branch 'origin/5.15' into dev
Conflicts:
src/core/render_widget_host_view_qt.cpp
Change-Id: I86113b13bb2d8419e9e9a485197f02b2c7399cd4
Diffstat (limited to 'src/core/ozone')
-rw-r--r-- | src/core/ozone/BUILD.gn | 5 | ||||
-rw-r--r-- | src/core/ozone/ozone_platform_qt.cpp | 71 |
2 files changed, 76 insertions, 0 deletions
diff --git a/src/core/ozone/BUILD.gn b/src/core/ozone/BUILD.gn index 4d27f8877..a01728842 100644 --- a/src/core/ozone/BUILD.gn +++ b/src/core/ozone/BUILD.gn @@ -1,6 +1,7 @@ # Copyright 2016 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. +import("//ui/base/ui_features.gni") source_set("qt") { sources = [ @@ -18,4 +19,8 @@ source_set("qt") { ] defines = [ "OZONE_IMPLEMENTATION" ] + + if (use_xkbcommon && use_x11) { + libs = [ "xkbfile" ] + } } diff --git a/src/core/ozone/ozone_platform_qt.cpp b/src/core/ozone/ozone_platform_qt.cpp index 9db5b9986..c547cf783 100644 --- a/src/core/ozone/ozone_platform_qt.cpp +++ b/src/core/ozone/ozone_platform_qt.cpp @@ -40,9 +40,12 @@ #include "ozone_platform_qt.h" #if defined(USE_OZONE) +#include "ui/base/buildflags.h" #include "ui/base/cursor/ozone/bitmap_cursor_factory_ozone.h" #include "ui/base/ime/input_method.h" #include "ui/display/types/native_display_delegate.h" +#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h" +#include "ui/events/ozone/layout/stub/stub_keyboard_layout_engine.h" #include "ui/ozone/common/stub_client_native_pixmap_factory.h" #include "ui/ozone/common/stub_overlay_manager.h" #include "ui/ozone/public/gpu_platform_support_host.h" @@ -56,6 +59,16 @@ #include "surface_factory_qt.h" #include "platform_window_qt.h" +#if BUILDFLAG(USE_XKBCOMMON) && defined(USE_X11) +#include "ui/events/ozone/layout/xkb/xkb_evdev_codes.h" +#include "ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h" + +#include <X11/XKBlib.h> +#include <X11/extensions/XKBrules.h> + +extern void *GetQtXDisplay(); +#endif // BUILDFLAG(USE_XKBCOMMON) && defined(USE_X11) + namespace ui { namespace { @@ -86,6 +99,11 @@ private: std::unique_ptr<InputController> input_controller_; std::unique_ptr<OverlayManagerOzone> overlay_manager_; +#if BUILDFLAG(USE_XKBCOMMON) && defined(USE_X11) + XkbEvdevCodes m_xkbEvdevCodeConverter; +#endif + std::unique_ptr<KeyboardLayoutEngine> m_keyboardLayoutEngine; + DISALLOW_COPY_AND_ASSIGN(OzonePlatformQt); }; @@ -135,12 +153,65 @@ std::unique_ptr<display::NativeDisplayDelegate> OzonePlatformQt::CreateNativeDis return nullptr; } +#if BUILDFLAG(USE_XKBCOMMON) && defined(USE_X11) +static std::string getCurrentKeyboardLayout() +{ + Display *dpy = static_cast<Display *>(GetQtXDisplay()); + if (dpy == nullptr) + return std::string(); + + XkbStateRec state; + if (XkbGetState(dpy, XkbUseCoreKbd, &state) != 0) + return std::string(); + + XkbRF_VarDefsRec vdr; + if (XkbRF_GetNamesProp(dpy, nullptr, &vdr) == 0) + return std::string(); + + char *layout = strtok(vdr.layout, ","); + for (int i = 0; i < state.group; i++) { + layout = strtok(nullptr, ","); + if (layout == nullptr) + return std::string(); + } + + char *variant = strtok(vdr.variant, ","); + if (!variant) + return layout; + + for (int i = 0; i < state.group; i++) { + variant = strtok(nullptr, ","); + if (variant == nullptr) + return layout; + } + + std::string layoutWithVariant = layout; + layoutWithVariant = layoutWithVariant.append("-"); + layoutWithVariant = layoutWithVariant.append(variant); + return layoutWithVariant; +} +#endif // BUILDFLAG(USE_XKBCOMMON) && defined(USE_X11) + void OzonePlatformQt::InitializeUI(const ui::OzonePlatform::InitParams &) { overlay_manager_.reset(new StubOverlayManager()); cursor_factory_ozone_.reset(new BitmapCursorFactoryOzone()); gpu_platform_support_host_.reset(ui::CreateStubGpuPlatformSupportHost()); input_controller_ = CreateStubInputController(); + +#if BUILDFLAG(USE_XKBCOMMON) && defined(USE_X11) + std::string layout = getCurrentKeyboardLayout(); + if (layout.empty()) { + m_keyboardLayoutEngine = std::make_unique<StubKeyboardLayoutEngine>(); + } else { + m_keyboardLayoutEngine = std::make_unique<XkbKeyboardLayoutEngine>(m_xkbEvdevCodeConverter); + m_keyboardLayoutEngine->SetCurrentLayoutByName(layout); + } +#else + m_keyboardLayoutEngine = std::make_unique<StubKeyboardLayoutEngine>(); +#endif // BUILDFLAG(USE_XKBCOMMON) && defined(USE_X11) + + KeyboardLayoutEngineManager::SetKeyboardLayoutEngine(m_keyboardLayoutEngine.get()); } void OzonePlatformQt::InitializeGPU(const ui::OzonePlatform::InitParams &) |