[Libreoffice-commits] core.git: 9 commits - vcl/inc vcl/Library_vcl.mk vcl/unx

Andrzej Hunt andrzej at ahunt.org
Tue Oct 20 09:15:46 PDT 2015


 vcl/Library_vcl.mk                              |    8 
 vcl/inc/unx/gtk/gtkframe.hxx                    |    5 
 vcl/inc/unx/salframe.h                          |    3 
 vcl/inc/unx/screensaverinhibitor.hxx            |   73 +++++
 vcl/unx/generic/window/salframe.cxx             |  180 -------------
 vcl/unx/generic/window/screensaverinhibitor.cxx |  332 ++++++++++++++++++++++++
 vcl/unx/gtk/window/gtksalframe.cxx              |  195 --------------
 7 files changed, 440 insertions(+), 356 deletions(-)

New commits:
commit 68570131013cfcf29f4c934a727053c2903e35b1
Author: Andrzej Hunt <andrzej at ahunt.org>
Date:   Tue Oct 20 17:24:44 2015 +0200

    Add org.mate.SessionManager support
    
    This is valid for Mate <= 1.10
    (As of writing, 1.10 is the current stable release - so we'll have
     to keep shipping this for quite a few years to come.)
    
    Change-Id: I4d1f81c50923148e710eac22f5428b2a1c41f0e9

diff --git a/vcl/inc/unx/screensaverinhibitor.hxx b/vcl/inc/unx/screensaverinhibitor.hxx
index f00e61f..286c18d 100644
--- a/vcl/inc/unx/screensaverinhibitor.hxx
+++ b/vcl/inc/unx/screensaverinhibitor.hxx
@@ -33,6 +33,7 @@ private:
     boost::optional<guint> mnFDOCookie; // FDO ScreenSaver Inhibit
     boost::optional<guint> mnFDOPMCookie; // FDO PowerManagement Inhibit
     boost::optional<guint> mnGSMCookie;
+    boost::optional<guint> mnMSMCookie;
 
     boost::optional<int> mnXScreenSaverTimeout;
 
@@ -53,11 +54,14 @@ private:
     // 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 gchar* appname, const gchar* reason );
     void inhibitFDOPM( bool bInhibit, const gchar* appname, const gchar* reason );
     void inhibitGSM( bool bInhibit, const gchar* appname, const gchar* reason, const guint xid );
+    void inhibitMSM( bool bInhibit, const gchar* appname, const gchar* reason, const guint xid );
 
     void inhibitXScreenSaver( bool bInhibit, Display* pDisplay );
     static void inhibitXAutoLock( bool bInhibit, Display* pDisplay );
diff --git a/vcl/unx/generic/window/screensaverinhibitor.cxx b/vcl/unx/generic/window/screensaverinhibitor.cxx
index e26b17d..5346ac4 100644
--- a/vcl/unx/generic/window/screensaverinhibitor.cxx
+++ b/vcl/unx/generic/window/screensaverinhibitor.cxx
@@ -29,6 +29,11 @@
 #define GSM_DBUS_SERVICE        "org.gnome.SessionManager"
 #define GSM_DBUS_PATH           "/org/gnome/SessionManager"
 #define GSM_DBUS_INTERFACE      "org.gnome.SessionManager"
+
+// Mate <= 1.10 uses org.mate.SessionManager, > 1.10 will use org.gnome.SessionManager
+#define MSM_DBUS_SERVICE        "org.mate.SessionManager"
+#define MSM_DBUS_PATH           "/org/mate/SessionManager"
+#define MSM_DBUS_INTERFACE      "org.mate.SessionManager"
 #endif
 
 #include <sal/log.hxx>
@@ -54,6 +59,7 @@ void ScreenSaverInhibitor::inhibit( bool bInhibit, const OUString& sReason,
         if ( xid != boost::none )
         {
             inhibitGSM( bInhibit, appname, aReason.getStr(), xid.get() );
+            inhibitMSM( bInhibit, appname, aReason.getStr(), xid.get() );
         }
     }
 }
@@ -198,6 +204,31 @@ void ScreenSaverInhibitor::inhibitGSM( bool bInhibit, const gchar* appname, cons
                  mnGSMCookie );
 }
 
