Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Backports:SLE-15-SP4:FactoryCandidates
mozc
ibus-mozc-candidate-window-qt-virtual-coordinat...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File ibus-mozc-candidate-window-qt-virtual-coordinate.patch of Package mozc
diff --git a/src/renderer/qt/qt_window_manager.cc b/src/renderer/qt/qt_window_manager.cc index 0aceecce6..5c8662b1f 100644 --- a/src/renderer/qt/qt_window_manager.cc +++ b/src/renderer/qt/qt_window_manager.cc @@ -32,9 +32,9 @@ #include <algorithm> #include <string> +#include "absl/strings/str_cat.h" #include "base/logging.h" #include "protocol/candidates.pb.h" -#include "absl/strings/str_cat.h" #include "renderer/renderer_style_handler.h" #include "renderer/window_util.h" @@ -341,16 +341,53 @@ void FillCandidates(const commands::Candidates &candidates, } } // namespace +struct VirtualRect { + const QScreen* screen; + const Rect rect; + + VirtualRect(const QScreen* screen, const Rect rect): screen(screen), rect(rect) {} +}; + +Rect TranslateToVirtualRectWithScreen(const QScreen *screen, const Rect& native_rect) { + const double device_pixel_ratio = screen->devicePixelRatio(); + // screen_left, screen_top have the save value in both virtual and native coordinate + const int screen_left = screen->geometry().x(); + const int screen_top = screen->geometry().y(); + const int vx = (native_rect.Left() - screen_left) / device_pixel_ratio + screen_left; + const int vy = (native_rect.Top() - screen_top) / device_pixel_ratio + screen_top; + + return Rect(vx, vy, native_rect.Width() / device_pixel_ratio, native_rect.Height() / device_pixel_ratio); +} + +VirtualRect TranslateToVirtualRect(const Rect& native_rect) { + for (const QScreen *screen: QGuiApplication::screens()) { + Rect rect = TranslateToVirtualRectWithScreen(screen, native_rect); + const QRect screen_rect = screen->geometry(); + + // Use (top left) to locate a screen + if (screen_rect.contains(rect.Left(), rect.Top())) { + return VirtualRect(screen, rect); + } + } + + // fall back to primary screen + const QScreen *screen = QGuiApplication::primaryScreen(); + Rect point = TranslateToVirtualRectWithScreen(screen, native_rect); + return VirtualRect(screen, point); +} + Point QtWindowManager::GetWindowPosition( const commands::RendererCommand &command, const Size &win_size) { - const Rect preedit_rect = GetRect(command.preedit_rectangle()); - const Point win_pos = Point(preedit_rect.Left(), preedit_rect.Bottom()); - const Rect monitor_rect = GetMonitorRect(win_pos.x, win_pos.y); + + const Rect native_preedit_rect = GetRect(command.preedit_rectangle()); + const VirtualRect preedit_rect = TranslateToVirtualRect(native_preedit_rect); + const Point win_pos = Point(preedit_rect.rect.Left(), preedit_rect.rect.Bottom()); + const Rect monitor_rect = GetRect(preedit_rect.screen->geometry()); const Point offset_to_column1(kColumn0Width, 0); const Rect adjusted_win_geometry = WindowUtil::GetWindowRectForMainWindowFromTargetPointAndPreedit( - win_pos, preedit_rect, win_size, offset_to_column1, monitor_rect, + win_pos, preedit_rect.rect, win_size, offset_to_column1, monitor_rect, /* vertical */ false); // Only support horizontal window yet. return adjusted_win_geometry.origin; }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor