Commit d9bd4752 authored by Tim Brown's avatar Tim Brown Committed by Commit Bot

Read Cinnamon settings for window button layout

Cinnamon uses a different settings schema to specify the window button
layout compared to Gnome. This affects Ubuntu 14.04 using Cinnamon since
my change to use GSettings to read the button layout.

To fix this I had to add an enum value for Cinnamon.

system title bar, and changed window button layout.

Bug: 794376
Test: Forced the use of the GSettings provider, ran Chrome not using
Change-Id: I2e41df59a71467ac9161751c1fd3e6582c99fdab
Reviewed-on: https://chromium-review.googlesource.com/826027
Commit-Queue: Tim Brown <timbrown@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Reviewed-by: default avatarThomas Anderson <thomasanderson@chromium.org>
Cr-Commit-Position: refs/heads/master@{#524161}
parent c064d341
...@@ -71,6 +71,8 @@ DesktopEnvironment GetDesktopEnvironment(Environment* env) { ...@@ -71,6 +71,8 @@ DesktopEnvironment GetDesktopEnvironment(Environment* env) {
} }
if (xdg_current_desktop == "GNOME") if (xdg_current_desktop == "GNOME")
return DESKTOP_ENVIRONMENT_GNOME; return DESKTOP_ENVIRONMENT_GNOME;
if (xdg_current_desktop == "X-Cinnamon")
return DESKTOP_ENVIRONMENT_CINNAMON;
if (xdg_current_desktop == "KDE") { if (xdg_current_desktop == "KDE") {
std::string kde_session; std::string kde_session;
if (env->GetVar(kKDESessionEnvVar, &kde_session)) { if (env->GetVar(kKDESessionEnvVar, &kde_session)) {
...@@ -120,6 +122,8 @@ const char* GetDesktopEnvironmentName(DesktopEnvironment env) { ...@@ -120,6 +122,8 @@ const char* GetDesktopEnvironmentName(DesktopEnvironment env) {
switch (env) { switch (env) {
case DESKTOP_ENVIRONMENT_OTHER: case DESKTOP_ENVIRONMENT_OTHER:
return nullptr; return nullptr;
case DESKTOP_ENVIRONMENT_CINNAMON:
return "CINNAMON";
case DESKTOP_ENVIRONMENT_GNOME: case DESKTOP_ENVIRONMENT_GNOME:
return "GNOME"; return "GNOME";
case DESKTOP_ENVIRONMENT_KDE3: case DESKTOP_ENVIRONMENT_KDE3:
......
...@@ -47,6 +47,7 @@ BASE_EXPORT FilePath GetXDGUserDirectory(const char* dir_name, ...@@ -47,6 +47,7 @@ BASE_EXPORT FilePath GetXDGUserDirectory(const char* dir_name,
enum DesktopEnvironment { enum DesktopEnvironment {
DESKTOP_ENVIRONMENT_OTHER, DESKTOP_ENVIRONMENT_OTHER,
DESKTOP_ENVIRONMENT_CINNAMON,
DESKTOP_ENVIRONMENT_GNOME, DESKTOP_ENVIRONMENT_GNOME,
// KDE3, KDE4 and KDE5 are sufficiently different that we count // KDE3, KDE4 and KDE5 are sufficiently different that we count
// them as different desktop environments here. // them as different desktop environments here.
......
...@@ -32,6 +32,7 @@ const char* const kDesktopMATE = "mate"; ...@@ -32,6 +32,7 @@ const char* const kDesktopMATE = "mate";
const char* const kDesktopKDE4 = "kde4"; const char* const kDesktopKDE4 = "kde4";
const char* const kDesktopKDE = "kde"; const char* const kDesktopKDE = "kde";
const char* const kDesktopXFCE = "xfce"; const char* const kDesktopXFCE = "xfce";
const char* const kXdgDesktopCinnamon = "X-Cinnamon";
const char* const kXdgDesktopGNOME = "GNOME"; const char* const kXdgDesktopGNOME = "GNOME";
const char* const kXdgDesktopKDE = "KDE"; const char* const kXdgDesktopKDE = "KDE";
const char* const kXdgDesktopPantheon = "Pantheon"; const char* const kXdgDesktopPantheon = "Pantheon";
...@@ -91,6 +92,15 @@ TEST(XDGUtilTest, GetDesktopEnvironmentXFCE) { ...@@ -91,6 +92,15 @@ TEST(XDGUtilTest, GetDesktopEnvironmentXFCE) {
EXPECT_EQ(DESKTOP_ENVIRONMENT_XFCE, GetDesktopEnvironment(&getter)); EXPECT_EQ(DESKTOP_ENVIRONMENT_XFCE, GetDesktopEnvironment(&getter));
} }
TEST(XDGUtilTest, GetXdgDesktopCinnamon) {
MockEnvironment getter;
EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
EXPECT_CALL(getter, GetVar(Eq(kXdgDesktop), _))
.WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopCinnamon), Return(true)));
EXPECT_EQ(DESKTOP_ENVIRONMENT_CINNAMON, GetDesktopEnvironment(&getter));
}
TEST(XDGUtilTest, GetXdgDesktopGnome) { TEST(XDGUtilTest, GetXdgDesktopGnome) {
MockEnvironment getter; MockEnvironment getter;
EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false)); EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
......
...@@ -321,7 +321,8 @@ void PasswordStoreFactory::RecordBackendStatistics( ...@@ -321,7 +321,8 @@ void PasswordStoreFactory::RecordBackendStatistics(
usage = usage =
used_backend == KWALLET ? KDE_NOFLAG_KWALLET : KDE_NOFLAG_PLAINTEXT; used_backend == KWALLET ? KDE_NOFLAG_KWALLET : KDE_NOFLAG_PLAINTEXT;
} }
} else if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_GNOME || } else if (desktop_env == base::nix::DESKTOP_ENVIRONMENT_CINNAMON ||
desktop_env == base::nix::DESKTOP_ENVIRONMENT_GNOME ||
desktop_env == base::nix::DESKTOP_ENVIRONMENT_UNITY || desktop_env == base::nix::DESKTOP_ENVIRONMENT_UNITY ||
desktop_env == base::nix::DESKTOP_ENVIRONMENT_XFCE) { desktop_env == base::nix::DESKTOP_ENVIRONMENT_XFCE) {
if (command_line_flag == "kwallet") { if (command_line_flag == "kwallet") {
......
...@@ -54,6 +54,7 @@ void DetectAndOpenPrinterConfigDialog() { ...@@ -54,6 +54,7 @@ void DetectAndOpenPrinterConfigDialog() {
opened = OpenPrinterConfigDialog(kSystemConfigPrinterCommand) || opened = OpenPrinterConfigDialog(kSystemConfigPrinterCommand) ||
OpenPrinterConfigDialog(kGnomeControlCenterPrintersCommand); OpenPrinterConfigDialog(kGnomeControlCenterPrintersCommand);
break; break;
case base::nix::DESKTOP_ENVIRONMENT_CINNAMON:
case base::nix::DESKTOP_ENVIRONMENT_KDE3: case base::nix::DESKTOP_ENVIRONMENT_KDE3:
case base::nix::DESKTOP_ENVIRONMENT_KDE4: case base::nix::DESKTOP_ENVIRONMENT_KDE4:
case base::nix::DESKTOP_ENVIRONMENT_KDE5: case base::nix::DESKTOP_ENVIRONMENT_KDE5:
......
...@@ -92,8 +92,9 @@ bool ShouldUseLibAppIndicator() { ...@@ -92,8 +92,9 @@ bool ShouldUseLibAppIndicator() {
case base::nix::DESKTOP_ENVIRONMENT_PANTHEON: case base::nix::DESKTOP_ENVIRONMENT_PANTHEON:
case base::nix::DESKTOP_ENVIRONMENT_UNITY: case base::nix::DESKTOP_ENVIRONMENT_UNITY:
return true; return true;
case base::nix::DESKTOP_ENVIRONMENT_KDE3: case base::nix::DESKTOP_ENVIRONMENT_CINNAMON:
case base::nix::DESKTOP_ENVIRONMENT_GNOME: case base::nix::DESKTOP_ENVIRONMENT_GNOME:
case base::nix::DESKTOP_ENVIRONMENT_KDE3:
case base::nix::DESKTOP_ENVIRONMENT_OTHER: case base::nix::DESKTOP_ENVIRONMENT_OTHER:
case base::nix::DESKTOP_ENVIRONMENT_XFCE: case base::nix::DESKTOP_ENVIRONMENT_XFCE:
return false; return false;
......
...@@ -601,6 +601,7 @@ bool GtkUi::GetDefaultUsesSystemTheme() const { ...@@ -601,6 +601,7 @@ bool GtkUi::GetDefaultUsesSystemTheme() const {
std::unique_ptr<base::Environment> env(base::Environment::Create()); std::unique_ptr<base::Environment> env(base::Environment::Create());
switch (base::nix::GetDesktopEnvironment(env.get())) { switch (base::nix::GetDesktopEnvironment(env.get())) {
case base::nix::DESKTOP_ENVIRONMENT_CINNAMON:
case base::nix::DESKTOP_ENVIRONMENT_GNOME: case base::nix::DESKTOP_ENVIRONMENT_GNOME:
case base::nix::DESKTOP_ENVIRONMENT_PANTHEON: case base::nix::DESKTOP_ENVIRONMENT_PANTHEON:
case base::nix::DESKTOP_ENVIRONMENT_UNITY: case base::nix::DESKTOP_ENVIRONMENT_UNITY:
......
...@@ -6,12 +6,15 @@ ...@@ -6,12 +6,15 @@
#include <gio/gio.h> #include <gio/gio.h>
#include "base/environment.h"
#include "base/nix/xdg_util.h"
#include "chrome/browser/ui/libgtkui/gtk_ui.h" #include "chrome/browser/ui/libgtkui/gtk_ui.h"
#include "chrome/browser/ui/libgtkui/gtk_util.h" #include "chrome/browser/ui/libgtkui/gtk_util.h"
namespace { namespace {
const char kGeneralPreferencesSchema[] = "org.gnome.desktop.wm.preferences"; const char kGnomePreferencesSchema[] = "org.gnome.desktop.wm.preferences";
const char kCinnamonPreferencesSchema[] = "org.cinnamon.muffin";
const char kButtonLayoutKey[] = "button-layout"; const char kButtonLayoutKey[] = "button-layout";
const char kButtonLayoutChangedSignal[] = "changed::button-layout"; const char kButtonLayoutChangedSignal[] = "changed::button-layout";
...@@ -29,38 +32,54 @@ namespace libgtkui { ...@@ -29,38 +32,54 @@ namespace libgtkui {
// Public interface: // Public interface:
SettingsProviderGSettings::SettingsProviderGSettings(GtkUi* delegate) SettingsProviderGSettings::SettingsProviderGSettings(GtkUi* delegate)
: delegate_(delegate), settings_(nullptr) { : delegate_(delegate) {
DCHECK(delegate_); DCHECK(delegate_);
// Of all the supported distros, this code path should only be used by
// Ubuntu 14.04 (all the others have a sufficent gtk version to use the
// gtk3 API). The default in 14.04 is Unity, but Cinnamon has enough
// usage to justify also checking its value.
std::unique_ptr<base::Environment> env(base::Environment::Create());
const gchar* settings_schema =
base::nix::GetDesktopEnvironment(env.get()) ==
base::nix::DESKTOP_ENVIRONMENT_CINNAMON
? settings_schema = kCinnamonPreferencesSchema
: settings_schema = kGnomePreferencesSchema;
if (!g_settings_schema_source_lookup(g_settings_schema_source_get_default(), if (!g_settings_schema_source_lookup(g_settings_schema_source_get_default(),
kGeneralPreferencesSchema, FALSE) || settings_schema, FALSE) ||
!(settings_ = g_settings_new(kGeneralPreferencesSchema))) { !(button_settings_ = g_settings_new(settings_schema))) {
LOG(ERROR) << "Unable to create a gsettings client - setting button layout "
"to default";
ParseAndStoreButtonValue(kDefaultButtonString); ParseAndStoreButtonValue(kDefaultButtonString);
return; } else {
// Get the inital value of the keys we're interested in.
OnDecorationButtonLayoutChanged(button_settings_, kButtonLayoutKey);
signal_button_id_ = g_signal_connect(
button_settings_, kButtonLayoutChangedSignal,
G_CALLBACK(OnDecorationButtonLayoutChangedThunk), this);
} }
// Get the inital value of the keys we're interested in. // If this fails, the default action has already been set in gtk_ui.cc.
OnDecorationButtonLayoutChanged(settings_, kButtonLayoutKey); if (g_settings_schema_source_lookup(g_settings_schema_source_get_default(),
signal_button_id_ = kGnomePreferencesSchema, FALSE) &&
g_signal_connect(settings_, kButtonLayoutChangedSignal, (click_settings_ = g_settings_new(kGnomePreferencesSchema))) {
G_CALLBACK(OnDecorationButtonLayoutChangedThunk), this); OnMiddleClickActionChanged(click_settings_, kMiddleClickActionKey);
signal_middle_click_id_ =
OnMiddleClickActionChanged(settings_, kMiddleClickActionKey); g_signal_connect(click_settings_, kMiddleClickActionChangedSignal,
signal_middle_click_id_ = G_CALLBACK(OnMiddleClickActionChangedThunk), this);
g_signal_connect(settings_, kMiddleClickActionChangedSignal, }
G_CALLBACK(OnMiddleClickActionChangedThunk), this);
} }
SettingsProviderGSettings::~SettingsProviderGSettings() { SettingsProviderGSettings::~SettingsProviderGSettings() {
if (settings_) { if (button_settings_) {
if (signal_button_id_) if (signal_button_id_)
g_signal_handler_disconnect(settings_, signal_button_id_); g_signal_handler_disconnect(button_settings_, signal_button_id_);
g_free(button_settings_);
}
if (click_settings_) {
if (signal_middle_click_id_) if (signal_middle_click_id_)
g_signal_handler_disconnect(settings_, signal_middle_click_id_); g_signal_handler_disconnect(click_settings_, signal_middle_click_id_);
g_free(click_settings_);
} }
g_free(settings_);
} }
// Private: // Private:
......
...@@ -42,7 +42,8 @@ class SettingsProviderGSettings : public SettingsProvider { ...@@ -42,7 +42,8 @@ class SettingsProviderGSettings : public SettingsProvider {
GtkUi* delegate_; GtkUi* delegate_;
GSettings* settings_; GSettings* button_settings_ = nullptr;
GSettings* click_settings_ = nullptr;
gulong signal_button_id_; gulong signal_button_id_;
gulong signal_middle_click_id_; gulong signal_middle_click_id_;
......
...@@ -94,6 +94,7 @@ void DetectAndStartProxyConfigUtil(int render_process_id, ...@@ -94,6 +94,7 @@ void DetectAndStartProxyConfigUtil(int render_process_id,
bool launched = false; bool launched = false;
switch (base::nix::GetDesktopEnvironment(env.get())) { switch (base::nix::GetDesktopEnvironment(env.get())) {
case base::nix::DESKTOP_ENVIRONMENT_CINNAMON:
case base::nix::DESKTOP_ENVIRONMENT_GNOME: case base::nix::DESKTOP_ENVIRONMENT_GNOME:
case base::nix::DESKTOP_ENVIRONMENT_PANTHEON: case base::nix::DESKTOP_ENVIRONMENT_PANTHEON:
case base::nix::DESKTOP_ENVIRONMENT_UNITY: { case base::nix::DESKTOP_ENVIRONMENT_UNITY: {
......
...@@ -57,6 +57,7 @@ SelectedLinuxBackend SelectBackend(const std::string& type, ...@@ -57,6 +57,7 @@ SelectedLinuxBackend SelectBackend(const std::string& type,
return SelectedLinuxBackend::KWALLET; return SelectedLinuxBackend::KWALLET;
case base::nix::DESKTOP_ENVIRONMENT_KDE5: case base::nix::DESKTOP_ENVIRONMENT_KDE5:
return SelectedLinuxBackend::KWALLET5; return SelectedLinuxBackend::KWALLET5;
case base::nix::DESKTOP_ENVIRONMENT_CINNAMON:
case base::nix::DESKTOP_ENVIRONMENT_GNOME: case base::nix::DESKTOP_ENVIRONMENT_GNOME:
case base::nix::DESKTOP_ENVIRONMENT_PANTHEON: case base::nix::DESKTOP_ENVIRONMENT_PANTHEON:
case base::nix::DESKTOP_ENVIRONMENT_UNITY: case base::nix::DESKTOP_ENVIRONMENT_UNITY:
......
...@@ -1155,6 +1155,7 @@ ProxyConfigServiceLinux::Delegate::Delegate( ...@@ -1155,6 +1155,7 @@ ProxyConfigServiceLinux::Delegate::Delegate(
: env_var_getter_(std::move(env_var_getter)) { : env_var_getter_(std::move(env_var_getter)) {
// Figure out which SettingGetterImpl to use, if any. // Figure out which SettingGetterImpl to use, if any.
switch (base::nix::GetDesktopEnvironment(env_var_getter_.get())) { switch (base::nix::GetDesktopEnvironment(env_var_getter_.get())) {
case base::nix::DESKTOP_ENVIRONMENT_CINNAMON:
case base::nix::DESKTOP_ENVIRONMENT_GNOME: case base::nix::DESKTOP_ENVIRONMENT_GNOME:
case base::nix::DESKTOP_ENVIRONMENT_PANTHEON: case base::nix::DESKTOP_ENVIRONMENT_PANTHEON:
case base::nix::DESKTOP_ENVIRONMENT_UNITY: case base::nix::DESKTOP_ENVIRONMENT_UNITY:
......
...@@ -465,6 +465,7 @@ DBusAPI PowerSaveBlocker::Delegate::SelectAPI() { ...@@ -465,6 +465,7 @@ DBusAPI PowerSaveBlocker::Delegate::SelectAPI() {
return NO_API; return NO_API;
std::unique_ptr<base::Environment> env(base::Environment::Create()); std::unique_ptr<base::Environment> env(base::Environment::Create());
switch (base::nix::GetDesktopEnvironment(env.get())) { switch (base::nix::GetDesktopEnvironment(env.get())) {
case base::nix::DESKTOP_ENVIRONMENT_CINNAMON:
case base::nix::DESKTOP_ENVIRONMENT_GNOME: case base::nix::DESKTOP_ENVIRONMENT_GNOME:
case base::nix::DESKTOP_ENVIRONMENT_PANTHEON: case base::nix::DESKTOP_ENVIRONMENT_PANTHEON:
case base::nix::DESKTOP_ENVIRONMENT_UNITY: case base::nix::DESKTOP_ENVIRONMENT_UNITY:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment