Merge ~3v1n0/ubuntu/+source/mutter:ubuntu/master into ~ubuntu-desktop/ubuntu/+source/mutter:ubuntu/master
- Git
- lp:~3v1n0/ubuntu/+source/mutter
- ubuntu/master
- Merge into ubuntu/master
Proposed by
Marco Trevisan (Treviño)
Status: | Merged |
---|---|
Merged at revision: | de028410be38c2ee6140f90da0b24c10f91b5fe4 |
Proposed branch: | ~3v1n0/ubuntu/+source/mutter:ubuntu/master |
Merge into: | ~ubuntu-desktop/ubuntu/+source/mutter:ubuntu/master |
Diff against target: |
810 lines (+111/-344) 2 files modified
debian/changelog (+8/-0) debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch (+103/-344) |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Daniel van Vugt (community) | Approve | ||
Ubuntu Desktop | Pending | ||
Review via email: mp+365502@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
Marco Trevisan (Treviño) (3v1n0) wrote : | # |
> Although it's never easy to read the diff-of-a-diff, the fact that the patch
> is shrinking is also good.
In such cases I suggest you to fetch the ubuntu-desktop ubuntu/master branch and do:
gbp pq import
Fetch my branch locally (say you call it marco-ubuntu), and there again
gbp pq import
Then you can easily diff things with
git diff patch-queue/
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | diff --git a/debian/changelog b/debian/changelog | |||
2 | index d096e50..67c17c0 100644 | |||
3 | --- a/debian/changelog | |||
4 | +++ b/debian/changelog | |||
5 | @@ -1,3 +1,11 @@ | |||
6 | 1 | mutter (3.32.0-1ubuntu2) UNRELEASED; urgency=medium | ||
7 | 2 | |||
8 | 3 | * debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch: | ||
9 | 4 | - Don't invert the screen size when rotation is enabled (LP: #1822513) | ||
10 | 5 | - Remove unneeded cleanup changes | ||
11 | 6 | |||
12 | 7 | -- Marco Trevisan (Treviño) <marco@ubuntu.com> Wed, 03 Apr 2019 19:19:59 -0400 | ||
13 | 8 | |||
14 | 1 | mutter (3.32.0-1ubuntu1) disco; urgency=medium | 9 | mutter (3.32.0-1ubuntu1) disco; urgency=medium |
15 | 2 | 10 | ||
16 | 3 | * debian/control: | 11 | * debian/control: |
17 | diff --git a/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch b/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch | |||
18 | index 987f4f9..ea6c35f 100644 | |||
19 | --- a/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch | |||
20 | +++ b/debian/patches/x11-Add-support-for-fractional-scaling-using-Randr.patch | |||
21 | @@ -1,19 +1,25 @@ | |||
25 | 1 | From: =?utf-8?b?Ik1hcmNvIFRyZXZpc2FuIChUcmV2acOxbyki?= <mail@3v1n0.net> | 1 | From: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> |
26 | 2 | Date: Wed, 27 Mar 2019 06:44:56 +0100 | 2 | Date: Wed, 3 Apr 2019 19:18:03 -0400 |
27 | 3 | Subject: X11: Add support for fractional scaling using Randr | 3 | Subject: x11-Add-support-for-fractional-scaling-using-Randr |
28 | 4 | MIME-Version: 1.0 | ||
29 | 5 | Content-Type: text/plain; charset="utf-8" | ||
30 | 6 | Content-Transfer-Encoding: 8bit | ||
31 | 7 | |||
32 | 8 | commit ed760c44b1998fc5fadde18186c51e74525038cc | ||
33 | 9 | Author: Marco Trevisan (Treviño) <mail@3v1n0.net> | ||
34 | 10 | Date: Wed Apr 3 18:57:28 2019 -0400 | ||
35 | 4 | 11 | ||
36 | 5 | Add scaling support using randr under x11. | 12 | Add scaling support using randr under x11. |
37 | 6 | 13 | ||
38 | 14 | Origin: https://gitlab.gnome.org/3v1n0/mutter/commits/xrandr-scaling | ||
39 | 7 | Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/mutter/+bug/1820850 | 15 | Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/mutter/+bug/1820850 |
40 | 8 | Forwarded: No, forwarding is in progress and planned though | 16 | Forwarded: No, forwarding is in progress and planned though |
41 | 9 | --- | 17 | --- |
42 | 10 | data/meson.build | 7 + | 18 | data/meson.build | 7 + |
43 | 11 | data/org.gnome.mutter.gschema.xml.in | 5 + | 19 | data/org.gnome.mutter.gschema.xml.in | 5 + |
44 | 12 | data/org.gnome.mutter.x11.gschema.xml.in | 30 ++ | 20 | data/org.gnome.mutter.x11.gschema.xml.in | 30 ++ |
45 | 13 | meson.build | 2 +- | ||
46 | 14 | src/backends/meta-crtc.h | 1 + | 21 | src/backends/meta-crtc.h | 1 + |
49 | 15 | src/backends/meta-logical-monitor.c | 36 +-- | 22 | src/backends/meta-monitor-config-manager.c | 150 +++++++++- |
48 | 16 | src/backends/meta-monitor-config-manager.c | 150 ++++++++- | ||
50 | 17 | src/backends/meta-monitor-config-migration.c | 15 +- | 23 | src/backends/meta-monitor-config-migration.c | 15 +- |
51 | 18 | src/backends/meta-monitor-config-store.c | 1 + | 24 | src/backends/meta-monitor-config-store.c | 1 + |
52 | 19 | src/backends/meta-monitor-manager-dummy.c | 24 +- | 25 | src/backends/meta-monitor-manager-dummy.c | 24 +- |
53 | @@ -22,26 +28,22 @@ Forwarded: No, forwarding is in progress and planned though | |||
54 | 22 | src/backends/meta-monitor.c | 60 ++-- | 28 | src/backends/meta-monitor.c | 60 ++-- |
55 | 23 | src/backends/meta-monitor.h | 6 +- | 29 | src/backends/meta-monitor.h | 6 +- |
56 | 24 | src/backends/meta-settings-private.h | 9 + | 30 | src/backends/meta-settings-private.h | 9 + |
58 | 25 | src/backends/meta-settings.c | 80 ++++- | 31 | src/backends/meta-settings.c | 76 ++++- |
59 | 26 | src/backends/native/meta-monitor-manager-kms.c | 44 ++- | 32 | src/backends/native/meta-monitor-manager-kms.c | 44 ++- |
60 | 27 | src/backends/x11/meta-crtc-xrandr.c | 87 +++++- | 33 | src/backends/x11/meta-crtc-xrandr.c | 87 +++++- |
61 | 28 | src/backends/x11/meta-crtc-xrandr.h | 13 +- | 34 | src/backends/x11/meta-crtc-xrandr.h | 13 +- |
62 | 29 | src/backends/x11/meta-gpu-xrandr.c | 89 +++++- | 35 | src/backends/x11/meta-gpu-xrandr.c | 89 +++++- |
63 | 30 | src/backends/x11/meta-gpu-xrandr.h | 4 + | 36 | src/backends/x11/meta-gpu-xrandr.h | 4 + |
65 | 31 | src/backends/x11/meta-monitor-manager-xrandr.c | 407 +++++++++++++++++-------- | 37 | src/backends/x11/meta-monitor-manager-xrandr.c | 399 +++++++++++++++++-------- |
66 | 32 | src/backends/x11/meta-monitor-manager-xrandr.h | 4 +- | 38 | src/backends/x11/meta-monitor-manager-xrandr.h | 4 +- |
67 | 33 | src/backends/x11/meta-output-xrandr.c | 5 +- | 39 | src/backends/x11/meta-output-xrandr.c | 5 +- |
73 | 34 | src/compositor/compositor-private.h | 2 + | 40 | src/compositor/compositor.c | 54 ++++ |
74 | 35 | src/compositor/compositor.c | 96 +++++- | 41 | src/core/boxes-private.h | 4 + |
75 | 36 | src/core/boxes-private.h | 8 + | 42 | src/core/boxes.c | 21 ++ |
71 | 37 | src/core/boxes.c | 53 ++++ | ||
72 | 38 | src/core/display.c | 3 +- | ||
76 | 39 | src/core/window.c | 19 ++ | 43 | src/core/window.c | 19 ++ |
77 | 40 | src/meta/compositor.h | 5 + | ||
78 | 41 | src/meta/display.h | 8 +- | ||
79 | 42 | src/org.gnome.Mutter.DisplayConfig.xml | 5 + | 44 | src/org.gnome.Mutter.DisplayConfig.xml | 5 + |
80 | 43 | src/tests/meta-monitor-manager-test.c | 14 +- | 45 | src/tests/meta-monitor-manager-test.c | 14 +- |
82 | 44 | 34 files changed, 1366 insertions(+), 303 deletions(-) | 46 | 28 files changed, 1269 insertions(+), 254 deletions(-) |
83 | 45 | create mode 100644 data/org.gnome.mutter.x11.gschema.xml.in | 47 | create mode 100644 data/org.gnome.mutter.x11.gschema.xml.in |
84 | 46 | 48 | ||
85 | 47 | diff --git a/data/meson.build b/data/meson.build | 49 | diff --git a/data/meson.build b/data/meson.build |
86 | @@ -114,19 +116,6 @@ index 0000000..3696659 | |||
87 | 114 | + </schema> | 116 | + </schema> |
88 | 115 | + | 117 | + |
89 | 116 | +</schemalist> | 118 | +</schemalist> |
90 | 117 | diff --git a/meson.build b/meson.build | ||
91 | 118 | index cafbde4..afcbd31 100644 | ||
92 | 119 | --- a/meson.build | ||
93 | 120 | +++ b/meson.build | ||
94 | 121 | @@ -9,7 +9,7 @@ mutter_plugin_api_version = '3' | ||
95 | 122 | libmutter_api_version = '4' | ||
96 | 123 | |||
97 | 124 | # generic version requirements | ||
98 | 125 | -glib_req = '>= 2.53.2' | ||
99 | 126 | +glib_req = '>= 2.56' | ||
100 | 127 | gi_req = '>= 0.9.5' | ||
101 | 128 | gtk3_req = '>= 3.19.8' | ||
102 | 129 | gdk_pixbuf_req = '>= 2.0' | ||
103 | 130 | diff --git a/src/backends/meta-crtc.h b/src/backends/meta-crtc.h | 119 | diff --git a/src/backends/meta-crtc.h b/src/backends/meta-crtc.h |
104 | 131 | index ddacfea..8d16455 100644 | 120 | index ddacfea..8d16455 100644 |
105 | 132 | --- a/src/backends/meta-crtc.h | 121 | --- a/src/backends/meta-crtc.h |
106 | @@ -139,58 +128,6 @@ index ddacfea..8d16455 100644 | |||
107 | 139 | 128 | ||
108 | 140 | MetaLogicalMonitor *logical_monitor; | 129 | MetaLogicalMonitor *logical_monitor; |
109 | 141 | 130 | ||
110 | 142 | diff --git a/src/backends/meta-logical-monitor.c b/src/backends/meta-logical-monitor.c | ||
111 | 143 | index 99a35f7..a2d8f41 100644 | ||
112 | 144 | --- a/src/backends/meta-logical-monitor.c | ||
113 | 145 | +++ b/src/backends/meta-logical-monitor.c | ||
114 | 146 | @@ -45,6 +45,7 @@ | ||
115 | 147 | #include "backends/meta-backend-private.h" | ||
116 | 148 | #include "backends/meta-crtc.h" | ||
117 | 149 | #include "backends/meta-output.h" | ||
118 | 150 | +#include "core/boxes-private.h" | ||
119 | 151 | |||
120 | 152 | G_DEFINE_TYPE (MetaLogicalMonitor, meta_logical_monitor, G_TYPE_OBJECT) | ||
121 | 153 | |||
122 | 154 | @@ -302,37 +303,6 @@ meta_logical_monitor_has_neighbor (MetaLogicalMonitor *logical_monitor, | ||
123 | 155 | MetaLogicalMonitor *neighbor, | ||
124 | 156 | MetaDisplayDirection neighbor_direction) | ||
125 | 157 | { | ||
126 | 158 | - switch (neighbor_direction) | ||
127 | 159 | - { | ||
128 | 160 | - case META_DISPLAY_RIGHT: | ||
129 | 161 | - if (neighbor->rect.x == (logical_monitor->rect.x + | ||
130 | 162 | - logical_monitor->rect.width) && | ||
131 | 163 | - meta_rectangle_vert_overlap (&neighbor->rect, | ||
132 | 164 | - &logical_monitor->rect)) | ||
133 | 165 | - return TRUE; | ||
134 | 166 | - break; | ||
135 | 167 | - case META_DISPLAY_LEFT: | ||
136 | 168 | - if (logical_monitor->rect.x == (neighbor->rect.x + | ||
137 | 169 | - neighbor->rect.width) && | ||
138 | 170 | - meta_rectangle_vert_overlap (&neighbor->rect, | ||
139 | 171 | - &logical_monitor->rect)) | ||
140 | 172 | - return TRUE; | ||
141 | 173 | - break; | ||
142 | 174 | - case META_DISPLAY_UP: | ||
143 | 175 | - if (logical_monitor->rect.y == (neighbor->rect.y + | ||
144 | 176 | - neighbor->rect.height) && | ||
145 | 177 | - meta_rectangle_horiz_overlap (&neighbor->rect, | ||
146 | 178 | - &logical_monitor->rect)) | ||
147 | 179 | - return TRUE; | ||
148 | 180 | - break; | ||
149 | 181 | - case META_DISPLAY_DOWN: | ||
150 | 182 | - if (neighbor->rect.y == (logical_monitor->rect.y + | ||
151 | 183 | - logical_monitor->rect.height) && | ||
152 | 184 | - meta_rectangle_horiz_overlap (&neighbor->rect, | ||
153 | 185 | - &logical_monitor->rect)) | ||
154 | 186 | - return TRUE; | ||
155 | 187 | - break; | ||
156 | 188 | - } | ||
157 | 189 | - | ||
158 | 190 | - return FALSE; | ||
159 | 191 | + return meta_rectangle_has_neighbor (&logical_monitor->rect, &neighbor->rect, | ||
160 | 192 | + (MetaSide) neighbor_direction); | ||
161 | 193 | } | ||
162 | 194 | diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c | 131 | diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c |
163 | 195 | index 771c57f..5d620a3 100644 | 132 | index 771c57f..5d620a3 100644 |
164 | 196 | --- a/src/backends/meta-monitor-config-manager.c | 133 | --- a/src/backends/meta-monitor-config-manager.c |
165 | @@ -774,7 +711,7 @@ index 3b951c6..3b375a0 100644 | |||
166 | 774 | meta_monitor_manager_get_capabilities (MetaMonitorManager *manager); | 711 | meta_monitor_manager_get_capabilities (MetaMonitorManager *manager); |
167 | 775 | 712 | ||
168 | 776 | diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c | 713 | diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c |
170 | 777 | index c4ed245..7cb3415 100644 | 714 | index c4ed245..8b5b983 100644 |
171 | 778 | --- a/src/backends/meta-monitor-manager.c | 715 | --- a/src/backends/meta-monitor-manager.c |
172 | 779 | +++ b/src/backends/meta-monitor-manager.c | 716 | +++ b/src/backends/meta-monitor-manager.c |
173 | 780 | @@ -104,8 +104,18 @@ static gboolean | 717 | @@ -104,8 +104,18 @@ static gboolean |
174 | @@ -1196,7 +1133,7 @@ index c4ed245..7cb3415 100644 | |||
175 | 1196 | + { | 1133 | + { |
176 | 1197 | + MetaLogicalMonitorConfig *logical_monitor_config = l->data; | 1134 | + MetaLogicalMonitorConfig *logical_monitor_config = l->data; |
177 | 1198 | + | 1135 | + |
179 | 1199 | + if (logical_monitor_config->scale != scale) | 1136 | + if (fabs (logical_monitor_config->scale - scale) > FLT_EPSILON) |
180 | 1200 | + return FALSE; | 1137 | + return FALSE; |
181 | 1201 | + } | 1138 | + } |
182 | 1202 | + | 1139 | + |
183 | @@ -1509,7 +1446,7 @@ index 619de17..8d20b88 100644 | |||
184 | 1509 | 1446 | ||
185 | 1510 | #endif /* META_SETTINGS_PRIVATE_H */ | 1447 | #endif /* META_SETTINGS_PRIVATE_H */ |
186 | 1511 | diff --git a/src/backends/meta-settings.c b/src/backends/meta-settings.c | 1448 | diff --git a/src/backends/meta-settings.c b/src/backends/meta-settings.c |
188 | 1512 | index 34d49b3..52c6632 100644 | 1449 | index 34d49b3..e54317e 100644 |
189 | 1513 | --- a/src/backends/meta-settings.c | 1450 | --- a/src/backends/meta-settings.c |
190 | 1514 | +++ b/src/backends/meta-settings.c | 1451 | +++ b/src/backends/meta-settings.c |
191 | 1515 | @@ -40,6 +40,7 @@ enum | 1452 | @@ -40,6 +40,7 @@ enum |
192 | @@ -1537,7 +1474,7 @@ index 34d49b3..52c6632 100644 | |||
193 | 1537 | }; | 1474 | }; |
194 | 1538 | 1475 | ||
195 | 1539 | G_DEFINE_TYPE (MetaSettings, meta_settings, G_TYPE_OBJECT) | 1476 | G_DEFINE_TYPE (MetaSettings, meta_settings, G_TYPE_OBJECT) |
197 | 1540 | @@ -77,14 +81,37 @@ calculate_ui_scaling_factor (MetaSettings *settings) | 1477 | @@ -77,14 +81,33 @@ calculate_ui_scaling_factor (MetaSettings *settings) |
198 | 1541 | { | 1478 | { |
199 | 1542 | MetaMonitorManager *monitor_manager = | 1479 | MetaMonitorManager *monitor_manager = |
200 | 1543 | meta_backend_get_monitor_manager (settings->backend); | 1480 | meta_backend_get_monitor_manager (settings->backend); |
201 | @@ -1547,28 +1484,24 @@ index 34d49b3..52c6632 100644 | |||
202 | 1547 | - meta_monitor_manager_get_primary_logical_monitor (monitor_manager); | 1484 | - meta_monitor_manager_get_primary_logical_monitor (monitor_manager); |
203 | 1548 | - if (!primary_logical_monitor) | 1485 | - if (!primary_logical_monitor) |
204 | 1549 | - return 1; | 1486 | - return 1; |
209 | 1550 | 1487 | + if (!meta_is_wayland_compositor () && | |
210 | 1551 | - return (int) meta_logical_monitor_get_scale (primary_logical_monitor); | 1488 | + (settings->experimental_features & |
211 | 1552 | + if (settings->experimental_features & | 1489 | + META_EXPERIMENTAL_FEATURE_X11_RANDR_FRACTIONAL_SCALING)) |
208 | 1553 | + META_EXPERIMENTAL_FEATURE_X11_RANDR_FRACTIONAL_SCALING) | ||
212 | 1554 | + { | 1490 | + { |
215 | 1555 | + if (settings->x11_scale_mode == META_X11_SCALE_MODE_UP) | 1491 | + float scale = 1; |
214 | 1556 | + return 1; | ||
216 | 1557 | + | 1492 | + |
217 | 1558 | + if (monitor_manager && | 1493 | + if (monitor_manager && |
218 | 1559 | + settings->x11_scale_mode == META_X11_SCALE_MODE_UI_DOWN) | 1494 | + settings->x11_scale_mode == META_X11_SCALE_MODE_UI_DOWN) |
224 | 1560 | + { | 1495 | + scale = |
225 | 1561 | + float max_scale = | 1496 | + ceilf (meta_monitor_manager_get_maximum_crtc_scale (monitor_manager)); |
221 | 1562 | + meta_monitor_manager_get_maximum_crtc_scale (monitor_manager); | ||
222 | 1563 | + return ceilf (max_scale); | ||
223 | 1564 | + } | ||
226 | 1565 | + | 1497 | + |
228 | 1566 | + return 1; | 1498 | + return scale; |
229 | 1567 | + } | 1499 | + } |
230 | 1568 | + else if (monitor_manager) | 1500 | + else if (monitor_manager) |
231 | 1569 | + { | 1501 | + { |
232 | 1570 | + MetaLogicalMonitor *primary_logical_monitor; | 1502 | + MetaLogicalMonitor *primary_logical_monitor; |
234 | 1571 | + | 1503 | |
235 | 1504 | - return (int) meta_logical_monitor_get_scale (primary_logical_monitor); | ||
236 | 1572 | + primary_logical_monitor = | 1505 | + primary_logical_monitor = |
237 | 1573 | + meta_monitor_manager_get_primary_logical_monitor (monitor_manager); | 1506 | + meta_monitor_manager_get_primary_logical_monitor (monitor_manager); |
238 | 1574 | + if (!primary_logical_monitor) | 1507 | + if (!primary_logical_monitor) |
239 | @@ -1581,7 +1514,7 @@ index 34d49b3..52c6632 100644 | |||
240 | 1581 | } | 1514 | } |
241 | 1582 | 1515 | ||
242 | 1583 | static gboolean | 1516 | static gboolean |
244 | 1584 | @@ -264,6 +291,8 @@ experimental_features_handler (GVariant *features_variant, | 1517 | @@ -264,6 +287,8 @@ experimental_features_handler (GVariant *features_variant, |
245 | 1585 | features |= META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER; | 1518 | features |= META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER; |
246 | 1586 | else if (g_str_equal (feature, "kms-modifiers")) | 1519 | else if (g_str_equal (feature, "kms-modifiers")) |
247 | 1587 | features |= META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS; | 1520 | features |= META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS; |
248 | @@ -1590,7 +1523,7 @@ index 34d49b3..52c6632 100644 | |||
249 | 1590 | else | 1523 | else |
250 | 1591 | g_info ("Unknown experimental feature '%s'\n", feature); | 1524 | g_info ("Unknown experimental feature '%s'\n", feature); |
251 | 1592 | } | 1525 | } |
253 | 1593 | @@ -392,6 +421,25 @@ wayland_settings_changed (GSettings *wayland_settings, | 1526 | @@ -392,6 +417,25 @@ wayland_settings_changed (GSettings *wayland_settings, |
254 | 1594 | } | 1527 | } |
255 | 1595 | } | 1528 | } |
256 | 1596 | 1529 | ||
257 | @@ -1616,7 +1549,7 @@ index 34d49b3..52c6632 100644 | |||
258 | 1616 | void | 1549 | void |
259 | 1617 | meta_settings_get_xwayland_grab_patterns (MetaSettings *settings, | 1550 | meta_settings_get_xwayland_grab_patterns (MetaSettings *settings, |
260 | 1618 | GPtrArray **whitelist_patterns, | 1551 | GPtrArray **whitelist_patterns, |
262 | 1619 | @@ -407,6 +455,12 @@ gboolean | 1552 | @@ -407,6 +451,12 @@ gboolean |
263 | 1620 | return (settings->xwayland_allow_grabs); | 1553 | return (settings->xwayland_allow_grabs); |
264 | 1621 | } | 1554 | } |
265 | 1622 | 1555 | ||
266 | @@ -1629,7 +1562,7 @@ index 34d49b3..52c6632 100644 | |||
267 | 1629 | MetaSettings * | 1562 | MetaSettings * |
268 | 1630 | meta_settings_new (MetaBackend *backend) | 1563 | meta_settings_new (MetaBackend *backend) |
269 | 1631 | { | 1564 | { |
271 | 1632 | @@ -426,6 +480,7 @@ meta_settings_dispose (GObject *object) | 1565 | @@ -426,6 +476,7 @@ meta_settings_dispose (GObject *object) |
272 | 1633 | g_clear_object (&settings->mutter_settings); | 1566 | g_clear_object (&settings->mutter_settings); |
273 | 1634 | g_clear_object (&settings->interface_settings); | 1567 | g_clear_object (&settings->interface_settings); |
274 | 1635 | g_clear_object (&settings->wayland_settings); | 1568 | g_clear_object (&settings->wayland_settings); |
275 | @@ -1637,7 +1570,7 @@ index 34d49b3..52c6632 100644 | |||
276 | 1637 | g_clear_pointer (&settings->xwayland_grab_whitelist_patterns, | 1570 | g_clear_pointer (&settings->xwayland_grab_whitelist_patterns, |
277 | 1638 | g_ptr_array_unref); | 1571 | g_ptr_array_unref); |
278 | 1639 | g_clear_pointer (&settings->xwayland_grab_blacklist_patterns, | 1572 | g_clear_pointer (&settings->xwayland_grab_blacklist_patterns, |
280 | 1640 | @@ -449,6 +504,10 @@ meta_settings_init (MetaSettings *settings) | 1573 | @@ -449,6 +500,10 @@ meta_settings_init (MetaSettings *settings) |
281 | 1641 | g_signal_connect (settings->wayland_settings, "changed", | 1574 | g_signal_connect (settings->wayland_settings, "changed", |
282 | 1642 | G_CALLBACK (wayland_settings_changed), | 1575 | G_CALLBACK (wayland_settings_changed), |
283 | 1643 | settings); | 1576 | settings); |
284 | @@ -1648,7 +1581,7 @@ index 34d49b3..52c6632 100644 | |||
285 | 1648 | 1581 | ||
286 | 1649 | /* Chain up inter-dependent settings. */ | 1582 | /* Chain up inter-dependent settings. */ |
287 | 1650 | g_signal_connect (settings, "global-scaling-factor-changed", | 1583 | g_signal_connect (settings, "global-scaling-factor-changed", |
289 | 1651 | @@ -460,6 +519,7 @@ meta_settings_init (MetaSettings *settings) | 1584 | @@ -460,6 +515,7 @@ meta_settings_init (MetaSettings *settings) |
290 | 1652 | update_experimental_features (settings); | 1585 | update_experimental_features (settings); |
291 | 1653 | update_xwayland_grab_access_rules (settings); | 1586 | update_xwayland_grab_access_rules (settings); |
292 | 1654 | update_xwayland_allow_grabs (settings); | 1587 | update_xwayland_allow_grabs (settings); |
293 | @@ -1656,7 +1589,7 @@ index 34d49b3..52c6632 100644 | |||
294 | 1656 | } | 1589 | } |
295 | 1657 | 1590 | ||
296 | 1658 | static void | 1591 | static void |
298 | 1659 | @@ -514,6 +574,14 @@ meta_settings_class_init (MetaSettingsClass *klass) | 1592 | @@ -514,6 +570,14 @@ meta_settings_class_init (MetaSettingsClass *klass) |
299 | 1660 | NULL, NULL, NULL, | 1593 | NULL, NULL, NULL, |
300 | 1661 | G_TYPE_NONE, 0); | 1594 | G_TYPE_NONE, 0); |
301 | 1662 | 1595 | ||
302 | @@ -2063,7 +1996,7 @@ index aad49d0..4ac32b9 100644 | |||
303 | 2063 | int *max_width, | 1996 | int *max_width, |
304 | 2064 | int *max_height); | 1997 | int *max_height); |
305 | 2065 | diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c | 1998 | diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c |
307 | 2066 | index 784bbde..9594bf4 100644 | 1999 | index 784bbde..47d19d6 100644 |
308 | 2067 | --- a/src/backends/x11/meta-monitor-manager-xrandr.c | 2000 | --- a/src/backends/x11/meta-monitor-manager-xrandr.c |
309 | 2068 | +++ b/src/backends/x11/meta-monitor-manager-xrandr.c | 2001 | +++ b/src/backends/x11/meta-monitor-manager-xrandr.c |
310 | 2069 | @@ -63,6 +63,9 @@ | 2002 | @@ -63,6 +63,9 @@ |
311 | @@ -2072,7 +2005,7 @@ index 784bbde..9594bf4 100644 | |||
312 | 2072 | #define DPI_FALLBACK 96.0 | 2005 | #define DPI_FALLBACK 96.0 |
313 | 2073 | +#define RANDR_VERSION_FORMAT(major, minor) ((major * 100) + minor) | 2006 | +#define RANDR_VERSION_FORMAT(major, minor) ((major * 100) + minor) |
314 | 2074 | +#define RANDR_TILING_MIN_VERSION RANDR_VERSION_FORMAT (1, 5) | 2007 | +#define RANDR_TILING_MIN_VERSION RANDR_VERSION_FORMAT (1, 5) |
316 | 2075 | +#define RANDR_TRANSFOMR_MIN_VERSION RANDR_VERSION_FORMAT (1, 3) | 2008 | +#define RANDR_TRANSFORM_MIN_VERSION RANDR_VERSION_FORMAT (1, 3) |
317 | 2076 | 2009 | ||
318 | 2077 | struct _MetaMonitorManagerXrandr | 2010 | struct _MetaMonitorManagerXrandr |
319 | 2078 | { | 2011 | { |
320 | @@ -2374,7 +2307,7 @@ index 784bbde..9594bf4 100644 | |||
321 | 2374 | } | 2307 | } |
322 | 2375 | } | 2308 | } |
323 | 2376 | 2309 | ||
325 | 2377 | @@ -568,8 +681,64 @@ meta_monitor_manager_xrandr_rebuild_derived (MetaMonitorManager *manager, | 2310 | @@ -568,8 +681,56 @@ meta_monitor_manager_xrandr_rebuild_derived (MetaMonitorManager *manager, |
326 | 2378 | { | 2311 | { |
327 | 2379 | MetaMonitorManagerXrandr *manager_xrandr = | 2312 | MetaMonitorManagerXrandr *manager_xrandr = |
328 | 2380 | META_MONITOR_MANAGER_XRANDR (manager); | 2313 | META_MONITOR_MANAGER_XRANDR (manager); |
329 | @@ -2408,21 +2341,13 @@ index 784bbde..9594bf4 100644 | |||
330 | 2408 | + scale = crtc->scale > 1.0f ? crtc->scale : 1.0f; | 2341 | + scale = crtc->scale > 1.0f ? crtc->scale : 1.0f; |
331 | 2409 | + } | 2342 | + } |
332 | 2410 | + | 2343 | + |
348 | 2411 | + if (meta_monitor_transform_is_rotated (crtc->transform)) | 2344 | + /* When computing the screen size from the crtc rects we don't have to |
349 | 2412 | + { | 2345 | + * use inverted values when monitors are rotated, because this is already |
350 | 2413 | + screen_width = MAX (screen_width, crtc->rect.x + | 2346 | + * taken in account in the crtc rectangles */ |
351 | 2414 | + roundf (crtc->rect.height * scale)); | 2347 | + screen_width = MAX (screen_width, crtc->rect.x + |
352 | 2415 | + screen_height = MAX (screen_height, crtc->rect.y + | 2348 | + roundf (crtc->rect.width * scale)); |
353 | 2416 | + roundf (crtc->rect.width * scale)); | 2349 | + screen_height = MAX (screen_height, crtc->rect.y + |
354 | 2417 | + } | 2350 | + roundf (crtc->rect.height * scale)); |
340 | 2418 | + else | ||
341 | 2419 | + { | ||
342 | 2420 | + screen_width = MAX (screen_width, crtc->rect.x + | ||
343 | 2421 | + roundf (crtc->rect.width * scale)); | ||
344 | 2422 | + screen_height = MAX (screen_height, crtc->rect.y + | ||
345 | 2423 | + roundf (crtc->rect.height * scale)); | ||
346 | 2424 | + } | ||
347 | 2425 | + | ||
355 | 2426 | + ++n_crtcs; | 2351 | + ++n_crtcs; |
356 | 2427 | + | 2352 | + |
357 | 2428 | + /* This value isn't completely exact, since it doesn't take care of the | 2353 | + /* This value isn't completely exact, since it doesn't take care of the |
358 | @@ -2440,7 +2365,7 @@ index 784bbde..9594bf4 100644 | |||
359 | 2440 | meta_monitor_manager_rebuild_derived (manager, config); | 2365 | meta_monitor_manager_rebuild_derived (manager, config); |
360 | 2441 | } | 2366 | } |
361 | 2442 | 2367 | ||
363 | 2443 | @@ -595,6 +764,9 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana | 2368 | @@ -595,6 +756,9 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana |
364 | 2444 | 2369 | ||
365 | 2445 | if (method != META_MONITORS_CONFIG_METHOD_VERIFY) | 2370 | if (method != META_MONITORS_CONFIG_METHOD_VERIFY) |
366 | 2446 | { | 2371 | { |
367 | @@ -2450,7 +2375,7 @@ index 784bbde..9594bf4 100644 | |||
368 | 2450 | /* | 2375 | /* |
369 | 2451 | * If the assignment has not changed, we won't get any notification about | 2376 | * If the assignment has not changed, we won't get any notification about |
370 | 2452 | * any new configuration from the X server; but we still need to update | 2377 | * any new configuration from the X server; but we still need to update |
372 | 2453 | @@ -615,6 +787,8 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana | 2378 | @@ -615,6 +779,8 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana |
373 | 2454 | crtc_infos->len, | 2379 | crtc_infos->len, |
374 | 2455 | (MetaOutputInfo **) output_infos->pdata, | 2380 | (MetaOutputInfo **) output_infos->pdata, |
375 | 2456 | output_infos->len); | 2381 | output_infos->len); |
376 | @@ -2459,7 +2384,7 @@ index 784bbde..9594bf4 100644 | |||
377 | 2459 | } | 2384 | } |
378 | 2460 | else | 2385 | else |
379 | 2461 | { | 2386 | { |
381 | 2462 | @@ -748,7 +922,8 @@ meta_monitor_manager_xrandr_tiled_monitor_added (MetaMonitorManager *manager, | 2387 | @@ -748,7 +914,8 @@ meta_monitor_manager_xrandr_tiled_monitor_added (MetaMonitorManager *manager, |
382 | 2463 | GList *l; | 2388 | GList *l; |
383 | 2464 | int i; | 2389 | int i; |
384 | 2465 | 2390 | ||
385 | @@ -2469,7 +2394,7 @@ index 784bbde..9594bf4 100644 | |||
386 | 2469 | return; | 2394 | return; |
387 | 2470 | 2395 | ||
388 | 2471 | product = meta_monitor_get_product (monitor); | 2396 | product = meta_monitor_get_product (monitor); |
390 | 2472 | @@ -797,7 +972,8 @@ meta_monitor_manager_xrandr_tiled_monitor_removed (MetaMonitorManager *manager, | 2397 | @@ -797,7 +964,8 @@ meta_monitor_manager_xrandr_tiled_monitor_removed (MetaMonitorManager *manager, |
391 | 2473 | 2398 | ||
392 | 2474 | int monitor_count; | 2399 | int monitor_count; |
393 | 2475 | 2400 | ||
394 | @@ -2479,7 +2404,7 @@ index 784bbde..9594bf4 100644 | |||
395 | 2479 | return; | 2404 | return; |
396 | 2480 | 2405 | ||
397 | 2481 | monitor_xrandr_data = meta_monitor_xrandr_data_from_monitor (monitor); | 2406 | monitor_xrandr_data = meta_monitor_xrandr_data_from_monitor (monitor); |
399 | 2482 | @@ -815,10 +991,12 @@ meta_monitor_manager_xrandr_tiled_monitor_removed (MetaMonitorManager *manager, | 2407 | @@ -815,10 +983,12 @@ meta_monitor_manager_xrandr_tiled_monitor_removed (MetaMonitorManager *manager, |
400 | 2483 | static void | 2408 | static void |
401 | 2484 | meta_monitor_manager_xrandr_init_monitors (MetaMonitorManagerXrandr *manager_xrandr) | 2409 | meta_monitor_manager_xrandr_init_monitors (MetaMonitorManagerXrandr *manager_xrandr) |
402 | 2485 | { | 2410 | { |
403 | @@ -2493,7 +2418,7 @@ index 784bbde..9594bf4 100644 | |||
404 | 2493 | return; | 2418 | return; |
405 | 2494 | 2419 | ||
406 | 2495 | /* delete any tiled monitors setup, as mutter will want to recreate | 2420 | /* delete any tiled monitors setup, as mutter will want to recreate |
408 | 2496 | @@ -849,83 +1027,26 @@ meta_monitor_manager_xrandr_is_transform_handled (MetaMonitorManager *manager, | 2421 | @@ -849,83 +1019,26 @@ meta_monitor_manager_xrandr_is_transform_handled (MetaMonitorManager *manager, |
409 | 2497 | return TRUE; | 2422 | return TRUE; |
410 | 2498 | } | 2423 | } |
411 | 2499 | 2424 | ||
412 | @@ -2506,25 +2431,25 @@ index 784bbde..9594bf4 100644 | |||
413 | 2506 | { | 2431 | { |
414 | 2507 | - return meta_monitor_calculate_mode_scale (monitor, monitor_mode); | 2432 | - return meta_monitor_calculate_mode_scale (monitor, monitor_mode); |
415 | 2508 | -} | 2433 | -} |
418 | 2509 | + MetaMonitorScalesConstraint constraints = 0; | 2434 | - |
417 | 2510 | |||
419 | 2511 | -static void | 2435 | -static void |
420 | 2512 | -add_supported_scale (GArray *supported_scales, | 2436 | -add_supported_scale (GArray *supported_scales, |
421 | 2513 | - float scale) | 2437 | - float scale) |
422 | 2514 | -{ | 2438 | -{ |
423 | 2515 | - unsigned int i; | 2439 | - unsigned int i; |
428 | 2516 | + if (meta_monitor_manager_get_capabilities (manager) & | 2440 | - |
425 | 2517 | + META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED) | ||
426 | 2518 | + constraints |= META_MONITOR_SCALES_CONSTRAINT_NO_FRAC; | ||
427 | 2519 | |||
429 | 2520 | - for (i = 0; i < supported_scales->len; i++) | 2441 | - for (i = 0; i < supported_scales->len; i++) |
430 | 2521 | - { | 2442 | - { |
431 | 2522 | - float supported_scale = g_array_index (supported_scales, float, i); | 2443 | - float supported_scale = g_array_index (supported_scales, float, i); |
433 | 2523 | - | 2444 | + MetaMonitorScalesConstraint constraints = 0; |
434 | 2445 | |||
435 | 2524 | - if (scale == supported_scale) | 2446 | - if (scale == supported_scale) |
436 | 2525 | - return; | 2447 | - return; |
437 | 2526 | - } | 2448 | - } |
439 | 2527 | - | 2449 | + if (meta_monitor_manager_get_capabilities (manager) & |
440 | 2450 | + META_MONITOR_MANAGER_CAPABILITY_GLOBAL_SCALE_REQUIRED) | ||
441 | 2451 | + constraints |= META_MONITOR_SCALES_CONSTRAINT_NO_FRAC; | ||
442 | 2452 | |||
443 | 2528 | - g_array_append_val (supported_scales, scale); | 2453 | - g_array_append_val (supported_scales, scale); |
444 | 2529 | + return constraints; | 2454 | + return constraints; |
445 | 2530 | } | 2455 | } |
446 | @@ -2532,7 +2457,12 @@ index 784bbde..9594bf4 100644 | |||
447 | 2532 | -static int | 2457 | -static int |
448 | 2533 | -compare_scales (gconstpointer a, | 2458 | -compare_scales (gconstpointer a, |
449 | 2534 | - gconstpointer b) | 2459 | - gconstpointer b) |
451 | 2535 | -{ | 2460 | +static float |
452 | 2461 | +meta_monitor_manager_xrandr_calculate_monitor_mode_scale (MetaMonitorManager *manager, | ||
453 | 2462 | + MetaLogicalMonitorLayoutMode layout_mode, | ||
454 | 2463 | + MetaMonitor *monitor, | ||
455 | 2464 | + MetaMonitorMode *monitor_mode) | ||
456 | 2465 | { | ||
457 | 2536 | - float f = *(float *) a - *(float *) b; | 2466 | - float f = *(float *) a - *(float *) b; |
458 | 2537 | - | 2467 | - |
459 | 2538 | - if (f < 0) | 2468 | - if (f < 0) |
460 | @@ -2544,12 +2474,7 @@ index 784bbde..9594bf4 100644 | |||
461 | 2544 | - | 2474 | - |
462 | 2545 | -static void | 2475 | -static void |
463 | 2546 | -ensure_supported_monitor_scales (MetaMonitorManager *manager) | 2476 | -ensure_supported_monitor_scales (MetaMonitorManager *manager) |
470 | 2547 | +static float | 2477 | -{ |
465 | 2548 | +meta_monitor_manager_xrandr_calculate_monitor_mode_scale (MetaMonitorManager *manager, | ||
466 | 2549 | + MetaLogicalMonitorLayoutMode layout_mode, | ||
467 | 2550 | + MetaMonitor *monitor, | ||
468 | 2551 | + MetaMonitorMode *monitor_mode) | ||
469 | 2552 | { | ||
471 | 2553 | - MetaMonitorManagerXrandr *manager_xrandr = | 2478 | - MetaMonitorManagerXrandr *manager_xrandr = |
472 | 2554 | - META_MONITOR_MANAGER_XRANDR (manager); | 2479 | - META_MONITOR_MANAGER_XRANDR (manager); |
473 | 2555 | - MetaMonitorScalesConstraint constraints; | 2480 | - MetaMonitorScalesConstraint constraints; |
474 | @@ -2591,7 +2516,7 @@ index 784bbde..9594bf4 100644 | |||
475 | 2591 | } | 2516 | } |
476 | 2592 | 2517 | ||
477 | 2593 | static float * | 2518 | static float * |
479 | 2594 | @@ -935,21 +1056,35 @@ meta_monitor_manager_xrandr_calculate_supported_scales (MetaMonitorManager | 2519 | @@ -935,21 +1048,35 @@ meta_monitor_manager_xrandr_calculate_supported_scales (MetaMonitorManager |
480 | 2595 | MetaMonitorMode *monitor_mode, | 2520 | MetaMonitorMode *monitor_mode, |
481 | 2596 | int *n_supported_scales) | 2521 | int *n_supported_scales) |
482 | 2597 | { | 2522 | { |
483 | @@ -2625,7 +2550,7 @@ index 784bbde..9594bf4 100644 | |||
484 | 2625 | + | 2550 | + |
485 | 2626 | + if (meta_settings_is_experimental_feature_enabled (settings, | 2551 | + if (meta_settings_is_experimental_feature_enabled (settings, |
486 | 2627 | + META_EXPERIMENTAL_FEATURE_X11_RANDR_FRACTIONAL_SCALING) && | 2552 | + META_EXPERIMENTAL_FEATURE_X11_RANDR_FRACTIONAL_SCALING) && |
488 | 2628 | + xrandr_manager->randr_version >= RANDR_TRANSFOMR_MIN_VERSION) | 2553 | + xrandr_manager->randr_version >= RANDR_TRANSFORM_MIN_VERSION) |
489 | 2629 | + { | 2554 | + { |
490 | 2630 | + capabilities |= META_MONITOR_MANAGER_CAPABILITY_NATIVE_OUTPUT_SCALING | | 2555 | + capabilities |= META_MONITOR_MANAGER_CAPABILITY_NATIVE_OUTPUT_SCALING | |
491 | 2631 | + META_MONITOR_MANAGER_CAPABILITY_LAYOUT_MODE; | 2556 | + META_MONITOR_MANAGER_CAPABILITY_LAYOUT_MODE; |
492 | @@ -2637,7 +2562,7 @@ index 784bbde..9594bf4 100644 | |||
493 | 2637 | } | 2562 | } |
494 | 2638 | 2563 | ||
495 | 2639 | static gboolean | 2564 | static gboolean |
497 | 2640 | @@ -966,9 +1101,30 @@ meta_monitor_manager_xrandr_get_max_screen_size (MetaMonitorManager *manager, | 2565 | @@ -966,9 +1093,30 @@ meta_monitor_manager_xrandr_get_max_screen_size (MetaMonitorManager *manager, |
498 | 2641 | return TRUE; | 2566 | return TRUE; |
499 | 2642 | } | 2567 | } |
500 | 2643 | 2568 | ||
501 | @@ -2668,7 +2593,7 @@ index 784bbde..9594bf4 100644 | |||
502 | 2668 | return META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL; | 2593 | return META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL; |
503 | 2669 | } | 2594 | } |
504 | 2670 | 2595 | ||
506 | 2671 | @@ -978,10 +1134,15 @@ meta_monitor_manager_xrandr_constructed (GObject *object) | 2596 | @@ -978,10 +1126,15 @@ meta_monitor_manager_xrandr_constructed (GObject *object) |
507 | 2672 | MetaMonitorManagerXrandr *manager_xrandr = | 2597 | MetaMonitorManagerXrandr *manager_xrandr = |
508 | 2673 | META_MONITOR_MANAGER_XRANDR (object); | 2598 | META_MONITOR_MANAGER_XRANDR (object); |
509 | 2674 | MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr); | 2599 | MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_xrandr); |
510 | @@ -2687,7 +2612,7 @@ index 784bbde..9594bf4 100644 | |||
511 | 2687 | 2612 | ||
512 | 2688 | manager_xrandr->gpu = META_GPU (meta_gpu_xrandr_new (manager_xrandr)); | 2613 | manager_xrandr->gpu = META_GPU (meta_gpu_xrandr_new (manager_xrandr)); |
513 | 2689 | meta_monitor_manager_add_gpu (manager, manager_xrandr->gpu); | 2614 | meta_monitor_manager_add_gpu (manager, manager_xrandr->gpu); |
515 | 2690 | @@ -1003,16 +1164,13 @@ meta_monitor_manager_xrandr_constructed (GObject *object) | 2615 | @@ -1003,16 +1156,13 @@ meta_monitor_manager_xrandr_constructed (GObject *object) |
516 | 2691 | | RRCrtcChangeNotifyMask | 2616 | | RRCrtcChangeNotifyMask |
517 | 2692 | | RROutputPropertyNotifyMask); | 2617 | | RROutputPropertyNotifyMask); |
518 | 2693 | 2618 | ||
519 | @@ -2709,7 +2634,7 @@ index 784bbde..9594bf4 100644 | |||
520 | 2709 | meta_monitor_manager_xrandr_init_monitors (manager_xrandr); | 2634 | meta_monitor_manager_xrandr_init_monitors (manager_xrandr); |
521 | 2710 | } | 2635 | } |
522 | 2711 | 2636 | ||
524 | 2712 | @@ -1026,7 +1184,6 @@ meta_monitor_manager_xrandr_finalize (GObject *object) | 2637 | @@ -1026,7 +1176,6 @@ meta_monitor_manager_xrandr_finalize (GObject *object) |
525 | 2713 | 2638 | ||
526 | 2714 | g_clear_object (&manager_xrandr->gpu); | 2639 | g_clear_object (&manager_xrandr->gpu); |
527 | 2715 | g_hash_table_destroy (manager_xrandr->tiled_monitor_atoms); | 2640 | g_hash_table_destroy (manager_xrandr->tiled_monitor_atoms); |
528 | @@ -2756,47 +2681,35 @@ index 515389d..3bc7f0b 100644 | |||
529 | 2756 | return; | 2681 | return; |
530 | 2757 | 2682 | ||
531 | 2758 | tile_atom = XInternAtom (xdisplay, "TILE", FALSE); | 2683 | tile_atom = XInternAtom (xdisplay, "TILE", FALSE); |
532 | 2759 | diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h | ||
533 | 2760 | index 0f92d42..13a8a6a 100644 | ||
534 | 2761 | --- a/src/compositor/compositor-private.h | ||
535 | 2762 | +++ b/src/compositor/compositor-private.h | ||
536 | 2763 | @@ -13,6 +13,8 @@ | ||
537 | 2764 | |||
538 | 2765 | struct _MetaCompositor | ||
539 | 2766 | { | ||
540 | 2767 | + GObject parent; | ||
541 | 2768 | + | ||
542 | 2769 | MetaDisplay *display; | ||
543 | 2770 | |||
544 | 2771 | guint pre_paint_func_id; | ||
545 | 2772 | diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c | 2684 | diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c |
547 | 2773 | index 0854a19..7fc2943 100644 | 2685 | index 0854a19..e412784 100644 |
548 | 2774 | --- a/src/compositor/compositor.c | 2686 | --- a/src/compositor/compositor.c |
549 | 2775 | +++ b/src/compositor/compositor.c | 2687 | +++ b/src/compositor/compositor.c |
553 | 2776 | @@ -86,6 +86,8 @@ | 2688 | @@ -92,6 +92,11 @@ on_presented (ClutterStage *stage, |
554 | 2777 | #include "wayland/meta-wayland-private.h" | 2689 | ClutterFrameInfo *frame_info, |
555 | 2778 | #endif | 2690 | MetaCompositor *compositor); |
556 | 2779 | 2691 | ||
558 | 2780 | +G_DEFINE_TYPE (MetaCompositor, meta_compositor, G_TYPE_OBJECT) | 2692 | +static void |
559 | 2693 | +on_redirected_monitor_changed (MetaWindow *window, | ||
560 | 2694 | + int old_monitor, | ||
561 | 2695 | + MetaCompositor *compositor); | ||
562 | 2781 | + | 2696 | + |
569 | 2782 | static void | 2697 | static gboolean |
570 | 2783 | on_presented (ClutterStage *stage, | 2698 | is_modal (MetaDisplay *display) |
565 | 2784 | CoglFrameEvent event, | ||
566 | 2785 | @@ -131,11 +133,8 @@ meta_switch_workspace_completed (MetaCompositor *compositor) | ||
567 | 2786 | void | ||
568 | 2787 | meta_compositor_destroy (MetaCompositor *compositor) | ||
571 | 2788 | { | 2699 | { |
580 | 2789 | - clutter_threads_remove_repaint_func (compositor->pre_paint_func_id); | 2700 | @@ -134,6 +139,11 @@ meta_compositor_destroy (MetaCompositor *compositor) |
581 | 2790 | - clutter_threads_remove_repaint_func (compositor->post_paint_func_id); | 2701 | clutter_threads_remove_repaint_func (compositor->pre_paint_func_id); |
582 | 2791 | - | 2702 | clutter_threads_remove_repaint_func (compositor->post_paint_func_id); |
575 | 2792 | - if (compositor->have_x11_sync_object) | ||
576 | 2793 | - meta_sync_ring_destroy (); | ||
577 | 2794 | + g_object_run_dispose (G_OBJECT (compositor)); | ||
578 | 2795 | + g_object_unref (compositor); | ||
579 | 2796 | } | ||
583 | 2797 | 2703 | ||
586 | 2798 | static void | 2704 | + if (compositor->unredirected_window) |
587 | 2799 | @@ -635,16 +634,54 @@ meta_shape_cow_for_window (MetaCompositor *compositor, | 2705 | + g_signal_handlers_disconnect_by_func (compositor->unredirected_window, |
588 | 2706 | + on_redirected_monitor_changed, | ||
589 | 2707 | + compositor); | ||
590 | 2708 | + | ||
591 | 2709 | if (compositor->have_x11_sync_object) | ||
592 | 2710 | meta_sync_ring_destroy (); | ||
593 | 2711 | } | ||
594 | 2712 | @@ -635,16 +645,54 @@ meta_shape_cow_for_window (MetaCompositor *compositor, | ||
595 | 2800 | } | 2713 | } |
596 | 2801 | } | 2714 | } |
597 | 2802 | 2715 | ||
598 | @@ -2851,81 +2764,21 @@ index 0854a19..7fc2943 100644 | |||
599 | 2851 | meta_window_actor_set_unredirected (window_actor, FALSE); | 2764 | meta_window_actor_set_unredirected (window_actor, FALSE); |
600 | 2852 | } | 2765 | } |
601 | 2853 | 2766 | ||
603 | 2854 | @@ -654,6 +691,13 @@ set_unredirected_window (MetaCompositor *compositor, | 2767 | @@ -654,6 +702,12 @@ set_unredirected_window (MetaCompositor *compositor, |
604 | 2855 | if (compositor->unredirected_window != NULL) | 2768 | if (compositor->unredirected_window != NULL) |
605 | 2856 | { | 2769 | { |
606 | 2857 | MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (compositor->unredirected_window)); | 2770 | MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (compositor->unredirected_window)); |
607 | 2858 | + | 2771 | + |
608 | 2859 | + meta_monitor_manager_disable_scale_for_monitor (monitor_manager, | 2772 | + meta_monitor_manager_disable_scale_for_monitor (monitor_manager, |
609 | 2860 | + window->monitor); | 2773 | + window->monitor); |
613 | 2861 | + g_signal_connect_object (window, "monitor-changed", | 2774 | + g_signal_connect (window, "monitor-changed", |
614 | 2862 | + G_CALLBACK (on_redirected_monitor_changed), | 2775 | + G_CALLBACK (on_redirected_monitor_changed), compositor); |
612 | 2863 | + compositor, 0); | ||
615 | 2864 | + | 2776 | + |
616 | 2865 | meta_window_actor_set_unredirected (window_actor, TRUE); | 2777 | meta_window_actor_set_unredirected (window_actor, TRUE); |
617 | 2866 | } | 2778 | } |
618 | 2867 | } | 2779 | } |
619 | 2868 | @@ -1274,12 +1318,20 @@ on_shadow_factory_changed (MetaShadowFactory *factory, | ||
620 | 2869 | MetaCompositor * | ||
621 | 2870 | meta_compositor_new (MetaDisplay *display) | ||
622 | 2871 | { | ||
623 | 2872 | - MetaBackend *backend = meta_get_backend (); | ||
624 | 2873 | - ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); | ||
625 | 2874 | MetaCompositor *compositor; | ||
626 | 2875 | |||
627 | 2876 | - compositor = g_new0 (MetaCompositor, 1); | ||
628 | 2877 | + compositor = g_object_new (META_TYPE_COMPOSITOR, NULL); | ||
629 | 2878 | compositor->display = display; | ||
630 | 2879 | + | ||
631 | 2880 | + return compositor; | ||
632 | 2881 | +} | ||
633 | 2882 | + | ||
634 | 2883 | +static void | ||
635 | 2884 | +meta_compositor_init (MetaCompositor *compositor) | ||
636 | 2885 | +{ | ||
637 | 2886 | + MetaBackend *backend = meta_get_backend (); | ||
638 | 2887 | + ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend); | ||
639 | 2888 | + | ||
640 | 2889 | compositor->context = clutter_backend->cogl_context; | ||
641 | 2890 | |||
642 | 2891 | g_signal_connect (meta_shadow_factory_get_default (), | ||
643 | 2892 | @@ -1297,7 +1349,33 @@ meta_compositor_new (MetaDisplay *display) | ||
644 | 2893 | meta_post_paint_func, | ||
645 | 2894 | compositor, | ||
646 | 2895 | NULL); | ||
647 | 2896 | - return compositor; | ||
648 | 2897 | +} | ||
649 | 2898 | + | ||
650 | 2899 | +static void | ||
651 | 2900 | +meta_compositor_dispose (GObject *gobject) | ||
652 | 2901 | +{ | ||
653 | 2902 | + MetaCompositor *compositor = META_COMPOSITOR (gobject); | ||
654 | 2903 | + | ||
655 | 2904 | + g_clear_handle_id (&compositor->pre_paint_func_id, | ||
656 | 2905 | + clutter_threads_remove_repaint_func); | ||
657 | 2906 | + g_clear_handle_id (&compositor->post_paint_func_id, | ||
658 | 2907 | + clutter_threads_remove_repaint_func); | ||
659 | 2908 | + | ||
660 | 2909 | + if (compositor->have_x11_sync_object) | ||
661 | 2910 | + { | ||
662 | 2911 | + meta_sync_ring_destroy (); | ||
663 | 2912 | + compositor->have_x11_sync_object = FALSE; | ||
664 | 2913 | + } | ||
665 | 2914 | + | ||
666 | 2915 | + G_OBJECT_CLASS (meta_compositor_parent_class)->dispose (gobject); | ||
667 | 2916 | +} | ||
668 | 2917 | + | ||
669 | 2918 | +static void | ||
670 | 2919 | +meta_compositor_class_init (MetaCompositorClass *klass) | ||
671 | 2920 | +{ | ||
672 | 2921 | + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); | ||
673 | 2922 | + | ||
674 | 2923 | + gobject_class->dispose = meta_compositor_dispose; | ||
675 | 2924 | } | ||
676 | 2925 | |||
677 | 2926 | /** | ||
678 | 2927 | diff --git a/src/core/boxes-private.h b/src/core/boxes-private.h | 2780 | diff --git a/src/core/boxes-private.h b/src/core/boxes-private.h |
680 | 2928 | index 24c596b..bb88083 100644 | 2781 | index 24c596b..f92837a 100644 |
681 | 2929 | --- a/src/core/boxes-private.h | 2782 | --- a/src/core/boxes-private.h |
682 | 2930 | +++ b/src/core/boxes-private.h | 2783 | +++ b/src/core/boxes-private.h |
683 | 2931 | @@ -157,6 +157,10 @@ gboolean meta_rectangle_overlaps_with_region ( | 2784 | @@ -157,6 +157,10 @@ gboolean meta_rectangle_overlaps_with_region ( |
684 | @@ -2939,17 +2792,8 @@ index 24c596b..bb88083 100644 | |||
685 | 2939 | /* Make the rectangle small enough to fit into one of the spanning_rects, | 2792 | /* Make the rectangle small enough to fit into one of the spanning_rects, |
686 | 2940 | * but make it no smaller than min_size. | 2793 | * but make it no smaller than min_size. |
687 | 2941 | */ | 2794 | */ |
688 | 2942 | @@ -284,4 +288,8 @@ void meta_rectangle_crop_and_scale (const MetaRectangle *rect, | ||
689 | 2943 | int dst_height, | ||
690 | 2944 | MetaRectangle *dest); | ||
691 | 2945 | |||
692 | 2946 | +gboolean meta_rectangle_has_neighbor (const MetaRectangle *rect, | ||
693 | 2947 | + const MetaRectangle *neighbor, | ||
694 | 2948 | + MetaSide neighbor_side); | ||
695 | 2949 | + | ||
696 | 2950 | #endif /* META_BOXES_PRIVATE_H */ | ||
697 | 2951 | diff --git a/src/core/boxes.c b/src/core/boxes.c | 2795 | diff --git a/src/core/boxes.c b/src/core/boxes.c |
699 | 2952 | index 87f2d5d..7c30153 100644 | 2796 | index 87f2d5d..95978c1 100644 |
700 | 2953 | --- a/src/core/boxes.c | 2797 | --- a/src/core/boxes.c |
701 | 2954 | +++ b/src/core/boxes.c | 2798 | +++ b/src/core/boxes.c |
702 | 2955 | @@ -911,6 +911,27 @@ meta_rectangle_overlaps_with_region (const GList *spanning_rects, | 2799 | @@ -911,6 +911,27 @@ meta_rectangle_overlaps_with_region (const GList *spanning_rects, |
703 | @@ -2966,7 +2810,7 @@ index 87f2d5d..7c30153 100644 | |||
704 | 2966 | + { | 2810 | + { |
705 | 2967 | + MetaRectangle *other = (MetaRectangle *) l->data; | 2811 | + MetaRectangle *other = (MetaRectangle *) l->data; |
706 | 2968 | + | 2812 | + |
708 | 2969 | + if (other == rect) | 2813 | + if (rect == other || meta_rectangle_equal (rect, other)) |
709 | 2970 | + continue; | 2814 | + continue; |
710 | 2971 | + | 2815 | + |
711 | 2972 | + if (meta_rectangle_is_adjecent_to ((MetaRectangle *) rect, other)) | 2816 | + if (meta_rectangle_is_adjecent_to ((MetaRectangle *) rect, other)) |
712 | @@ -2980,56 +2824,6 @@ index 87f2d5d..7c30153 100644 | |||
713 | 2980 | 2824 | ||
714 | 2981 | void | 2825 | void |
715 | 2982 | meta_rectangle_clamp_to_fit_into_region (const GList *spanning_rects, | 2826 | meta_rectangle_clamp_to_fit_into_region (const GList *spanning_rects, |
716 | 2983 | @@ -2201,3 +2222,35 @@ meta_rectangle_crop_and_scale (const MetaRectangle *rect, | ||
717 | 2984 | |||
718 | 2985 | meta_rectangle_from_clutter_rect (&tmp, META_ROUNDING_STRATEGY_GROW, dest); | ||
719 | 2986 | } | ||
720 | 2987 | + | ||
721 | 2988 | +gboolean | ||
722 | 2989 | +meta_rectangle_has_neighbor (const MetaRectangle *rect, | ||
723 | 2990 | + const MetaRectangle *neighbor, | ||
724 | 2991 | + MetaSide neighbor_side) | ||
725 | 2992 | +{ | ||
726 | 2993 | + switch (neighbor_side) | ||
727 | 2994 | + { | ||
728 | 2995 | + case META_SIDE_RIGHT: | ||
729 | 2996 | + if (neighbor->x == (rect->x + rect->width) && | ||
730 | 2997 | + meta_rectangle_vert_overlap (neighbor, rect)) | ||
731 | 2998 | + return TRUE; | ||
732 | 2999 | + break; | ||
733 | 3000 | + case META_SIDE_LEFT: | ||
734 | 3001 | + if (rect->x == (neighbor->x + neighbor->width) && | ||
735 | 3002 | + meta_rectangle_vert_overlap (neighbor, rect)) | ||
736 | 3003 | + return TRUE; | ||
737 | 3004 | + break; | ||
738 | 3005 | + case META_SIDE_TOP: | ||
739 | 3006 | + if (rect->y == (neighbor->y + neighbor->height) && | ||
740 | 3007 | + meta_rectangle_horiz_overlap (neighbor, rect)) | ||
741 | 3008 | + return TRUE; | ||
742 | 3009 | + break; | ||
743 | 3010 | + case META_SIDE_BOTTOM: | ||
744 | 3011 | + if (neighbor->y == (rect->y + rect->height) && | ||
745 | 3012 | + meta_rectangle_horiz_overlap (neighbor, rect)) | ||
746 | 3013 | + return TRUE; | ||
747 | 3014 | + break; | ||
748 | 3015 | + } | ||
749 | 3016 | + | ||
750 | 3017 | + return FALSE; | ||
751 | 3018 | +} | ||
752 | 3019 | diff --git a/src/core/display.c b/src/core/display.c | ||
753 | 3020 | index e1477d3..0a55d90 100644 | ||
754 | 3021 | --- a/src/core/display.c | ||
755 | 3022 | +++ b/src/core/display.c | ||
756 | 3023 | @@ -946,8 +946,7 @@ meta_display_close (MetaDisplay *display, | ||
757 | 3024 | g_hash_table_destroy (display->wayland_windows); | ||
758 | 3025 | g_hash_table_destroy (display->stamps); | ||
759 | 3026 | |||
760 | 3027 | - if (display->compositor) | ||
761 | 3028 | - meta_compositor_destroy (display->compositor); | ||
762 | 3029 | + g_clear_object (&display->compositor); | ||
763 | 3030 | |||
764 | 3031 | if (display->x11_display) | ||
765 | 3032 | { | ||
766 | 3033 | diff --git a/src/core/window.c b/src/core/window.c | 2827 | diff --git a/src/core/window.c b/src/core/window.c |
767 | 3034 | index 62b2df8..d1cf7c3 100644 | 2828 | index 62b2df8..d1cf7c3 100644 |
768 | 3035 | --- a/src/core/window.c | 2829 | --- a/src/core/window.c |
769 | @@ -3074,41 +2868,6 @@ index 62b2df8..d1cf7c3 100644 | |||
770 | 3074 | if (old) | 2868 | if (old) |
771 | 3075 | g_signal_emit_by_name (window->display, "window-left-monitor", | 2869 | g_signal_emit_by_name (window->display, "window-left-monitor", |
772 | 3076 | old->number, window); | 2870 | old->number, window); |
773 | 3077 | diff --git a/src/meta/compositor.h b/src/meta/compositor.h | ||
774 | 3078 | index 31d14dd..7fad05b 100644 | ||
775 | 3079 | --- a/src/meta/compositor.h | ||
776 | 3080 | +++ b/src/meta/compositor.h | ||
777 | 3081 | @@ -28,6 +28,11 @@ | ||
778 | 3082 | #include <meta/window.h> | ||
779 | 3083 | #include <meta/workspace.h> | ||
780 | 3084 | |||
781 | 3085 | +#define META_TYPE_COMPOSITOR (meta_compositor_get_type ()) | ||
782 | 3086 | + | ||
783 | 3087 | +META_EXPORT | ||
784 | 3088 | +G_DECLARE_FINAL_TYPE (MetaCompositor, meta_compositor, META, COMPOSITOR, GObject) | ||
785 | 3089 | + | ||
786 | 3090 | /** | ||
787 | 3091 | * MetaCompEffect: | ||
788 | 3092 | * @META_COMP_EFFECT_CREATE: The window is newly created | ||
789 | 3093 | diff --git a/src/meta/display.h b/src/meta/display.h | ||
790 | 3094 | index 1703920..0eb1629 100644 | ||
791 | 3095 | --- a/src/meta/display.h | ||
792 | 3096 | +++ b/src/meta/display.h | ||
793 | 3097 | @@ -226,10 +226,10 @@ void meta_display_set_cursor (MetaDisplay *display, | ||
794 | 3098 | */ | ||
795 | 3099 | typedef enum | ||
796 | 3100 | { | ||
797 | 3101 | - META_DISPLAY_UP, | ||
798 | 3102 | - META_DISPLAY_DOWN, | ||
799 | 3103 | - META_DISPLAY_LEFT, | ||
800 | 3104 | - META_DISPLAY_RIGHT | ||
801 | 3105 | + META_DISPLAY_UP = META_DIRECTION_UP, | ||
802 | 3106 | + META_DISPLAY_DOWN = META_DIRECTION_DOWN, | ||
803 | 3107 | + META_DISPLAY_LEFT = META_DIRECTION_LEFT, | ||
804 | 3108 | + META_DISPLAY_RIGHT = META_DIRECTION_RIGHT, | ||
805 | 3109 | } MetaDisplayDirection; | ||
806 | 3110 | |||
807 | 3111 | META_EXPORT | ||
808 | 3112 | diff --git a/src/org.gnome.Mutter.DisplayConfig.xml b/src/org.gnome.Mutter.DisplayConfig.xml | 2871 | diff --git a/src/org.gnome.Mutter.DisplayConfig.xml b/src/org.gnome.Mutter.DisplayConfig.xml |
809 | 3113 | index 3abfa15..4ec6cd4 100644 | 2872 | index 3abfa15..4ec6cd4 100644 |
810 | 3114 | --- a/src/org.gnome.Mutter.DisplayConfig.xml | 2873 | --- a/src/org.gnome.Mutter.DisplayConfig.xml |
Sounds and looks sensible.
Although it's never easy to read the diff-of-a-diff, the fact that the patch is shrinking is also good.