PageRenderTime 68ms CodeModel.GetById 46ms RepoModel.GetById 0ms app.codeStats 0ms

/gui/utils/application.cpp

https://gitlab.com/alvinahmadov2/icq-desktop
C++ | 261 lines | 213 code | 48 blank | 0 comment | 26 complexity | 769fb18070058661ce8b3dfb95e0518e MD5 | raw file
  1. #include "stdafx.h"
  2. #include "application.h"
  3. #include "utils.h"
  4. #include "log/log.h"
  5. #include "profiling/auto_stop_watch.h"
  6. #include "Text2DocConverter.h"
  7. #include "../main_window/MainWindow.h"
  8. #include "../core_dispatcher.h"
  9. #include "../gui_settings.h"
  10. #include "../main_window/history_control/MessagesModel.h"
  11. #include "../main_window/contact_list/RecentsModel.h"
  12. #include "../main_window/contact_list/ContactListModel.h"
  13. #include "../cache/emoji/Emoji.h"
  14. #include "../themes/Themes.h"
  15. #include "../constants.h"
  16. #include "../app_config.h"
  17. #include "../../gui.shared/constants.h"
  18. #include "../../common.shared/version_info.h"
  19. namespace
  20. {
  21. const int shadow_width = (platform::is_windows() ? 10 : 0);
  22. }
  23. namespace Utils
  24. {
  25. #ifdef _WIN32
  26. AppGuard::AppGuard()
  27. : Mutex_(0)
  28. , Exist_(false)
  29. {
  30. Mutex_ = ::CreateSemaphore(NULL, 0, 1, crossprocess_mutex_name);
  31. Exist_ = GetLastError() == ERROR_ALREADY_EXISTS;
  32. }
  33. AppGuard::~AppGuard()
  34. {
  35. if (Mutex_)
  36. CloseHandle(Mutex_);
  37. }
  38. bool AppGuard::succeeded() const
  39. {
  40. return !Exist_;
  41. }
  42. #endif //_WIN32
  43. Application::Application(int argc, char *argv[])
  44. : QObject(0)
  45. {
  46. #ifndef _WIN32
  47. #ifdef __APPLE__
  48. QDir dir(argv[0]);
  49. assert(dir.cdUp());
  50. assert(dir.cdUp());
  51. assert(dir.cd("plugins"));
  52. QCoreApplication::setLibraryPaths(QStringList(dir.absolutePath()));
  53. #else
  54. std::string appDir(argv[0]);
  55. appDir = appDir.substr(0, appDir.rfind("/") + 1);
  56. appDir += "plugins";
  57. QCoreApplication::setLibraryPaths(QStringList(QString::fromStdString(appDir)));
  58. #endif //__APPLE__
  59. #endif //_WIN32
  60. app_.reset(new QApplication(argc, argv));
  61. peer_.reset(new LocalPeer(0, !isMainInstance()));
  62. if (isMainInstance())
  63. peer_->listen();
  64. }
  65. Application::~Application()
  66. {
  67. Emoji::Cleanup();
  68. QResource::unregisterResource(QApplication::applicationDirPath() + "/qresource");
  69. main_window_.reset();
  70. Logic::ResetRecentsModel();
  71. Logic::ResetContactListModel();
  72. }
  73. int Application::exec()
  74. {
  75. return app_->exec();
  76. }
  77. bool Application::init()
  78. {
  79. if (!Ui::GetDispatcher())
  80. {
  81. return false;
  82. }
  83. init_win7_features();
  84. app_->setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents, false);
  85. QResource::registerResource(app_->applicationDirPath() + "/qresource");
  86. QPixmapCache::setCacheLimit(0);
  87. QObject::connect(Ui::GetDispatcher(), SIGNAL(guiSettings()), this, SLOT(initMainWindow()), Qt::DirectConnection);
  88. return true;
  89. }
  90. void Application::init_win7_features()
  91. {
  92. Utils::groupTaskbarIcon(true);
  93. }
  94. bool Application::isMainInstance()
  95. {
  96. #ifdef _WIN32
  97. return guard_.succeeded();
  98. #endif //_WIN32
  99. return true;
  100. }
  101. void Application::open_url(QUrl url)
  102. {
  103. QString urlStr = url.toString().remove(QString(QChar::SoftHyphen));
  104. if (urlStr.isEmpty())
  105. return;
  106. QString decoded = url.fromPercentEncoding(urlStr.toStdString().c_str());
  107. QDesktopServices::openUrl(decoded);
  108. }
  109. void Application::switchInstance()
  110. {
  111. #ifdef _WIN32
  112. unsigned int hwnd = peer_->get_hwnd_and_activate();
  113. if (hwnd)
  114. {
  115. ::SetForegroundWindow((HWND) hwnd);
  116. }
  117. #endif //_WIN32
  118. }
  119. void Application::initMainWindow()
  120. {
  121. double dpi = app_->primaryScreen()->logicalDotsPerInchX();
  122. #ifdef __APPLE__
  123. if (QSysInfo().macVersion() >= QSysInfo().MV_10_11)
  124. {
  125. QFontDatabase().addApplicationFont("/System/Library/Fonts/SFNSDisplay-Medium.otf");
  126. QFontDatabase().addApplicationFont("/System/Library/Fonts/SFNSDisplay-Regular.otf");
  127. QFontDatabase().addApplicationFont("/System/Library/Fonts/SFNSDisplay-Light.otf");
  128. QFontDatabase().addApplicationFont("/System/Library/Fonts/SFNSDisplay-Thin.otf");
  129. QFontDatabase().addApplicationFont("/System/Library/Fonts/SFNSDisplay-Ultralight.otf");
  130. #ifdef DEBUG
  131. QStringList families = QFontDatabase().families();
  132. for (QStringList::iterator i = families.begin(); i != families.end(); i++)
  133. {
  134. qDebug() << (*i);
  135. }
  136. QStringList list = QFontDatabase().styles(".SF NS Display");//families();
  137. for (QStringList::iterator i = list.begin(); i != list.end(); i++)
  138. {
  139. qDebug() << (*i);
  140. }
  141. #endif
  142. }
  143. dpi = 96;
  144. bool isMacRetina = false;
  145. isMacRetina = app_->primaryScreen()->devicePixelRatio() == 2;
  146. Utils::set_mac_retina(isMacRetina);
  147. if (isMacRetina)
  148. {
  149. app_->setAttribute(Qt::AA_UseHighDpiPixmaps);
  150. }
  151. #endif
  152. QDesktopServices::setUrlHandler("http", this, "open_url");
  153. QDesktopServices::setUrlHandler("https", this, "open_url");
  154. const auto guiScaleCoefficient = std::min(dpi / 96.0, 2.0);
  155. Utils::init_basic_scale_coefficient(guiScaleCoefficient);
  156. Utils::set_scale_coefficient(Ui::get_gui_settings()->get_value<double>(settings_scale_coefficient, Utils::get_basic_scale_coefficient()));
  157. app_->setStyleSheet(Utils::LoadStyle(":/resources/qss/styles.qss", Utils::get_scale_coefficient(), true));
  158. Themes::SetCurrentThemeId(Themes::ThemeId::Default);
  159. Emoji::InitializeSubsystem();
  160. Ui::get_gui_settings()->set_shadow_width(Utils::scale_value(shadow_width));
  161. Utils::GetTranslator()->init();
  162. main_window_.reset(new Ui::MainWindow(app_.get()));
  163. main_window_->show();
  164. main_window_->activateWindow();
  165. #ifdef _WIN32
  166. peer_->set_main_window(main_window_.get());
  167. #endif //_WIN32
  168. }
  169. bool Application::updating()
  170. {
  171. #ifdef _WIN32
  172. CHandle mutex(::CreateSemaphore(NULL, 0, 1, updater_singlton_mutex_name.c_str()));
  173. if (ERROR_ALREADY_EXISTS == ::GetLastError())
  174. return true;
  175. CRegKey key_software;
  176. if (ERROR_SUCCESS != key_software.Open(HKEY_CURRENT_USER, L"Software"))
  177. return false;
  178. CRegKey key_product;
  179. if (ERROR_SUCCESS != key_product.Create(key_software, (const wchar_t*) product_name.utf16()))
  180. return false;
  181. wchar_t version_buffer[1025];
  182. unsigned long len = 1024;
  183. if (ERROR_SUCCESS != key_product.QueryStringValue(L"update_version", version_buffer, &len))
  184. return false;
  185. QString version_update = QString::fromUtf16((const ushort*) version_buffer);
  186. core::tools::version_info info_current;
  187. core::tools::version_info info_update(version_update.toStdString());
  188. if (info_current < info_update)
  189. {
  190. wchar_t this_module_name[1024];
  191. if (!::GetModuleFileName(0, this_module_name, 1024))
  192. return false;
  193. QDir dir = QFileInfo(QString::fromUtf16((const ushort*) this_module_name)).absoluteDir();
  194. if (!dir.cdUp())
  195. return false;
  196. QString update_folder = dir.absolutePath() + "/" + updates_folder_short + "/" + version_update;
  197. QDir update_dir(update_folder);
  198. if (update_dir.exists())
  199. {
  200. QString setup_name = update_folder + "/" + installer_exe_name;
  201. QFileInfo setup_info(setup_name);
  202. if (!setup_info.exists())
  203. return false;
  204. mutex.Close();
  205. const auto command = QString("\"") + QDir::toNativeSeparators(setup_name) + "\"" + " " + update_final_command;
  206. QProcess::startDetached(command);
  207. return true;
  208. }
  209. }
  210. #endif //_WIN32
  211. return false;
  212. }
  213. }