changeset 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 2b4f7287aa3a
children 4d74446020ad
files libgui/src/community-news.cc libgui/src/community-news.h libgui/src/gui-utils.cc libgui/src/gui-utils.h libgui/src/m-editor/find-dialog.cc libgui/src/main-window.cc libgui/src/main-window.h libgui/src/octave-dock-widget.cc libgui/src/release-notes.cc libgui/src/release-notes.h libgui/src/terminal-dock-widget.cc libgui/src/welcome-wizard.cc
diffstat 12 files changed, 127 insertions(+), 69 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/community-news.cc	Mon May 16 23:00:27 2022 +0200
+++ b/libgui/src/community-news.cc	Sun Jan 30 16:41:44 2022 +0100
@@ -27,12 +27,12 @@
 #  include "config.h"
 #endif
 
-#include <QDesktopWidget>
 #include <QLayout>
 #include <QTextBrowser>
 #include <QThread>
 
 #include "community-news.h"
+#include "gui-utils.h"
 #include "gui-preferences-nr.h"
 #include "news-reader.h"
 #include "octave-qobject.h"
@@ -130,14 +130,4 @@
     activateWindow ();
   }
 
-  // FIXME: This function is duplicated in main_window.cc.  Maybe it
-  // should be a utility function?
-
-  void community_news::get_screen_geometry (int& width, int& height)
-  {
-    QRect screen_geometry = QApplication::desktop ()->availableGeometry (this);
-
-    width = screen_geometry.width ();
-    height = screen_geometry.height ();
-  }
 }
--- a/libgui/src/community-news.h	Mon May 16 23:00:27 2022 +0200
+++ b/libgui/src/community-news.h	Sun Jan 30 16:41:44 2022 +0100
@@ -61,8 +61,6 @@
     void construct (base_qobject& oct_qobj, const QString& base_url,
                     const QString& page, int serial);
 
-    void get_screen_geometry (int& width, int& height);
-
     QTextBrowser *m_browser;
   };
 }
--- 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)));
+  }
+
 }
--- a/libgui/src/gui-utils.h	Mon May 16 23:00:27 2022 +0200
+++ b/libgui/src/gui-utils.h	Sun Jan 30 16:41:44 2022 +0100
@@ -29,6 +29,7 @@
 #include "octave-config.h"
 
 #include <QColor>
+#include <QRect>
 
 namespace octave
 {
@@ -55,6 +56,28 @@
   interpolate_color (const QColor& col1, const QColor& col2,
                      double fs, double fv);
 
+
+  /*!
+      Get the screen geometry of the actual screen.
+
+      @param width integer variable for storing the screen width
+      @param height integer variable for storing the screen height
+  */
+
+  extern OCTGUI_API void
+  get_screen_geometry (int& width, int& height);
+
+
+  /*!
+      Adjust geometry to be completely on a screen
+
+      @param actual_geometry QRect with actual widget geometry; this is
+             changed to the updated geometry which is on the screen.
+      @param default_geometry the default geometry that is used in case
+             the actual geometry os on no available screen.
+  */
+  extern OCTGUI_API void
+  adjust_to_screen (QRect& actual_geometry, const QRect& default_geometry);
 }
 
 #endif
--- a/libgui/src/m-editor/find-dialog.cc	Mon May 16 23:00:27 2022 +0200
+++ b/libgui/src/m-editor/find-dialog.cc	Sun Jan 30 16:41:44 2022 +0100
@@ -71,7 +71,6 @@
 #include <QCheckBox>
 #include <QCheckBox>
 #include <QCompleter>
-#include <QDesktopWidget>
 #include <QDialogButtonBox>
 #include <QGridLayout>
 #include <QIcon>
@@ -83,6 +82,7 @@
 
 #include "find-dialog.h"
 #include "gui-preferences-ed.h"
+#include "gui-utils.h"
 #include "resource-manager.h"
 #include "octave-qobject.h"
 
@@ -293,27 +293,21 @@
     m_backward_check_box->setChecked (FIND_DLG_BACK & opts);
     m_search_selection_check_box->setChecked (FIND_DLG_SEL & opts);
 
