diff libgui/src/gui-utils.cc @ 31006:35d37e433532 stable

replace use of depreciated QDesktopWidget in GUI * gui-utils.cc: include QApplication, QRect and QScreen; (get_screen_geometry): return QRect with geometry of primary screen; (adjust_to_screen): adjust given QRect to be completely on the screen that contains the largest part of the QRect, use a default geometry if no part is on an available screen * gui-utils.h: include QRect; new function get_screen_geometry and adjust_to_screen * community-news.cc: do not include QDesktopWidget, but gui-utils.h; (get_screen_geometry); move function to gui-utils.cc; * community-news.h: move get_screen_geometry to gui-utils.h * find-dialog.cc: do not include QDesktopWidget, but gui-utils.h; (restore_settings): use new function adjust_to_screen * main-window.cc: do not include QDesktopWidget, but gui-utils.h; (get_screen_geometry: move function to gui-utils.cc * main-window.h: move function get_screen_geometry to gui.utils.h; * octave-dock-widget.cc: do not include QDesktopWidget, but gui-utils.h QScreen and QWindow; (handle_settings): use adjust_to_screen and QGuiApplication->primaryScreen * release-notes.cc: do not include QDesktopWidget, but gui-utils.h and QScreen; (get_screen_geometry): move to gui-utils.cc; * release-notes.h: move get:screen_geometry to gui-utils.h * terminal-dock-widget.cc: do not include QDesktopWidget but QScreen; (terminal_dock_widget): use QGuiApplication->primaryScreen instead of QDesktopWidget->screenGeometry * welcome-wizard.cc: remove include of QDesktopWidget
author Torsten Lilge <ttl-octave@mailbox.org>
date Sun, 30 Jan 2022 16:41:44 +0100
parents 796f54d4ddbf
children c6d54dd31a7e
line wrap: on
line diff
--- a/libgui/src/gui-utils.cc	Mon May 16 23:00:27 2022 +0200
+++ b/libgui/src/gui-utils.cc	Sun Jan 30 16:41:44 2022 +0100
@@ -27,6 +27,10 @@
 #  include "config.h"
 #endif
 
+#include <QApplication>
+#include <QRect>
+#include <QScreen>
+
 #include "gui-utils.h"
 
 namespace octave
@@ -42,4 +46,80 @@
 
     return QColor::fromHsvF (h1, s1*fs, v1 + fv*(v2 - v1));
   }
+
+  OCTGUI_API void
+  get_screen_geometry (int& width, int& height)
+  {
+    QRect geom = QGuiApplication::primaryScreen ()->availableGeometry ();
+
+    width = geom.width ();
+    height = geom.height ();
+  }
+
+
+  OCTGUI_API void
+  adjust_to_screen (QRect& actual_geometry, const QRect& default_geometry)
+  {
+
+    // Get the screen that holds the largest part of the given actual geometry
+
+    const QScreen *actual_screen = nullptr;  // no screen found yet
+    QRect actual_screen_geom = QRect ();     // geometry of found screen
+    int intersected_area_max = 0;            // max. intersected area
+
+    const int area_actual_geometry
+        = actual_geometry.width () * actual_geometry.height ();
+    QRect intersection;
+
+    foreach (const QScreen *screen, QGuiApplication::screens())
+      {
+        QRect screen_geom = screen->availableGeometry ();
+        intersection = screen_geom.intersected (actual_geometry);
+        if (! intersection.isEmpty ())
+          {
+            int area = intersection.width () * intersection.height ();
+            if (area > intersected_area_max)
+              {
+                actual_screen = screen;
+                actual_screen_geom = screen->availableGeometry ();
+                if (area == area_actual_geometry)
+                  return;   // Actual geom is completely on a screen: return
+                intersected_area_max = area;
+              }
+          }
+      }
+
+    // If the actual geometry is on no screen, use deault geometry
+
+    if (actual_screen == nullptr)
+      {
+        actual_geometry = default_geometry;
+        return;
+      }
+
+    // There is a screen that holds a part of the actual geometry.
+    // Now adjust actual geometry to this screen
+
+    // Get some properties of the actual and intersected geometry
+    int agx1, agy1, agx2, agy2;
+    actual_geometry.getCoords (&agx1, &agy1, &agx2, &agy2);
+    int isx1, isy1, isx2, isy2;
+    intersection.getCoords (&isx1, &isy1, &isx2, &isy2);
+
+    // Make the intersection the same size as the actual geometry
+    if ((agx1 == isx1) && (agx2 != isx2))
+      isx1 = isx1 - agx2 + isx2;
+    if ((agx1 != isx1) && (agx2 == isx2))
+      isx2 = isx2 + agx2 - isx2;
+    if ((agy1 == isy1) && (agy2 != isy2))
+      isy1 = isy1 - agy2 + isy2;
+    if ((agy1 != isy1) && (agy2 == isy2))
+      isy2 = isy2 + agy2 - isy2;
+
+    // And compute again the intersection with the screen if this resizing
+    // led to corners outside the screen
+    actual_geometry = actual_screen_geom.intersected (
+                            QRect (QPoint (isx1,isy1), QPoint (isx2,isy2)));
+  }
+
 }