+void ScreenSaverInhibitor::inhibitMSM( bool bInhibit, const gchar* appname, const gchar* reason, const guint xid )
+{
+    dbusInhibit( bInhibit,
+                 MSM_DBUS_SERVICE, MSM_DBUS_PATH, MSM_DBUS_INTERFACE,
+                 [appname, reason, xid] ( DBusGProxy *proxy, guint& nCookie, GError*& error ) -> bool {
+                     return dbus_g_proxy_call( proxy,
+                                               "Inhibit", &error,
+                                               G_TYPE_STRING, appname,
+                                               G_TYPE_UINT, xid,
+                                               G_TYPE_STRING, reason,
+                                               G_TYPE_UINT, 8, //Inhibit the session being marked as idle
+                                               G_TYPE_INVALID,
+                                               G_TYPE_UINT, &nCookie,
+                                               G_TYPE_INVALID );
+                 },
+                 [] ( DBusGProxy *proxy, const guint nCookie, GError*& error ) -> bool {
+                     return dbus_g_proxy_call( proxy,
+                                               "Uninhibit", &error,
+                                               G_TYPE_UINT, nCookie,
+                                               G_TYPE_INVALID,
+                                               G_TYPE_INVALID );
+                 },
+                 mnMSMCookie );
+}
+
 /**
  * Disable screensavers using the XSetScreenSaver/XGetScreenSaver API.
  *
commit f99674421d91d417abd965612fffd1d139473e7f
Author: Andrzej Hunt <andrzej at ahunt.org>
Date:   Tue Oct 20 16:36:33 2015 +0200

    Add support for org.freedesktop.PowerManagement.Inhibit too
    
    This one seems to be supported by KDE (partially) and XFCE.
    On KDE it doesn't inhibit the ScreenSaver, however it's the only
    inhibition that appears to be available on XFCE (untested due
    to lack of XFCE system at hand).
    
    Change-Id: I4eab04d8ef66fc4fa55f57add46cb1ad15a8e2b3

diff --git a/vcl/inc/unx/screensaverinhibitor.hxx b/vcl/inc/unx/screensaverinhibitor.hxx
index 2486961..f00e61f 100644
--- a/vcl/inc/unx/screensaverinhibitor.hxx
+++ b/vcl/inc/unx/screensaverinhibitor.hxx
@@ -30,7 +30,8 @@ public:
                   bool bIsX11, const boost::optional<guint> xid, boost::optional<Display*> pDisplay );
 
 private:
-    boost::optional<guint> mnFDOCookie;
+    boost::optional<guint> mnFDOCookie; // FDO ScreenSaver Inhibit
+    boost::optional<guint> mnFDOPMCookie; // FDO PowerManagement Inhibit
     boost::optional<guint> mnGSMCookie;
 
     boost::optional<int> mnXScreenSaverTimeout;
@@ -42,8 +43,20 @@ private:
     CARD16 mnDPMSOffTimeout;
 #endif
 
+    // There are a bunch of different dbus based inhibition APIs. Some call
+    // themselves ScreenSaver inhibition, some are PowerManagement inhibition,
+    // but they appear to have the same effect. There doesn't appear to be one
+    // all encompassing standard, hence we should just try all of tem.
+    //
+    // 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?
+    // FDOPM: org.freedesktop.PowerManagement.Inhibit::Inhibit - XFCE, (KDE) ?
+    //        (KDE: doesn't inhibit screensaver, but does inhibit PowerManagement)
+    // GSM: org.gnome.SessionManager::Inhibit - gnome 3
+    //
     // Note: the Uninhibit call has different spelling in FDO (UnInhibit) vs GSM (Uninhibit)
     void inhibitFDO( bool bInhibit, const gchar* appname, const gchar* reason );
+    void inhibitFDOPM( bool bInhibit, const gchar* appname, const gchar* reason );
     void inhibitGSM( bool bInhibit, const gchar* appname, const gchar* reason, const guint xid );
 
     void inhibitXScreenSaver( bool bInhibit, Display* pDisplay );
diff --git a/vcl/unx/generic/window/screensaverinhibitor.cxx b/vcl/unx/generic/window/screensaverinhibitor.cxx
index 3b4b1db..e26b17d 100644
--- a/vcl/unx/generic/window/screensaverinhibitor.cxx
+++ b/vcl/unx/generic/window/screensaverinhibitor.cxx
@@ -22,6 +22,10 @@
 #define FDO_DBUS_PATH           "/org/freedesktop/ScreenSaver"
 #define FDO_DBUS_INTERFACE      "org.freedesktop.ScreenSaver"
 
+#define FDOPM_DBUS_SERVICE      "org.freedesktop.PowerManagement.Inhibit"
+#define FDOPM_DBUS_PATH         "/org/freedesktop/PowerManagement/Inhibit"
+#define FDOPM_DBUS_INTERFACE    "org.freedesktop.PowerManagement.Inhibit"
+
 #define GSM_DBUS_SERVICE        "org.gnome.SessionManager"
 #define GSM_DBUS_PATH           "/org/gnome/SessionManager"
 #define GSM_DBUS_INTERFACE      "org.gnome.SessionManager"
@@ -36,6 +40,7 @@ void ScreenSaverInhibitor::inhibit( bool bInhibit, const OUString& sReason,
     const OString aReason = OUStringToOString( sReason, RTL_TEXTENCODING_UTF8 );
 
     inhibitFDO( bInhibit, appname, aReason.getStr() );
+    inhibitFDOPM( bInhibit, appname, aReason.getStr() );
 
     if ( bIsX11 )
     {
@@ -145,6 +150,29 @@ void ScreenSaverInhibitor::inhibitFDO( bool bInhibit, const gchar* appname, cons
                  mnFDOCookie );
 }
 
+void ScreenSaverInhibitor::inhibitFDOPM( bool bInhibit, const gchar* appname, const gchar* reason )
+{
+    dbusInhibit( bInhibit,
+                 FDOPM_DBUS_SERVICE, FDOPM_DBUS_PATH, FDOPM_DBUS_INTERFACE,
+                 [appname, reason] ( DBusGProxy *proxy, guint& nCookie, GError*& error ) -> bool {
+                     return dbus_g_proxy_call( proxy,
+                                               "Inhibit", &error,
+                                               G_TYPE_STRING, appname,
+                                               G_TYPE_STRING, reason,
+                                               G_TYPE_INVALID,
+                                               G_TYPE_UINT, &nCookie,
+                                               G_TYPE_INVALID );
+                 },
+                 [] ( DBusGProxy *proxy, const guint nCookie, GError*& error ) -> bool {
+                     return dbus_g_proxy_call( proxy,
+                                               "UnInhibit", &error,
+                                               G_TYPE_UINT, nCookie,
+                                               G_TYPE_INVALID,
+                                               G_TYPE_INVALID );
+                 },
+                 mnFDOPMCookie );
+}
+
 void ScreenSaverInhibitor::inhibitGSM( bool bInhibit, const gchar* appname, const gchar* reason, const guint xid )
 {
     dbusInhibit( bInhibit,
commit 18817c8cc0cb9d63bbb8c737ab221a9c47b4090a
Author: Andrzej Hunt <andrzej at ahunt.org>
Date:   Tue Oct 20 12:20:04 2015 +0200

    Move DPMS inhibition to ScreenSaverInhibitor
    
    We should also be doing this irregardless of vcl backend
    
    Change-Id: I46ec2c654dfd9ab3c6bcf6da19e7ffa2c05890b9

diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index d485f33..575a64f 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -734,6 +734,7 @@ $(eval $(call gb_Library_add_libs,vcl,\
 	-lpthread \
     -lGL \
     -lX11 \
+	-lXext \
 ))
 
 $(eval $(call gb_Library_add_exception_objects,vcl,\
diff --git a/vcl/inc/unx/screensaverinhibitor.hxx b/vcl/inc/unx/screensaverinhibitor.hxx
index 8c9ad54..2486961 100644
--- a/vcl/inc/unx/screensaverinhibitor.hxx
+++ b/vcl/inc/unx/screensaverinhibitor.hxx
@@ -11,6 +11,9 @@
 #define INCLUDED_VCL_INC_UNX_SCREENSAVERINHIBITOR_HXX
 
 #include <prex.h>
+#if !defined(SOLARIS) && !defined(AIX)
+#include <X11/extensions/dpms.h>
+#endif
 #include <postx.h>
 
 #include <rtl/ustring.hxx>
@@ -32,12 +35,20 @@ private:
 
     boost::optional<int> mnXScreenSaverTimeout;
 
+#if !defined(SOLARIS) && !defined(AIX)
+    BOOL mbDPMSWasEnabled;
+    CARD16 mnDPMSStandbyTimeout;
+    CARD16 mnDPMSSuspendTimeout;
+    CARD16 mnDPMSOffTimeout;
+#endif
+
     // Note: the Uninhibit call has different spelling in FDO (UnInhibit) vs GSM (Uninhibit)
     void inhibitFDO( bool bInhibit, const gchar* appname, const gchar* reason );
     void inhibitGSM( bool bInhibit, const gchar* appname, const gchar* reason, const guint xid );
 
     void inhibitXScreenSaver( bool bInhibit, Display* pDisplay );
     static void inhibitXAutoLock( bool bInhibit, Display* pDisplay );
+    void inhibitDPMS( bool bInhibit, Display* pDisplay );
 };
 
 #endif // INCLUDED_VCL_INC_UNX_SCREENSAVERINHIBITOR_HXX
diff --git a/vcl/unx/generic/window/salframe.cxx b/vcl/unx/generic/window/salframe.cxx
index c1122f7..4be20a7 100644
--- a/vcl/unx/generic/window/salframe.cxx
+++ b/vcl/unx/generic/window/salframe.cxx
@@ -41,9 +41,6 @@
 #include <X11/keysym.h>
 #include "FWS.hxx"
 #include <X11/extensions/shape.h>
-#if !defined(SOLARIS) && !defined(AIX)
-#include <X11/extensions/dpms.h>
-#endif
 #include <postx.h>
 
 #include "unx/salunx.h"
@@ -2202,73 +2199,13 @@ void X11SalFrame::StartPresentation( bool bStart )
         doReparentPresentationDialogues( GetDisplay() );
     hPresentationWindow = (bStart && IsOverrideRedirect() ) ? GetWindow() : None;
 
-    // needs static here to save DPMS settings
-    int dummy;
-    static bool DPMSExtensionAvailable =
-#if !defined(SOLARIS) && !defined(AIX)
-        (DPMSQueryExtension(GetXDisplay(), &dummy, &dummy) != 0);
-    static sal_Bool DPMSEnabled = false;
-#else
-        false;
-    bool DPMSEnabled = false;
-    (void)dummy;
-#define CARD16 unsigned short
-#endif
-    static CARD16 dpms_standby_timeout=0;
-    static CARD16 dpms_suspend_timeout=0;
-    static CARD16 dpms_off_timeout=0;
-
-    if( bStart  || DPMSEnabled)
+    if( bStart && hPresentationWindow )
     {
-        if( hPresentationWindow )
-        {
-            /*  #i10559# workaround for WindowMaker: try to restore
-             *  current focus after presentation window is gone
-             */
-            int revert_to = 0;
-            XGetInputFocus( GetXDisplay(), &hPresFocusWindow, &revert_to );
-        }
-
-        // get the DPMS state right before the start
-        if (DPMSExtensionAvailable)
-        {
-#if !defined(SOLARIS) && !defined(AIX)
-            CARD16 state; // card16 is defined in Xdm.h
-            DPMSInfo(   GetXDisplay(),
-                        &state,
-                        &DPMSEnabled);
-#endif
-        }
-        if( bStart ) // start show
-        {
-#if !defined(SOLARIS) && !defined(AIX)
-            if( DPMSEnabled )
-            {
-                if ( DPMSExtensionAvailable )
-                {
-                    DPMSGetTimeouts(    GetXDisplay(),
-                                        &dpms_standby_timeout,
-                                        &dpms_suspend_timeout,
-                                        &dpms_off_timeout);
-                    DPMSSetTimeouts(GetXDisplay(), 0,0,0);
-                }
-            }
-#endif
-        }
-        else
-        {
-#if !defined(SOLARIS) && !defined(AIX)
-            if ( DPMSEnabled )
-            {
-                if ( DPMSExtensionAvailable )
-                {
-                // restore timeouts
-                    DPMSSetTimeouts(GetXDisplay(), dpms_standby_timeout,
-                        dpms_suspend_timeout, dpms_off_timeout);
-                }
-            }
-#endif
-        }
+        /*  #i10559# workaround for WindowMaker: try to restore
+         *  current focus after presentation window is gone
+         */
+        int revert_to = 0;
+        XGetInputFocus( GetXDisplay(), &hPresFocusWindow, &revert_to );
     }
 }
 
diff --git a/vcl/unx/generic/window/screensaverinhibitor.cxx b/vcl/unx/generic/window/screensaverinhibitor.cxx
index 4add4bd..3b4b1db 100644
--- a/vcl/unx/generic/window/screensaverinhibitor.cxx
+++ b/vcl/unx/generic/window/screensaverinhibitor.cxx
@@ -43,6 +43,7 @@ void ScreenSaverInhibitor::inhibit( bool bInhibit, const OUString& sReason,
         {
             inhibitXScreenSaver( bInhibit, pDisplay.get() );
             inhibitXAutoLock( bInhibit, pDisplay.get() );
+            inhibitDPMS( bInhibit, pDisplay.get() );
         }
 
         if ( xid != boost::none )
@@ -229,4 +230,44 @@ void ScreenSaverInhibitor::inhibitXAutoLock( bool bInhibit, Display* pDisplay )
                      sizeof( nMessage ) );
 }
 
