Skip to content
Commits on Source (25)
================
Version 42.3
================
- Updated translations
Display
- Use virtual clone modes when mirroring
Network
- Prevent crash by disconnecting device.
- Fix Wi-Fi network with "&" in name not appearing.
- Fix warning when panel closed.
================
Version 42.2
================
......
gnome-control-center (1:42.3-2ubuntu1) kinetic; urgency=medium
* Merge with Debian
- Fix GNOME version number with latest gnome-desktop (LP: #1986616)
* Recommend libcanberra-pulse for Test Sound Output feature (Closes: #676234)
(LP: #1983638) (LP: #1004973)
* Refresh patches
-- Jeremy Bicha <jbicha@ubuntu.com> Thu, 18 Aug 2022 09:16:02 -0400
gnome-control-center (1:42.3-2) unstable; urgency=medium
* Lower gnome-remote-desktop from Depends to Recommends (Closes: #1014879)
* Cherry-pick patches to use gnome-shell version number as
the GNOME Version in the About page
-- Jeremy Bicha <jbicha@ubuntu.com> Sat, 16 Jul 2022 16:24:18 +0200
gnome-control-center (1:42.3-1) unstable; urgency=medium
[ Jeremy Bicha ]
* New upstream release
* debian/control.in: Depend on gnome-remote-desktop (LP: #1980606)
[ Marco Trevisan (Treviño) ]
* debian/patches: Use Fedora patch to handle distro logo
-- Jeremy Bicha <jbicha@ubuntu.com> Sun, 03 Jul 2022 19:21:29 -0400
gnome-control-center (1:42.2-1ubuntu2) kinetic; urgency=medium
* Rebuild against latest gnome-desktop
......
......@@ -7,7 +7,7 @@ Section: gnome
Priority: optional
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
XSBC-Original-Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
Uploaders: Jeremy Bicha <jbicha@ubuntu.com>, Laurent Bigonville <bigon@debian.org>, Sebastien Bacher <seb128@debian.org>
Uploaders: Jeremy Bicha <jbicha@ubuntu.com>
Build-Depends: debhelper-compat (= 13),
dh-sequence-gnome (>= 0.22.2),
libaccountsservice-dev (>= 0.6.39),
......@@ -91,11 +91,13 @@ Depends: ${misc:Depends},
whoopsie-preferences,
Recommends: cups-pk-helper,
gnome-online-accounts (>= 3.25.3),
gnome-remote-desktop (>= 42),
gnome-user-docs,
# gnome-user-share,
gkbd-capplet,
ibus,
iso-codes,
libcanberra-pulse,
policykit-1,
power-profiles-daemon,
# pulseaudio-module-bluetooth,
......
......@@ -87,11 +87,13 @@ Depends: ${misc:Depends},
whoopsie-preferences,
Recommends: cups-pk-helper,
gnome-online-accounts (>= 3.25.3),
gnome-remote-desktop (>= 42),
gnome-user-docs,
# gnome-user-share,
gkbd-capplet,
ibus,
iso-codes,
libcanberra-pulse,
policykit-1,
power-profiles-daemon,
# pulseaudio-module-bluetooth,
......
From: Michael Catanzaro <mcatanzaro@gnome.org>
Date: Tue, 9 Mar 2021 14:51:54 -0600
Subject: [PATCH 1/2] info-overview: add build option to control distributor
logo
Subject: info-overview: add build option to control distributor logo
Currently, we display a 256x256 version of the OS icon from
/etc/os-release. This is too big for my taste, and it's also not
......@@ -9,11 +8,14 @@ sufficient for distros that want to display a logo that is not an icon.
For instance, because we no longer display the operating system name
immediately beneath the logo, it may be desirable to use a logo variant
that includes text. This patch adds a meson build option that
distributions can use to override the logo.
distributions can use to override the logo, and a second build option to
specify a different logo for use in dark mode.
Because the logo might include text, distributions may want to vary the
logo used in dark mode. A subsequent commit will add a second option for
this.
This may be removed when debian will expose the LOGO property in
/etc/os-release (as per upstream commit f39cd5a93)
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=989690
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/base-files/+bug/1931582
---
meson.build | 11 +++++++++++
meson_options.txt | 2 ++
......
......@@ -6,10 +6,13 @@ Subject: display-config: Parse privacy screen property and expose it per
Each monitor can have a privacy screen property, so read it and expose
so that it can be at upper levels.
This is a backport of the gtk4 version proposed upstream, and can be
safely removed post GNOME-41.
Origin: https://gitlab.gnome.org/GNOME/gnome-control-center/-/merge_requests/1032
(cherry picked from commit 2f6d086c6f8c00c1b04687bd9db5532ad7f4b773)
---
panels/display/cc-display-config-dbus.c | 24 ++++++++++++++++++++++++
panels/display/cc-display-config.c | 6 ++++++
......@@ -17,10 +20,10 @@ Origin: https://gitlab.gnome.org/GNOME/gnome-control-center/-/merge_requests/103
3 files changed, 41 insertions(+)
diff --git a/panels/display/cc-display-config-dbus.c b/panels/display/cc-display-config-dbus.c
index 83a49ad..02761f5 100644
index bb1d797..2b4addc 100644
--- a/panels/display/cc-display-config-dbus.c
+++ b/panels/display/cc-display-config-dbus.c
@@ -303,6 +303,7 @@ struct _CcDisplayMonitorDBus
@@ -340,6 +340,7 @@ struct _CcDisplayMonitorDBus
int height_mm;
gboolean builtin;
CcDisplayMonitorUnderscanning underscanning;
......@@ -28,7 +31,7 @@ index 83a49ad..02761f5 100644
int max_width;
int max_height;
@@ -588,6 +589,14 @@ cc_display_monitor_dbus_get_underscanning (CcDisplayMonitor *pself)
@@ -625,6 +626,14 @@ cc_display_monitor_dbus_get_underscanning (CcDisplayMonitor *pself)
return self->underscanning == UNDERSCANNING_ENABLED;
}
......@@ -43,15 +46,15 @@ index 83a49ad..02761f5 100644
static void
cc_display_monitor_dbus_set_underscanning (CcDisplayMonitor *pself,
gboolean underscanning)
@@ -768,6 +777,7 @@ cc_display_monitor_dbus_class_init (CcDisplayMonitorDBusClass *klass)
@@ -843,6 +852,7 @@ cc_display_monitor_dbus_class_init (CcDisplayMonitorDBusClass *klass)
parent_class->supports_underscanning = cc_display_monitor_dbus_supports_underscanning;
parent_class->get_underscanning = cc_display_monitor_dbus_get_underscanning;
parent_class->set_underscanning = cc_display_monitor_dbus_set_underscanning;
+ parent_class->get_privacy = cc_display_monitor_dbus_get_privacy;
parent_class->set_mode = cc_display_monitor_dbus_set_mode;
parent_class->set_compatible_clone_mode = cc_display_monitor_dbus_set_compatible_clone_mode;
parent_class->set_position = cc_display_monitor_dbus_set_position;
parent_class->get_scale = cc_display_monitor_dbus_get_scale;
@@ -856,6 +866,20 @@ cc_display_monitor_dbus_new (GVariant *variant,
@@ -932,6 +942,20 @@ cc_display_monitor_dbus_new (GVariant *variant,
{
g_variant_get (v, "s", &self->display_name);
}
......@@ -73,10 +76,10 @@ index 83a49ad..02761f5 100644
return self;
diff --git a/panels/display/cc-display-config.c b/panels/display/cc-display-config.c
index a78b33f..381c9e0 100644
index 25f4aae..4c21aa8 100644
--- a/panels/display/cc-display-config.c
+++ b/panels/display/cc-display-config.c
@@ -322,6 +322,12 @@ cc_display_monitor_set_underscanning (CcDisplayMonitor *self,
@@ -334,6 +334,12 @@ cc_display_monitor_set_underscanning (CcDisplayMonitor *self,
return CC_DISPLAY_MONITOR_GET_CLASS (self)->set_underscanning (self, underscanning);
}
......@@ -90,7 +93,7 @@ index a78b33f..381c9e0 100644
cc_display_monitor_set_mode (CcDisplayMonitor *self, CcDisplayMode *m)
{
diff --git a/panels/display/cc-display-config.h b/panels/display/cc-display-config.h
index d83fa8e..2587916 100644
index e58009b..c136f57 100644
--- a/panels/display/cc-display-config.h
+++ b/panels/display/cc-display-config.h
@@ -68,6 +68,14 @@ typedef enum _CcDisplayRotation
......@@ -108,7 +111,7 @@ index d83fa8e..2587916 100644
#define CC_TYPE_DISPLAY_MODE (cc_display_mode_get_type ())
G_DECLARE_DERIVABLE_TYPE (CcDisplayMode, cc_display_mode,
@@ -121,6 +129,7 @@ struct _CcDisplayMonitorClass
@@ -123,6 +131,7 @@ struct _CcDisplayMonitorClass
gboolean (*get_underscanning) (CcDisplayMonitor *self);
void (*set_underscanning) (CcDisplayMonitor *self,
gboolean u);
......@@ -116,7 +119,7 @@ index d83fa8e..2587916 100644
CcDisplayMode* (*get_mode) (CcDisplayMonitor *self);
CcDisplayMode* (*get_preferred_mode) (CcDisplayMonitor *self);
GList* (*get_modes) (CcDisplayMonitor *self);
@@ -214,6 +223,8 @@ gboolean cc_display_monitor_get_underscanning (CcDisplayMonitor *
@@ -222,6 +231,8 @@ gboolean cc_display_monitor_get_underscanning (CcDisplayMonitor *
void cc_display_monitor_set_underscanning (CcDisplayMonitor *monitor,
gboolean underscanning);
......
From: Bastien Nocera <hadess@hadess.net>
Date: Wed, 4 May 2022 09:38:38 +0200
Subject: info-overview: Don't load version.xml info we don't use
We don't use the distributor or date info from gnome-desktop's version.xml
so no need to parse it.
(cherry picked from commit 8914fae8daba71e255285e6ca58f1ec894785b2f)
---
panels/info-overview/cc-info-overview-panel.c | 18 ++----------------
1 file changed, 2 insertions(+), 16 deletions(-)
diff --git a/panels/info-overview/cc-info-overview-panel.c b/panels/info-overview/cc-info-overview-panel.c
index 5ff649d..3eddd35 100644
--- a/panels/info-overview/cc-info-overview-panel.c
+++ b/panels/info-overview/cc-info-overview-panel.c
@@ -79,8 +79,6 @@ typedef struct
{
char *major;
char *minor;
- char *distributor;
- char *date;
char **current;
} VersionData;
@@ -89,8 +87,6 @@ version_data_free (VersionData *data)
{
g_free (data->major);
g_free (data->minor);
- g_free (data->distributor);
- g_free (data->date);
g_free (data);
}
@@ -111,10 +107,6 @@ version_start_element_handler (GMarkupParseContext *ctx,
data->current = &data->major;
else if (g_str_equal (element_name, "minor"))
data->current = &data->minor;
- else if (g_str_equal (element_name, "distributor"))
- data->current = &data->distributor;
- else if (g_str_equal (element_name, "date"))
- data->current = &data->date;
else
data->current = NULL;
}
@@ -148,9 +140,7 @@ version_text_handler (GMarkupParseContext *ctx,
}
static gboolean
-load_gnome_version (char **version,
- char **distributor,
- char **date)
+load_gnome_version (char **version)
{
GMarkupParser version_parser = {
version_start_element_handler,
@@ -182,10 +172,6 @@ load_gnome_version (char **version,
{
if (version != NULL)
*version = g_strdup_printf ("%s.%s", data->major, data->minor);
- if (distributor != NULL)
- *distributor = g_strdup (data->distributor);
- if (date != NULL)
- *date = g_strdup (data->date);
return TRUE;
}
@@ -771,7 +757,7 @@ info_overview_panel_setup_overview (CcInfoOverviewPanel *self)
g_autofree char *os_name_text = NULL;
g_autofree gchar *graphics_hardware_string = NULL;
- if (load_gnome_version (&gnome_version, NULL, NULL))
+ if (load_gnome_version (&gnome_version))
cc_list_row_set_secondary_label (self->gnome_version_row, gnome_version);
cc_list_row_set_secondary_label (self->windowing_system_row, get_windowing_system ());
From: Bastien Nocera <hadess@hadess.net>
Date: Wed, 4 May 2022 09:54:34 +0200
Subject: info-overview: Load GNOME version from gnome-shell
See https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5406
(cherry picked from commit bfc567955f6235b522c9acce5d4c27fc83929fe0)
---
panels/info-overview/cc-info-overview-panel.c | 62 ++++++++++++++++++++++++++-
1 file changed, 60 insertions(+), 2 deletions(-)
diff --git a/panels/info-overview/cc-info-overview-panel.c b/panels/info-overview/cc-info-overview-panel.c
index 3eddd35..7bdee59 100644
--- a/panels/info-overview/cc-info-overview-panel.c
+++ b/panels/info-overview/cc-info-overview-panel.c
@@ -23,6 +23,7 @@
#include <config.h>
#include "cc-hostname-entry.h"
+#include "shell/cc-object-storage.h"
#include "cc-info-overview-resources.h"
#include "info-cleanup.h"
@@ -745,6 +746,56 @@ get_ram_size_dmi (void)
return ram_total;
}
+static char *
+get_gnome_version (GDBusProxy *proxy)
+{
+ g_autoptr(GVariant) variant = NULL;
+ const char *gnome_version = NULL;
+ if (!proxy)
+ return NULL;
+
+ variant = g_dbus_proxy_get_cached_property (proxy, "ShellVersion");
+ if (!variant)
+ return NULL;
+
+ gnome_version = g_variant_get_string (variant, NULL);
+ if (!gnome_version || *gnome_version == '\0')
+ return NULL;
+ return g_strdup (gnome_version);
+}
+
+static void
+shell_proxy_ready (GObject *source,
+ GAsyncResult *res,
+ CcInfoOverviewPanel *self)
+{
+ g_autoptr(GDBusProxy) proxy = NULL;
+ g_autoptr(GError) error = NULL;
+ g_autoptr(GVariant) variant = NULL;
+ g_autofree char *gnome_version = NULL;
+
+ proxy = cc_object_storage_create_dbus_proxy_finish (res, &error);
+ if (!proxy)
+ {
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
+ g_warning ("Failed to contact gnome-shell: %s", error->message);
+ }
+
+ gnome_version = get_gnome_version (proxy);
+
+ if (!gnome_version)
+ {
+ /* translators: this is the placeholder string when the GNOME Shell
+ * version couldn't be loaded, eg. “GNOME Version: Not Available” */
+ cc_list_row_set_secondary_label (self->gnome_version_row, _("Not Available"));
+ }
+ else
+ {
+ cc_list_row_set_secondary_label (self->gnome_version_row, gnome_version);
+ }
+}
+
static void
info_overview_panel_setup_overview (CcInfoOverviewPanel *self)
{
@@ -757,8 +808,15 @@ info_overview_panel_setup_overview (CcInfoOverviewPanel *self)
g_autofree char *os_name_text = NULL;
g_autofree gchar *graphics_hardware_string = NULL;
- if (load_gnome_version (&gnome_version))
- cc_list_row_set_secondary_label (self->gnome_version_row, gnome_version);
+ cc_object_storage_create_dbus_proxy (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS |
+ G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
+ "org.gnome.Shell",
+ "/org/gnome/Shell",
+ "org.gnome.Shell",
+ cc_panel_get_cancellable (CC_PANEL (self)),
+ (GAsyncReadyCallback) shell_proxy_ready,
+ self);
cc_list_row_set_secondary_label (self->windowing_system_row, get_windowing_system ());
From: Bastien Nocera <hadess@hadess.net>
Date: Wed, 4 May 2022 09:59:10 +0200
Subject: info-overview: Remove old version.xml loading code
(cherry picked from commit 88f87de7480f6513bcbaf658c272a9751b8f76ad)
---
panels/info-overview/cc-info-overview-panel.c | 102 --------------------------
1 file changed, 102 deletions(-)
diff --git a/panels/info-overview/cc-info-overview-panel.c b/panels/info-overview/cc-info-overview-panel.c
index 7bdee59..acb7884 100644
--- a/panels/info-overview/cc-info-overview-panel.c
+++ b/panels/info-overview/cc-info-overview-panel.c
@@ -76,110 +76,8 @@ struct _CcInfoOverviewPanel
CcListRow *windowing_system_row;
};
-typedef struct
-{
- char *major;
- char *minor;
- char **current;
-} VersionData;
-
-static void
-version_data_free (VersionData *data)
-{
- g_free (data->major);
- g_free (data->minor);
- g_free (data);
-}
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (VersionData, version_data_free);
-
G_DEFINE_TYPE (CcInfoOverviewPanel, cc_info_overview_panel, CC_TYPE_PANEL)
-static void
-version_start_element_handler (GMarkupParseContext *ctx,
- const char *element_name,
- const char **attr_names,
- const char **attr_values,
- gpointer user_data,
- GError **error)
-{
- VersionData *data = user_data;
- if (g_str_equal (element_name, "platform"))
- data->current = &data->major;
- else if (g_str_equal (element_name, "minor"))
- data->current = &data->minor;
- else
- data->current = NULL;
-}
-
-static void
-version_end_element_handler (GMarkupParseContext *ctx,
- const char *element_name,
- gpointer user_data,
- GError **error)
-{
- VersionData *data = user_data;
- data->current = NULL;
-}
-
-static void
-version_text_handler (GMarkupParseContext *ctx,
- const char *text,
- gsize text_len,
- gpointer user_data,
- GError **error)
-{
- VersionData *data = user_data;
- if (data->current != NULL)
- {
- g_autofree char *stripped = NULL;
-
- stripped = g_strstrip (g_strdup (text));
- g_free (*data->current);
- *data->current = g_strdup (stripped);
- }
-}
-
-static gboolean
-load_gnome_version (char **version)
-{
- GMarkupParser version_parser = {
- version_start_element_handler,
- version_end_element_handler,
- version_text_handler,
- NULL,
- NULL,
- };
- g_autoptr(GError) error = NULL;
- g_autoptr(GMarkupParseContext) ctx = NULL;
- g_autofree char *contents = NULL;
- gsize length;
- g_autoptr(VersionData) data = NULL;
-
- if (!g_file_get_contents (DATADIR "/gnome/gnome-version.xml",
- &contents,
- &length,
- &error))
- return FALSE;
-
- data = g_new0 (VersionData, 1);
- ctx = g_markup_parse_context_new (&version_parser, 0, data, NULL);
-
- if (!g_markup_parse_context_parse (ctx, contents, length, &error))
- {
- g_warning ("Invalid version file: '%s'", error->message);
- }
- else
- {
- if (version != NULL)
- *version = g_strdup_printf ("%s.%s", data->major, data->minor);
-
- return TRUE;
- }
-
- return FALSE;
-};
-
static char *
get_renderer_from_session (void)
{
......@@ -6,8 +6,11 @@ keyboard-For-xkb-options-have-Layout-default-toggle-and-N.patch
keyboard-Avoid-modifying-xkb-options-when-user-changes-n.patch
debian/Expose-touchpad-settings-if-synaptics-is-in-use.patch
debian/Debian-s-adduser-doesn-t-allow-uppercase-letters-by-defau.patch
debian/info-overview-add-build-option-to-control-distributor-log.patch
debian/Ignore-result-of-test-network-panel.patch
ubuntu/distro-logo.patch
info-overview-Don-t-load-version.xml-info-we-don-t-use.patch
info-overview-Load-GNOME-version-from-gnome-shell.patch
info-overview-Remove-old-version.xml-loading-code.patch
ubuntu/keyboard-Add-launch-terminal-shortcut.patch
ubuntu/sound-Allow-volume-to-be-set-above-100.patch
ubuntu/Allow-tweaking-some-settings-for-Ubuntu-Dock.patch
......
......@@ -11,10 +11,10 @@ Subject: display: Allow fractional scaling to be enabled
5 files changed, 351 insertions(+), 1 deletion(-)
diff --git a/panels/display/cc-display-config-dbus.c b/panels/display/cc-display-config-dbus.c
index 8e2385b..07e534b 100644
index 2b4addc..96f69bf 100644
--- a/panels/display/cc-display-config-dbus.c
+++ b/panels/display/cc-display-config-dbus.c
@@ -918,6 +918,8 @@ struct _CcDisplayConfigDBus
@@ -994,6 +994,8 @@ struct _CcDisplayConfigDBus
gboolean supports_changing_layout_mode;
gboolean global_scale_required;
CcDisplayLayoutMode layout_mode;
......@@ -23,7 +23,7 @@ index 8e2385b..07e534b 100644
GList *monitors;
CcDisplayMonitorDBus *primary;
@@ -1086,6 +1088,9 @@ cc_display_config_dbus_equal (CcDisplayConfig *pself,
@@ -1160,6 +1162,9 @@ cc_display_config_dbus_equal (CcDisplayConfig *pself,
g_return_val_if_fail (pself, FALSE);
g_return_val_if_fail (pother, FALSE);
......@@ -33,7 +33,7 @@ index 8e2385b..07e534b 100644
cc_display_config_dbus_ensure_non_offset_coords (self);
cc_display_config_dbus_ensure_non_offset_coords (other);
@@ -1235,6 +1240,29 @@ cc_display_config_dbus_is_layout_logical (CcDisplayConfig *pself)
@@ -1458,6 +1463,29 @@ cc_display_config_dbus_is_layout_logical (CcDisplayConfig *pself)
self->layout_mode == CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL;
}
......@@ -63,7 +63,7 @@ index 8e2385b..07e534b 100644
static gboolean
cc_display_config_dbus_layout_use_ui_scale (CcDisplayConfig *pself)
{
@@ -1242,6 +1270,20 @@ cc_display_config_dbus_layout_use_ui_scale (CcDisplayConfig *pself)
@@ -1465,6 +1493,20 @@ cc_display_config_dbus_layout_use_ui_scale (CcDisplayConfig *pself)
return self->layout_mode == CC_DISPLAY_LAYOUT_MODE_GLOBAL_UI_LOGICAL;
}
......@@ -84,7 +84,7 @@ index 8e2385b..07e534b 100644
static gboolean
is_scale_allowed_by_active_monitors (CcDisplayConfigDBus *self,
CcDisplayMode *mode,
@@ -1409,6 +1451,11 @@ cc_display_config_dbus_init (CcDisplayConfigDBus *self)
@@ -1632,6 +1674,11 @@ cc_display_config_dbus_init (CcDisplayConfigDBus *self)
self->global_scale_required = FALSE;
self->layout_mode = CC_DISPLAY_LAYOUT_MODE_LOGICAL;
self->logical_monitors = g_hash_table_new (NULL, NULL);
......@@ -96,7 +96,7 @@ index 8e2385b..07e534b 100644
}
static void
@@ -1625,6 +1672,15 @@ cc_display_config_dbus_constructed (GObject *object)
@@ -1816,6 +1863,15 @@ cc_display_config_dbus_constructed (GObject *object)
{
g_variant_get (v, "b", &self->global_scale_required);
}
......@@ -112,17 +112,17 @@ index 8e2385b..07e534b 100644
else if (g_str_equal (s, "layout-mode"))
{
guint32 u = 0;
@@ -1729,6 +1785,7 @@ cc_display_config_dbus_finalize (GObject *object)
@@ -1919,6 +1975,7 @@ cc_display_config_dbus_finalize (GObject *object)
g_clear_list (&self->monitors, g_object_unref);
g_clear_pointer (&self->logical_monitors, g_hash_table_destroy);
g_clear_pointer (&self->clone_modes, g_list_free);
+ g_clear_pointer (&self->renderer, g_free);
G_OBJECT_CLASS (cc_display_config_dbus_parent_class)->finalize (object);
}
@@ -1754,11 +1811,14 @@ cc_display_config_dbus_class_init (CcDisplayConfigDBusClass *klass)
@@ -1944,11 +2001,14 @@ cc_display_config_dbus_class_init (CcDisplayConfigDBusClass *klass)
parent_class->set_cloning = cc_display_config_dbus_set_cloning;
parent_class->get_cloning_modes = cc_display_config_dbus_get_cloning_modes;
parent_class->generate_cloning_modes = cc_display_config_dbus_generate_cloning_modes;
parent_class->is_layout_logical = cc_display_config_dbus_is_layout_logical;
+ parent_class->set_layout_logical = cc_display_config_dbus_set_layout_logical;
parent_class->is_scaled_mode_valid = cc_display_config_dbus_is_scaled_mode_valid;
......@@ -136,7 +136,7 @@ index 8e2385b..07e534b 100644
pspec = g_param_spec_variant ("state",
"GVariant",
diff --git a/panels/display/cc-display-config.c b/panels/display/cc-display-config.c
index 69ca9c1..82c14e2 100644
index 4c21aa8..5743869 100644
--- a/panels/display/cc-display-config.c
+++ b/panels/display/cc-display-config.c
@@ -17,6 +17,11 @@
......@@ -151,7 +151,7 @@ index 69ca9c1..82c14e2 100644
#include <gio/gio.h>
#include <math.h>
#include "cc-display-config.h"
@@ -425,6 +430,10 @@ cc_display_monitor_set_ui_info (CcDisplayMonitor *self, gint ui_number, gchar *u
@@ -443,6 +448,10 @@ cc_display_monitor_set_ui_info (CcDisplayMonitor *self, gint ui_number, gchar *u
struct _CcDisplayConfigPrivate {
GList *ui_sorted_monitors;
......@@ -162,7 +162,7 @@ index 69ca9c1..82c14e2 100644
};
typedef struct _CcDisplayConfigPrivate CcDisplayConfigPrivate;
@@ -432,6 +441,68 @@ G_DEFINE_TYPE_WITH_PRIVATE (CcDisplayConfig,
@@ -450,6 +459,68 @@ G_DEFINE_TYPE_WITH_PRIVATE (CcDisplayConfig,
cc_display_config,
G_TYPE_OBJECT)
......@@ -231,7 +231,7 @@ index 69ca9c1..82c14e2 100644
static void
cc_display_config_init (CcDisplayConfig *self)
{
@@ -469,6 +540,10 @@ cc_display_config_constructed (GObject *object)
@@ -487,6 +558,10 @@ cc_display_config_constructed (GObject *object)
ui_number += 1;
}
......@@ -242,7 +242,7 @@ index 69ca9c1..82c14e2 100644
}
static void
@@ -478,6 +553,7 @@ cc_display_config_finalize (GObject *object)
@@ -496,6 +571,7 @@ cc_display_config_finalize (GObject *object)
CcDisplayConfigPrivate *priv = cc_display_config_get_instance_private (self);
g_list_free (priv->ui_sorted_monitors);
......@@ -250,7 +250,7 @@ index 69ca9c1..82c14e2 100644
G_OBJECT_CLASS (cc_display_config_parent_class)->finalize (object);
}
@@ -568,9 +644,16 @@ gboolean
@@ -587,9 +663,16 @@ gboolean
cc_display_config_equal (CcDisplayConfig *self,
CcDisplayConfig *other)
{
......@@ -267,7 +267,7 @@ index 69ca9c1..82c14e2 100644
return CC_DISPLAY_CONFIG_GET_CLASS (self)->equal (self, other);
}
@@ -578,6 +661,8 @@ gboolean
@@ -597,6 +680,8 @@ gboolean
cc_display_config_apply (CcDisplayConfig *self,
GError **error)
{
......@@ -276,7 +276,7 @@ index 69ca9c1..82c14e2 100644
if (!CC_IS_DISPLAY_CONFIG (self))
{
g_warning ("Cannot apply invalid configuration");
@@ -588,6 +673,12 @@ cc_display_config_apply (CcDisplayConfig *self,
@@ -607,6 +692,12 @@ cc_display_config_apply (CcDisplayConfig *self,
return FALSE;
}
......@@ -289,7 +289,7 @@ index 69ca9c1..82c14e2 100644
return CC_DISPLAY_CONFIG_GET_CLASS (self)->apply (self, error);
}
@@ -620,6 +711,14 @@ cc_display_config_is_layout_logical (CcDisplayConfig *self)
@@ -639,6 +730,14 @@ cc_display_config_is_layout_logical (CcDisplayConfig *self)
return CC_DISPLAY_CONFIG_GET_CLASS (self)->is_layout_logical (self);
}
......@@ -304,7 +304,7 @@ index 69ca9c1..82c14e2 100644
void
cc_display_config_set_minimum_size (CcDisplayConfig *self,
int width,
@@ -629,13 +728,37 @@ cc_display_config_set_minimum_size (CcDisplayConfig *self,
@@ -648,13 +747,37 @@ cc_display_config_set_minimum_size (CcDisplayConfig *self,
CC_DISPLAY_CONFIG_GET_CLASS (self)->set_minimum_size (self, width, height);
}
......@@ -342,7 +342,7 @@ index 69ca9c1..82c14e2 100644
return CC_DISPLAY_CONFIG_GET_CLASS (self)->is_scaled_mode_valid (self, mode, scale);
}
@@ -670,3 +793,124 @@ cc_display_config_get_maximum_scaling (CcDisplayConfig *self)
@@ -689,3 +812,124 @@ cc_display_config_get_maximum_scaling (CcDisplayConfig *self)
return max_scale;
}
......@@ -468,19 +468,19 @@ index 69ca9c1..82c14e2 100644
+ return priv->fractional_scaling;
+}
diff --git a/panels/display/cc-display-config.h b/panels/display/cc-display-config.h
index 2ad35d1..dc3a924 100644
index c136f57..e206a02 100644
--- a/panels/display/cc-display-config.h
+++ b/panels/display/cc-display-config.h
@@ -163,6 +163,8 @@ struct _CcDisplayConfigClass
@@ -167,6 +167,8 @@ struct _CcDisplayConfigClass
gboolean clone);
GList* (*get_cloning_modes) (CcDisplayConfig *self);
GList* (*generate_cloning_modes) (CcDisplayConfig *self);
gboolean (*is_layout_logical) (CcDisplayConfig *self);
+ void (*set_layout_logical) (CcDisplayConfig *self,
+ gboolean enabled);
void (*set_minimum_size) (CcDisplayConfig *self,
int width,
int height);
@@ -171,6 +173,8 @@ struct _CcDisplayConfigClass
@@ -175,6 +177,8 @@ struct _CcDisplayConfigClass
double scale);
gboolean (* get_panel_orientation_managed) (CcDisplayConfig *self);
gboolean (*layout_use_ui_scale) (CcDisplayConfig *self);
......@@ -489,7 +489,7 @@ index 2ad35d1..dc3a924 100644
};
@@ -191,6 +195,8 @@ void cc_display_config_set_mode_on_all_outputs (CcDisplayConfig *co
@@ -195,6 +199,8 @@ void cc_display_config_set_mode_on_all_outputs (CcDisplayConfig *co
CcDisplayMode *mode);
gboolean cc_display_config_is_layout_logical (CcDisplayConfig *self);
......@@ -498,7 +498,7 @@ index 2ad35d1..dc3a924 100644
void cc_display_config_set_minimum_size (CcDisplayConfig *self,
int width,
int height);
@@ -200,8 +206,13 @@ gboolean cc_display_config_is_scaled_mode_valid (CcDisplayConfig
@@ -204,8 +210,13 @@ gboolean cc_display_config_is_scaled_mode_valid (CcDisplayConfig
gboolean cc_display_config_get_panel_orientation_managed
(CcDisplayConfig *self);
gboolean cc_display_config_layout_use_ui_scale (CcDisplayConfig *self);
......@@ -513,7 +513,7 @@ index 2ad35d1..dc3a924 100644
const char* cc_display_monitor_get_display_name (CcDisplayMonitor *monitor);
gboolean cc_display_monitor_is_active (CcDisplayMonitor *monitor);
diff --git a/panels/display/cc-display-settings.c b/panels/display/cc-display-settings.c
index 54301b3..b7158a4 100644
index 21a0a1a..5861e49 100644
--- a/panels/display/cc-display-settings.c
+++ b/panels/display/cc-display-settings.c
@@ -23,6 +23,7 @@
......@@ -540,7 +540,7 @@ index 54301b3..b7158a4 100644
static gboolean
should_show_rotation (CcDisplaySettings *self)
{
@@ -253,6 +254,7 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
@@ -254,6 +255,7 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
gtk_widget_set_visible (self->resolution_row, FALSE);
gtk_widget_set_visible (self->scale_combo_row, FALSE);
gtk_widget_set_visible (self->scale_buttons_row, FALSE);
......@@ -548,7 +548,7 @@ index 54301b3..b7158a4 100644
gtk_widget_set_visible (self->underscanning_row, FALSE);
return G_SOURCE_REMOVE;
@@ -457,6 +459,11 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
@@ -463,6 +465,11 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
}
cc_display_settings_refresh_layout (self, self->folded);
......@@ -560,7 +560,7 @@ index 54301b3..b7158a4 100644
gtk_widget_set_visible (self->underscanning_row,
cc_display_monitor_supports_underscanning (self->selected_output) &&
!cc_display_config_is_cloning (self->config));
@@ -752,6 +759,7 @@ cc_display_settings_class_init (CcDisplaySettingsClass *klass)
@@ -758,6 +765,7 @@ cc_display_settings_class_init (CcDisplaySettingsClass *klass)
gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, scale_bbox);
gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, scale_buttons_row);
gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, scale_combo_row);
......@@ -568,7 +568,7 @@ index 54301b3..b7158a4 100644
gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, underscanning_row);
gtk_widget_class_bind_template_child (widget_class, CcDisplaySettings, underscanning_switch);
@@ -763,6 +771,19 @@ cc_display_settings_class_init (CcDisplaySettingsClass *klass)
@@ -769,6 +777,19 @@ cc_display_settings_class_init (CcDisplaySettingsClass *klass)
gtk_widget_class_bind_template_callback (widget_class, on_underscanning_switch_active_changed_cb);
}
......@@ -588,7 +588,7 @@ index 54301b3..b7158a4 100644
static void
cc_display_settings_init (CcDisplaySettings *self)
{
@@ -798,6 +819,11 @@ cc_display_settings_init (CcDisplaySettings *self)
@@ -804,6 +825,11 @@ cc_display_settings_init (CcDisplaySettings *self)
adw_combo_row_set_model (ADW_COMBO_ROW (self->resolution_row),
G_LIST_MODEL (self->resolution_list));
......
......@@ -6,8 +6,12 @@ export DEB_LDFLAGS_MAINT_APPEND = -Wl,-O1 -Wl,-z,defs
# Not in Ubuntu main yet https://launchpad.net/bugs/1892456
ifeq ($(shell dpkg-vendor --is Ubuntu && echo yes),yes)
DISTRIBUTOR_LOGO := /usr/share/pixmaps/ubuntu-logo-icon.png
DISTRIBUTOR_LOGO_DARK := /usr/share/pixmaps/ubuntu-logo-dark.png
MALCONTENT := -Dmalcontent=false
else
DISTRIBUTOR_LOGO := /usr/share/icons/vendor/scalable/emblems/emblem-vendor.svg
DISTRIBUTOR_LOGO_DARK := /usr/share/icons/vendor/scalable/emblems/emblem-vendor.svg
ifneq (,$(filter $(DEB_HOST_ARCH), amd64 arm64 armel armhf i386 mips mipsel mips64el ppc64el s390x hppa powerpc powerpcspe ppc64))
MALCONTENT := -Dmalcontent=true
else
......@@ -30,6 +34,7 @@ override_dh_auto_configure:
-Ddocumentation=true \
-Dwhoopsie=true \
-Ddistributor_logo=/usr/share/pixmaps/ubuntu-logo-icon.png \
-Ddark_mode_distributor_logo=/usr/share/pixmaps/ubuntu-logo-dark.png \
-Ddistributor_logo=$(DISTRIBUTOR_LOGO) \
-Ddark_mode_distributor_logo=$(DISTRIBUTOR_LOGO) \
$(MALCONTENT) \
$(SNAP)
project(
'gnome-control-center', 'c',
version : '42.2',
version : '42.3',
license : 'GPL2+',
meson_version : '>= 0.53.0'
)
......
......@@ -76,6 +76,14 @@ cc_display_mode_dbus_equal (const CcDisplayModeDBus *m1,
(m1->flags & MODE_INTERLACED) == (m2->flags & MODE_INTERLACED);
}
static gboolean
cc_display_mode_dbus_is_clone_mode (CcDisplayMode *pself)
{
CcDisplayModeDBus *self = CC_DISPLAY_MODE_DBUS (pself);
return !self->id;
}
static void
cc_display_mode_dbus_get_resolution (CcDisplayMode *pself,
int *w, int *h)
......@@ -124,6 +132,14 @@ cc_display_mode_dbus_is_interlaced (CcDisplayMode *pself)
return !!(self->flags & MODE_INTERLACED);
}
static gboolean
cc_display_mode_dbus_is_preferred (CcDisplayMode *pself)
{
CcDisplayModeDBus *self = CC_DISPLAY_MODE_DBUS (pself);
return !!(self->flags & MODE_PREFERRED);
}
static int
cc_display_mode_dbus_get_freq (CcDisplayMode *pself)
{
......@@ -165,14 +181,35 @@ cc_display_mode_dbus_class_init (CcDisplayModeDBusClass *klass)
gobject_class->finalize = cc_display_mode_dbus_finalize;
parent_class->is_clone_mode = cc_display_mode_dbus_is_clone_mode;
parent_class->get_resolution = cc_display_mode_dbus_get_resolution;
parent_class->get_supported_scales = cc_display_mode_dbus_get_supported_scales;
parent_class->get_preferred_scale = cc_display_mode_dbus_get_preferred_scale;
parent_class->is_interlaced = cc_display_mode_dbus_is_interlaced;
parent_class->is_preferred = cc_display_mode_dbus_is_preferred;
parent_class->get_freq = cc_display_mode_dbus_get_freq;
parent_class->get_freq_f = cc_display_mode_dbus_get_freq_f;
}
static CcDisplayModeDBus *
cc_display_mode_dbus_new_virtual (int width,
int height,
double preferred_scale,
GArray *supported_scales)
{
g_autoptr(GVariant) properties_variant = NULL;
CcDisplayModeDBus *self;
self = g_object_new (CC_TYPE_DISPLAY_MODE_DBUS, NULL);
self->width = width;
self->height = height;
self->preferred_scale = preferred_scale;
self->supported_scales = g_array_ref (supported_scales);
return self;
}
static CcDisplayModeDBus *
cc_display_mode_dbus_new (CcDisplayMonitorDBus *monitor,
GVariant *variant)
......@@ -655,6 +692,44 @@ cc_display_monitor_dbus_set_mode (CcDisplayMonitor *pself,
g_signal_emit_by_name (self, "mode");
}
static void
cc_display_monitor_dbus_set_compatible_clone_mode (CcDisplayMonitor *pself,
CcDisplayMode *clone_mode)
{
CcDisplayMonitorDBus *self = CC_DISPLAY_MONITOR_DBUS (pself);
GList *l;
CcDisplayMode *best_mode = NULL;
int clone_width, clone_height;
g_return_if_fail (cc_display_mode_is_clone_mode (clone_mode));
cc_display_mode_get_resolution (clone_mode, &clone_width, &clone_height);
for (l = self->modes; l; l = l->next)
{
CcDisplayMode *mode = l->data;
int width, height;
cc_display_mode_get_resolution (mode, &width, &height);
if (width != clone_width || height != clone_height)
continue;
if (!best_mode)
{
best_mode = mode;
continue;
}
if (cc_display_mode_get_freq_f (mode) >
cc_display_mode_get_freq_f (best_mode))
best_mode = mode;
}
g_return_if_fail (best_mode);
cc_display_monitor_set_mode (CC_DISPLAY_MONITOR (self), best_mode);
}
static void
cc_display_monitor_dbus_set_position (CcDisplayMonitor *pself,
int x, int y)
......@@ -769,6 +844,7 @@ cc_display_monitor_dbus_class_init (CcDisplayMonitorDBusClass *klass)
parent_class->get_underscanning = cc_display_monitor_dbus_get_underscanning;
parent_class->set_underscanning = cc_display_monitor_dbus_set_underscanning;
parent_class->set_mode = cc_display_monitor_dbus_set_mode;
parent_class->set_compatible_clone_mode = cc_display_monitor_dbus_set_compatible_clone_mode;
parent_class->set_position = cc_display_monitor_dbus_set_position;
parent_class->get_scale = cc_display_monitor_dbus_get_scale;
parent_class->set_scale = cc_display_monitor_dbus_set_scale;
......@@ -898,8 +974,6 @@ struct _CcDisplayConfigDBus
CcDisplayMonitorDBus *primary;
GHashTable *logical_monitors;
GList *clone_modes;
};
G_DEFINE_TYPE (CcDisplayConfigDBus,
......@@ -1184,12 +1258,161 @@ cc_display_config_dbus_set_cloning (CcDisplayConfig *pself,
}
}
static gboolean
mode_supports_scale (CcDisplayMode *mode,
double scale)
{
g_autoptr(GArray) scales = NULL;
int i;
scales = cc_display_mode_get_supported_scales (mode);
for (i = 0; i < scales->len; i++)
{
if (G_APPROX_VALUE (scale, g_array_index (scales, double, i),
DBL_EPSILON))
return TRUE;
}
return FALSE;
}
static void
remove_unsupported_scales (CcDisplayMode *mode,
GArray *supported_scales)
{
g_autoptr(GArray) mode_scales = NULL;
int i;
mode_scales = cc_display_mode_get_supported_scales (mode);
i = 0;
while (i < supported_scales->len)
{
double scale;
if (i == supported_scales->len)
break;
scale = g_array_index (supported_scales, double, i);
if (mode_supports_scale (mode, scale))
{
i++;
continue;
}
g_array_remove_range (supported_scales, i, 1);
}
}
static gboolean
monitor_has_compatible_clone_mode (CcDisplayMonitorDBus *monitor,
CcDisplayModeDBus *mode,
GArray *supported_scales)
{
GList *l;
for (l = monitor->modes; l; l = l->next)
{
CcDisplayModeDBus *other_mode = l->data;
if (other_mode->width != mode->width ||
other_mode->height != mode->height)
continue;
if ((other_mode->flags & MODE_INTERLACED) !=
(mode->flags & MODE_INTERLACED))
continue;
remove_unsupported_scales (CC_DISPLAY_MODE (other_mode), supported_scales);
return TRUE;
}
return FALSE;
}
static gboolean
monitors_has_compatible_clone_mode (CcDisplayConfigDBus *self,
CcDisplayModeDBus *mode,
GArray *supported_scales)
{
GList *l;
for (l = self->monitors; l; l = l->next)
{
CcDisplayMonitorDBus *monitor = l->data;
if (!monitor_has_compatible_clone_mode (monitor, mode, supported_scales))
return FALSE;
}
return TRUE;
}
static gboolean
is_mode_better (CcDisplayModeDBus *mode,
CcDisplayModeDBus *other_mode)
{
if (mode->width * mode->height > other_mode->width * other_mode->height)
return TRUE;
else if (mode->width * mode->height < other_mode->width * other_mode->height)
return FALSE;
if (!(mode->flags & MODE_INTERLACED) &&
(other_mode->flags & MODE_INTERLACED))
return TRUE;
return FALSE;
}
static GList *
cc_display_config_dbus_get_cloning_modes (CcDisplayConfig *pself)
cc_display_config_dbus_generate_cloning_modes (CcDisplayConfig *pself)
{
CcDisplayConfigDBus *self = CC_DISPLAY_CONFIG_DBUS (pself);
CcDisplayMonitorDBus *base_monitor = NULL;
GList *l;
GList *clone_modes = NULL;
CcDisplayModeDBus *best_mode = NULL;
return self->clone_modes;
for (l = self->monitors; l; l = l->next)
{
CcDisplayMonitor *monitor = l->data;
if (cc_display_monitor_is_active (monitor))
{
base_monitor = CC_DISPLAY_MONITOR_DBUS (monitor);
break;
}
}
if (!base_monitor)
return NULL;
for (l = base_monitor->modes; l; l = l->next)
{
CcDisplayModeDBus *mode = l->data;
CcDisplayModeDBus *virtual_mode;
g_autoptr (GArray) supported_scales = NULL;
supported_scales =
cc_display_mode_get_supported_scales (CC_DISPLAY_MODE (mode));
if (!monitors_has_compatible_clone_mode (self, mode, supported_scales))
continue;
virtual_mode = cc_display_mode_dbus_new_virtual (mode->width,
mode->height,
mode->preferred_scale,
supported_scales);
clone_modes = g_list_append (clone_modes, virtual_mode);
if (!best_mode || is_mode_better (virtual_mode, best_mode))
best_mode = virtual_mode;
}
best_mode->flags |= MODE_PREFERRED;
return clone_modes;
}
static gboolean
......@@ -1378,36 +1601,6 @@ cc_display_config_dbus_init (CcDisplayConfigDBus *self)
self->logical_monitors = g_hash_table_new (NULL, NULL);
}
static void
gather_clone_modes (CcDisplayConfigDBus *self)
{
guint n_monitors = g_list_length (self->monitors);
CcDisplayMonitorDBus *monitor;
GList *l;
if (n_monitors < 2)
return;
monitor = self->monitors->data;
for (l = monitor->modes; l != NULL; l = l->next)
{
CcDisplayModeDBus *mode = l->data;
gboolean valid = TRUE;
GList *ll;
for (ll = self->monitors->next; ll != NULL; ll = ll->next)
{
CcDisplayMonitorDBus *other_monitor = ll->data;
if (!cc_display_monitor_dbus_get_closest_mode (other_monitor, mode))
{
valid = FALSE;
break;
}
}
if (valid)
self->clone_modes = g_list_prepend (self->clone_modes, mode);
}
}
static void
remove_logical_monitor (gpointer data,
GObject *object)
......@@ -1516,8 +1709,6 @@ construct_monitors (CcDisplayConfigDBus *self,
register_logical_monitor (self, logical_monitor);
}
gather_clone_modes (self);
}
static void
......@@ -1695,7 +1886,6 @@ cc_display_config_dbus_finalize (GObject *object)
g_clear_list (&self->monitors, g_object_unref);
g_clear_pointer (&self->logical_monitors, g_hash_table_destroy);
g_clear_pointer (&self->clone_modes, g_list_free);
G_OBJECT_CLASS (cc_display_config_dbus_parent_class)->finalize (object);
}
......@@ -1719,7 +1909,7 @@ cc_display_config_dbus_class_init (CcDisplayConfigDBusClass *klass)
parent_class->apply = cc_display_config_dbus_apply;
parent_class->is_cloning = cc_display_config_dbus_is_cloning;
parent_class->set_cloning = cc_display_config_dbus_set_cloning;
parent_class->get_cloning_modes = cc_display_config_dbus_get_cloning_modes;
parent_class->generate_cloning_modes = cc_display_config_dbus_generate_cloning_modes;
parent_class->is_layout_logical = cc_display_config_dbus_is_layout_logical;
parent_class->is_scaled_mode_valid = cc_display_config_dbus_is_scaled_mode_valid;
parent_class->set_minimum_size = cc_display_config_dbus_set_minimum_size;
......
......@@ -90,6 +90,12 @@ cc_display_mode_class_init (CcDisplayModeClass *klass)
{
}
gboolean
cc_display_mode_is_clone_mode (CcDisplayMode *self)
{
return CC_DISPLAY_MODE_GET_CLASS (self)->is_clone_mode (self);
}
void
cc_display_mode_get_resolution (CcDisplayMode *self, int *w, int *h)
{
......@@ -114,6 +120,12 @@ cc_display_mode_is_interlaced (CcDisplayMode *self)
return CC_DISPLAY_MODE_GET_CLASS (self)->is_interlaced (self);
}
gboolean
cc_display_mode_is_preferred (CcDisplayMode *self)
{
return CC_DISPLAY_MODE_GET_CLASS (self)->is_preferred (self);
}
int
cc_display_mode_get_freq (CcDisplayMode *self)
{
......@@ -328,6 +340,12 @@ cc_display_monitor_set_mode (CcDisplayMonitor *self, CcDisplayMode *m)
return CC_DISPLAY_MONITOR_GET_CLASS (self)->set_mode (self, m);
}
void
cc_display_monitor_set_compatible_clone_mode (CcDisplayMonitor *self, CcDisplayMode *m)
{
return CC_DISPLAY_MONITOR_GET_CLASS (self)->set_mode (self, m);
}
void
cc_display_monitor_set_position (CcDisplayMonitor *self, int x, int y)
{
......@@ -543,17 +561,18 @@ cc_display_config_is_applicable (CcDisplayConfig *self)
void
cc_display_config_set_mode_on_all_outputs (CcDisplayConfig *config,
CcDisplayMode *mode)
CcDisplayMode *clone_mode)
{
GList *outputs, *l;
g_return_if_fail (CC_IS_DISPLAY_CONFIG (config));
g_return_if_fail (cc_display_mode_is_clone_mode (clone_mode));
outputs = cc_display_config_get_monitors (config);
for (l = outputs; l; l = l->next)
{
CcDisplayMonitor *output = l->data;
cc_display_monitor_set_mode (output, mode);
cc_display_monitor_set_compatible_clone_mode (output, clone_mode);
cc_display_monitor_set_position (output, 0, 0);
}
}
......@@ -601,10 +620,10 @@ cc_display_config_set_cloning (CcDisplayConfig *self,
}
GList *
cc_display_config_get_cloning_modes (CcDisplayConfig *self)
cc_display_config_generate_cloning_modes (CcDisplayConfig *self)
{
g_return_val_if_fail (CC_IS_DISPLAY_CONFIG (self), NULL);
return CC_DISPLAY_CONFIG_GET_CLASS (self)->get_cloning_modes (self);
return CC_DISPLAY_CONFIG_GET_CLASS (self)->generate_cloning_modes (self);
}
gboolean
......
......@@ -77,10 +77,12 @@ struct _CcDisplayModeClass
{
GObjectClass parent_class;
gboolean (*is_clone_mode) (CcDisplayMode *self);
void (*get_resolution) (CcDisplayMode *self, int *w, int *h);
GArray* (*get_supported_scales) (CcDisplayMode *self);
double (*get_preferred_scale) (CcDisplayMode *self);
gboolean (*is_interlaced) (CcDisplayMode *self);
gboolean (*is_preferred) (CcDisplayMode *self);
int (*get_freq) (CcDisplayMode *self);
double (*get_freq_f) (CcDisplayMode *self);
};
......@@ -124,6 +126,8 @@ struct _CcDisplayMonitorClass
CcDisplayMode* (*get_mode) (CcDisplayMonitor *self);
CcDisplayMode* (*get_preferred_mode) (CcDisplayMonitor *self);
GList* (*get_modes) (CcDisplayMonitor *self);
void (*set_compatible_clone_mode) (CcDisplayMonitor *self,
CcDisplayMode *m);
void (*set_mode) (CcDisplayMonitor *self,
CcDisplayMode *m);
void (*set_position) (CcDisplayMonitor *self,
......@@ -152,7 +156,7 @@ struct _CcDisplayConfigClass
gboolean (*is_cloning) (CcDisplayConfig *self);
void (*set_cloning) (CcDisplayConfig *self,
gboolean clone);
GList* (*get_cloning_modes) (CcDisplayConfig *self);
GList* (*generate_cloning_modes) (CcDisplayConfig *self);
gboolean (*is_layout_logical) (CcDisplayConfig *self);
void (*set_minimum_size) (CcDisplayConfig *self,
int width,
......@@ -175,7 +179,7 @@ gboolean cc_display_config_apply (CcDisplayConfig
gboolean cc_display_config_is_cloning (CcDisplayConfig *config);
void cc_display_config_set_cloning (CcDisplayConfig *config,
gboolean clone);
GList* cc_display_config_get_cloning_modes (CcDisplayConfig *config);
GList* cc_display_config_generate_cloning_modes (CcDisplayConfig *config);
void cc_display_config_set_mode_on_all_outputs (CcDisplayConfig *config,
CcDisplayMode *mode);
......@@ -226,6 +230,8 @@ double cc_display_monitor_get_scale (CcDisplayMonitor *
void cc_display_monitor_set_scale (CcDisplayMonitor *monitor,
double s);
void cc_display_monitor_set_compatible_clone_mode (CcDisplayMonitor *monitor,
CcDisplayMode *mode);
void cc_display_monitor_set_mode (CcDisplayMonitor *monitor,
CcDisplayMode *mode);
void cc_display_monitor_set_position (CcDisplayMonitor *monitor,
......@@ -241,12 +247,14 @@ const char* cc_display_monitor_get_ui_name (CcDisplayMonitor *
const char* cc_display_monitor_get_ui_number_name (CcDisplayMonitor *monitor);
char* cc_display_monitor_dup_ui_number_name (CcDisplayMonitor *monitor);
gboolean cc_display_mode_is_clone_mode (CcDisplayMode *mode);
void cc_display_mode_get_resolution (CcDisplayMode *mode,
int *width,
int *height);
GArray* cc_display_mode_get_supported_scales (CcDisplayMode *self);
double cc_display_mode_get_preferred_scale (CcDisplayMode *self);
gboolean cc_display_mode_is_interlaced (CcDisplayMode *mode);
gboolean cc_display_mode_is_preferred (CcDisplayMode *mode);
int cc_display_mode_get_freq (CcDisplayMode *mode);
double cc_display_mode_get_freq_f (CcDisplayMode *mode);
......
......@@ -164,6 +164,22 @@ cc_panel_get_selected_type (CcDisplayPanel *panel)
g_assert_not_reached ();
}
static CcDisplayMode *
find_preferred_mode (GList *modes)
{
GList *l;
for (l = modes; l; l = l->next)
{
CcDisplayMode *mode = l->data;
if (cc_display_mode_is_preferred (mode))
return mode;
}
return NULL;
}
static void
config_ensure_of_type (CcDisplayPanel *panel, CcDisplayConfigType type)
{
......@@ -238,34 +254,22 @@ config_ensure_of_type (CcDisplayPanel *panel, CcDisplayConfigType type)
{
g_debug ("Creating new clone config");
gdouble scale;
GList *modes = cc_display_config_get_cloning_modes (panel->current_config);
gint bw, bh;
CcDisplayMode *best = NULL;
g_autolist(CcDisplayMode) modes = NULL;
CcDisplayMode *clone_mode;
/* Turn on cloning and select the best mode we can find by default */
cc_display_config_set_cloning (panel->current_config, TRUE);
while (modes)
{
CcDisplayMode *mode = modes->data;
gint w, h;
cc_display_mode_get_resolution (mode, &w, &h);
if (best == NULL || (bw*bh < w*h))
{
best = mode;
cc_display_mode_get_resolution (best, &bw, &bh);
}
modes = modes->next;
}
modes = cc_display_config_generate_cloning_modes (panel->current_config);
clone_mode = find_preferred_mode (modes);
g_return_if_fail (clone_mode);
/* Take the preferred scale by default, */
scale = cc_display_mode_get_preferred_scale (best);
scale = cc_display_mode_get_preferred_scale (clone_mode);
/* but prefer the old primary scale if that is valid. */
if (current_primary &&
cc_display_config_is_scaled_mode_valid (panel->current_config,
best,
clone_mode,
old_primary_scale))
scale = old_primary_scale;
......@@ -273,7 +277,7 @@ config_ensure_of_type (CcDisplayPanel *panel, CcDisplayConfigType type)
{
CcDisplayMonitor *output = l->data;
cc_display_monitor_set_mode (output, best);
cc_display_monitor_set_compatible_clone_mode (output, clone_mode);
cc_display_monitor_set_scale (output, scale);
}
}
......
......@@ -235,6 +235,7 @@ static gboolean
cc_display_settings_rebuild_ui (CcDisplaySettings *self)
{
GtkWidget *child;
g_autolist(CcDisplayMode) clone_modes = NULL;
GList *modes;
GList *item;
gint width, height;
......@@ -365,9 +366,14 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
/* Resolutions are always shown. */
gtk_widget_set_visible (self->resolution_row, TRUE);
if (cc_display_config_is_cloning (self->config))
modes = cc_display_config_get_cloning_modes (self->config);
{
clone_modes = cc_display_config_generate_cloning_modes (self->config);
modes = clone_modes;
}
else
modes = cc_display_monitor_get_modes (self->selected_output);
{
modes = cc_display_monitor_get_modes (self->selected_output);
}
g_list_store_remove_all (self->resolution_list);
g_list_store_append (self->resolution_list, current_mode);
......
......@@ -212,9 +212,12 @@ update_ui (CcWifiConnectionRow *self)
}
else
{
g_autofree char *title_escaped = NULL;
ssid = nm_access_point_get_ssid (best_ap);
title = nm_utils_ssid_to_utf8 (g_bytes_get_data (ssid, NULL), g_bytes_get_size (ssid));
adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self), title);
title_escaped = g_markup_escape_text (title, -1);
adw_preferences_row_set_title (ADW_PREFERENCES_ROW (self), title_escaped);
}
if (active_connection)
......
......@@ -424,6 +424,11 @@ remove_wifi_device (CcWifiPanel *self,
}
}
/* Disconnect the signal to prevent assertion crash */
g_signal_handlers_disconnect_by_func (device,
G_CALLBACK (wifi_panel_update_qr_image_cb),
self);
/* Destroy all stack pages related to this device */
child = gtk_stack_get_child_by_name (self->stack, id);
gtk_stack_remove (self->stack, child);
......