vcl/inc/qt5/QtFrame.hxx                         |    2 
 vcl/inc/unx/gtk/gtkframe.hxx                    |    2 
 vcl/inc/unx/salframe.h                          |    2 
 vcl/inc/unx/screensaverinhibitor.hxx            |   28 ++++++--
 vcl/qt5/QtFrame.cxx                             |    8 +-
 vcl/unx/generic/window/salframe.cxx             |    4 -
 vcl/unx/generic/window/screensaverinhibitor.cxx |   75 ++++++++++--------------
 vcl/unx/gtk3/gtkframe.cxx                       |   15 +---
 8 files changed, 66 insertions(+), 70 deletions(-)

New commits:
commit 796fb57d7b2e2ea05795dc49c4438c25adc26fd4
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Mon May 8 11:17:00 2023 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Tue May 9 11:20:29 2023 +0200

    Related: tdf#142176 rearrange screensaver inhibiter to be more generic
    
    and for not-x11 I see gtk just uses 0 for xid (which is called
    window_system_id there now)
    
    Change-Id: I9248bcceaa2d21d34133dea80697776df0aa8c6c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151560
    Tested-by: Caolán McNamara <caol...@redhat.com>
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/vcl/inc/qt5/QtFrame.hxx b/vcl/inc/qt5/QtFrame.hxx
index 963572ca819b..b927d366765d 100644
--- a/vcl/inc/qt5/QtFrame.hxx
+++ b/vcl/inc/qt5/QtFrame.hxx
@@ -102,7 +102,7 @@ class VCLPLUG_QT_PUBLIC QtFrame : public QObject, public 
SalFrame
     QRect m_aRestoreGeometry;
 
 #if CHECK_ANY_QT_USING_X11
-    ScreenSaverInhibitor m_ScreenSaverInhibitor;
+    SessionManagerInhibitor m_SessionManagerInhibitor;
     ModKeyFlags m_nKeyModifiers;
 #endif
 
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index 00bbd26379ae..1a83a7fc39d3 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -202,7 +202,7 @@ class GtkSalFrame final : public SalFrame
     bool                            m_bGraphics;
     ModKeyFlags                     m_nKeyModifiers;
     PointerStyle                    m_ePointerStyle;
-    ScreenSaverInhibitor            m_ScreenSaverInhibitor;
+    SessionManagerInhibitor         m_SessionManagerInhibitor;
     gulong                          m_nSetFocusSignalId;
     bool                            m_bFullscreen;
     bool                            m_bDefaultPos;
diff --git a/vcl/inc/unx/salframe.h b/vcl/inc/unx/salframe.h
index 3bbf9729c971..d8a177d9a867 100644
--- a/vcl/inc/unx/salframe.h
+++ b/vcl/inc/unx/salframe.h
@@ -105,7 +105,7 @@ class X11SalFrame final : public SalFrame
     int             m_nWorkArea;
     bool            m_bSetFocusOnMap;
 
-    ScreenSaverInhibitor maScreenSaverInhibitor;
+    SessionManagerInhibitor maSessionManagerInhibitor;
     tools::Rectangle       maPaintRegion;
 
     Timer           maAlwaysOnTopRaiseTimer;
diff --git a/vcl/inc/unx/screensaverinhibitor.hxx 
b/vcl/inc/unx/screensaverinhibitor.hxx
index 4ddbb53f9c12..6cfa3e2fd700 100644
--- a/vcl/inc/unx/screensaverinhibitor.hxx
+++ b/vcl/inc/unx/screensaverinhibitor.hxx
@@ -19,17 +19,25 @@
 #include <optional>
 #include <string_view>
 
