Skip to content

Commit 7e36e90

Browse files
authored
Merge pull request #21406 from meeseeksmachine/auto-backport-of-pr-21212-on-v3.5.x
Backport PR #21212 on branch v3.5.x (Fix set_size_inches on HiDPI and also GTK4)
2 parents c6e4381 + fbf5477 commit 7e36e90

File tree

5 files changed

+19
-16
lines changed

5 files changed

+19
-16
lines changed

lib/matplotlib/backend_bases.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1760,7 +1760,12 @@ def blit(self, bbox=None):
17601760
"""Blit the canvas in bbox (default entire canvas)."""
17611761

17621762
def resize(self, w, h):
1763-
"""Set the canvas size in pixels."""
1763+
"""
1764+
UNUSED: Set the canvas size in pixels.
1765+
1766+
Certain backends may implement a similar method internally, but this is
1767+
not a requirement of, nor is it used by, Matplotlib itself.
1768+
"""
17641769

17651770
def draw_event(self, renderer):
17661771
"""Pass a `DrawEvent` to all functions connected to ``draw_event``."""
@@ -2813,7 +2818,7 @@ def full_screen_toggle(self):
28132818
pass
28142819

28152820
def resize(self, w, h):
2816-
"""For GUI backends, resize the window (in pixels)."""
2821+
"""For GUI backends, resize the window (in physical pixels)."""
28172822

28182823
@_api.deprecated(
28192824
"3.4", alternative="self.canvas.callbacks.process(event.name, event)")

lib/matplotlib/backends/backend_gtk3.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,8 @@ def set_window_title(self, title):
413413

414414
def resize(self, width, height):
415415
"""Set the canvas size in pixels."""
416+
width = int(width / self.canvas.device_pixel_ratio)
417+
height = int(height / self.canvas.device_pixel_ratio)
416418
if self.toolbar:
417419
toolbar_size = self.toolbar.size_request()
418420
height += toolbar_size.height

lib/matplotlib/backends/backend_gtk4.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -374,18 +374,13 @@ def set_window_title(self, title):
374374

375375
def resize(self, width, height):
376376
"""Set the canvas size in pixels."""
377+
width = int(width / self.canvas.device_pixel_ratio)
378+
height = int(height / self.canvas.device_pixel_ratio)
377379
if self.toolbar:
378-
toolbar_size = self.toolbar.size_request()
379-
height += toolbar_size.height
380+
min_size, nat_size = self.toolbar.get_preferred_size()
381+
height += nat_size.height
380382
canvas_size = self.canvas.get_allocation()
381-
if canvas_size.width == canvas_size.height == 1:
382-
# A canvas size of (1, 1) cannot exist in most cases, because
383-
# window decorations would prevent such a small window. This call
384-
# must be before the window has been mapped and widgets have been
385-
# sized, so just change the window's starting size.
386-
self.window.set_default_size(width, height)
387-
else:
388-
self.window.resize(width, height)
383+
self.window.set_default_size(width, height)
389384

390385

391386
class NavigationToolbar2GTK4(_NavigationToolbar2GTK, Gtk.Box):

lib/matplotlib/backends/backend_qt.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -589,8 +589,10 @@ def _get_toolbar(self, canvas, parent):
589589
return toolbar
590590

591591
def resize(self, width, height):
592-
# these are Qt methods so they return sizes in 'virtual' pixels
593-
# so we do not need to worry about dpi scaling here.
592+
# The Qt methods return sizes in 'virtual' pixels so we do need to
593+
# rescale from physical to logical pixels.
594+
width = int(width / self.canvas.device_pixel_ratio)
595+
height = int(height / self.canvas.device_pixel_ratio)
594596
extra_width = self.window.width() - self.canvas.width()
595597
extra_height = self.window.height() - self.canvas.height()
596598
self.canvas.resize(width, height)

lib/matplotlib/figure.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2657,10 +2657,9 @@ def set_size_inches(self, w, h=None, forward=True):
26572657
if forward:
26582658
canvas = getattr(self, 'canvas')
26592659
if canvas is not None:
2660-
dpi_ratio = getattr(canvas, '_dpi_ratio', 1)
26612660
manager = getattr(canvas, 'manager', None)
26622661
if manager is not None:
2663-
manager.resize(*(size * self.dpi / dpi_ratio).astype(int))
2662+
manager.resize(*(size * self.dpi).astype(int))
26642663
self.stale = True
26652664

26662665
def get_size_inches(self):

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy