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

List:       kde-commits
Subject:    branches/KDE/4.4/kdebase/workspace/kwin
From:       Martin Gräßlin <kde () martin-graesslin ! com>
Date:       2010-06-12 6:55:42
Message-ID: 20100612065542.54C4DAC8D3 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1137263 by graesslin:

Make icon sizes 64x64 and 128x128 available in KWin and use it in TabBox for large \
icon modes. So no more ugly upscaling.
BUG: 241384
FIXED-IN: 4.4.5



 M  +35 -2     client.cpp  
 M  +16 -1     client.h  
 M  +28 -2     group.cpp  
 M  +2 -0      group.h  
 M  +2 -2      kcmkwin/kwintabbox/previewhandlerimpl.cpp  
 M  +1 -1      kcmkwin/kwintabbox/previewhandlerimpl.h  
 M  +2 -2      tabbox.cpp  
 M  +1 -1      tabbox.h  
 M  +15 -2     tabbox/clientitemdelegate.cpp  
 M  +2 -1      tabbox/tabboxhandler.h  


--- branches/KDE/4.4/kdebase/workspace/kwin/client.cpp #1137262:1137263
@@ -1757,7 +1757,7 @@
         updateDecoration( true ); // Check if noborder state has changed
     }
 
-void Client::readIcons( Window win, QPixmap* icon, QPixmap* miniicon )
+void Client::readIcons( Window win, QPixmap* icon, QPixmap* miniicon, QPixmap* \
bigicon, QPixmap* hugeicon )  {
     // Get the icons, allow scaling
     if( icon != NULL )
@@ -1769,16 +1769,32 @@
         else
             *miniicon = QPixmap();
         }
+    if( bigicon != NULL )
+        {
+        if( icon == NULL || !icon->isNull() )
+            *bigicon = KWindowSystem::icon( win, 64, 64, false, KWindowSystem::NETWM \
| KWindowSystem::WMHints ); +        else
+            *bigicon = QPixmap();
     }
+    if( hugeicon != NULL )
+        {
+        if( icon == NULL || !icon->isNull() )
+            *hugeicon = KWindowSystem::icon( win, 128, 128, false, \
KWindowSystem::NETWM | KWindowSystem::WMHints ); +        else
+            *hugeicon = QPixmap();
+        }
+    }
 
 void Client::getIcons()
     {
     // First read icons from the window itself
-    readIcons( window(), &icon_pix, &miniicon_pix );
+    readIcons( window(), &icon_pix, &miniicon_pix, &bigicon_pix, &hugeicon_pix );
     if( icon_pix.isNull() )
         { // Then try window group
         icon_pix = group()->icon();
         miniicon_pix = group()->miniIcon();
+        bigicon_pix = group()->bigIcon();
+        hugeicon_pix = group()->hugeIcon();
         }
     if( icon_pix.isNull() && isTransient() )
         { // Then mainclients
@@ -1789,17 +1805,34 @@
             {
             icon_pix = (*it)->icon();
             miniicon_pix = (*it)->miniIcon();
+            bigicon_pix = (*it)->bigIcon();
+            hugeicon_pix = (*it)->hugeIcon();
             }
         }
     if( icon_pix.isNull())
         { // And if nothing else, load icon from classhint or xapp icon
         icon_pix = KWindowSystem::icon( window(), 32, 32, true, \
                KWindowSystem::ClassHint | KWindowSystem::XApp );
         miniicon_pix = KWindowSystem::icon( window(), 16, 16, true, \
KWindowSystem::ClassHint | KWindowSystem::XApp ); +        bigicon_pix = \
KWindowSystem::icon( window(), 64, 64, false, KWindowSystem::ClassHint | \
KWindowSystem::XApp ); +        hugeicon_pix = KWindowSystem::icon( window(), 128, \
128, false, KWindowSystem::ClassHint | KWindowSystem::XApp );  }
     if( isManaged() && decoration != NULL )
         decoration->iconChange();
     }
 
+QPixmap Client::icon( const QSize& size ) const
+    {
+    const int iconSize = qMin( size.width(), size.height() );
+    if( iconSize <= 16 )
+        return miniIcon();
+    else if( iconSize <= 32 )
+        return icon();
+    if( iconSize <= 64 )
+        return bigIcon();
+    else
+        return hugeIcon();
+    }
+
 void Client::getWindowProtocols()
     {
     Atom* p;
--- branches/KDE/4.4/kdebase/workspace/kwin/client.h #1137262:1137263
@@ -134,7 +134,10 @@
         QSize adjustedSize() const;
 
         QPixmap icon() const;
+        QPixmap icon( const QSize& size ) const;
         QPixmap miniIcon() const;
+        QPixmap bigIcon() const;
+        QPixmap hugeIcon() const;
 
         bool isActive() const;
         void setActive( bool );
@@ -290,7 +293,7 @@
 
         static bool belongToSameApplication( const Client* c1, const Client* c2, \
                bool active_hack = false );
         static bool sameAppWindowRoleMatch( const Client* c1, const Client* c2, bool \
                active_hack );
-        static void readIcons( Window win, QPixmap* icon, QPixmap* miniicon );
+        static void readIcons( Window win, QPixmap* icon, QPixmap* miniicon, \
QPixmap* bigicon, QPixmap* hugeicon );  
         void minimize( bool avoid_animation = false );
         void unminimize( bool avoid_animation = false );
@@ -575,6 +578,8 @@
         void getWindowProtocols();
         QPixmap icon_pix;
         QPixmap miniicon_pix;
+        QPixmap bigicon_pix;
+        QPixmap hugeicon_pix;
         QCursor cursor;
         // DON'T reorder - Saved to config files !!!
         enum FullScreenMode
@@ -780,6 +785,16 @@
     return miniicon_pix;
     }
 
+inline QPixmap Client::bigIcon() const
+    {
+    return bigicon_pix;
+    }
+
+inline QPixmap Client::hugeIcon() const
+    {
+    return hugeicon_pix;
+    }
+
 inline QRect Client::geometryRestore() const
     {
     return geom_restore;
--- branches/KDE/4.4/kdebase/workspace/kwin/group.cpp #1137262:1137263
@@ -241,7 +241,7 @@
     else if( leader_wid != None )
         {
         QPixmap ic;
-        Client::readIcons( leader_wid, &ic, NULL );
+        Client::readIcons( leader_wid, &ic, NULL, NULL, NULL );
         return ic;
         }
     return QPixmap();
@@ -254,12 +254,38 @@
     else if( leader_wid != None )
         {
         QPixmap ic;
-        Client::readIcons( leader_wid, NULL, &ic );
+        Client::readIcons( leader_wid, NULL, &ic, NULL, NULL );
         return ic;
         }
     return QPixmap();
     }
 
+QPixmap Group::bigIcon() const
+    {
+    if( leader_client != NULL )
+        return leader_client->bigIcon();
+    else if( leader_wid != None )
+        {
+        QPixmap ic;
+        Client::readIcons( leader_wid, NULL, NULL, &ic, NULL );
+        return ic;
+        }
+    return QPixmap();
+    }
+
+QPixmap Group::hugeIcon() const
+    {
+    if( leader_client != NULL )
+        return leader_client->hugeIcon();
+    else if( leader_wid != None )
+        {
+        QPixmap ic;
+        Client::readIcons( leader_wid, NULL, NULL, NULL, &ic );
+        return ic;
+        }
+    return QPixmap();
+    }
+
 void Group::addMember( Client* member_P )
     {
     TRANSIENCY_CHECK( member_P );
--- branches/KDE/4.4/kdebase/workspace/kwin/group.h #1137262:1137263
@@ -44,6 +44,8 @@
         const ClientList& members() const;
         QPixmap icon() const;
         QPixmap miniIcon() const;
+        QPixmap bigIcon() const;
+        QPixmap hugeIcon() const;
         void addMember( Client* member );
         void removeMember( Client* member );
         void gotLeader( Client* leader );
--- branches/KDE/4.4/kdebase/workspace/kwin/kcmkwin/kwintabbox/previewhandlerimpl.cpp \
#1137262:1137263 @@ -44,9 +44,9 @@
     return info.visibleName();
     }
 