+void ScreenSaverInhibitor::inhibitDPMS( bool bInhibit, Display* pDisplay )
+{
+#if !defined(SOLARIS) && !defined(AIX)
+    int dummy;
+    // This won't change while X11 is running, hence
+    // we can evaluate only once and store as static
+    static bool bDPMSExtensionAvailable = ( DPMSQueryExtension( pDisplay, &dummy, &dummy) != 0 );
+
+    if ( !bDPMSExtensionAvailable )
+    {
+        return;
+    }
+
+    if ( bInhibit )
+    {
+        CARD16 state; // unused by us
+        DPMSInfo( pDisplay, &state, &mbDPMSWasEnabled );
+
+        if ( mbDPMSWasEnabled )
+        {
+            DPMSGetTimeouts( pDisplay,
+                             &mnDPMSStandbyTimeout,
+                             &mnDPMSSuspendTimeout,
+                             &mnDPMSOffTimeout );
+            DPMSSetTimeouts( pDisplay,
+                             0,
+                             0,
+                             0 );
+        }
+    }
+    else if ( !bInhibit && mbDPMSWasEnabled )
+    {
+        DPMSSetTimeouts( pDisplay,
+                         mnDPMSStandbyTimeout,
+                         mnDPMSSuspendTimeout,
+                         mnDPMSOffTimeout );
+    }
+#endif // !defined(SOLARIS) && !defined(AIX)
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 189aabbcde1fe544a4e98ab9ee82aea03f1e00f3
Author: Andrzej Hunt <andrzej at ahunt.org>
Date:   Mon Oct 19 21:50:39 2015 +0200

    Deduplicate XGet/SetScreenSaver, move to ScreenSaverInhibitor
    
    I haven't been able to find anyone actually using this API,
    however it's probably best not to remove it either?
    
    Change-Id: I0ca11591bfd54f9882d8081a94b012f638936ce5

diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index e6cdbd7..4f73ac8 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -192,7 +192,6 @@ class GtkSalFrame : public SalFrame, public X11WindowProvider
     GdkCursor                      *m_pCurrentCursor;
     GdkVisibilityState              m_nVisibility;
     PointerStyle                    m_ePointerStyle;
-    int                             m_nSavedScreenSaverTimeout;
     ScreenSaverInhibitor            m_ScreenSaverInhibitor;
     int                             m_nWorkArea;
     bool                            m_bFullscreen;
diff --git a/vcl/inc/unx/salframe.h b/vcl/inc/unx/salframe.h
index b10bebd..d595c44 100644
--- a/vcl/inc/unx/salframe.h
+++ b/vcl/inc/unx/salframe.h
@@ -100,7 +100,6 @@ class VCLPLUG_GEN_PUBLIC X11SalFrame : public SalFrame, public X11WindowProvider
     int             m_nWorkArea;
     bool            m_bSetFocusOnMap;
 
-    int             nScreenSaversTimeout_;
     ScreenSaverInhibitor maScreenSaverInhibitor;
     Rectangle       maPaintRegion;
 
diff --git a/vcl/inc/unx/screensaverinhibitor.hxx b/vcl/inc/unx/screensaverinhibitor.hxx
index 56d1849..8c9ad54 100644
--- a/vcl/inc/unx/screensaverinhibitor.hxx
+++ b/vcl/inc/unx/screensaverinhibitor.hxx
@@ -30,10 +30,13 @@ private:
     boost::optional<guint> mnFDOCookie;
     boost::optional<guint> mnGSMCookie;
 
+    boost::optional<int> mnXScreenSaverTimeout;
+
     // Note: the Uninhibit call has different spelling in FDO (UnInhibit) vs GSM (Uninhibit)
     void inhibitFDO( bool bInhibit, const gchar* appname, const gchar* reason );
     void inhibitGSM( bool bInhibit, const gchar* appname, const gchar* reason, const guint xid );
 
+    void inhibitXScreenSaver( bool bInhibit, Display* pDisplay );
     static void inhibitXAutoLock( bool bInhibit, Display* pDisplay );
 };
 