-    // Position:  lower right of editor's position
+    // Default position:  lower right of editor's position
     int xp = ed_bottom_right.x () - sizeHint ().width ();
     int yp = ed_bottom_right.y () - sizeHint ().height ();
-
-    m_last_position = s->value (ed_fdlg_pos.key, QPoint (xp, yp)).toPoint ();
-    move (m_last_position);
+    QRect default_geometry (xp, yp, sizeHint ().width (), sizeHint ().height ());
 
-    if (QApplication::desktop ()->screenNumber (this) == -1)
-      {
-        // Last used position is not on screen anymore, use default pos.
-        m_last_position = QPoint (xp, yp);
-        move (m_last_position);
+    // Last position from settings
+    m_last_position = s->value (ed_fdlg_pos.key, QPoint (xp, yp)).toPoint ();
+    QRect last_geometry (m_last_position,
+                         QSize (sizeHint ().width (), sizeHint ().height ()));
 
-        if (QApplication::desktop ()->screenNumber (this) == -1)
-          {
-            // Default position is not on screen, last resort
-            m_last_position = QPoint (50, 100); // upper left
-            move (m_last_position);
-          }
-      }
+    // Make sure we are on the screen
+    adjust_to_screen (last_geometry, default_geometry);
+    m_last_position = last_geometry.topLeft ();
 
+    move (m_last_position);
   }
 
   // set text of "search from start" depending on backward search
--- a/libgui/src/main-window.cc	Mon May 16 23:00:27 2022 +0200
+++ b/libgui/src/main-window.cc	Sun Jan 30 16:41:44 2022 +0100
@@ -35,7 +35,6 @@
 #include <QDateTime>
 #include <QDebug>
 #include <QDesktopServices>
-#include <QDesktopWidget>
 #include <QFileDialog>
 #include <QIcon>
 #include <QInputDialog>
@@ -69,6 +68,7 @@
 #include "gui-preferences-nr.h"
 #include "gui-preferences-sc.h"
 #include "gui-settings.h"
+#include "gui-utils.h"
 #include "interpreter-qobject.h"
 #include "main-window.h"
 #include "news-reader.h"
@@ -2729,15 +2729,6 @@
        });
   }
 
