[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/trinity/kdebase/kdesktop
From:       Timothy Pearson <kb9vqf () pearsoncomputing ! net>
Date:       2010-09-27 6:25:37
Message-ID: 20100927062537.147BAAC857 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1180138 by tpearson:

Add show desktop get/set commands to DCOP


 M  +12 -0     KDesktopIface.h  
 M  +155 -0    desktop.cc  
 M  +16 -0     desktop.h  


--- branches/trinity/kdebase/kdesktop/KDesktopIface.h #1180137:1180138
@@ -42,6 +42,18 @@
      */
     virtual void refreshIcons() = 0;
     /**
+     * Set show desktop state
+     */
+    virtual void setShowDesktop( bool b ) = 0;
+    /**
+     * @return the show desktop state
+     */
+    virtual bool showDesktopState() = 0;
+    /**
+     * Toggle show desktop state
+     */
+    virtual void toggleShowDesktop() = 0;
+    /**
      * @return the urls of selected icons
      */
     virtual TQStringList selectedURLs() = 0;
--- branches/trinity/kdebase/kdesktop/desktop.cc #1180137:1180138
@@ -140,6 +140,9 @@
     // those two WStyle_ break kdesktop when the root-hack isn't used (no Dnd)
    startup_id( NULL ), m_waitForKicker(0)
 {
+  NETRootInfo i( qt_xdisplay(), NET::Supported );
+  m_wmSupport = i.isSupported( NET::WM2ShowingDesktop );
+
   m_bWaitForKded = wait_for_kded;
   m_miniCli = 0; // created on demand
   keys = 0; // created later
@@ -593,6 +596,158 @@
         m_pIconView->refreshIcons();
 }
 
+void KDesktop::setShowDesktop( bool b )
+{
+    bool m_showingDesktop = showDesktopState();
+
+    if (b == m_showingDesktop)
+    {
+        return;
+    }
+
+    if( m_wmSupport )
+    {
+        NETRootInfo i( qt_xdisplay(), 0 );
+        i.setShowingDesktop( b );
+        return;
+    }
+
+    if (b)
+    {
+        m_activeWindow = kwinModule()->activeWindow();
+        m_iconifiedList.clear();
+
+        const TQValueList<WId> windows = kwinModule()->windows();
+        for (TQValueList<WId>::ConstIterator it = windows.begin();
+             it != windows.end();
+             ++it)
+        {
+            WId w = *it;
+
+            NETWinInfo info( qt_xdisplay(), w, qt_xrootwin(),
+                             NET::XAWMState | NET::WMDesktop );
+
+            if (info.mappingState() == NET::Visible &&
+                (info.desktop() == NETWinInfo::OnAllDesktops ||
+                 info.desktop() == (int)kwinModule()->currentDesktop()))
+            {
+                m_iconifiedList.append( w );
+            }
+        }
+
+        // find first, hide later, otherwise transients may get minimized
+        // with the window they're transient for
+        for (TQValueVector<WId>::Iterator it = m_iconifiedList.begin();
+             it != m_iconifiedList.end();
+             ++it)
+        {
+            KWin::iconifyWindow( *it, false );
+        }
+
+        // on desktop changes or when a window is deiconified, we abort the show desktop mode
+        connect(kwinModule(), TQT_SIGNAL(currentDesktopChanged(int)),
+                TQT_SLOT(slotCurrentDesktopChanged(int)));
+        connect(kwinModule(), TQT_SIGNAL(windowChanged(WId,unsigned int)),
+                TQT_SLOT(slotWindowChanged(WId,unsigned int)));
+        connect(kwinModule(), TQT_SIGNAL(windowAdded(WId)),
+                TQT_SLOT(slotWindowAdded(WId)));
+    }
+    else
+    {
+        disconnect(kwinModule(), TQT_SIGNAL(currentDesktopChanged(int)),
+                   this, TQT_SLOT(slotCurrentDesktopChanged(int)));
+        disconnect(kwinModule(), TQT_SIGNAL(windowChanged(WId,unsigned int)),
+                   this, TQT_SLOT(slotWindowChanged(WId,unsigned int)));
+        disconnect(kwinModule(), TQT_SIGNAL(windowAdded(WId)),
+                   this, TQT_SLOT(slotWindowAdded(WId)));
+
+        for (TQValueVector<WId>::ConstIterator it = m_iconifiedList.begin();
+             it != m_iconifiedList.end();
+             ++it)
+        {
+            KWin::deIconifyWindow(*it, false);
+        }
+
+        KWin::forceActiveWindow(m_activeWindow);
+    }
+
+    m_showingDesktop = b;
+    emit desktopShown(m_showingDesktop);
+}
+
+void KDesktop::slotCurrentDesktopChanged(int)
+{
+    setShowDesktop( false );
+}
+
+void KDesktop::slotWindowAdded(WId w)
+{
+    bool m_showingDesktop = showDesktopState();
+
+    if (!m_showingDesktop)
+    {
+        return;
+    }
+
+    NETWinInfo inf(qt_xdisplay(), w, qt_xrootwin(),
+                   NET::XAWMState | NET::WMWindowType);
+    NET::WindowType windowType = inf.windowType(NET::AllTypesMask);
+
+    if ((windowType == NET::Normal || windowType == NET::Unknown) &&
+        inf.mappingState() == NET::Visible)
+    {
+        KConfig kwincfg( "kwinrc", true ); // see in kwin
+        kwincfg.setGroup( "Windows" );
+        if( kwincfg.readBoolEntry( "ShowDesktopIsMinimizeAll", false ))
+        {
+            m_iconifiedList.clear();
+            m_showingDesktop = false;
+            emit desktopShown(false);
+        }
+        else
+        {
+            m_activeWindow = w;
+            setShowDesktop(false);
+        }
+    }
+}
+
+void KDesktop::slotWindowChanged(WId w, unsigned int dirty)
+{
+    bool m_showingDesktop = showDesktopState();
+
+    if (!m_showingDesktop)
+    {
+        return;
+    }
+
+    if (dirty & NET::XAWMState)
+    {
+        NETWinInfo inf(qt_xdisplay(), w, qt_xrootwin(),
+                       NET::XAWMState | NET::WMWindowType);
+        NET::WindowType windowType = inf.windowType(NET::AllTypesMask);
+
+        if ((windowType == NET::Normal || windowType == NET::Unknown) &&
+            inf.mappingState() == NET::Visible)
+        {
+            // a window was deiconified, abort the show desktop mode.
+            m_iconifiedList.clear();
+            m_showingDesktop = false;
+            emit desktopShown(false);
+        }
+    }
+}
+
+bool KDesktop::showDesktopState()
+{
+    return kwinModule()->showingDesktop();
+}
+
+void KDesktop::toggleShowDesktop()
+{
+    setShowDesktop(!showDesktopState());
+}
+
 KActionCollection * KDesktop::actionCollection()
 {
     if (!m_pIconView)
--- branches/trinity/kdebase/kdesktop/desktop.h #1180137:1180138
@@ -24,6 +24,7 @@
 
 #include <tqwidget.h>
 #include <tqstringlist.h>
+#include <tqvaluevector.h>
 
 #include <kapplication.h>	// for logout parameters
 
@@ -75,6 +76,9 @@
   virtual void selectAll();
   virtual void unselectAll();
   virtual void refreshIcons();
+  virtual void setShowDesktop( bool b );
+  virtual bool showDesktopState();
+  virtual void toggleShowDesktop();
   virtual TQStringList selectedURLs();
 
   virtual void configure();
@@ -151,6 +155,11 @@
   // when there seems to be no kicker, we have to get desktopIconsArea from kwinModule
   void slotNoKicker();
 
+  /** Used for desktop show/hide functionality */
+  void slotCurrentDesktopChanged(int);
+  void slotWindowAdded(WId w);
+  void slotWindowChanged(WId w, unsigned int dirty);
+
 protected:
   void initConfig();
   void initRoot();
@@ -172,6 +181,9 @@
 private slots:
   void desktopResized();
 
+signals:
+    void desktopShown(bool shown);
+
 private:
 
   KGlobalAccel *keys;
@@ -212,6 +224,10 @@
 
   /** Possible values for "kdesktoprc"->"Mouse Buttons"->"WheelDirection" */
   static const char* m_wheelDirectionStrings[2];
+
+  bool m_wmSupport;
+  WId  m_activeWindow;
+  TQValueVector<WId> m_iconifiedList;
 };
 
 #endif
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic