- Notifications
You must be signed in to change notification settings - Fork 31.8k
/
Copy pathzoomheight.py
124 lines (95 loc) · 4.1 KB
/
zoomheight.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
"Zoom a window to maximum height."
importre
importsys
importtkinter
classWmInfoGatheringError(Exception):
pass
classZoomHeight:
# Cached values for maximized window dimensions, one for each set
# of screen dimensions.
_max_height_and_y_coords= {}
def__init__(self, editwin):
self.editwin=editwin
self.top=self.editwin.top
defzoom_height_event(self, event=None):
zoomed=self.zoom_height()
ifzoomedisNone:
self.top.bell()
else:
menu_status='Restore'ifzoomedelse'Zoom'
self.editwin.update_menu_label(menu='options', index='* Height',
label=f'{menu_status} Height')
return"break"
defzoom_height(self):
top=self.top
width, height, x, y=get_window_geometry(top)
iftop.wm_state() !='normal':
# Can't zoom/restore window height for windows not in the 'normal'
# state, e.g. maximized and full-screen windows.
returnNone
try:
maxheight, maxy=self.get_max_height_and_y_coord()
exceptWmInfoGatheringError:
returnNone
ifheight!=maxheight:
# Maximize the window's height.
set_window_geometry(top, (width, maxheight, x, maxy))
returnTrue
else:
# Restore the window's height.
#
# .wm_geometry('') makes the window revert to the size requested
# by the widgets it contains.
top.wm_geometry('')
returnFalse
defget_max_height_and_y_coord(self):
top=self.top
screen_dimensions= (top.winfo_screenwidth(),
top.winfo_screenheight())
ifscreen_dimensionsnotinself._max_height_and_y_coords:
orig_state=top.wm_state()
# Get window geometry info for maximized windows.
try:
top.wm_state('zoomed')
excepttkinter.TclError:
# The 'zoomed' state is not supported by some esoteric WMs,
# such as Xvfb.
raiseWmInfoGatheringError(
'Failed getting geometry of maximized windows, because '+
'the "zoomed" window state is unavailable.')
top.update()
maxwidth, maxheight, maxx, maxy=get_window_geometry(top)
ifsys.platform=='win32':
# On Windows, the returned Y coordinate is the one before
# maximizing, so we use 0 which is correct unless a user puts
# their dock on the top of the screen (very rare).
maxy=0
maxrooty=top.winfo_rooty()
# Get the "root y" coordinate for non-maximized windows with their
# y coordinate set to that of maximized windows. This is needed
# to properly handle different title bar heights for non-maximized
# vs. maximized windows, as seen e.g. in Windows 10.
top.wm_state('normal')
top.update()
orig_geom=get_window_geometry(top)
max_y_geom=orig_geom[:3] + (maxy,)
set_window_geometry(top, max_y_geom)
top.update()
max_y_geom_rooty=top.winfo_rooty()
# Adjust the maximum window height to account for the different
# title bar heights of non-maximized vs. maximized windows.
maxheight+=maxrooty-max_y_geom_rooty
self._max_height_and_y_coords[screen_dimensions] =maxheight, maxy
set_window_geometry(top, orig_geom)
top.wm_state(orig_state)
returnself._max_height_and_y_coords[screen_dimensions]
defget_window_geometry(top):
geom=top.wm_geometry()
m=re.match(r"(\d+)x(\d+)\+(-?\d+)\+(-?\d+)", geom)
returntuple(map(int, m.groups()))
defset_window_geometry(top, geometry):
top.wm_geometry("{:d}x{:d}+{:d}+{:d}".format(*geometry))
if__name__=="__main__":
fromunittestimportmain
main('idlelib.idle_test.test_zoomheight', verbosity=2, exit=False)
# Add htest?