diff --git a/vcl/unx/generic/window/salframe.cxx b/vcl/unx/generic/window/salframe.cxx
index 331f82a..c1122f7 100644
--- a/vcl/unx/generic/window/salframe.cxx
+++ b/vcl/unx/generic/window/salframe.cxx
@@ -803,7 +803,6 @@ X11SalFrame::X11SalFrame( SalFrame *pParent, SalFrameStyleFlags nSalFrameStyle,
     mbInShow                    = false;
     m_bXEmbed                   = false;
 
-    nScreenSaversTimeout_       = 0;
 
     mpInputContext              = NULL;
     mbInputFocus                = False;
@@ -2219,7 +2218,7 @@ void X11SalFrame::StartPresentation( bool bStart )
     static CARD16 dpms_suspend_timeout=0;
     static CARD16 dpms_off_timeout=0;
 
-    if( bStart || nScreenSaversTimeout_ || DPMSEnabled)
+    if( bStart  || DPMSEnabled)
     {
         if( hPresentationWindow )
         {
@@ -2229,12 +2228,6 @@ void X11SalFrame::StartPresentation( bool bStart )
             int revert_to = 0;
             XGetInputFocus( GetXDisplay(), &hPresFocusWindow, &revert_to );
         }
-        int timeout, interval, prefer_blanking, allow_exposures;
-        XGetScreenSaver( GetXDisplay(),
-                         &timeout,
-                         &interval,
-                         &prefer_blanking,
-                         &allow_exposures );
 
         // get the DPMS state right before the start
         if (DPMSExtensionAvailable)
@@ -2248,16 +2241,6 @@ void X11SalFrame::StartPresentation( bool bStart )
         }
         if( bStart ) // start show
         {
-            if ( timeout )
-            {
-                nScreenSaversTimeout_ = timeout;
-                XResetScreenSaver( GetXDisplay() );
-                XSetScreenSaver( GetXDisplay(),
-                                 0,
-                                 interval,
-                                 prefer_blanking,
-                                 allow_exposures );
-            }
 #if !defined(SOLARIS) && !defined(AIX)
             if( DPMSEnabled )
             {
@@ -2274,15 +2257,6 @@ void X11SalFrame::StartPresentation( bool bStart )
         }
         else
         {
-            if( nScreenSaversTimeout_ )
-            {
-                XSetScreenSaver( GetXDisplay(),
-                             nScreenSaversTimeout_,
-                             interval,
-                             prefer_blanking,
-                             allow_exposures );
-                nScreenSaversTimeout_ = 0;
-            }
 #if !defined(SOLARIS) && !defined(AIX)
             if ( DPMSEnabled )
             {
diff --git a/vcl/unx/generic/window/screensaverinhibitor.cxx b/vcl/unx/generic/window/screensaverinhibitor.cxx
index 0636b06..4add4bd 100644
--- a/vcl/unx/generic/window/screensaverinhibitor.cxx
+++ b/vcl/unx/generic/window/screensaverinhibitor.cxx
@@ -41,6 +41,7 @@ void ScreenSaverInhibitor::inhibit( bool bInhibit, const OUString& sReason,
     {
         if ( pDisplay != boost::none )
         {
+            inhibitXScreenSaver( bInhibit, pDisplay.get() );
             inhibitXAutoLock( bInhibit, pDisplay.get() );
         }
 
@@ -168,6 +169,37 @@ void ScreenSaverInhibitor::inhibitGSM( bool bInhibit, const gchar* appname, cons
                  mnGSMCookie );
 }
 
+/**
+ * Disable screensavers using the XSetScreenSaver/XGetScreenSaver API.
+ *
+ * Worth noting: xscreensaver explicitly ignores this and does it's own
+ * timeout handling.
+ */
+void ScreenSaverInhibitor::inhibitXScreenSaver( bool bInhibit, Display* pDisplay )
+{
+    int nTimeout, nInterval, bPreferBlanking, bAllowExposures;
+    XGetScreenSaver( pDisplay, &nTimeout, &nInterval,
+                     &bPreferBlanking, &bAllowExposures );
+
+    // To disable/reenable we simply fiddle the timeout, whilst
+    // retaining all other properties.
+    if ( bInhibit && nTimeout)
+    {
+        mnXScreenSaverTimeout = nTimeout;
+        XResetScreenSaver( pDisplay );
+        XSetScreenSaver( pDisplay, 0, nInterval,
+                         bPreferBlanking, bAllowExposures );
+    }
+    else if ( !bInhibit && ( mnXScreenSaverTimeout != boost::none ) )
+    {
+        XSetScreenSaver( pDisplay, mnXScreenSaverTimeout.get(),
+                         nInterval, bPreferBlanking,
+                         bAllowExposures );
+        mnXScreenSaverTimeout = boost::none;
+    }
+}
+
+
 /* definitions from xautolock.c (pl15) */
 #define XAUTOLOCK_DISABLE 1
 #define XAUTOLOCK_ENABLE  2
diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx
index 498161e..e2d5507 100644
--- a/vcl/unx/gtk/window/gtksalframe.cxx
+++ b/vcl/unx/gtk/window/gtksalframe.cxx
@@ -1118,7 +1118,6 @@ void GtkSalFrame::InitCommon()
     m_bSendModChangeOnRelease = false;
     m_pIMHandler        = NULL;
     m_hBackgroundPixmap = None;
-    m_nSavedScreenSaverTimeout = 0;
     m_nExtStyle         = 0;
     m_pRegion           = NULL;
     m_ePointerStyle     = static_cast<PointerStyle>(0xffff);
@@ -2553,39 +2552,6 @@ void GtkSalFrame::StartPresentation( bool bStart )
                                     getDisplay()->IsX11Display(),
                                     aWindow,
                                     aDisplay );
-
-    if( !getDisplay()->IsX11Display() )
-        return;
-
-#if !GTK_CHECK_VERSION(3,0,0)
-    Display *pDisplay = GDK_DISPLAY_XDISPLAY( getGdkDisplay() );
-
-    int nTimeout, nInterval, bPreferBlanking, bAllowExposures;
-    XGetScreenSaver( pDisplay, &nTimeout, &nInterval,
-                     &bPreferBlanking, &bAllowExposures );
-#endif
-    if( bStart )
-    {
-#if !GTK_CHECK_VERSION(3,0,0)
-        if ( nTimeout )
-        {
-            m_nSavedScreenSaverTimeout = nTimeout;
-            XResetScreenSaver( pDisplay );
-            XSetScreenSaver( pDisplay, 0, nInterval,
-                             bPreferBlanking, bAllowExposures );
-        }
-#endif
-    }
-    else
-    {
-#if !GTK_CHECK_VERSION(3,0,0)
-        if( m_nSavedScreenSaverTimeout )
-            XSetScreenSaver( pDisplay, m_nSavedScreenSaverTimeout,
-                             nInterval, bPreferBlanking,
-                             bAllowExposures );
-#endif
-        m_nSavedScreenSaverTimeout = 0;
-    }
 }
 
 void GtkSalFrame::SetAlwaysOnTop( bool bOnTop )
commit 5074d1b4d712cd35798758e8168ffbdfe59a11a9
Author: Andrzej Hunt <andrzej at ahunt.org>
Date:   Mon Oct 19 20:11:53 2015 +0200

    Deduplicate XAutoLock inhibition and move to ScreenSaverInhibitor
    
    (Successfully tested with xautolock 2.2)
    
    Change-Id: I55a3703322dd6792689ff3c3e85b27840ee2bc55

diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index 1a56cdf..e6cdbd7 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -262,7 +262,6 @@ class GtkSalFrame : public SalFrame, public X11WindowProvider
 
     void            Center();
     void            SetDefaultSize();
-    void            setAutoLock( bool bLock );
 
     void            doKeyCallback( guint state,
                                    guint keyval,
diff --git a/vcl/inc/unx/screensaverinhibitor.hxx b/vcl/inc/unx/screensaverinhibitor.hxx
index b1c742f..56d1849 100644
--- a/vcl/inc/unx/screensaverinhibitor.hxx
+++ b/vcl/inc/unx/screensaverinhibitor.hxx
@@ -10,6 +10,9 @@
 #ifndef INCLUDED_VCL_INC_UNX_SCREENSAVERINHIBITOR_HXX
 #define INCLUDED_VCL_INC_UNX_SCREENSAVERINHIBITOR_HXX
 
+#include <prex.h>
+#include <postx.h>
+
 #include <rtl/ustring.hxx>
 #include <vcl/dllapi.h>
 
@@ -20,7 +23,8 @@
 class VCL_PLUGIN_PUBLIC ScreenSaverInhibitor
 {
 public:
-    void inhibit( bool bInhibit, const rtl::OUString& sReason, bool bIsX11, const boost::optional<guint> xid );
+    void inhibit( bool bInhibit, const rtl::OUString& sReason,
+                  bool bIsX11, const boost::optional<guint> xid, boost::optional<Display*> pDisplay );
 
 private:
     boost::optional<guint> mnFDOCookie;
@@ -29,6 +33,8 @@ private:
     // Note: the Uninhibit call has different spelling in FDO (UnInhibit) vs GSM (Uninhibit)
     void inhibitFDO( bool bInhibit, const gchar* appname, const gchar* reason );
     void inhibitGSM( bool bInhibit, const gchar* appname, const gchar* reason, const guint xid );
+
+    static void inhibitXAutoLock( bool bInhibit, Display* pDisplay );
 };
 
 #endif // INCLUDED_VCL_INC_UNX_SCREENSAVERINHIBITOR_HXX
diff --git a/vcl/unx/generic/window/salframe.cxx b/vcl/unx/generic/window/salframe.cxx
index c5881a1..331f82a 100644
--- a/vcl/unx/generic/window/salframe.cxx
+++ b/vcl/unx/generic/window/salframe.cxx
@@ -2189,87 +2189,15 @@ void X11SalFrame::ShowFullScreen( bool bFullScreen, sal_Int32 nScreen )
     }
 }
 
-/* ---------------------------------------------------------------------
-   the xautolock pseudo screen saver needs special treatment since it
-   doesn't cooperate with XxxxScreenSaver settings
-   ------------------------------------------------------------------- */
-
-static Bool
-IsRunningXAutoLock( Display *p_display, ::Window a_window )
-{
-    const char *p_atomname = "XAUTOLOCK_SEMAPHORE_PID";
-    Atom        a_pidatom;
-
-    // xautolock interns this atom
-    a_pidatom    = XInternAtom( p_display, p_atomname, True );
-    if ( a_pidatom == None )
-        return False;
-
-    Atom          a_type;
-    int           n_format;
-    unsigned long n_items;
-    unsigned long n_bytes_after;
-    pid_t        *p_pid;
-    pid_t         n_pid;
-    // get pid of running xautolock
-    XGetWindowProperty (p_display, a_window, a_pidatom, 0L, 2L, False,
-            AnyPropertyType, &a_type, &n_format, &n_items, &n_bytes_after,
-            reinterpret_cast<unsigned char**>(&p_pid) );
-    n_pid = *p_pid;
-    XFree( p_pid );
-
-      if ( a_type == XA_INTEGER )
-      {
-        // check if xautolock pid points to a running process
-        if ( kill(n_pid, 0) == -1 )
-            return False;
-        else
-            return True;
-    }
-
-    return False;
-}
-
-/* definitions from xautolock.c (pl15) */
-#define XAUTOLOCK_DISABLE 1
-#define XAUTOLOCK_ENABLE  2
-
-static Bool
-MessageToXAutoLock( Display *p_display, int n_message )
-{
-    const char *p_atomname = "XAUTOLOCK_MESSAGE" ;
-    Atom        a_messageatom;
-    ::Window    a_rootwindow;
-
-    a_rootwindow = RootWindowOfScreen( ScreenOfDisplay(p_display, 0) );
-    if ( ! IsRunningXAutoLock(p_display, a_rootwindow) )
-    {
-        // remove any pending messages
-        a_messageatom = XInternAtom( p_display, p_atomname, True );
-        if ( a_messageatom != None )
-            XDeleteProperty( p_display, a_rootwindow, a_messageatom );
-        return False;
-    }
-
-    a_messageatom = XInternAtom( p_display, p_atomname, False );
-    XChangeProperty (p_display, a_rootwindow, a_messageatom, XA_INTEGER,
-            8, PropModeReplace, reinterpret_cast<unsigned char*>(&n_message), sizeof(n_message) );
-
-    return True;
-}
-
 void X11SalFrame::StartPresentation( bool bStart )
 {
     maScreenSaverInhibitor.inhibit( bStart,
                                     "presentation",
                                     true, // isX11
-                                    mhWindow );
+                                    mhWindow,
+                                    GetXDisplay() );
 
     vcl::I18NStatus::get().show( !bStart, vcl::I18NStatus::presentation );
-    if ( bStart )
-        MessageToXAutoLock( GetXDisplay(), XAUTOLOCK_DISABLE );
-    else
-        MessageToXAutoLock( GetXDisplay(), XAUTOLOCK_ENABLE );
 
     if( ! bStart && hPresentationWindow != None )
         doReparentPresentationDialogues( GetDisplay() );
diff --git a/vcl/unx/generic/window/screensaverinhibitor.cxx b/vcl/unx/generic/window/screensaverinhibitor.cxx
index b352c1d..0636b06 100644
--- a/vcl/unx/generic/window/screensaverinhibitor.cxx
+++ b/vcl/unx/generic/window/screensaverinhibitor.cxx
@@ -10,6 +10,11 @@
 #include <generic/gensys.h>
 #include <unx/screensaverinhibitor.hxx>
 
+#include <prex.h>
+#include <X11/Xatom.h>
+#include <X11/Xlib.h>
+#include <postx.h>
+
 #ifdef ENABLE_DBUS
 #include <dbus/dbus-glib.h>
 
@@ -24,16 +29,25 @@
 
 #include <sal/log.hxx>
 
-void ScreenSaverInhibitor::inhibit( bool bInhibit, const OUString& sReason, bool bIsX11, const boost::optional<guint> xid )
+void ScreenSaverInhibitor::inhibit( bool bInhibit, const OUString& sReason,
+                                    bool bIsX11, const boost::optional<guint> xid, boost::optional<Display*> pDisplay )
 {
     const gchar* appname = SalGenericSystem::getFrameClassName();
     const OString aReason = OUStringToOString( sReason, RTL_TEXTENCODING_UTF8 );
 
     inhibitFDO( bInhibit, appname, aReason.getStr() );
 
-    if ( bIsX11 && ( xid != boost::none ) )
+    if ( bIsX11 )
     {
-        inhibitGSM( bInhibit, appname, aReason.getStr(), xid.get() );
+        if ( pDisplay != boost::none )
+        {
+            inhibitXAutoLock( bInhibit, pDisplay.get() );
+        }
+
+        if ( xid != boost::none )
+        {
+            inhibitGSM( bInhibit, appname, aReason.getStr(), xid.get() );
+        }
     }
 }
 
@@ -154,4 +168,33 @@ void ScreenSaverInhibitor::inhibitGSM( bool bInhibit, const gchar* appname, cons
                  mnGSMCookie );
 }
 
+/* definitions from xautolock.c (pl15) */
+#define XAUTOLOCK_DISABLE 1
+#define XAUTOLOCK_ENABLE  2
+
+void ScreenSaverInhibitor::inhibitXAutoLock( bool bInhibit, Display* pDisplay )
+{
+    ::Window aRootWindow = RootWindowOfScreen( ScreenOfDisplay( pDisplay, 0 ) );
+
+    Atom nAtom = XInternAtom( pDisplay,
+                              "XAUTOLOCK_MESSAGE",
+                              False );
+
+    if ( nAtom == None )
+    {
+        return;
+    }
+
+    int nMessage = bInhibit ? XAUTOLOCK_DISABLE : XAUTOLOCK_ENABLE;
+
+    XChangeProperty( pDisplay,
+                     aRootWindow,
+                     nAtom,
+                     XA_INTEGER,
+                     8, // format -- 8 bit quantity
+                     PropModeReplace,
+                     reinterpret_cast<unsigned char*>( &nMessage ),
+                     sizeof( nMessage ) );
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx
index 4d74e67a..498161e 100644
--- a/vcl/unx/gtk/window/gtksalframe.cxx
+++ b/vcl/unx/gtk/window/gtksalframe.cxx
@@ -2538,40 +2538,21 @@ void GtkSalFrame::ShowFullScreen( bool bFullScreen, sal_Int32 nScreen )
     }
 }
 