-  // Get size of screen where the main window is located
-  void main_window::get_screen_geometry (int& width, int& height)
-  {
-    QRect screen_geometry = QApplication::desktop ()->availableGeometry (this);
-
-    width = screen_geometry.width ();
-    height = screen_geometry.height ();
-  }
-
   void main_window::resize_dock (QDockWidget *dw, int width, int height)
   {
 #if defined (HAVE_QMAINWINDOW_RESIZEDOCKS)
--- a/libgui/src/main-window.h	Mon May 16 23:00:27 2022 +0200
+++ b/libgui/src/main-window.h	Sun Jan 30 16:41:44 2022 +0100
@@ -299,7 +299,6 @@
 
     void update_default_encoding (const QString& default_encoding);
 
-    void get_screen_geometry (int& width, int& height);
     void set_default_geometry (void);
     void resize_dock (QDockWidget *dw, int width, int height);
 
--- a/libgui/src/octave-dock-widget.cc	Mon May 16 23:00:27 2022 +0200
+++ b/libgui/src/octave-dock-widget.cc	Sun Jan 30 16:41:44 2022 +0100
@@ -29,18 +29,20 @@
 
 #include <QAction>
 #include <QApplication>
-#include <QDesktopWidget>
 #include <QHBoxLayout>
 #include <QLabel>
+#include <QScreen>
 #include <QStyle>
 #include <QToolBar>
 #include <QMenuBar>
+#include <QWindow>
 
 #include "gui-preferences-dw.h"
 #include "gui-preferences-global.h"
 #include "gui-preferences-mw.h"
 #include "gui-preferences-sc.h"
 #include "gui-settings.h"
+#include "gui-utils.h"
 #include "main-window.h"
 #include "octave-dock-widget.h"
 #include "octave-qobject.h"
@@ -513,12 +515,8 @@
       m_icon_color_active = "";
 
 
-    QWidget *ref_widget = m_main_window;
-    if (! ref_widget)
-      ref_widget = this;
-
     int x, y, w, h;
-    QApplication::desktop ()->availableGeometry (ref_widget).getRect (&x, &y, &w, &h);
+    QGuiApplication::primaryScreen ()->availableGeometry ().getRect (&x, &y, &w, &h);
     QRect default_floating_size = QRect (x+16, y+32, w/3, h/2);
 
     QRect default_dock_size;
@@ -538,11 +536,7 @@
       = settings->value (dw_float_geometry.key.arg (objectName ()),
                          default_floating_size).toRect ();
 
-    QWidget dummy;
-    dummy.setGeometry (m_recent_float_geom);
-
-    if (QApplication::desktop ()->screenNumber (&dummy) == -1)
-      m_recent_float_geom = default_floating_size;
+    adjust_to_screen (m_recent_float_geom, default_floating_size);
 
     // The following is required for ensure smooth transition from old
     // saveGeomety to new QRect setting (see comment for restoring size
--- a/libgui/src/release-notes.cc	Mon May 16 23:00:27 2022 +0200
+++ b/libgui/src/release-notes.cc	Sun Jan 30 16:41:44 2022 +0100
@@ -27,15 +27,17 @@
 #  include "config.h"
 #endif
 
-#include <QDesktopWidget>
+#include <QApplication>
 #include <QFile>
 #include <QIcon>
 #include <QLayout>
+#include <QScreen>
 #include <QTextBrowser>
 #include <QTextStream>
 #include <QThread>
 
 #include "release-notes.h"
+#include "gui-utils.h"
 #include "gui-preferences-nr.h"
 #include "news-reader.h"
 #include "octave-qobject.h"
@@ -116,14 +118,4 @@
     activateWindow ();
   }
 
-  // FIXME: This function is duplicated in main_window.cc.  Maybe it
-  // should be a utility function?
-
-  void release_notes::get_screen_geometry (int& width, int& height)
-  {
-    QRect screen_geometry = QApplication::desktop ()->availableGeometry (this);
-
-    width = screen_geometry.width ();
-    height = screen_geometry.height ();
-  }
 }
--- a/libgui/src/release-notes.h	Mon May 16 23:00:27 2022 +0200
+++ b/libgui/src/release-notes.h	Sun Jan 30 16:41:44 2022 +0100
@@ -51,8 +51,6 @@
 
   private:
 
-    void get_screen_geometry (int& width, int& height);
-
     QTextBrowser *m_browser;
     QString m_release_notes_icon;
   };
--- a/libgui/src/terminal-dock-widget.cc	Mon May 16 23:00:27 2022 +0200
+++ b/libgui/src/terminal-dock-widget.cc	Sun Jan 30 16:41:44 2022 +0100
@@ -27,7 +27,7 @@
 #  include "config.h"
 #endif
 
-#include <QDesktopWidget>
+#include <QScreen>
 
 // This header is only needed for the new terminal widget.
 #include "command-widget.h"
@@ -107,8 +107,8 @@
     int win_x =  metrics.maxWidth()*80;
     int win_y =  metrics.height()*25;
 
-    int max_x = QApplication::desktop ()->screenGeometry (this).width ();
-    int max_y = QApplication::desktop ()->screenGeometry (this).height ();
+    int max_x = QGuiApplication::primaryScreen ()->availableGeometry ().width ();
+    int max_y = QGuiApplication::primaryScreen ()->availableGeometry ().height ();
 
     if (win_x > max_x)
       win_x = max_x;
--- a/libgui/src/welcome-wizard.cc	Mon May 16 23:00:27 2022 +0200
+++ b/libgui/src/welcome-wizard.cc	Sun Jan 30 16:41:44 2022 +0100
@@ -28,7 +28,6 @@
 #endif
 
 #include <QApplication>
-#include <QDesktopWidget>
 #include <QHBoxLayout>
 #include <QPushButton>
 #include <QVBoxLayout>