From 8d086a43cb0b79dda40c60d1a85b6a47099370c0 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Tue, 20 Feb 2018 10:16:51 -0600 Subject: [PATCH] Fix brightray::GetApplicationName(), ..Version() on Linux (#11980) * add brightray API to override app version * in atom browser, use brightray app version API * on Linux, have GetApplicationVersion() use brightray version API * on Linux, implement brightray::GetApplicationName() * fix typo in brightray API * make browser.GetName() logic follow GetVersion() logic * improve variable name in OverrideApplicationVersion declaration * fix typo in brightray impl --- atom/browser/browser.cc | 24 ++++------ atom/browser/browser.h | 1 - atom/common/linux/application_info.cc | 60 +++++++++++++++++++++++- brightray/common/application_info.cc | 16 +++++-- brightray/common/application_info.h | 5 +- brightray/common/application_info_win.cc | 2 +- 6 files changed, 84 insertions(+), 24 deletions(-) diff --git a/atom/browser/browser.cc b/atom/browser/browser.cc index b1aa444677..f16ee50158 100644 --- a/atom/browser/browser.cc +++ b/atom/browser/browser.cc @@ -97,27 +97,21 @@ void Browser::Shutdown() { } std::string Browser::GetVersion() const { - if (version_override_.empty()) { - std::string version = GetExecutableFileVersion(); - if (!version.empty()) - return version; - } - - return version_override_; + std::string ret = brightray::GetOverriddenApplicationVersion(); + if (ret.empty()) + ret = GetExecutableFileVersion(); + return ret; } void Browser::SetVersion(const std::string& version) { - version_override_ = version; + brightray::OverrideApplicationVersion(version); } std::string Browser::GetName() const { - if (name_override_.empty()) { - std::string name = GetExecutableFileProductName(); - if (!name.empty()) - return name; - } - - return name_override_; + std::string ret = name_override_; + if (ret.empty()) + ret = GetExecutableFileProductName(); + return ret; } void Browser::SetName(const std::string& name) { diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 05fcdf4047..0970b26b77 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -273,7 +273,6 @@ class Browser : public WindowListObserver { // The browser is being shutdown. bool is_shutdown_; - std::string version_override_; std::string name_override_; int badge_count_ = 0; diff --git a/atom/common/linux/application_info.cc b/atom/common/linux/application_info.cc index 053bd4bb86..cff228ba49 100644 --- a/atom/common/linux/application_info.cc +++ b/atom/common/linux/application_info.cc @@ -2,18 +2,74 @@ // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. +#include "brightray/common/application_info.h" + +#include +#include + +#include #include #include "atom/common/atom_version.h" +#include "base/environment.h" +#include "base/logging.h" +#include "chrome/browser/ui/libgtkui/gtk_util.h" + +namespace { + +GDesktopAppInfo* get_desktop_app_info() { + std::unique_ptr env(base::Environment::Create()); + const std::string desktop_id = libgtkui::GetDesktopName(env.get()); + return desktop_id.empty() ? nullptr + : g_desktop_app_info_new(desktop_id.c_str()); +} + +} // namespace namespace brightray { std::string GetApplicationName() { - return ATOM_PRODUCT_NAME; + // attempt #1: the string set in app.setName() + std::string ret = GetOverriddenApplicationName(); + + // attempt #2: the 'Name' entry from .desktop file's [Desktop] section + if (ret.empty()) { + GDesktopAppInfo* info = get_desktop_app_info(); + if (info != nullptr) { + char* str = g_desktop_app_info_get_string(info, "Name"); + g_clear_object(&info); + if (str != nullptr) + ret = str; + g_clear_pointer(&str, g_free); + } + } + + // attempt #3: Electron's name + if (ret.empty()) { + ret = ATOM_PRODUCT_NAME; + } + + return ret; } std::string GetApplicationVersion() { - return ATOM_VERSION_STRING; + std::string ret; + + // ensure ATOM_PRODUCT_NAME and ATOM_PRODUCT_STRING match up + if (GetApplicationName() == ATOM_PRODUCT_NAME) + ret = ATOM_VERSION_STRING; + + // try to use the string set in app.setVersion() + if (ret.empty()) + ret = GetOverriddenApplicationVersion(); + + // no known version number; return some safe fallback + if (ret.empty()) { + LOG(WARNING) << "No version found. Was app.setVersion() called?"; + ret = "0.0"; + } + + return ret; } } // namespace brightray diff --git a/brightray/common/application_info.cc b/brightray/common/application_info.cc index 2286f62c3e..1d3da35d72 100644 --- a/brightray/common/application_info.cc +++ b/brightray/common/application_info.cc @@ -4,15 +4,23 @@ namespace brightray { namespace { -std::string g_overriden_application_name; +std::string g_overridden_application_name; +std::string g_overridden_application_version; } void OverrideApplicationName(const std::string& name) { - g_overriden_application_name = name; + g_overridden_application_name = name; } -std::string GetOverridenApplicationName() { - return g_overriden_application_name; +std::string GetOverriddenApplicationName() { + return g_overridden_application_name; +} + +void OverrideApplicationVersion(const std::string& version) { + g_overridden_application_version = version; +} +std::string GetOverriddenApplicationVersion() { + return g_overridden_application_version; } } // namespace brightray diff --git a/brightray/common/application_info.h b/brightray/common/application_info.h index 7a7ed89649..a4918cc7c3 100644 --- a/brightray/common/application_info.h +++ b/brightray/common/application_info.h @@ -10,7 +10,10 @@ namespace brightray { void OverrideApplicationName(const std::string& name); -std::string GetOverridenApplicationName(); +std::string GetOverriddenApplicationName(); + +void OverrideApplicationVersion(const std::string& version); +std::string GetOverriddenApplicationVersion(); std::string GetApplicationName(); std::string GetApplicationVersion(); diff --git a/brightray/common/application_info_win.cc b/brightray/common/application_info_win.cc index 09f094604e..08b203a232 100644 --- a/brightray/common/application_info_win.cc +++ b/brightray/common/application_info_win.cc @@ -47,7 +47,7 @@ PCWSTR GetRawAppUserModelID() { if (SUCCEEDED(GetCurrentProcessExplicitAppUserModelID(¤t_app_id))) { g_app_user_model_id = current_app_id; } else { - std::string name = GetOverridenApplicationName(); + std::string name = GetOverriddenApplicationName(); if (name.empty()) { name = GetApplicationName(); }