-/* definitions from xautolock.c (pl15) */
-#define XAUTOLOCK_DISABLE 1
-#define XAUTOLOCK_ENABLE  2
-
-void GtkSalFrame::setAutoLock( bool bLock )
-{
-    if( isChild() || !getDisplay()->IsX11Display() )
-        return;
-
-    GdkScreen  *pScreen = gtk_window_get_screen( GTK_WINDOW(m_pWindow) );
-    GdkDisplay *pDisplay = gdk_screen_get_display( pScreen );
-    GdkWindow  *pRootWin = gdk_screen_get_root_window( pScreen );
-
-    Atom nAtom = XInternAtom( GDK_DISPLAY_XDISPLAY( pDisplay ),
-                              "XAUTOLOCK_MESSAGE", False );
-
-    int nMessage = bLock ? XAUTOLOCK_ENABLE : XAUTOLOCK_DISABLE;
-
-    XChangeProperty( GDK_DISPLAY_XDISPLAY( pDisplay ),
-                     GDK_WINDOW_XID( pRootWin ),
-                     nAtom, XA_INTEGER,
-                     8, PropModeReplace,
-                     reinterpret_cast<unsigned char*>(&nMessage),
-                     sizeof( nMessage ) );
-}
-
 void GtkSalFrame::StartPresentation( bool bStart )
 {
+    boost::optional<guint> aWindow;
+    boost::optional<Display*> aDisplay;
+    if( getDisplay()->IsX11Display() )
+    {
+        aWindow = widget_get_xid(m_pWindow);
+        aDisplay = GDK_DISPLAY_XDISPLAY( getGdkDisplay() );
+    }
+
     m_ScreenSaverInhibitor.inhibit( bStart,
                                     "presentation",
                                     getDisplay()->IsX11Display(),
-                                    widget_get_xid(m_pWindow) );
-
-    setAutoLock( !bStart );
+                                    aWindow,
+                                    aDisplay );
 
     if( !getDisplay()->IsX11Display() )
         return;
commit e97b1b6c28529487467ad9b4051ec288aa0f0c31
Author: Andrzej Hunt <andrzej at ahunt.org>
Date:   Mon Oct 19 18:03:37 2015 +0200

    Lambda'ise the almost identical FDO and GSM screensaver inhibition
    
    This doesn't save us much for now, but could be useful when yet another
    screensaver inhibition standard is introduced. (The GSM/gnome inhibition
    currently requires passing the X11 window handle/id, which suggests that
    at some point they will have to update their screensaver inhibition api.)
    
    Change-Id: I4fa7bc15f089d112777fb166ab469045c002ae48

diff --git a/vcl/unx/generic/window/screensaverinhibitor.cxx b/vcl/unx/generic/window/screensaverinhibitor.cxx
index 4ac63fe..b352c1d 100644
--- a/vcl/unx/generic/window/screensaverinhibitor.cxx
+++ b/vcl/unx/generic/window/screensaverinhibitor.cxx
@@ -37,11 +37,15 @@ void ScreenSaverInhibitor::inhibit( bool bInhibit, const OUString& sReason, bool
     }
 }
 
-void ScreenSaverInhibitor::inhibitFDO( bool bInhibit, const gchar* appname, const gchar* reason )
+void dbusInhibit( bool bInhibit,
+                  const gchar* service, const gchar* path, const gchar* interface,
+                  std::function<bool( DBusGProxy*, guint&, GError*& )> fInhibit,
+                  std::function<bool( DBusGProxy*, const guint, GError*& )> fUnInhibit,
+                  boost::optional<guint>& rCookie )
 {
 #ifdef ENABLE_DBUS
-    if ( ( !bInhibit && ( mnFDOCookie == boost::none ) ) ||
-         ( bInhibit && ( mnFDOCookie != boost::none ) ) )
+    if ( ( !bInhibit && ( rCookie == boost::none ) ) ||
+         ( bInhibit && ( rCookie != boost::none ) ) )
     {
         return;
     }
@@ -58,46 +62,36 @@ void ScreenSaverInhibitor::inhibitFDO( bool bInhibit, const gchar* appname, cons
     }
 
     proxy = dbus_g_proxy_new_for_name( session_connection,
-                                       FDO_DBUS_SERVICE,
-                                       FDO_DBUS_PATH,
-                                       FDO_DBUS_INTERFACE );
+                                       service,
+                                       path,
+                                       interface );
     if (proxy == NULL) {
-        SAL_INFO( "vcl.screensaverinhibitor", "could not get dbus proxy: " FDO_DBUS_SERVICE );
+        SAL_INFO( "vcl.screensaverinhibitor", "could not get dbus proxy: " << service );
         return;
     }
 
     if ( bInhibit )
     {
         guint nCookie;
-        res = dbus_g_proxy_call( proxy,
-                                 "Inhibit", &error,
-                                 G_TYPE_STRING, appname,
-                                 G_TYPE_STRING, reason,
-                                 G_TYPE_INVALID,
-                                 G_TYPE_UINT, &nCookie,
-                                 G_TYPE_INVALID);
+        res = fInhibit( proxy, nCookie, error );
+
         if (res)
         {
-            mnFDOCookie = nCookie;
+            rCookie = nCookie;
         }
         else
         {
-            SAL_INFO( "vcl.screensaverinhibitor", FDO_DBUS_SERVICE ".Inhibit failed");
+            SAL_INFO( "vcl.screensaverinhibitor", service << ".Inhibit failed");
         }
     }
     else
     {
-        res = dbus_g_proxy_call (proxy,
-                                 "UnInhibit",
-                                 &error,
-                                 G_TYPE_UINT, mnFDOCookie.get(),
-                                 G_TYPE_INVALID,
-                                 G_TYPE_INVALID);
-        mnFDOCookie = boost::none;
+        res = fUnInhibit( proxy, rCookie.get(), error );
+        rCookie = boost::none;
 
         if (!res)
         {
-            SAL_INFO( "vcl.screensaverinhibitor", FDO_DBUS_SERVICE ".UnInhibit failed" );
+            SAL_INFO( "vcl.screensaverinhibitor", service << ".UnInhibit failed" );
         }
     }
 
@@ -112,81 +106,52 @@ void ScreenSaverInhibitor::inhibitFDO( bool bInhibit, const gchar* appname, cons
 #endif // ENABLE_DBUS
 }
 
