raven/multimedia/amarok/port-away-from-deprecated-QDesktopWidget-functions-and-disable-missing-OSD-settings-functionalities-on-Wayland.patch
2024-08-05 12:25:16 +06:00

286 lines
11 KiB
Diff

From c60f5dab3729d587eb025afefaf1f5555706368d Mon Sep 17 00:00:00 2001
From: Tuomas Nurmi <tuomas@norsumanageri.org>
Date: Thu, 9 Mar 2023 18:07:10 +0200
Subject: [PATCH 1/3] Port away from deprecated QDesktopWidget functions.
Following the instructions on https://doc.qt.io/qt-5/qdesktopwidget-obsolete.html
---
src/covermanager/CoverManager.cpp | 4 ++--
src/covermanager/CoverViewDialog.cpp | 3 +--
src/dialogs/OrganizeCollectionDialog.cpp | 4 ++--
src/widgets/Osd.cpp | 22 +++++++++++-----------
src/widgets/PixmapViewer.cpp | 6 +++---
5 files changed, 19 insertions(+), 20 deletions(-)
diff --git a/src/covermanager/CoverManager.cpp b/src/covermanager/CoverManager.cpp
index e67a89416a..eb0d63f637 100644
--- a/src/covermanager/CoverManager.cpp
+++ b/src/covermanager/CoverManager.cpp
@@ -39,11 +39,11 @@
#include <QAction>
#include <QApplication>
-#include <QDesktopWidget>
#include <QDialogButtonBox>
#include <QMenu> //showCoverMenu()
#include <QProgressBar>
#include <QPushButton>
+#include <QScreen>
#include <QSplitter>
#include <QStatusBar>
#include <QStringList>
@@ -228,7 +228,7 @@ CoverManager::slotContinueConstruction() //SLOT
connect( m_progress, &CompoundProgressBar::allDone, this, &CoverManager::progressAllDone );
- QSize size = QApplication::desktop()->screenGeometry( this ).size() / 1.5;
+ QSize size = this->screen()->size() / 1.5;
QSize sz = Amarok::config( "Cover Manager" ).readEntry( "Window Size", size );
resize( sz.width(), sz.height() );
diff --git a/src/covermanager/CoverViewDialog.cpp b/src/covermanager/CoverViewDialog.cpp
index bb01e1f7fb..d3a1b96f7e 100644
--- a/src/covermanager/CoverViewDialog.cpp
+++ b/src/covermanager/CoverViewDialog.cpp
@@ -25,7 +25,6 @@
#include <KLocalizedString>
#include <KWindowSystem>
-#include <QDesktopWidget>
#include <QHBoxLayout>
#include <KConfigGroup>
@@ -72,7 +71,7 @@ CoverViewDialog::zoomFactorChanged( qreal value )
void
CoverViewDialog::createViewer( const QImage &image, const QWidget *widget )
{
- int screenNumber = QApplication::desktop()->screenNumber( widget );
+ int screenNumber = QApplication::screens().indexOf( widget->screen() );
PixmapViewer *pixmapViewer = new PixmapViewer( this, QPixmap::fromImage(image), screenNumber );
QHBoxLayout *layout = new QHBoxLayout( this );
layout->addWidget( pixmapViewer );
diff --git a/src/dialogs/OrganizeCollectionDialog.cpp b/src/dialogs/OrganizeCollectionDialog.cpp
index fb59c98224..cfda1f109c 100644
--- a/src/dialogs/OrganizeCollectionDialog.cpp
+++ b/src/dialogs/OrganizeCollectionDialog.cpp
@@ -30,9 +30,9 @@
#include "ui_OrganizeCollectionDialogBase.h"
#include <QApplication>
-#include <QDesktopWidget>
#include <QDir>
#include <QPushButton>
+#include <QScreen>
#include <QTimer>
#include <KColorScheme>
@@ -84,7 +84,7 @@ OrganizeCollectionWidget::OrganizeCollectionWidget( QWidget *parent )
// show some non-editable tags before and after
// but only if screen size is large enough (BR: 283361)
- const QRect screenRect = QApplication::desktop()->screenGeometry();
+ const QRect screenRect = QApplication::primaryScreen()->geometry();
if( screenRect.width() >= 1024 )
{
m_schemaLineLayout->insertWidget( 0,
diff --git a/src/widgets/Osd.cpp b/src/widgets/Osd.cpp
index dc1cf722e3..062f3ceeb9 100644
--- a/src/widgets/Osd.cpp
+++ b/src/widgets/Osd.cpp
@@ -45,6 +45,7 @@
#include <QPainter>
#include <QPixmap>
#include <QRegExp>
+#include <QScreen>
#include <QTimeLine>
#include <QTimer>
@@ -245,7 +246,7 @@ OSDWidget::determineMetrics( const int M )
// determine a sensible maximum size, don't cover the whole desktop or cross the screen
const QSize margin( ( M + MARGIN ) * 2, ( M + MARGIN ) * 2 ); //margins
const QSize image = m_cover.isNull() ? QSize( 0, 0 ) : minImageSize;
- const QSize max = QApplication::desktop()->screen( m_screen )->size() - margin;
+ const QSize max = QApplication::screens()[ screen() ]->size() - margin;
// If we don't do that, the boundingRect() might not be suitable for drawText() (Qt issue N67674)
m_text.replace( QRegExp( " +\n" ), "\n" );
@@ -311,7 +312,7 @@ OSDWidget::determineMetrics( const int M )
rect.adjust( -M, -M, M, M );
const QSize newSize = rect.size();
- const QRect screen = QApplication::desktop()->screenGeometry( m_screen );
+ const QRect screenRect = QApplication::screens()[ screen() ]->geometry();
QPoint newPos( MARGIN, m_yOffset );
switch( m_alignment )
@@ -320,25 +321,25 @@ OSDWidget::determineMetrics( const int M )
break;
case Right:
- newPos.rx() = screen.width() - MARGIN - newSize.width();
+ newPos.rx() = screenRect.width() - MARGIN - newSize.width();
break;
case Center:
- newPos.ry() = ( screen.height() - newSize.height() ) / 2;
+ newPos.ry() = ( screenRect.height() - newSize.height() ) / 2;
Q_FALLTHROUGH();
case Middle:
- newPos.rx() = ( screen.width() - newSize.width() ) / 2;
+ newPos.rx() = ( screenRect.width() - newSize.width() ) / 2;
break;
}
//ensure we don't dip below the screen
- if ( newPos.y() + newSize.height() > screen.height() - MARGIN )
- newPos.ry() = screen.height() - MARGIN - newSize.height();
+ if ( newPos.y() + newSize.height() > screenRect.height() - MARGIN )
+ newPos.ry() = screenRect.height() - MARGIN - newSize.height();
// correct for screen position
- newPos += screen.topLeft();
+ newPos += screenRect.topLeft();
return QRect( newPos, rect.size() );
}
@@ -551,7 +552,7 @@ OSDPreviewWidget::mouseMoveEvent( QMouseEvent *e )
{
// Here we implement a "snap-to-grid" like positioning system for the preview widget
- const QRect screenRect = QApplication::desktop()->screenGeometry( screen() );
+ const QRect screenRect = QApplication::screens()[ screen() ]->geometry();
const uint hcenter = screenRect.width() / 2;
const uint eGlobalPosX = e->globalPos().x() - screenRect.left();
const uint snapZone = screenRect.width() / 24;
@@ -592,8 +593,7 @@ OSDPreviewWidget::mouseMoveEvent( QMouseEvent *e )
move( destination );
// compute current Position && Y-offset
- QDesktopWidget *desktop = QApplication::desktop();
- const int currentScreen = desktop->screenNumber( pos() );
+ const int currentScreen = QGuiApplication::screens().indexOf( QGuiApplication::screenAt( pos() ) );
// set new data
OSDWidget::setScreen( currentScreen );
diff --git a/src/widgets/PixmapViewer.cpp b/src/widgets/PixmapViewer.cpp
index 158540f541..332dbc5d5e 100644
--- a/src/widgets/PixmapViewer.cpp
+++ b/src/widgets/PixmapViewer.cpp
@@ -21,11 +21,11 @@
#include <QApplication>
-#include <QDesktopWidget>
#include <QMouseEvent>
#include <QLabel>
#include <QPixmap>
#include <QPainter>
+#include <QScreen>
#include <QWheelEvent>
@@ -35,8 +35,8 @@ PixmapViewer::PixmapViewer( QWidget *parent, const QPixmap &pix, int screenNumbe
{
m_zoomFactor = 1.0; // initial zoom
- int screenWidth = QApplication::desktop()->availableGeometry( screenNumber ).width();
- int screenHeight = QApplication::desktop()->availableGeometry( screenNumber ).height();
+ int screenWidth = QApplication::screens()[ screenNumber ]->availableGeometry().width();
+ int screenHeight = QApplication::screens()[ screenNumber ]->availableGeometry().height();
if( screenWidth < m_pixmap.width() || screenHeight < m_pixmap.height() )
{
qreal zoomFactorX = qreal(screenWidth) / m_pixmap.width();
--
GitLab
From b95c439ebba30ba257ba75d060b237a293415ea8 Mon Sep 17 00:00:00 2001
From: Tuomas Nurmi <tuomas@norsumanageri.org>
Date: Sat, 11 Mar 2023 15:22:18 +0200
Subject: [PATCH 2/3] Disable OSD options not available on Wayland.
---
src/configdialog/dialogs/NotificationsConfig.cpp | 6 +++++-
src/widgets/Osd.cpp | 8 ++++++--
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/configdialog/dialogs/NotificationsConfig.cpp b/src/configdialog/dialogs/NotificationsConfig.cpp
index 0c16fdcb17..1c3387206a 100644
--- a/src/configdialog/dialogs/NotificationsConfig.cpp
+++ b/src/configdialog/dialogs/NotificationsConfig.cpp
@@ -51,7 +51,11 @@ NotificationsConfig::NotificationsConfig( Amarok2ConfigDialog* parent )
#endif
// Enable/disable the translucency option depending on availability of desktop compositing
- kcfg_OsdUseTranslucency->setEnabled( KWindowSystem::compositingActive() );
+ // As opacity functionality is not available on Wayland at least with current implementation, don't enable option there
+ kcfg_OsdUseTranslucency->setEnabled( !KWindowSystem::isPlatformWayland() && KWindowSystem::compositingActive() );
+
+ // Also disable other functionalities not (yet?) available on Wayland
+ kcfg_OsdScreen->setEnabled( !KWindowSystem::isPlatformWayland() );
connect( m_osdPreview, &OSDPreviewWidget::positionChanged, this, &NotificationsConfig::slotPositionChanged );
diff --git a/src/widgets/Osd.cpp b/src/widgets/Osd.cpp
index 062f3ceeb9..e29a1b2347 100644
--- a/src/widgets/Osd.cpp
+++ b/src/widgets/Osd.cpp
@@ -509,7 +509,9 @@ OSDPreviewWidget::OSDPreviewWidget( QWidget *parent )
setDuration( 0 );
setImage( Amarok::icon() );
setTranslucent( AmarokConfig::osdUseTranslucency() );
- setText( i18n( "On-Screen-Display preview\nDrag to reposition" ) );
+ // Drag-positioning not available on Wayland, so let's hide any untrue ideas about dragging
+ // TODO maybe one day Wayland will be first-class OSD citizen
+ setText( KWindowSystem::isPlatformWayland() ? i18n ( "Preview" ) : i18n( "On-Screen-Display preview\nDrag to reposition" ) );
}
void
@@ -517,7 +519,9 @@ OSDPreviewWidget::mousePressEvent( QMouseEvent *event )
{
m_dragYOffset = event->pos();
- if( event->button() == Qt::LeftButton && !m_dragging )
+ // As we can't position OSD on Wayland at the moment, and grabbing mouse doesn't quite work
+ // either, let's disable this for now.
+ if( !KWindowSystem::isPlatformWayland() && event->button() == Qt::LeftButton && !m_dragging )
{
grabMouse( Qt::SizeAllCursor );
m_dragging = true;
--
GitLab
From d70177ab4a57c3aecf63cfd3937044c575ee1a6a Mon Sep 17 00:00:00 2001
From: Tuomas Nurmi <tuomas@norsumanageri.org>
Date: Sat, 11 Mar 2023 17:58:59 +0200
Subject: [PATCH 3/3] Remove obsolete ifdef.
Apparently Q_WS's are not defined any more. Turns out, if run, the setType
actually makes the OSD positioning to go totally bonkers on X11, so let's just
remove it.
---
src/widgets/Osd.cpp | 4 ----
1 file changed, 4 deletions(-)
diff --git a/src/widgets/Osd.cpp b/src/widgets/Osd.cpp
index e29a1b2347..1eee135be4 100644
--- a/src/widgets/Osd.cpp
+++ b/src/widgets/Osd.cpp
@@ -87,10 +87,6 @@ OSDWidget::OSDWidget( QWidget *parent, const char *name )
setObjectName( name );
setFocusPolicy( Qt::NoFocus );
- #ifdef Q_WS_X11
- KWindowSystem::setType( winId(), NET::Notification );
- #endif
-
m_timer->setSingleShot( true );
connect( m_timer, &QTimer::timeout, this, &OSDWidget::hide );
--
GitLab