-class VCL_PLUGIN_PUBLIC ScreenSaverInhibitor
+enum ApplicationInhibitFlags
+{
+    APPLICATION_INHIBIT_LOGOUT = (1 << 0),
+    APPLICATION_INHIBIT_SWITCH = (1 << 1),
+    APPLICATION_INHIBIT_SUSPEND = (1 << 2),
+    APPLICATION_INHIBIT_IDLE = (1 << 3) // Inhibit the session being marked as 
idle
+};
+
+class VCL_PLUGIN_PUBLIC SessionManagerInhibitor
 {
 public:
-    void inhibit(bool bInhibit, std::u16string_view sReason, bool bIsX11,
-                 const std::optional<unsigned int>& xid, 
std::optional<Display*> pDisplay);
+    void inhibit(bool bInhibit, std::u16string_view sReason, 
ApplicationInhibitFlags eType,
+                 unsigned int window_system_id, std::optional<Display*> 
pDisplay);
 
 private:
     // These are all used as guint, however this header may be included
     // in kde/tde/etc backends, where we would ideally avoid having
     // any glib dependencies, hence the direct use of unsigned int.
-    std::optional<unsigned int> mnFDOCookie; // FDO ScreenSaver Inhibit
+    std::optional<unsigned int> mnFDOSSCookie; // FDO ScreenSaver Inhibit
     std::optional<unsigned int> mnFDOPMCookie; // FDO PowerManagement Inhibit
     std::optional<unsigned int> mnGSMCookie;
     std::optional<unsigned int> mnMSMCookie;
@@ -49,18 +57,20 @@ private:
     // all encompassing standard, hence we should just try all of them.
     //
     // The current APIs we have: (note: the list of supported environments is 
incomplete)
-    // FDO: org.freedesktop.ScreenSaver::Inhibit - appears to be supported 
only by KDE?
+    // FDSSO: org.freedesktop.ScreenSaver::Inhibit - appears to be supported 
only by KDE?
     // FDOPM: org.freedesktop.PowerManagement.Inhibit::Inhibit - XFCE, (KDE) ?
     //        (KDE: doesn't inhibit screensaver, but does inhibit 
PowerManagement)
     // GSM: org.gnome.SessionManager::Inhibit - gnome 3
     // MSM: org.mate.Sessionmanager::Inhibit - Mate <= 1.10, is identical to 
GSM
     //       (This is replaced by the GSM interface from Mate 1.12 onwards)
     //
-    // Note: the Uninhibit call has different spelling in FDO (UnInhibit) vs 
GSM (Uninhibit)
-    void inhibitFDO(bool bInhibit, const char* appname, const char* reason);
+    // Note: the Uninhibit call has different spelling in FDOSS (UnInhibit) vs 
GSM (Uninhibit)
+    void inhibitFDOSS(bool bInhibit, const char* appname, const char* reason);
     void inhibitFDOPM(bool bInhibit, const char* appname, const char* reason);
-    void inhibitGSM(bool bInhibit, const char* appname, const char* reason, 
const unsigned int xid);
-    void inhibitMSM(bool bInhibit, const char* appname, const char* reason, 
const unsigned int xid);
+    void inhibitGSM(bool bInhibit, const char* appname, const char* reason,
+                    ApplicationInhibitFlags eType, unsigned int 
window_system_id);
+    void inhibitMSM(bool bInhibit, const char* appname, const char* reason,
+                    ApplicationInhibitFlags eType, unsigned int 
window_system_id);
 
     void inhibitXScreenSaver(bool bInhibit, Display* pDisplay);
     static void inhibitXAutoLock(bool bInhibit, Display* pDisplay);
diff --git a/vcl/qt5/QtFrame.cxx b/vcl/qt5/QtFrame.cxx
index 74dfc98445af..ed5c0538e5cb 100644
--- a/vcl/qt5/QtFrame.cxx
+++ b/vcl/qt5/QtFrame.cxx
@@ -741,19 +741,19 @@ void QtFrame::StartPresentation(bool bStart)
     // meh - so there's no Qt platform independent solution
     // 
https://forum.qt.io/topic/38504/solved-qdialog-in-fullscreen-disable-os-screensaver
     assert(m_aSystemData.platform != SystemEnvData::Platform::Invalid);
-    const bool bIsX11 = m_aSystemData.platform == SystemEnvData::Platform::Xcb;
-    std::optional<unsigned int> aRootWindow;
+    unsigned int nRootWindow(0);
     std::optional<Display*> aDisplay;
 
 #if CHECK_QT5_USING_X11
     if (QX11Info::isPlatformX11())
     {
-        aRootWindow = QX11Info::appRootWindow();
+        nRootWindow = QX11Info::appRootWindow();
         aDisplay = QX11Info::display();
     }
 #endif
 
-    m_ScreenSaverInhibitor.inhibit(bStart, u"presentation", bIsX11, 
aRootWindow, aDisplay);
+    m_SessionManagerInhibitor.inhibit(bStart, u"presentation", 
APPLICATION_INHIBIT_IDLE,
+                                      nRootWindow, aDisplay);
 #else
     Q_UNUSED(bStart)
 #endif
diff --git a/vcl/unx/generic/window/salframe.cxx 
b/vcl/unx/generic/window/salframe.cxx
index 528bb91e065a..f96c99b5c480 100644
--- a/vcl/unx/generic/window/salframe.cxx
+++ b/vcl/unx/generic/window/salframe.cxx
@@ -1972,9 +1972,9 @@ void X11SalFrame::ShowFullScreen( bool bFullScreen, 
sal_Int32 nScreen )
 
 void X11SalFrame::StartPresentation( bool bStart )
 {
-    maScreenSaverInhibitor.inhibit( bStart,
+    maSessionManagerInhibitor.inhibit( bStart,
                                     u"presentation",
-                                    true, // isX11
+                                    APPLICATION_INHIBIT_IDLE,
                                     mhWindow,
                                     GetXDisplay() );
 
diff --git a/vcl/unx/generic/window/screensaverinhibitor.cxx 
b/vcl/unx/generic/window/screensaverinhibitor.cxx
index a2274028b526..b1cfcb3f4993 100644
--- a/vcl/unx/generic/window/screensaverinhibitor.cxx
+++ b/vcl/unx/generic/window/screensaverinhibitor.cxx
@@ -26,9 +26,9 @@
 #if ENABLE_GIO
 #include <gio/gio.h>
 
-#define FDO_DBUS_SERVICE        "org.freedesktop.ScreenSaver"
-#define FDO_DBUS_PATH           "/org/freedesktop/ScreenSaver"
-#define FDO_DBUS_INTERFACE      "org.freedesktop.ScreenSaver"
+#define FDOSS_DBUS_SERVICE        "org.freedesktop.ScreenSaver"
+#define FDOSS_DBUS_PATH           "/org/freedesktop/ScreenSaver"
+#define FDOSS_DBUS_INTERFACE      "org.freedesktop.ScreenSaver"
 
 #define FDOPM_DBUS_SERVICE      "org.freedesktop.PowerManagement.Inhibit"
 #define FDOPM_DBUS_PATH         "/org/freedesktop/PowerManagement/Inhibit"
@@ -46,30 +46,27 @@
 
 #include <sal/log.hxx>
 
-void ScreenSaverInhibitor::inhibit( bool bInhibit, std::u16string_view sReason,
-                                    bool bIsX11, const std::optional<unsigned 
int>& xid, std::optional<Display*> pDisplay )
+void SessionManagerInhibitor::inhibit(bool bInhibit, std::u16string_view 
sReason, ApplicationInhibitFlags eType,
+                                      unsigned int window_system_id, 
std::optional<Display*> pDisplay)
 {
     const char* appname = SalGenericSystem::getFrameClassName();
     const OString aReason = OUStringToOString( sReason, RTL_TEXTENCODING_UTF8 
);
 
-    inhibitFDO( bInhibit, appname, aReason.getStr() );
-    inhibitFDOPM( bInhibit, appname, aReason.getStr() );
-
-    if ( !bIsX11 )
-        return;
+    if (eType == APPLICATION_INHIBIT_IDLE)
+    {
+        inhibitFDOSS( bInhibit, appname, aReason.getStr() );
+        inhibitFDOPM( bInhibit, appname, aReason.getStr() );
+    }
 
-    if (pDisplay)
+    if (eType == APPLICATION_INHIBIT_IDLE && pDisplay)
     {
         inhibitXScreenSaver( bInhibit, *pDisplay );
         inhibitXAutoLock( bInhibit, *pDisplay );
         inhibitDPMS( bInhibit, *pDisplay );
     }
 
-    if (xid)
-    {
-        inhibitGSM( bInhibit, appname, aReason.getStr(), *xid );
-        inhibitMSM( bInhibit, appname, aReason.getStr(), *xid );
-    }
+    inhibitGSM(bInhibit, appname, aReason.getStr(), eType, window_system_id);
+    inhibitMSM(bInhibit, appname, aReason.getStr(), eType, window_system_id);
 }
 
 #if ENABLE_GIO
@@ -159,11 +156,11 @@ static void dbusInhibit( bool bInhibit,
 }
 #endif // ENABLE_GIO
 
-void ScreenSaverInhibitor::inhibitFDO( bool bInhibit, const char* appname, 
const char* reason )
+void SessionManagerInhibitor::inhibitFDOSS( bool bInhibit, const char* 
appname, const char* reason )
 {
 #if ENABLE_GIO
     dbusInhibit( bInhibit,
-                 FDO_DBUS_SERVICE, FDO_DBUS_PATH, FDO_DBUS_INTERFACE,
+                 FDOSS_DBUS_SERVICE, FDOSS_DBUS_PATH, FDOSS_DBUS_INTERFACE,
                  [appname, reason] ( GDBusProxy *proxy, GError*& error ) -> 
GVariant* {
                      return g_dbus_proxy_call_sync( proxy, "Inhibit",
                                                     g_variant_new("(ss)", 
appname, reason),
@@ -174,7 +171,7 @@ void ScreenSaverInhibitor::inhibitFDO( bool bInhibit, const 
char* appname, const
                                                     g_variant_new("(u)", 
nCookie),
                                                     G_DBUS_CALL_FLAGS_NONE, 
-1, nullptr, &error );
                  },
-                 mnFDOCookie );
+                 mnFDOSSCookie );
 #else
     (void) this;
     (void) bInhibit;
@@ -183,7 +180,7 @@ void ScreenSaverInhibitor::inhibitFDO( bool bInhibit, const 
char* appname, const
 #endif // ENABLE_GIO
 }
 
-void ScreenSaverInhibitor::inhibitFDOPM( bool bInhibit, const char* appname, 
const char* reason )
+void SessionManagerInhibitor::inhibitFDOPM( bool bInhibit, const char* 
appname, const char* reason )
 {
 #if ENABLE_GIO
     dbusInhibit( bInhibit,
@@ -207,28 +204,18 @@ void ScreenSaverInhibitor::inhibitFDOPM( bool bInhibit, 
const char* appname, con
 #endif // ENABLE_GIO
 }
 
-#if ENABLE_GIO
-enum ApplicationInhibitFlags
-{
-    APPLICATION_INHIBIT_LOGOUT  = (1 << 0),
-    APPLICATION_INHIBIT_SWITCH  = (1 << 1),
-    APPLICATION_INHIBIT_SUSPEND = (1 << 2),
-    APPLICATION_INHIBIT_IDLE    = (1 << 3) // Inhibit the session being marked 
as idle
-};
-#endif
-
-void ScreenSaverInhibitor::inhibitGSM( bool bInhibit, const char* appname, 
const char* reason, const unsigned int xid )
+void SessionManagerInhibitor::inhibitGSM( bool bInhibit, const char* appname, 
const char* reason, ApplicationInhibitFlags eType, unsigned int 
window_system_id )
 {
 #if ENABLE_GIO
     dbusInhibit( bInhibit,
                  GSM_DBUS_SERVICE, GSM_DBUS_PATH, GSM_DBUS_INTERFACE,
-                 [appname, reason, xid] ( GDBusProxy *proxy, GError*& error ) 
-> GVariant* {
+                 [appname, reason, eType, window_system_id] ( GDBusProxy 
*proxy, GError*& error ) -> GVariant* {
                      return g_dbus_proxy_call_sync( proxy, "Inhibit",
                                                     g_variant_new("(susu)",
                                                                   appname,
-                                                                  xid,
+                                                                  
window_system_id,
                                                                   reason,
-                                                                  
APPLICATION_INHIBIT_IDLE
+                                                                  eType
                                                                  ),
                                                     G_DBUS_CALL_FLAGS_NONE, 
-1, nullptr, &error );
                  },
@@ -243,22 +230,23 @@ void ScreenSaverInhibitor::inhibitGSM( bool bInhibit, 
const char* appname, const
     (void) bInhibit;
     (void) appname;
     (void) reason;
-    (void) xid;
+    (void) eType;
+    (void) window_system_id;
 #endif // ENABLE_GIO
 }
 
-void ScreenSaverInhibitor::inhibitMSM( bool bInhibit, const char* appname, 
const char* reason, const unsigned int xid )
+void SessionManagerInhibitor::inhibitMSM( bool bInhibit, const char* appname, 
const char* reason, ApplicationInhibitFlags eType, unsigned int 
window_system_id )
 {
 #if ENABLE_GIO
     dbusInhibit( bInhibit,
                  MSM_DBUS_SERVICE, MSM_DBUS_PATH, MSM_DBUS_INTERFACE,
-                 [appname, reason, xid] ( GDBusProxy *proxy, GError*& error ) 
-> GVariant* {
+                 [appname, reason, eType, window_system_id] ( GDBusProxy 
*proxy, GError*& error ) -> GVariant* {
                      return g_dbus_proxy_call_sync( proxy, "Inhibit",
                                                     g_variant_new("(susu)",
                                                                   appname,
-                                                                  xid,
+                                                                  
window_system_id,
                                                                   reason,
-                                                                  8 //Inhibit 
the session being marked as idle
+                                                                  eType
                                                                  ),
                                                     G_DBUS_CALL_FLAGS_NONE, 
-1, nullptr, &error );
                  },
@@ -273,7 +261,8 @@ void ScreenSaverInhibitor::inhibitMSM( bool bInhibit, const 
char* appname, const
     (void) bInhibit;
     (void) appname;
     (void) reason;
-    (void) xid;
+    (void) eType;
+    (void) window_system_id;
 #endif // ENABLE_GIO
 }
 
@@ -283,7 +272,7 @@ void ScreenSaverInhibitor::inhibitMSM( bool bInhibit, const 
char* appname, const
  * Worth noting: xscreensaver explicitly ignores this and does its own
  * timeout handling.
  */
-void ScreenSaverInhibitor::inhibitXScreenSaver( bool bInhibit, Display* 
pDisplay )
+void SessionManagerInhibitor::inhibitXScreenSaver( bool bInhibit, Display* 
pDisplay )
 {
     int nTimeout, nInterval, bPreferBlanking, bAllowExposures;
     XGetScreenSaver( pDisplay, &nTimeout, &nInterval,
@@ -312,7 +301,7 @@ void ScreenSaverInhibitor::inhibitXScreenSaver( bool 
bInhibit, Display* pDisplay
 #define XAUTOLOCK_DISABLE 1
 #define XAUTOLOCK_ENABLE  2
 
-void ScreenSaverInhibitor::inhibitXAutoLock( bool bInhibit, Display* pDisplay )
+void SessionManagerInhibitor::inhibitXAutoLock( bool bInhibit, Display* 
pDisplay )
 {
     ::Window aRootWindow = RootWindowOfScreen( ScreenOfDisplay( pDisplay, 0 ) 
);
 
@@ -337,7 +326,7 @@ void ScreenSaverInhibitor::inhibitXAutoLock( bool bInhibit, 
Display* pDisplay )
                      sizeof( nMessage ) );
 }
 
-void ScreenSaverInhibitor::inhibitDPMS( bool bInhibit, Display* pDisplay )
+void SessionManagerInhibitor::inhibitDPMS( bool bInhibit, Display* pDisplay )
 {
 #if !defined(__sun)
     int dummy;
diff --git a/vcl/unx/gtk3/gtkframe.cxx b/vcl/unx/gtk3/gtkframe.cxx
index 4f8a7d46897d..b6b4cd52f8cf 100644
--- a/vcl/unx/gtk3/gtkframe.cxx
+++ b/vcl/unx/gtk3/gtkframe.cxx
@@ -2472,21 +2472,18 @@ void GtkSalFrame::ShowFullScreen( bool bFullScreen, 
sal_Int32 nScreen )
 
 void GtkSalFrame::StartPresentation( bool bStart )
 {
-    std::optional<guint> aWindow;
+    guint nWindow(0);
     std::optional<Display*> aDisplay;
 
-    bool bX11 = DLSYM_GDK_IS_X11_DISPLAY(getGdkDisplay());
-    if (bX11)
+    if (DLSYM_GDK_IS_X11_DISPLAY(getGdkDisplay()))
     {
-        aWindow = GtkSalFrame::GetNativeWindowHandle(m_pWindow);
+        nWindow = GtkSalFrame::GetNativeWindowHandle(m_pWindow);
         aDisplay = gdk_x11_display_get_xdisplay(getGdkDisplay());
     }
 
-    m_ScreenSaverInhibitor.inhibit( bStart,
-                                    u"presentation",
-                                    bX11,
-                                    aWindow,
-                                    aDisplay );
+    m_SessionManagerInhibitor.inhibit(bStart, u"presentation",
+                                      APPLICATION_INHIBIT_IDLE,
+                                      nWindow, aDisplay);
 }
 
 void GtkSalFrame::SetAlwaysOnTop( bool bOnTop )

Reply via email to