-void ScreenSaverInhibitor::inhibitGSM( bool bInhibit, const gchar* appname, const gchar* reason, const guint xid )
+void ScreenSaverInhibitor::inhibitFDO( bool bInhibit, const gchar* appname, const gchar* reason )
 {
-#ifdef ENABLE_DBUS
-    if ( ( !bInhibit && ( mnGSMCookie == boost::none ) ) ||
-         ( bInhibit && ( mnGSMCookie != boost::none ) ) )
-    {
-        return;
-    }
-
-    gboolean         res;
-    GError          *error = NULL;
-    DBusGProxy      *proxy = NULL;
-
-    DBusGConnection *session_connection = dbus_g_bus_get( DBUS_BUS_SESSION, &error );
-    if (error != NULL) {
-        SAL_WARN( "vcl.screensaverinhibitor", "failed to connect to dbus session bus: " << error->message );
-        g_error_free( error );
-        return;
-    }
-
-    proxy = dbus_g_proxy_new_for_name( session_connection,
-                                       GSM_DBUS_SERVICE,
-                                       GSM_DBUS_PATH,
-                                       GSM_DBUS_INTERFACE );
-    if (proxy == NULL) {
-        SAL_INFO( "vcl.screensaverinhibitor", "could not get dbus proxy: " GSM_DBUS_SERVICE );
-        return;
-    }
-
-    if ( bInhibit )
-    {
-        guint nCookie;
-        res = dbus_g_proxy_call (proxy,
-                                 "Inhibit", &error,
-                                 G_TYPE_STRING, appname,
-                                 G_TYPE_UINT, xid,
-                                 G_TYPE_STRING, reason,
-                                 G_TYPE_UINT, 8, //Inhibit the session being marked as idle
-                                 G_TYPE_INVALID,
-                                 G_TYPE_UINT, &nCookie,
-                                 G_TYPE_INVALID);
-        if ( res )
-        {
-            mnGSMCookie = nCookie;
-        }
-        else
-        {
-            SAL_INFO( "vcl.screensaverinhibitor", GSM_DBUS_SERVICE ".Inhibit failed" );
-        }
-    }
-    else
-    {
-        res = dbus_g_proxy_call (proxy,
-                                 "Uninhibit",
-                                 &error,
-                                 G_TYPE_UINT, mnGSMCookie.get(),
-                                 G_TYPE_INVALID,
-                                 G_TYPE_INVALID);
-        mnGSMCookie = boost::none;
-
-        if ( !res )
-        {
-            SAL_INFO( "vcl.screensaverinhibitor", GSM_DBUS_SERVICE ".Uninhibit failed" );
-        }
-    }
-
-    if (error != NULL)
-    {
-        SAL_INFO( "vcl.screensaverinhibitor", "Error: " << error->message );
-        g_error_free( error );
-    }
-
-    g_object_unref( G_OBJECT( proxy ) );
+    dbusInhibit( bInhibit,
+                 FDO_DBUS_SERVICE, FDO_DBUS_PATH, FDO_DBUS_INTERFACE,
+                 [appname, reason] ( DBusGProxy *proxy, guint& nCookie, GError*& error ) -> bool {
+                     return dbus_g_proxy_call( proxy,
+                                               "Inhibit", &error,
+                                               G_TYPE_STRING, appname,
+                                               G_TYPE_STRING, reason,
+                                               G_TYPE_INVALID,
+                                               G_TYPE_UINT, &nCookie,
+                                               G_TYPE_INVALID );
+                 },
+                 [] ( DBusGProxy *proxy, const guint nCookie, GError*& error ) -> bool {
+                     return dbus_g_proxy_call( proxy,
+                                               "UnInhibit", &error,
+                                               G_TYPE_UINT, nCookie,
+                                               G_TYPE_INVALID,
+                                               G_TYPE_INVALID );
+                 },
+                 mnFDOCookie );
+}
 
-#endif // ENABLE_DBUS
+void ScreenSaverInhibitor::inhibitGSM( bool bInhibit, const gchar* appname, const gchar* reason, const guint xid )
+{
+    dbusInhibit( bInhibit,
+                 GSM_DBUS_SERVICE, GSM_DBUS_PATH, GSM_DBUS_INTERFACE,
+                 [appname, reason, xid] ( DBusGProxy *proxy, guint& nCookie, GError*& error ) -> bool {
+                     return dbus_g_proxy_call( proxy,
+                                               "Inhibit", &error,
+                                               G_TYPE_STRING, appname,
+                                               G_TYPE_UINT, xid,
+                                               G_TYPE_STRING, reason,
+                                               G_TYPE_UINT, 8, //Inhibit the session being marked as idle
+                                               G_TYPE_INVALID,
+                                               G_TYPE_UINT, &nCookie,
+                                               G_TYPE_INVALID );
+                 },
+                 [] ( DBusGProxy *proxy, const guint nCookie, GError*& error ) -> bool {
+                     return dbus_g_proxy_call( proxy,
+                                               "Uninhibit", &error,
+                                               G_TYPE_UINT, nCookie,
+                                               G_TYPE_INVALID,
+                                               G_TYPE_INVALID );
+                 },
+                 mnGSMCookie );
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit a50ac1f8c7828836a9b1f928975196d79d21eb6a
Author: Andrzej Hunt <andrzej at ahunt.org>
Date:   Mon Oct 19 17:50:24 2015 +0200

    Add comment on gsm vs fdo differences
    
    Change-Id: I30d1c24e84f1b28fad9933407b362be886821864

diff --git a/vcl/inc/unx/screensaverinhibitor.hxx b/vcl/inc/unx/screensaverinhibitor.hxx
index 896f49a..b1c742f 100644
--- a/vcl/inc/unx/screensaverinhibitor.hxx
+++ b/vcl/inc/unx/screensaverinhibitor.hxx
@@ -26,6 +26,7 @@ private:
     boost::optional<guint> mnFDOCookie;
     boost::optional<guint> mnGSMCookie;
 
+    // Note: the Uninhibit call has different spelling in FDO (UnInhibit) vs GSM (Uninhibit)
     void inhibitFDO( bool bInhibit, const gchar* appname, const gchar* reason );
     void inhibitGSM( bool bInhibit, const gchar* appname, const gchar* reason, const guint xid );
 };
commit 095396f9eac1842fdfabb0c395dd7b9db8529cb4
Author: Andrzej Hunt <andrzej at ahunt.org>
Date:   Mon Oct 19 17:04:13 2015 +0200

    Move org.gnome.SessionManager.Inhibit to ScreenSaverInhibitor
    
    We should be using the same inhibition code irregardless of
    vcl backend on Linux.
    
    Change-Id: I996630666e32c40a52958edb248466c815a5e0e5

diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index 9cc7404..1a56cdf 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -193,7 +193,6 @@ class GtkSalFrame : public SalFrame, public X11WindowProvider
     GdkVisibilityState              m_nVisibility;
     PointerStyle                    m_ePointerStyle;
     int                             m_nSavedScreenSaverTimeout;
-    guint                           m_nGSMCookie;
     ScreenSaverInhibitor            m_ScreenSaverInhibitor;
     int                             m_nWorkArea;
     bool                            m_bFullscreen;
diff --git a/vcl/inc/unx/screensaverinhibitor.hxx b/vcl/inc/unx/screensaverinhibitor.hxx
index 93b6027..896f49a 100644
--- a/vcl/inc/unx/screensaverinhibitor.hxx
+++ b/vcl/inc/unx/screensaverinhibitor.hxx
@@ -20,12 +20,14 @@
 class VCL_PLUGIN_PUBLIC ScreenSaverInhibitor
 {
 public:
-    void inhibit( bool bInhibit, bool bIsX11, const rtl::OUString& sReason );
+    void inhibit( bool bInhibit, const rtl::OUString& sReason, bool bIsX11, const boost::optional<guint> xid );
 
 private:
     boost::optional<guint> mnFDOCookie;
+    boost::optional<guint> mnGSMCookie;
 
     void inhibitFDO( bool bInhibit, const gchar* appname, const gchar* reason );
+    void inhibitGSM( bool bInhibit, const gchar* appname, const gchar* reason, const guint xid );
 };
 
 #endif // INCLUDED_VCL_INC_UNX_SCREENSAVERINHIBITOR_HXX
diff --git a/vcl/unx/generic/window/salframe.cxx b/vcl/unx/generic/window/salframe.cxx
index e913ccd..c5881a1 100644
--- a/vcl/unx/generic/window/salframe.cxx
+++ b/vcl/unx/generic/window/salframe.cxx
@@ -2260,7 +2260,10 @@ MessageToXAutoLock( Display *p_display, int n_message )
 
 void X11SalFrame::StartPresentation( bool bStart )
 {
-    maScreenSaverInhibitor.inhibit( bStart, /* isX11 */ true, "presentation" );
+    maScreenSaverInhibitor.inhibit( bStart,
+                                    "presentation",
+                                    true, // isX11
+                                    mhWindow );
 
     vcl::I18NStatus::get().show( !bStart, vcl::I18NStatus::presentation );
     if ( bStart )
diff --git a/vcl/unx/generic/window/screensaverinhibitor.cxx b/vcl/unx/generic/window/screensaverinhibitor.cxx
index 4f0523f..4ac63fe 100644
--- a/vcl/unx/generic/window/screensaverinhibitor.cxx
+++ b/vcl/unx/generic/window/screensaverinhibitor.cxx
@@ -16,17 +16,25 @@
 #define FDO_DBUS_SERVICE        "org.freedesktop.ScreenSaver"
 #define FDO_DBUS_PATH           "/org/freedesktop/ScreenSaver"
 #define FDO_DBUS_INTERFACE      "org.freedesktop.ScreenSaver"
+
+#define GSM_DBUS_SERVICE        "org.gnome.SessionManager"
+#define GSM_DBUS_PATH           "/org/gnome/SessionManager"
+#define GSM_DBUS_INTERFACE      "org.gnome.SessionManager"
 #endif
 
 #include <sal/log.hxx>
 
-void ScreenSaverInhibitor::inhibit( bool bInhibit, bool bIsX11, const OUString& sReason )
+void ScreenSaverInhibitor::inhibit( bool bInhibit, const OUString& sReason, bool bIsX11, const boost::optional<guint> xid )
 {
     const gchar* appname = SalGenericSystem::getFrameClassName();
     const OString aReason = OUStringToOString( sReason, RTL_TEXTENCODING_UTF8 );
 
-    (void ) bIsX11; // Will be needed once all inhibition tooling is moved here
     inhibitFDO( bInhibit, appname, aReason.getStr() );
+
+    if ( bIsX11 && ( xid != boost::none ) )
+    {
+        inhibitGSM( bInhibit, appname, aReason.getStr(), xid.get() );
+    }
 }
 
 void ScreenSaverInhibitor::inhibitFDO( bool bInhibit, const gchar* appname, const gchar* reason )
@@ -100,6 +108,84 @@ void ScreenSaverInhibitor::inhibitFDO( bool bInhibit, const gchar* appname, cons
     }
 
     g_object_unref( G_OBJECT( proxy ) );
+
+#endif // ENABLE_DBUS
+}
+
+void ScreenSaverInhibitor::inhibitGSM( bool bInhibit, const gchar* appname, const gchar* reason, const guint xid )
+{
+#ifdef ENABLE_DBUS
+    if ( ( !bInhibit && ( mnGSMCookie == boost::none ) ) ||
+         ( bInhibit && ( mnGSMCookie != boost::none ) ) )
+    {
+        return;
+    }
+
+    gboolean         res;
+    GError          *error = NULL;
+    DBusGProxy      *proxy = NULL;
+
+    DBusGConnection *session_connection = dbus_g_bus_get( DBUS_BUS_SESSION, &error );
+    if (error != NULL) {
+        SAL_WARN( "vcl.screensaverinhibitor", "failed to connect to dbus session bus: " << error->message );
+        g_error_free( error );
+        return;
+    }
+
+    proxy = dbus_g_proxy_new_for_name( session_connection,
+                                       GSM_DBUS_SERVICE,
+                                       GSM_DBUS_PATH,
+                                       GSM_DBUS_INTERFACE );
+    if (proxy == NULL) {
+        SAL_INFO( "vcl.screensaverinhibitor", "could not get dbus proxy: " GSM_DBUS_SERVICE );
+        return;
+    }
+
+    if ( bInhibit )
+    {
+        guint nCookie;
+        res = dbus_g_proxy_call (proxy,
+                                 "Inhibit", &error,
+                                 G_TYPE_STRING, appname,
+                                 G_TYPE_UINT, xid,
+                                 G_TYPE_STRING, reason,
+                                 G_TYPE_UINT, 8, //Inhibit the session being marked as idle
+                                 G_TYPE_INVALID,
+                                 G_TYPE_UINT, &nCookie,
+                                 G_TYPE_INVALID);
+        if ( res )
+        {
+            mnGSMCookie = nCookie;
+        }
+        else
+        {
+            SAL_INFO( "vcl.screensaverinhibitor", GSM_DBUS_SERVICE ".Inhibit failed" );
+        }
+    }
+    else
+    {
+        res = dbus_g_proxy_call (proxy,
+                                 "Uninhibit",
+                                 &error,
+                                 G_TYPE_UINT, mnGSMCookie.get(),
+                                 G_TYPE_INVALID,
+                                 G_TYPE_INVALID);
+        mnGSMCookie = boost::none;
+
+        if ( !res )
+        {
+            SAL_INFO( "vcl.screensaverinhibitor", GSM_DBUS_SERVICE ".Uninhibit failed" );
+        }
+    }
+
+    if (error != NULL)
+    {
+        SAL_INFO( "vcl.screensaverinhibitor", "Error: " << error->message );
+        g_error_free( error );
+    }
+
+    g_object_unref( G_OBJECT( proxy ) );
+
 #endif // ENABLE_DBUS
 }
 
diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx
index 332d6f5..4d74e67a 100644
--- a/vcl/unx/gtk/window/gtksalframe.cxx
+++ b/vcl/unx/gtk/window/gtksalframe.cxx
@@ -87,14 +87,6 @@
 #  include <gdk/gdkkeysyms-compat.h>
 #endif
 
-#ifdef ENABLE_DBUS
-#include <dbus/dbus-glib.h>
-
-#define GSM_DBUS_SERVICE        "org.gnome.SessionManager"
-#define GSM_DBUS_PATH           "/org/gnome/SessionManager"
-#define GSM_DBUS_INTERFACE      "org.gnome.SessionManager"
-#endif
-
 #include <config_folders.h>
 
 #if GTK_CHECK_VERSION(3,0,0)
@@ -1127,7 +1119,6 @@ void GtkSalFrame::InitCommon()
     m_pIMHandler        = NULL;
     m_hBackgroundPixmap = None;
     m_nSavedScreenSaverTimeout = 0;
-    m_nGSMCookie = 0;
     m_nExtStyle         = 0;
     m_pRegion           = NULL;
     m_ePointerStyle     = static_cast<PointerStyle>(0xffff);
@@ -2573,118 +2564,12 @@ void GtkSalFrame::setAutoLock( bool bLock )
                      sizeof( nMessage ) );
 }
 
-#ifdef ENABLE_DBUS
-/** cookie is returned as an unsigned integer */
-static guint
-dbus_inhibit_gsm (const gchar *appname,
-                  const gchar *reason,
-                  guint xid)
-{
-        gboolean         res;
-        guint            cookie;
-        GError          *error = NULL;
-        DBusGProxy      *proxy = NULL;
-
-        /* get the DBUS session connection */
-        DBusGConnection *session_connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
-        if (error != NULL) {
-                g_debug ("DBUS cannot connect : %s", error->message);
-                g_error_free (error);
-                return -1;
-        }
-
-        /* get the proxy with gnome-session-manager */
-        proxy = dbus_g_proxy_new_for_name (session_connection,
-                                           GSM_DBUS_SERVICE,
-                                           GSM_DBUS_PATH,
-                                           GSM_DBUS_INTERFACE);
-        if (proxy == NULL) {
-                g_debug ("Could not get DBUS proxy: %s", GSM_DBUS_SERVICE);
-                return -1;
-        }
-
-        res = dbus_g_proxy_call (proxy,
-                                 "Inhibit", &error,
-                                 G_TYPE_STRING, appname,
-                                 G_TYPE_UINT, xid,
-                                 G_TYPE_STRING, reason,
-                                 G_TYPE_UINT, 8, //Inhibit the session being marked as idle
-                                 G_TYPE_INVALID,
-                                 G_TYPE_UINT, &cookie,
-                                 G_TYPE_INVALID);
-
-        /* check the return value */
-        if (! res) {
-                cookie = -1;
-                g_debug ("Inhibit method failed");
-        }
-
-        /* check the error value */
-        if (error != NULL) {
-                g_debug ("Inhibit problem : %s", error->message);
-                g_error_free (error);
-                cookie = -1;
-        }
-
-        g_object_unref (G_OBJECT (proxy));
-        return cookie;
-}
-
-static void
-dbus_uninhibit_gsm (guint cookie)
-{
-        gboolean         res;
-        GError          *error = NULL;
-        DBusGProxy      *proxy = NULL;
-        DBusGConnection *session_connection = NULL;
-
-        if (cookie == guint(-1)) {
-                g_debug ("Invalid cookie");
-                return;
-        }
-
-        /* get the DBUS session connection */
-        session_connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
-        if (error) {
-                g_debug ("DBUS cannot connect : %s", error->message);
-                g_error_free (error);
-                return;
-        }
-
-        /* get the proxy with gnome-session-manager */
-        proxy = dbus_g_proxy_new_for_name (session_connection,
-                                           GSM_DBUS_SERVICE,
-                                           GSM_DBUS_PATH,
-                                           GSM_DBUS_INTERFACE);
-        if (proxy == NULL) {
-                g_debug ("Could not get DBUS proxy: %s", GSM_DBUS_SERVICE);
-                return;
-        }
-
-        res = dbus_g_proxy_call (proxy,
-                                 "Uninhibit",
-                                 &error,
-                                 G_TYPE_UINT, cookie,
-                                 G_TYPE_INVALID,
-                                 G_TYPE_INVALID);
-
-        /* check the return value */
-        if (! res) {
-                g_debug ("Uninhibit method failed");
-        }
-
-        /* check the error value */
-        if (error != NULL) {
-                g_debug ("Uninhibit problem : %s", error->message);
-                g_error_free (error);
-        }
-        g_object_unref (G_OBJECT (proxy));
-}
-#endif
-
 void GtkSalFrame::StartPresentation( bool bStart )
 {
-    m_ScreenSaverInhibitor.inhibit( bStart, getDisplay()->IsX11Display(), "presentation" );
+    m_ScreenSaverInhibitor.inhibit( bStart,
+                                    "presentation",
+                                    getDisplay()->IsX11Display(),
+                                    widget_get_xid(m_pWindow) );
 
     setAutoLock( !bStart );
 
@@ -2709,10 +2594,6 @@ void GtkSalFrame::StartPresentation( bool bStart )
                              bPreferBlanking, bAllowExposures );
         }
 #endif
-#ifdef ENABLE_DBUS
-        m_nGSMCookie = dbus_inhibit_gsm(g_get_application_name(), "presentation",
-                    widget_get_xid(m_pWindow));
-#endif
     }
     else
     {
@@ -2723,9 +2604,6 @@ void GtkSalFrame::StartPresentation( bool bStart )
                              bAllowExposures );
 #endif
         m_nSavedScreenSaverTimeout = 0;
-#ifdef ENABLE_DBUS
-        dbus_uninhibit_gsm(m_nGSMCookie);
-#endif
     }
 }
 
