summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlya Fedin <fedin-ilja2010@ya.ru>2021-01-28 05:36:20 +0400
committerJohn Preston <johnprestonmail@gmail.com>2021-01-28 11:50:52 +0400
commit7c031a4fb69352d487b76d00cccbf8f0a8fca062 (patch)
treebd834e9df38a43b5a5fbac259b348baa947f2086
parent834ee4eae7fa8511049bfac575d26abf999a6d72 (diff)
Perform additional checks for gtk scaling factor
-rw-r--r--Telegram/SourceFiles/platform/linux/linux_gtk_integration.cpp21
-rw-r--r--Telegram/SourceFiles/platform/linux/linux_gtk_integration_p.h1
2 files changed, 20 insertions, 2 deletions
diff --git a/Telegram/SourceFiles/platform/linux/linux_gtk_integration.cpp b/Telegram/SourceFiles/platform/linux/linux_gtk_integration.cpp
index cef2133667..59fcd12d9a 100644
--- a/Telegram/SourceFiles/platform/linux/linux_gtk_integration.cpp
+++ b/Telegram/SourceFiles/platform/linux/linux_gtk_integration.cpp
@@ -328,6 +328,7 @@ void GtkIntegration::load() {
if (GtkLoaded) {
LOAD_GTK_SYMBOL(lib_gtk, "gdk_display_get_default", gdk_display_get_default);
+ LOAD_GTK_SYMBOL(lib_gtk, "gdk_display_get_monitor", gdk_display_get_monitor);
LOAD_GTK_SYMBOL(lib_gtk, "gdk_display_get_primary_monitor", gdk_display_get_primary_monitor);
LOAD_GTK_SYMBOL(lib_gtk, "gdk_monitor_get_scale_factor", gdk_monitor_get_scale_factor);
@@ -440,13 +441,29 @@ std::optional<QString> GtkIntegration::getStringSetting(
std::optional<int> GtkIntegration::scaleFactor() const {
if (!loaded()
|| (gdk_display_get_default == nullptr)
+ || (gdk_display_get_monitor == nullptr)
|| (gdk_display_get_primary_monitor == nullptr)
|| (gdk_monitor_get_scale_factor == nullptr)) {
return std::nullopt;
}
- return gdk_monitor_get_scale_factor(
- gdk_display_get_primary_monitor(gdk_display_get_default()));
+ const auto display = gdk_display_get_default();
+ if (!display) {
+ return std::nullopt;
+ }
+
+ const auto monitor = [&] {
+ if (const auto primary = gdk_display_get_primary_monitor(display)) {
+ return primary;
+ }
+ return gdk_display_get_monitor(display, 0);
+ }();
+
+ if (!monitor) {
+ return std::nullopt;
+ }
+
+ return gdk_monitor_get_scale_factor(monitor);
}
bool GtkIntegration::fileDialogSupported() const {
diff --git a/Telegram/SourceFiles/platform/linux/linux_gtk_integration_p.h b/Telegram/SourceFiles/platform/linux/linux_gtk_integration_p.h
index c12faa846b..b0b60e6bcf 100644
--- a/Telegram/SourceFiles/platform/linux/linux_gtk_integration_p.h
+++ b/Telegram/SourceFiles/platform/linux/linux_gtk_integration_p.h
@@ -149,6 +149,7 @@ inline bool g_type_cit_helper(Object *instance, GType iface_type) {
inline gint (*gtk_dialog_run)(GtkDialog *dialog) = nullptr;
inline GdkAtom (*gdk_atom_intern)(const gchar *atom_name, gboolean only_if_exists) = nullptr;
inline GdkDisplay* (*gdk_display_get_default)(void) = nullptr;
+inline GdkMonitor* (*gdk_display_get_monitor)(GdkDisplay *display, int monitor_num) = nullptr;
inline GdkMonitor* (*gdk_display_get_primary_monitor)(GdkDisplay *display) = nullptr;
inline int (*gdk_monitor_get_scale_factor)(GdkMonitor *monitor) = nullptr;
inline GdkPixbuf* (*gdk_pixbuf_new_from_file_at_size)(const gchar *filename, int width, int height, GError **error) = nullptr;