Skip to content

Commit 623b606

Browse files
committed
Fix browser scaling with Java 9+ (fixes issue chromiumembedded#343)
1 parent bb6c58a commit 623b606

1 file changed

Lines changed: 23 additions & 12 deletions

File tree

java/org/cef/browser/CefBrowserWr.java

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,18 @@
44

55
package org.cef.browser;
66

7+
import org.cef.CefClient;
8+
import org.cef.OS;
9+
import org.cef.handler.CefWindowHandler;
10+
import org.cef.handler.CefWindowHandlerAdapter;
11+
712
import java.awt.BorderLayout;
813
import java.awt.Canvas;
914
import java.awt.Component;
1015
import java.awt.Container;
1116
import java.awt.Dimension;
1217
import java.awt.Graphics;
18+
import java.awt.Graphics2D;
1319
import java.awt.MouseInfo;
1420
import java.awt.Point;
1521
import java.awt.Rectangle;
@@ -33,11 +39,6 @@
3339
import javax.swing.Timer;
3440
import javax.swing.ToolTipManager;
3541

36-
import org.cef.CefClient;
37-
import org.cef.OS;
38-
import org.cef.handler.CefWindowHandler;
39-
import org.cef.handler.CefWindowHandlerAdapter;
40-
4142
/**
4243
* This class represents a windowed rendered browser.
4344
* The visibility of this class is "package". To create a new
@@ -49,14 +50,14 @@ class CefBrowserWr extends CefBrowser_N {
4950
private Rectangle content_rect_ = new Rectangle(0, 0, 0, 0);
5051
private long window_handle_ = 0;
5152
private boolean justCreated_ = false;
53+
private double scaleFactor_ = 1.0;
5254
private Timer delayedUpdate_ = new Timer(100, new ActionListener() {
5355
@Override
5456
public void actionPerformed(ActionEvent e) {
5557
SwingUtilities.invokeLater(new Runnable() {
5658
@Override
5759
public void run() {
58-
if (isClosed())
59-
return;
60+
if (isClosed()) return;
6061

6162
boolean hasCreatedUI = createBrowserIfRequired(true);
6263

@@ -149,7 +150,7 @@ public int getClickCount(int event, int button) {
149150
if (currTime > nextClick[idx]) {
150151
nextClick[idx] = currTime
151152
+ (Integer) Toolkit.getDefaultToolkit().getDesktopProperty(
152-
"awt.multiClickInterval");
153+
"awt.multiClickInterval");
153154
clickCnt[idx] = 1;
154155
} else {
155156
clickCnt[idx]++;
@@ -186,7 +187,7 @@ private CefBrowserWr(CefClient client, String url, CefRequestContext context,
186187
@Override
187188
public void setBounds(int x, int y, int width, int height) {
188189
super.setBounds(x, y, width, height);
189-
wasResized(width, height);
190+
wasResized((int) (width * scaleFactor_), (int) (height * scaleFactor_));
190191
}
191192

192193
@Override
@@ -197,7 +198,7 @@ public void setBounds(Rectangle r) {
197198
@Override
198199
public void setSize(int width, int height) {
199200
super.setSize(width, height);
200-
wasResized(width, height);
201+
wasResized((int) (width * scaleFactor_), (int) (height * scaleFactor_));
201202
}
202203

203204
@Override
@@ -215,6 +216,9 @@ public void paint(Graphics g) {
215216
// we're setting up a delayedUpdate timer which is reset each time
216217
// paint is called. This prevents the us of sending the UI update too
217218
// often.
219+
if (g instanceof Graphics2D) {
220+
scaleFactor_ = ((Graphics2D) g).getTransform().getScaleX();
221+
}
218222
doUpdate();
219223
delayedUpdate_.restart();
220224
}
@@ -344,7 +348,10 @@ private static long getWindowHandle(Component component) {
344348
private void doUpdate() {
345349
if (isClosed()) return;
346350

347-
Rectangle clipping = ((JPanel) component_).getVisibleRect();
351+
Rectangle vr = ((JPanel) component_).getVisibleRect();
352+
Rectangle clipping = new Rectangle((int) (vr.getX() * scaleFactor_),
353+
(int) (vr.getY() * scaleFactor_), (int) (vr.getWidth() * scaleFactor_),
354+
(int) (vr.getHeight() * scaleFactor_));
348355

349356
if (OS.isMacintosh()) {
350357
Container parent = component_.getParent();
@@ -369,7 +376,11 @@ private void doUpdate() {
369376
}
370377
} else {
371378
synchronized (content_rect_) {
372-
content_rect_ = component_.getBounds();
379+
Rectangle bounds = component_.getBounds();
380+
content_rect_ = new Rectangle((int) (bounds.getX() * scaleFactor_),
381+
(int) (bounds.getY() * scaleFactor_),
382+
(int) (bounds.getWidth() * scaleFactor_),
383+
(int) (bounds.getHeight() * scaleFactor_));
373384
updateUI(clipping, content_rect_);
374385
}
375386
}

0 commit comments

Comments
 (0)