workrave/1be2073.patch
2025-04-08 16:14:06 +02:00

206 lines
6.9 KiB
Diff

From 1be2073a41691ff4db909b1b04de465c3e2c92dc Mon Sep 17 00:00:00 2001
From: Rob Caelers <rob.caelers@gmail.com>
Date: Sat, 22 Mar 2025 17:57:22 +0100
Subject: [PATCH] Make muilti-monitor support most robust (#606)
---
ui/app/Application.cc | 16 ++++++++++---
ui/app/toolkits/gtkmm/IToolkitPrivate.hh | 3 ++-
ui/app/toolkits/gtkmm/MainWindow.cc | 14 ++++++++++--
ui/app/toolkits/gtkmm/Toolkit.cc | 29 +++++++++++++++++++++---
ui/app/toolkits/gtkmm/Toolkit.hh | 2 +-
ui/app/toolkits/qt/IToolkitPrivate.hh | 2 +-
6 files changed, 55 insertions(+), 11 deletions(-)
diff --git a/ui/app/Application.cc b/ui/app/Application.cc
index a88e6e49f..f3f7751b0 100644
--- a/ui/app/Application.cc
+++ b/ui/app/Application.cc
@@ -152,6 +152,7 @@ Application::init_configurator()
{
if (std::filesystem::is_regular_file(ini_file))
{
+ spdlog::info("Using INI configuration file: {}", ini_file);
configurator = workrave::config::ConfiguratorFactory::create(workrave::config::ConfigFileFormat::Ini);
configurator->load(ini_file);
}
@@ -174,6 +175,7 @@ Application::init_configurator()
#endif
if (!configFile.empty())
{
+ spdlog::info("Using XML configuration file: {}", configFile);
configurator->load(configFile);
}
}
@@ -186,6 +188,7 @@ Application::init_configurator()
if (configurator)
{
+ spdlog::info("Using INI configuration file: {}", ini_file);
configurator->load(ini_file);
configurator->save();
}
@@ -432,7 +435,11 @@ Application::create_prelude_window(BreakId break_id)
for (int i = 0; i < toolkit->get_head_count(); i++)
{
- prelude_windows.push_back(toolkit->create_prelude_window(i, break_id));
+ auto prelude_window = toolkit->create_prelude_window(i, break_id);
+ if (prelude_window)
+ {
+ prelude_windows.push_back(prelude_window);
+ }
}
}
@@ -479,8 +486,11 @@ Application::create_break_window(BreakId break_id, workrave::utils::Flags<BreakH
{
IBreakWindow::Ptr break_window = toolkit->create_break_window(i, break_id, break_flags);
- break_windows.push_back(break_window);
- break_window->init();
+ if (break_window)
+ {
+ break_windows.push_back(break_window);
+ break_window->init();
+ }
}
}
diff --git a/ui/app/toolkits/gtkmm/IToolkitPrivate.hh b/ui/app/toolkits/gtkmm/IToolkitPrivate.hh
index abe3e5dbd..15f966514 100644
--- a/ui/app/toolkits/gtkmm/IToolkitPrivate.hh
+++ b/ui/app/toolkits/gtkmm/IToolkitPrivate.hh
@@ -19,6 +19,7 @@
#define ITOOLKIT_PRIVATE_HH
#include <gtkmm.h>
+#include <optional>
#include "HeadInfo.hh"
@@ -27,7 +28,7 @@ class IToolkitPrivate
public:
virtual ~IToolkitPrivate() = default;
- virtual HeadInfo get_head_info(int screen_index) const = 0;
+ virtual std::optional<HeadInfo> get_head_info(int screen_index) const = 0;
virtual void attach_menu(Gtk::Menu *menu) = 0;
};
diff --git a/ui/app/toolkits/gtkmm/MainWindow.cc b/ui/app/toolkits/gtkmm/MainWindow.cc
index 74af375b9..96a176664 100644
--- a/ui/app/toolkits/gtkmm/MainWindow.cc
+++ b/ui/app/toolkits/gtkmm/MainWindow.cc
@@ -351,7 +351,12 @@ MainWindow::convert_display_to_monitor(int &x, int &y)
for (int i = 0; i < app->get_toolkit()->get_head_count(); i++)
{
- HeadInfo head = toolkit_priv->get_head_info(i);
+ auto optional_head = toolkit_priv->get_head_info(i);
+ if (!optional_head)
+ {
+ continue;
+ }
+ HeadInfo head = *optional_head;
int left = head.get_x();
int top = head.get_y();
@@ -383,7 +388,12 @@ void
MainWindow::convert_monitor_to_display(int &x, int &y, int head)
{
auto toolkit_priv = std::dynamic_pointer_cast<IToolkitPrivate>(app->get_toolkit());
- HeadInfo h = toolkit_priv->get_head_info(head);
+ auto optional_head = toolkit_priv->get_head_info(head);
+ if (!optional_head)
+ {
+ return;
+ }
+ HeadInfo h = *optional_head;
if (x < 0)
{
diff --git a/ui/app/toolkits/gtkmm/Toolkit.cc b/ui/app/toolkits/gtkmm/Toolkit.cc
index 76c456780..8fccf86b6 100644
--- a/ui/app/toolkits/gtkmm/Toolkit.cc
+++ b/ui/app/toolkits/gtkmm/Toolkit.cc
@@ -145,11 +145,22 @@ Toolkit::run()
gapp->run();
}
-HeadInfo
+std::optional<HeadInfo>
Toolkit::get_head_info(int screen_index) const
{
Glib::RefPtr<Gdk::Display> display = Gdk::Display::get_default();
+ if (!display)
+ {
+ logger->error("Failed to get default display");
+ return {};
+ }
+
Glib::RefPtr<Gdk::Monitor> monitor = display->get_monitor(screen_index);
+ if (!monitor)
+ {
+ logger->error("Failed to get monitor for screen index {}", screen_index);
+ return {};
+ }
HeadInfo head;
head.primary = monitor->is_primary();
@@ -178,7 +189,13 @@ Toolkit::create_break_window(int screen_index, BreakId break_id, BreakFlags brea
{
IBreakWindow::Ptr ret;
- HeadInfo head = get_head_info(screen_index);
+ auto optional_head = get_head_info(screen_index);
+ if (!optional_head)
+ {
+ logger->error("Failed to retrieve monitor info for screen index {}", screen_index);
+ return nullptr;
+ }
+ HeadInfo head = *optional_head;
BlockMode block_mode = GUIConfig::block_mode()();
@@ -201,7 +218,13 @@ Toolkit::create_break_window(int screen_index, BreakId break_id, BreakFlags brea
IPreludeWindow::Ptr
Toolkit::create_prelude_window(int screen_index, workrave::BreakId break_id)
{
- HeadInfo head = get_head_info(screen_index);
+ auto optional_head = get_head_info(screen_index);
+ if (!optional_head)
+ {
+ logger->error("Failed to retrieve monitor info for screen index {}", screen_index);
+ return nullptr;
+ }
+ HeadInfo head = *optional_head;
return std::make_shared<PreludeWindow>(head, break_id);
}
diff --git a/ui/app/toolkits/gtkmm/Toolkit.hh b/ui/app/toolkits/gtkmm/Toolkit.hh
index 159a7815d..d337cd563 100644
--- a/ui/app/toolkits/gtkmm/Toolkit.hh
+++ b/ui/app/toolkits/gtkmm/Toolkit.hh
@@ -76,7 +76,7 @@ public:
void init(std::shared_ptr<IApplicationContext> app) override;
void deinit() override;
- HeadInfo get_head_info(int screen_index) const override;
+ std::optional<HeadInfo> get_head_info(int screen_index) const override;
int get_head_count() const override;
void terminate() override;
diff --git a/ui/app/toolkits/qt/IToolkitPrivate.hh b/ui/app/toolkits/qt/IToolkitPrivate.hh
index ac1d16974..06b5c03e5 100644
--- a/ui/app/toolkits/qt/IToolkitPrivate.hh
+++ b/ui/app/toolkits/qt/IToolkitPrivate.hh
@@ -27,7 +27,7 @@ public:
virtual auto get_desktop_image() -> QPixmap = 0;
- // virtual HeadInfo get_head_info(int screen_index) const = 0;
+ // virtual std::optional<HeadInfo> get_head_info(int screen_index) const = 0;
// virtual void attach_menu(Gtk::Menu *menu) = 0;
};