commit 3021a25b6d38e7de2e7a512c06adfea04a5394ec
Author: Andrzej Hunt <andrzej at ahunt.org>
Date:   Mon Oct 19 17:01:02 2015 +0200

    Implement org.freedesktop.ScreenSaver inhibition
    
    This is required for screensaver inhibition on kde (this might
    also be supported on further desktops).
    
    It would appear to make sense to move all screensaver inhibiting
    code here into one location, since it should be shared across
    the generic unx, and gtk vcl backends - currently we have completely
    independent implementations for gtk/gtk3 (which only supports
    XSetScreenSaver, and gnome's dbus inhibition), and the generic backend
    for all other plugins, which supports XSetScreenSaver, xautolock, DPMS,
    but no dbus inhibition.
    
    Change-Id: I9c5af8021b0b49b5c93ed75a7d25e3208d5e9629

diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index b54642f..d485f33 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -43,6 +43,12 @@ $(eval $(call gb_Library_set_include,vcl,\
 	$(if $(filter WNTGCC,$(OS)$(COM)),-I$(MINGW_SYSROOT)/include/gdiplus) \
 ))
 
+ifeq ($(ENABLE_DBUS),TRUE)
+$(eval $(call gb_Library_add_defs,vclplug_gen,\
+	-DENABLE_DBUS \
+))
+endif
+
 $(eval $(call gb_Library_add_defs,vcl,\
     -DVCL_DLLIMPLEMENTATION \
 	-DCUI_DLL_NAME=\"$(call gb_Library_get_runtime_filename,$(call gb_Library__get_name,cui))\" \
@@ -575,6 +581,7 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\
     vcl/unx/generic/printer/ppdparser \
     vcl/unx/generic/gdi/cairotextrender \
     vcl/unx/generic/gdi/x11windowprovider \
+    vcl/unx/generic/window/screensaverinhibitor \
     $(if $(filter TRUE,$(ENABLE_CUPS)),\
         vcl/unx/generic/printer/cupsmgr \
         vcl/unx/generic/printer/printerinfomanager \
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index 8ccba66..9cc7404 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -35,6 +35,7 @@
 #include <vcl/sysdata.hxx>
 #include <unx/x11windowprovider.hxx>
 #include <unx/saltype.h>
+#include <unx/screensaverinhibitor.hxx>
 
 #include "tools/link.hxx"
 
@@ -193,6 +194,7 @@ class GtkSalFrame : public SalFrame, public X11WindowProvider
     PointerStyle                    m_ePointerStyle;
     int                             m_nSavedScreenSaverTimeout;
     guint                           m_nGSMCookie;
+    ScreenSaverInhibitor            m_ScreenSaverInhibitor;
     int                             m_nWorkArea;
     bool                            m_bFullscreen;
     bool                            m_bSpanMonitorsWhenFullscreen;
diff --git a/vcl/inc/unx/salframe.h b/vcl/inc/unx/salframe.h
index 489ee25..b10bebd 100644
--- a/vcl/inc/unx/salframe.h
+++ b/vcl/inc/unx/salframe.h
@@ -26,6 +26,7 @@
 #include <unx/salunx.h>
 #include <unx/saltype.h>
 #include <unx/saldisp.hxx>
+#include <unx/screensaverinhibitor.hxx>
 #include <unx/x11windowprovider.hxx>
 #include <salframe.hxx>
 #include <salwtype.hxx>
@@ -100,6 +101,7 @@ class VCLPLUG_GEN_PUBLIC X11SalFrame : public SalFrame, public X11WindowProvider
     bool            m_bSetFocusOnMap;
 
     int             nScreenSaversTimeout_;
+    ScreenSaverInhibitor maScreenSaverInhibitor;
     Rectangle       maPaintRegion;
 
     Timer           maAlwaysOnTopRaiseTimer;
diff --git a/vcl/inc/unx/screensaverinhibitor.hxx b/vcl/inc/unx/screensaverinhibitor.hxx
new file mode 100644
index 0000000..93b6027
--- /dev/null
+++ b/vcl/inc/unx/screensaverinhibitor.hxx
@@ -0,0 +1,33 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_VCL_INC_UNX_SCREENSAVERINHIBITOR_HXX
+#define INCLUDED_VCL_INC_UNX_SCREENSAVERINHIBITOR_HXX
+
+#include <rtl/ustring.hxx>
+#include <vcl/dllapi.h>
+
+#include <boost/optional.hpp>
+
+#include <glib.h>
+
+class VCL_PLUGIN_PUBLIC ScreenSaverInhibitor
+{
+public:
+    void inhibit( bool bInhibit, bool bIsX11, const rtl::OUString& sReason );
+
+private:
+    boost::optional<guint> mnFDOCookie;
+
+    void inhibitFDO( bool bInhibit, const gchar* appname, const gchar* reason );
+};
+
+#endif // INCLUDED_VCL_INC_UNX_SCREENSAVERINHIBITOR_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/generic/window/salframe.cxx b/vcl/unx/generic/window/salframe.cxx
index 604ab60..e913ccd 100644
--- a/vcl/unx/generic/window/salframe.cxx
+++ b/vcl/unx/generic/window/salframe.cxx
@@ -2260,6 +2260,8 @@ MessageToXAutoLock( Display *p_display, int n_message )
 
 void X11SalFrame::StartPresentation( bool bStart )
 {
+    maScreenSaverInhibitor.inhibit( bStart, /* isX11 */ true, "presentation" );
+
     vcl::I18NStatus::get().show( !bStart, vcl::I18NStatus::presentation );
     if ( bStart )
         MessageToXAutoLock( GetXDisplay(), XAUTOLOCK_DISABLE );
diff --git a/vcl/unx/generic/window/screensaverinhibitor.cxx b/vcl/unx/generic/window/screensaverinhibitor.cxx
new file mode 100644
index 0000000..4f0523f
--- /dev/null
+++ b/vcl/unx/generic/window/screensaverinhibitor.cxx
@@ -0,0 +1,106 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <generic/gensys.h>
+#include <unx/screensaverinhibitor.hxx>
+
+#ifdef ENABLE_DBUS
+#include <dbus/dbus-glib.h>
+
+#define FDO_DBUS_SERVICE        "org.freedesktop.ScreenSaver"
+#define FDO_DBUS_PATH           "/org/freedesktop/ScreenSaver"
+#define FDO_DBUS_INTERFACE      "org.freedesktop.ScreenSaver"
+#endif
+
+#include <sal/log.hxx>
+
+void ScreenSaverInhibitor::inhibit( bool bInhibit, bool bIsX11, const OUString& sReason )
+{
+    const gchar* appname = SalGenericSystem::getFrameClassName();
+    const OString aReason = OUStringToOString( sReason, RTL_TEXTENCODING_UTF8 );
+
+    (void ) bIsX11; // Will be needed once all inhibition tooling is moved here
+    inhibitFDO( bInhibit, appname, aReason.getStr() );
+}
+
+void ScreenSaverInhibitor::inhibitFDO( bool bInhibit, const gchar* appname, const gchar* reason )
+{
+#ifdef ENABLE_DBUS
+    if ( ( !bInhibit && ( mnFDOCookie == boost::none ) ) ||
+         ( bInhibit && ( mnFDOCookie != boost::none ) ) )
+    {
+        return;
+    }
+
+    gboolean         res;
+    GError          *error = NULL;
+    DBusGProxy      *proxy = NULL;
+
+    DBusGConnection *session_connection = dbus_g_bus_get( DBUS_BUS_SESSION, &error );
+    if (error != NULL) {
+        SAL_WARN( "vcl.screensaverinhibitor", "failed to connect to dbus session bus: " << error->message );
+        g_error_free( error );
+        return;
+    }
+
+    proxy = dbus_g_proxy_new_for_name( session_connection,
+                                       FDO_DBUS_SERVICE,
+                                       FDO_DBUS_PATH,
+                                       FDO_DBUS_INTERFACE );
+    if (proxy == NULL) {
+        SAL_INFO( "vcl.screensaverinhibitor", "could not get dbus proxy: " FDO_DBUS_SERVICE );
+        return;
+    }
+
+    if ( bInhibit )
+    {
+        guint nCookie;
+        res = dbus_g_proxy_call( proxy,
+                                 "Inhibit", &error,
+                                 G_TYPE_STRING, appname,
+                                 G_TYPE_STRING, reason,
+                                 G_TYPE_INVALID,
+                                 G_TYPE_UINT, &nCookie,
+                                 G_TYPE_INVALID);
+        if (res)
+        {
+            mnFDOCookie = nCookie;
+        }
+        else
+        {
+            SAL_INFO( "vcl.screensaverinhibitor", FDO_DBUS_SERVICE ".Inhibit failed");
+        }
+    }
+    else
+    {
+        res = dbus_g_proxy_call (proxy,
+                                 "UnInhibit",
+                                 &error,
+                                 G_TYPE_UINT, mnFDOCookie.get(),
+                                 G_TYPE_INVALID,
+                                 G_TYPE_INVALID);
+        mnFDOCookie = boost::none;
+
+        if (!res)
+        {
+            SAL_INFO( "vcl.screensaverinhibitor", FDO_DBUS_SERVICE ".UnInhibit failed" );
+        }
+    }
+
+    if (error != NULL)
+    {
+        SAL_INFO( "vcl.screensaverinhibitor", "Error: " << error->message );
+        g_error_free( error );
+    }
+
+    g_object_unref( G_OBJECT( proxy ) );
+#endif // ENABLE_DBUS
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx
index 25f3fe5..332d6f5 100644
--- a/vcl/unx/gtk/window/gtksalframe.cxx
+++ b/vcl/unx/gtk/window/gtksalframe.cxx
@@ -2684,6 +2684,8 @@ dbus_uninhibit_gsm (guint cookie)
 
 void GtkSalFrame::StartPresentation( bool bStart )
 {
+    m_ScreenSaverInhibitor.inhibit( bStart, getDisplay()->IsX11Display(), "presentation" );
+
     setAutoLock( !bStart );
 
     if( !getDisplay()->IsX11Display() )


More information about the Libreoffice-commits mailing list