-QPixmap PreviewClientImpl::icon() const
+QPixmap PreviewClientImpl::icon( const QSize& size ) const
     {
-    return KWindowSystem::icon( m_id );
+    return KWindowSystem::icon( m_id, size.width(), size.height(), true );
     }
 
 bool PreviewClientImpl::isMinimized() const
--- branches/KDE/4.4/kdebase/workspace/kwin/kcmkwin/kwintabbox/previewhandlerimpl.h \
#1137262:1137263 @@ -38,7 +38,7 @@
 
         virtual QString caption() const;
         virtual int height() const;
-        virtual QPixmap icon() const;
+        virtual QPixmap icon( const QSize& size = QSize( 32, 32 ) ) const;
         virtual bool isMinimized() const;
         virtual int width() const;
         virtual WId window() const;
--- branches/KDE/4.4/kdebase/workspace/kwin/tabbox.cpp #1137262:1137263
@@ -198,9 +198,9 @@
     return m_client->caption();
     }
 
-QPixmap TabBoxClientImpl::icon() const
+QPixmap TabBoxClientImpl::icon( const QSize& size ) const
     {
-    return m_client->icon();
+    return m_client->icon( size );
     }
 
 WId TabBoxClientImpl::window() const
--- branches/KDE/4.4/kdebase/workspace/kwin/tabbox.h #1137262:1137263
@@ -64,7 +64,7 @@
         virtual ~TabBoxClientImpl();
 
         virtual QString caption() const;
-        virtual QPixmap icon() const;
+        virtual QPixmap icon( const QSize& size = QSize( 32, 32 ) ) const;
         virtual WId window() const;
         virtual bool isMinimized() const;
         virtual int x() const;
--- branches/KDE/4.4/kdebase/workspace/kwin/tabbox/clientitemdelegate.cpp \
#1137262:1137263 @@ -156,7 +156,7 @@
                     if( element.isRowSpan() )
                         iconY = option.rect.top() + option.rect.height() * 0.5 - \
                element.iconSize().height() * 0.5;
                     QRectF iconRect = QRectF( iconX, iconY, \
                element.iconSize().width(), element.iconSize().height() );
-                    QPixmap icon = client->icon();
+                    QPixmap icon = client->icon( element.iconSize().toSize() );
                     if( !icon.isNull() )
                         {
                         if( m_config.isHighlightSelectedIcons() && option.state & \
QStyle::State_Selected ) @@ -169,7 +169,20 @@
                             KIconEffect *effect = \
                KIconLoader::global()->iconEffect();
                             icon = effect->apply( icon, KIconLoader::Desktop, \
KIconLoader::DisabledState );  }
-                        QRectF sourceRect = QRectF( 0.0, 0.0, icon.width(), \
icon.height() ); +                        QRectF sourceRect = QRectF( QPointF( 0.0, \
0.0 ), element.iconSize() ); +                        if( icon.width() > \
element.iconSize().width() ) +                            {
+                            // if icon is bigger than our region, scale it down
+                            sourceRect = QRectF( 0.0, 0.0, icon.width(), \
icon.height() ); +                            }
+                        else if ( icon.width() < element.iconSize().width() )
+                            {
+                            // don't scale - center in requested area
+                            sourceRect = QRectF( 0.0, 0.0, icon.width(), \
icon.height() ); +                            iconRect = QRectF( iconX + \
(element.iconSize().width()-icon.width())/2, +                                        \
iconY + (element.iconSize().height()-icon.height())/2, +                              \
icon.width(), icon.height() ); +                            }
                         painter->drawPixmap( iconRect, icon, sourceRect );
                         }
                     x += element.width();
--- branches/KDE/4.4/kdebase/workspace/kwin/tabbox/tabboxhandler.h #1137262:1137263
@@ -325,9 +325,10 @@
         */
         virtual QString caption() const = 0;
         /**
+        * @param size Requested size of the icon
         * @return The icon of the client
         */
-        virtual QPixmap icon() const = 0;
+        virtual QPixmap icon( const QSize& size = QSize( 32, 32 ) ) const = 0;
         /**
         * @return The window Id of the client
         */


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

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