From fb2af90daacc0dc3123741fd6371f5aa943ee935 Mon Sep 17 00:00:00 2001 From: Laurent Berger Date: Fri, 19 Apr 2024 12:38:17 +0200 Subject: [PATCH] Merge pull request #25354 from LaurentBerger:uiname Add cv::currentUIFramework #25354 issue https://github.com/opencv/opencv/issues/25329 ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [ ] The PR is proposed to the proper branch - [x] There is a reference to the original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [x] The feature is well documented and sample code can be built with the project CMake --- modules/highgui/include/opencv2/highgui.hpp | 9 +++++++ modules/highgui/src/backend.hpp | 1 + modules/highgui/src/window.cpp | 27 +++++++++++++++++++++ modules/highgui/src/window_gtk.cpp | 13 ++++++++++ modules/highgui/src/window_w32.cpp | 5 ++++ modules/highgui/test/test_gui.cpp | 19 +++++++++++++++ 6 files changed, 74 insertions(+) diff --git a/modules/highgui/include/opencv2/highgui.hpp b/modules/highgui/include/opencv2/highgui.hpp index 41ce7b6186..8175bd0871 100644 --- a/modules/highgui/include/opencv2/highgui.hpp +++ b/modules/highgui/include/opencv2/highgui.hpp @@ -285,6 +285,15 @@ The function destroyAllWindows destroys all of the opened HighGUI windows. */ CV_EXPORTS_W void destroyAllWindows(); + +/** @brief HighGUI backend used. + +The function returns HighGUI backend name used: could be COCOA, GTK2/3, QT, WAYLAND or WIN32. +Returns empty string if there is no available UI backend. + */ +CV_EXPORTS_W const std::string currentUIFramework(); + + CV_EXPORTS_W int startWindowThread(); /** @brief Similar to #waitKey, but returns full key code. diff --git a/modules/highgui/src/backend.hpp b/modules/highgui/src/backend.hpp index 7c32846ce4..93d51da119 100644 --- a/modules/highgui/src/backend.hpp +++ b/modules/highgui/src/backend.hpp @@ -106,6 +106,7 @@ public: virtual int waitKeyEx(int delay /*= 0*/) = 0; virtual int pollKey() = 0; + virtual const std::string getName() const = 0; }; std::shared_ptr& getCurrentUIBackend(); diff --git a/modules/highgui/src/window.cpp b/modules/highgui/src/window.cpp index 4bb6e9d880..a41e2313c8 100644 --- a/modules/highgui/src/window.cpp +++ b/modules/highgui/src/window.cpp @@ -1091,6 +1091,33 @@ void cv::imshow(const String& winname, const ogl::Texture2D& _tex) #endif } +const std::string cv::currentUIFramework() +{ + CV_TRACE_FUNCTION(); + + // plugin and backend-compatible implementations + auto backend = getCurrentUIBackend(); + if (backend) + { + return backend->getName(); + } + + // builtin backends +#if defined(HAVE_WIN32UI) + CV_Assert(false); // backend-compatible +#elif defined (HAVE_GTK) + CV_Assert(false); // backend-compatible +#elif defined (HAVE_QT) + return std::string("QT"); +#elif defined (HAVE_COCOA) + return std::string("COCOA"); +#elif defined (HAVE_WAYLAND) + return std::string("WAYLAND"); +#else + return std::string(); +#endif +} + // Without OpenGL #ifndef HAVE_OPENGL diff --git a/modules/highgui/src/window_gtk.cpp b/modules/highgui/src/window_gtk.cpp index c3fb853305..88421be8b8 100644 --- a/modules/highgui/src/window_gtk.cpp +++ b/modules/highgui/src/window_gtk.cpp @@ -2286,6 +2286,19 @@ public: { return cvWaitKey(1); // TODO } + + const std::string getName() const CV_OVERRIDE + { +#if GTK_MAJOR_VERSION == 2 + return "GTK2"; +#elif GTK_MAJOR_VERSION == 3 + return "GTK3"; +#elif GTK_MAJOR_VERSION == 4 + return "GTK4"; +#else +#error "Unsupported GTK version" +#endif + } }; // GTKBackendUI static diff --git a/modules/highgui/src/window_w32.cpp b/modules/highgui/src/window_w32.cpp index a693b1de90..98f876a34f 100644 --- a/modules/highgui/src/window_w32.cpp +++ b/modules/highgui/src/window_w32.cpp @@ -3004,6 +3004,11 @@ public: { return pollKey_W32(); } + + const std::string getName() const CV_OVERRIDE + { + return "WIN32"; + } }; // Win32BackendUI static diff --git a/modules/highgui/test/test_gui.cpp b/modules/highgui/test/test_gui.cpp index de40e80ede..8991e8072b 100644 --- a/modules/highgui/test/test_gui.cpp +++ b/modules/highgui/test/test_gui.cpp @@ -205,4 +205,23 @@ TEST(Highgui_GUI, trackbar) EXPECT_NO_THROW(destroyAllWindows()); } + +TEST(Highgui_GUI, currentUIFramework) +{ + auto framework = currentUIFramework(); + std::cout << "UI framework: \"" << framework << "\"" << std::endl; +#if (!defined(ENABLE_PLUGINS) \ + && !defined HAVE_GTK \ + && !defined HAVE_QT \ + && !defined HAVE_WIN32UI \ + && !defined HAVE_COCOA \ + && !defined HAVE_WAYLAND \ + ) + EXPECT_TRUE(framework.empty()); +#elif !defined(ENABLE_PLUGINS) + EXPECT_GT(framework.size(), 0); // builtin backends +#endif +} + + }} // namespace