Skip to content

Commit

Permalink
Scale IME position by hidpi_factor
Browse files Browse the repository at this point in the history
Since the IME was positioned using physical coordinates,
the location would be incorrect with monitors using a DPR
other than 1.0.

This has been resolved by converting the physical position
to a logical position using the methods built into winit.

Fixes #2056.
  • Loading branch information
awused authored and chrisduerr committed Feb 5, 2019
1 parent 851e773 commit 879ea05
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 11 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Remove error message when reloading an empty config
- Allow disabling URL launching by setting the value of `mouse.url.launcher` to `None`
- Corrected the `window.decorations` config documentation for macOS
- Fix IME position on HiDPI displays

## Version 0.2.7

Expand Down
26 changes: 15 additions & 11 deletions src/display.rs
Expand Up @@ -18,7 +18,7 @@ use std::sync::mpsc;
use std::f64;

use parking_lot::MutexGuard;
use glutin::dpi::{LogicalPosition, PhysicalSize};
use glutin::dpi::{PhysicalPosition, PhysicalSize};

use crate::cli;
use crate::config::Config;
Expand Down Expand Up @@ -488,15 +488,19 @@ impl Display {

/// Adjust the IME editor position according to the new location of the cursor
pub fn update_ime_position(&mut self, terminal: &Term) {
use crate::index::{Column, Line, Point};
use crate::term::SizeInfo;
let Point{line: Line(row), col: Column(col)} = terminal.cursor().point;
let SizeInfo{cell_width: cw,
cell_height: ch,
padding_x: px,
padding_y: py, ..} = *terminal.size_info();
let nspot_y = (py + (row + 1) as f32 * ch) as i32;
let nspot_x = (px + col as f32 * cw) as i32;
self.window().set_ime_spot(LogicalPosition::from((nspot_x, nspot_y)));
let point = terminal.cursor().point;
let SizeInfo {
cell_width: cw,
cell_height: ch,
padding_x: px,
padding_y: py,
..
} = *terminal.size_info();

let dpr = self.window().hidpi_factor();
let nspot_x = f64::from(px + point.col.0 as f32 * cw);
let nspot_y = f64::from(py + (point.line.0 + 1) as f32 * ch);

self.window().set_ime_spot(PhysicalPosition::from((nspot_x, nspot_y)).to_logical(dpr));
}
}

0 comments on commit 879ea05

Please sign in to comment.