Commit graph

31 commits

Author SHA1 Message Date
Marco Trevisan (Treviño)
f55639cabb display: cleanup monitors list disposition 2022-04-24 12:21:14 +00:00
Marco Trevisan (Treviño)
c6da230052 display: Remove weak references on display disposition
Weak references are added when logical monitors are created, however we
don't remove them when destroying the display.

This means that if a monitor survives to the display finalization
(because may be referenced elsewhere) it will make g-c-c to crash
during its finalization, as that will trigger the weak reference
callback that will try to access to the already-finalized display.
2022-04-24 12:21:14 +00:00
Robert Mader
6a4652bd35 display-config: Do not invert order when constructing modes
Mutter sends modes in descending order of preference. By reverting
the order via `g_list_prepend`, we get unintended side effects
such as choosing the least preferred refresh rate by default (if
the selected mode is not marked as preferred).

Instead of adding complex logic in several places, make sure that
the assumption of descending preference is kept by simply not
inverting the order.

Closes https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/1562
2022-01-05 22:12:13 +00:00
Marco Trevisan (Treviño)
266622e99e display-config: Filter invalid modes and scales when setting minimum size
In the front-end we define a minimum size and then we check every time
we iterate through resolutions or scales if such mode is valid.

Since the configuration won't change, we can just filter the invalid
values once when the minimum allowed size is set, so that we can be sure
that the returned scales list is always matching the ones appliable for
the current mode.

The only edge case is when using a cloned configuration, as in this case
the values need to be applied to all the monitors.
However, since we already return a reffed GArray we can just create a
temporary one in this case where unappliable scales are skipped.

As per this we can just use around the scales array length as the number
of visible buttons.
2021-06-15 17:30:36 +00:00
Marco Trevisan (Treviño)
a3392176a9 display-config: Expose the supported scales as a reffed GArray
It's just a nicer api and allows us to avoid having to count all the
elements around or to expose the size via an out value.

Given this is a private API anyway there's no risk for modifying the
array, so it's something safe to use anyways.
2021-06-15 17:30:36 +00:00
Marco Trevisan (Treviño)
89cb1d99cb display-config: Use G_APPROX_VALUE to compare scale doubles
It's not safe to compare double values directly, use G_APPROX_VALUE with
DBL_EPSILON instead.
2021-06-15 17:30:36 +00:00
Carlos Garnacho
c89f5ca526 display: Add panel-orientation-managed signal to CcDisplayConfig
So we can track changes on this property.
2020-09-05 08:03:44 +00:00
Carlos Garnacho
b91a83c402 display: Add API to get the PanelOrientationManaged DisplayConfig property
This property indicates whether the builtin panel orientation is managed by
an accelerometer, thus shouldn't be managed by the display panel.
2020-09-05 08:03:44 +00:00
Carlos Garnacho
1ae3ebcfb2 display: Use a proxy for org.gnome.Mutter.DisplayConfig
It will be more convenient than a direct DBus call in future commits.
2020-09-05 08:03:44 +00:00
Jian-Hong Pan
00081c434c display: Fix the resolution going to be tested
Gnome-control-center checks the display modes by
cc_display_config_is_scaled_mode_valid()
  ...
  cc_display_config_dbus_is_scaled_mode_valid()
to exclude unusable low resolutions.

However, it is the current using resolution that going to be tested by
is_scaled_mode_allowed() in is_scale_allowed_by_active_monitors(), if it
is global scaled required or configured as cloning mode originally.
Therefor, it will check current using resolution again and again,
instead of the enumerated one. This leads gnome-control-center building
wrong resolution list on the panel.

This patch replaces the current mode with the enumerated mode to have
the correct resolution to be tested by is_scaled_mode_allowed().

Fixes #903
2020-03-10 17:49:22 +08:00
Benjamin Berg
4e800cc558 display: Consider monitors in landscape mode for minimum size
Some devices have panels with a native resolution in portrait mode. In
these cases the monitor will likely be used in landscape mode.

Accept the modes as if they are landscape rather than portrait. A
further improvement would be to restrict the orientation setting.

Fixes #639
2019-08-27 13:43:29 +00:00
Benjamin Berg
561ac849d7 display: Add failure returns into CcDisplayConfig
This guards against accidental use of NULL pointers so that the panel
will hopefully not crash if new bugs like this are introduced.
2019-07-20 02:23:53 +00:00
Benjamin Berg
5aac1e93f2 display: Check scale is valid for all monitors when mirroring 2019-07-15 03:14:24 +00:00
Marco Trevisan (Treviño)
9ef001b3b1 display-config: Add size constraints and (global) scaled mode checks
Make possible to set scaled size constraints per configuration, and add a method
to verify if the current mode at scale is allowed for such config.

This allows to perform such check also in case we have global scaling enabled,
as in such case we must verify that all the selected current modes are supported
by the given scale.

Fixes GNOME/mutter#407
2019-07-15 03:14:23 +00:00
Benjamin Berg
ae22f72cac display: Prevent error when serializing invalid configuration
If no monitors are enabled, then the variant would end up with an
invalid variant type, causing a crash later on. This case only happened
due to other bugs (i.e. in principle we should never send a
configuration without any monitors to the server).

Prevent the serialization error by specifying the correct type for the
builder, therefore potentially preventing a crash in such a corner case.
2019-03-20 17:26:56 +01:00
Benjamin Berg
0c4e84e417 display: Ensure we have a primary monitor after all were disabled
When enabling the first monitor, we need to select it as primary as we
otherwise end up without a primary monitor (rendering the configuration
invalid). "Unsetting" the NULL primary monitor effectively causes the
first and only available monitor to become the primary, while not doing
anything if we have a primary monitor.
2019-03-20 17:26:08 +01:00
Benjamin Berg
37c768ab0f display: Fix Apply button showing for changes to disabled monitor
Disabled monitors may or may not have a mode selected. This means, we
need to skip the mode comparison if the two compared monitors are
disabled (i.e. have no logical monitor).
Move the mode check to the end and skip it if both monitors are disabled.

This fixes cases where identical configurations are misdetected, because
we applied a mode to a monitor and disabled the monitor again. This
happens for example when switching the active monitor in "single" mode.
2019-03-11 18:32:21 +00:00
Benjamin Berg
d9aab36609 display: Compare configurations without monitor offset
When comparing configurations, the monitor positions are compared
directly. This comparison will not work properly if one of the
configurations has an offset.

This results in the "Apply" button to show up incorrectly after moving
the top/left monitor position.
2019-01-29 12:05:43 +01:00
Alex Hirsch
b4809cd210 display: Mode compare takes interlaced into account
When changing the display mode, the apply button does not appear if the
current mode and new mode differ only in their interlaced flag.

The display mode comparison function now takes the interlaced flag into
account.
2018-11-10 20:38:02 +01:00
Robert Ancell
961b41a291 display: Use g_auto for variables 2018-05-29 22:35:32 +00:00
Benjamin Berg
32be5bd1d9 display: Add signal to monitor notifying about position changes
This is in preparation to a new arrangement widget.

https://bugzilla.gnome.org/show_bug.cgi?id=786971
2018-05-28 20:57:20 -03:00
Rui Matos
1fe3f5c5fe display: Add support for mutter's global scale requirement
If mutter requires the same scale on all logical monitors we must
propagate a scale set on one monitor to the remaining ones or we'll
fail validation leaving users wondering why it doesn't work.

https://bugzilla.gnome.org/show_bug.cgi?id=790809
2018-01-21 12:24:54 -02:00
Rui Matos
245f796f4a display: Remove automatic layout adjustments
As the comment hinted at, fixing layouts automatically to ensure their
applicability doesn't actually work in all cases and in fact may force
users to redo their layout completely after a seemingly small change.

So, let's stop pretending we can do it and instead leave it to users
to fix it manually.

https://bugzilla.gnome.org/show_bug.cgi?id=789711
2017-11-13 18:31:39 +01:00
Rui Matos
a4a243cee4 display: Round scaled logical monitor sizes the same way mutter does
Mutter uses round() while we are just truncating via the implicit
double -> int type conversion, meaning that mutter will reject some
configurations that should work. Fix that by using the same rounding
as mutter.

https://bugzilla.gnome.org/show_bug.cgi?id=786919
2017-08-28 18:58:05 +02:00
Rui Matos
e4dc2995a3 display: Add a signal for scale changes
This will allows other bits of the UI to monitor scale changes.
2017-08-22 19:21:41 +02:00
Rui Matos
353236b576 display-config-dbus: Consider interlaced flag for similar modes
Otherwise we could end up picking an interlaced mode when we want a
non-interlaced one or vice-versa since they might have equal
refresh rates.

https://bugzilla.gnome.org/show_bug.cgi?id=785949
2017-08-09 19:27:08 +02:00
Rui Matos
7c89e30a47 display: Add some signals to the new configuration API
These will be useful to keep track of changes across different places
in the new UI.

https://bugzilla.gnome.org/show_bug.cgi?id=785949
2017-08-09 19:27:08 +02:00
Jonas Ådahl
c37ce6fcb4 display: Add is_interlaced() D-Bus implementation
Whether a mode is interlaced or not is now exported by adding a
'is-interlaced' (b) value to the mode properties variant. Implement the
is_interlaced() vfunc using this information.
2017-07-14 18:32:55 +02:00
Jonas Ådahl
252fd31762 display: Update to the new D-Bus API mode format
The mode format communicated via the new D-Bus API changed to
specifying modes using a per monitor unique mode ID string. The uint
'flags' was also changed to more flexible a{sv} 'properties' structure.
2017-07-14 18:32:55 +02:00
Marco Trevisan (Treviño)
cca9663d87 display: Adapt to new Mutter interface with scaling per mode
New Mutter GetCurrentState now provides a list of available scales, we
need to use these values in order to define an UI that shows them all.
2017-07-14 18:32:54 +02:00
Rui Matos
8a175d1106 display: Provide an implementation for mutter's new display config API
This adapts as much as possible mutter's new display config API to the
current display panel's expectations. In particular we keep the
concept of logical monitors hidden from the panel. They will later be
exposed when we re-design the panel to make full use of the new API.

https://bugzilla.gnome.org/show_bug.cgi?id=782785
2017-05-18 18:57:26 +02:00