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

List:       kde-devel
Subject:    Kicker viewport fix
From:       Dennis Kasprzyk <onestone () opencompositing ! org>
Date:       2007-06-06 19:50:58
Message-ID: 200706062150.58977.onestone () opencompositing ! org
[Download RAW message or body]

Hello,

The current version of the kicker minipager applet has problems with vertical 
viewports and with the combination of multiple viewports and desktops. This 
patch fixes the complete minipager viewport handling.

Regards
Dennis

["kicker_viewport_fix.patch" (text/x-diff)]

Index: pagerbutton.h
===================================================================
--- pagerbutton.h	(Revision 672326)
+++ pagerbutton.h	(Arbeitskopie)
@@ -44,6 +44,7 @@
     ~KMiniPagerButton();
 
     int desktop() { return m_desktop; }
+    QPoint viewport() { return m_viewport; }
 
     QString desktopName() { return m_desktopName; }
     void setDesktopName( QString name ) { m_desktopName = name; }
@@ -56,7 +57,7 @@
     bool shouldPaintWindow( KWin::WindowInfo *info ) const;
 
 signals:
-    void buttonSelected( int desk );
+    void buttonSelected( int desk, const QPoint& viewport );
     void showMenu( const QPoint&, int );
 
 protected:
Index: pagerapplet.cpp
===================================================================
--- pagerapplet.cpp	(Revision 672326)
+++ pagerapplet.cpp	(Arbeitskopie)
@@ -208,32 +208,39 @@
         m_curDesk = 1;
     }
 
-    KMiniPagerButton* button = m_desktops[m_curDesk - 1];
-    if (!button->isOn())
+    QPoint vx(m_kwin->currentViewport(1));
+
+    for (QValueList<KMiniPagerButton*>::ConstIterator it =
+         m_desktops.constBegin(); it != m_desktops.constEnd(); ++it)
     {
-        button->toggle();
+        if ((vx != (*it)->viewport() || desktop != (*it)->desktop()) &&
+             (*it)->isOn())
+            (*it)->toggle();
+        if (vx == (*it)->viewport() && desktop == (*it)->desktop() &&
+             !(*it)->isOn())
+            (*it)->toggle();
     }
 }
 
 void KMiniPager::slotSetDesktopViewport(int desktop, const QPoint& viewport)
 {
     // ###
-    Q_UNUSED(desktop);
-    QSize s(m_kwin->numberOfViewports(m_kwin->currentDesktop()));
-    slotSetDesktop((viewport.y()-1) * s.width() + viewport.x() );
+    Q_UNUSED(viewport);
+    slotSetDesktop(desktop);
 }
 
-void KMiniPager::slotButtonSelected( int desk )
+void KMiniPager::slotButtonSelected( int desk , const QPoint& viewport)
 {
     if (m_kwin->numberOfViewports(m_kwin->currentDesktop()).width() *
         m_kwin->numberOfViewports(m_kwin->currentDesktop()).height() > 1)
     {
         QPoint p;
+        QPoint vx(m_kwin->currentViewport(1));
+        p.setX((viewport.x() - 1) * QApplication::desktop()->width());
+        p.setY((viewport.y() - 1) * QApplication::desktop()->height());
 
-        p.setX( (desk-1) * QApplication::desktop()->screenGeometry().width());
-        p.setY( 0 );
-
-        KWin::setCurrentDesktopViewport(m_kwin->currentDesktop(), p);
+        KWin::setCurrentDesktop( desk );
+        KWin::setCurrentDesktopViewport(desk , p);
     }
     else
         KWin::setCurrentDesktop( desk );
@@ -437,20 +444,64 @@
 
 void KMiniPager::wheelEvent( QWheelEvent* e )
 {
-    int newDesk;
+    int newDesk = m_curDesk;
+    QPoint vx(m_kwin->currentViewport(1));
     int desktops = KWin::numberOfDesktops();
-    if (m_kwin->numberOfViewports(0).width() * m_kwin->numberOfViewports(0).height() > 1 )
-        desktops = m_kwin->numberOfViewports(0).width() * m_kwin->numberOfViewports(0).height();
-    if (e->delta() < 0)
+    QSize s(m_kwin->numberOfViewports(1));
+    
+    if (s.width() * s.height() > 1 )
     {
-        newDesk = m_curDesk % desktops + 1;
+        if (e->delta() < 0)
+        {
+            if (vx.x() + 1 > s.width())
+            {
+                vx.setX(1);
+                if (vx.y() + 1 > s.height())
+                {
+                    newDesk = m_curDesk % desktops + 1;
+                    vx.setY(1);
+                }
+                else
+                {
+                    vx.setY(vx.y() + 1);
+                }
+            }
+            else
+                vx.setX(vx.x() + 1);
+            
+        }
+        else
+        {
+            if (vx.x() - 1 <= 0)
+            {
+                vx.setX(s.width());
+                if (vx.y() - 1 <= 0)
+                {
+                    newDesk = (desktops + m_curDesk - 2) % desktops + 1;
+                    vx.setY(s.height());
+                }
+                else
+                {
+                    vx.setY(vx.y() - 1);
+                }
+            }
+            else
+                vx.setX(vx.x() - 1);
+        }
     }
     else
     {
-        newDesk = (desktops + m_curDesk - 2) % desktops + 1;
+        if (e->delta() < 0)
+        {
+            newDesk = m_curDesk % desktops + 1;
+        }
+        else
+        {
+            newDesk = (desktops + m_curDesk - 2) % desktops + 1;
+        }
     }
 
-    slotButtonSelected(newDesk);
+    slotButtonSelected(newDesk, vx);
 }
 
 void KMiniPager::drawButtons()
@@ -466,8 +517,8 @@
         for (int j = 1; j <= viewportNum.width() * viewportNum.height(); ++j)
         {
             QSize s(m_kwin->numberOfViewports(m_kwin->currentDesktop()));
-            QPoint viewport( (j-1) % s.width(), (j-1) / s.width());
-            desk = new KMiniPagerButton( count, m_useViewports, viewport, this );
+            QPoint viewport( ((j-1) % s.width()) + 1, ((j-1) / s.width()) + 1);
+            desk = new KMiniPagerButton( i, m_useViewports, viewport, this );
             if ( m_settings->labelType() != PagerSettings::EnumLabelType::LabelName )
             {
                 QToolTip::add( desk, desk->desktopName() );
@@ -476,8 +527,8 @@
             m_desktops.append( desk );
             m_group->insert( desk, count );
 
-            connect(desk, SIGNAL(buttonSelected(int)),
-                    SLOT(slotButtonSelected(int)) );
+            connect(desk, SIGNAL(buttonSelected(int, const QPoint&)),
+                    SLOT(slotButtonSelected(int, const QPoint&)) );
             connect(desk, SIGNAL(showMenu(const QPoint&, int )),
                     SLOT(slotShowMenu(const QPoint&, int )) );
 
Index: pagerapplet.h
===================================================================
--- pagerapplet.h	(Revision 672326)
+++ pagerapplet.h	(Arbeitskopie)
@@ -84,7 +84,7 @@
     void slotSetDesktop(int desktop);
     void slotSetDesktopViewport(int desktop, const QPoint& viewport);
     void slotSetDesktopCount(int count);
-    void slotButtonSelected(int desk );
+    void slotButtonSelected(int desk, const QPoint& viewport);
     void slotActiveWindowChanged( WId win );
     void slotWindowAdded( WId );
     void slotWindowRemoved( WId );
Index: pagerbutton.cpp
===================================================================
--- pagerbutton.cpp	(Revision 672326)
+++ pagerbutton.cpp	(Arbeitskopie)
@@ -102,13 +102,11 @@
     if (!m_useViewports)
         return info.frameGeometry();
 
-    // ### fix vertically layouted viewports
     QRect _r(info.frameGeometry());
-    QPoint vx(m_pager->kwin()->currentViewport(m_pager->kwin()->currentDesktop()));
+    QPoint vx(m_pager->kwin()->currentViewport(1));
 
-    _r.moveBy( - (m_desktop - vx.x()) * QApplication::desktop()->width(),
-               0);
-
+    _r.moveBy( (vx.x() - m_viewport.x()) * QApplication::desktop()->width(),
+               (vx.y() - m_viewport.y()) * QApplication::desktop()->height());
     if ((info.state() & NET::Sticky))
     {
         _r.moveTopLeft(QPoint(_r.x() % QApplication::desktop()->width(),
@@ -123,11 +121,14 @@
 {
     if (!m_useViewports) return _p;
 
-    QPoint vx(m_pager->kwin()->currentViewport(m_pager->kwin()->currentDesktop()));
+    QPoint vx(m_pager->kwin()->currentViewport(1));
 
     // ### fix vertically layouted viewports
     QPoint p(_p);
-    p.setX(p.x() + (m_desktop - vx.x()) * QApplication::desktop()->width());
+    p.setX(p.x() +
+            ((m_viewport.x() - vx.x()) * QApplication::desktop()->width()));
+    p.setY(p.y() +
+            ((m_viewport.y() - vx.y()) * QApplication::desktop()->height()));
     return p;
 }
 
@@ -146,18 +147,9 @@
     if (type == NET::Desktop || type == NET::Dock || type == NET::TopMenu)
       return false;
 
-    if (!m_useViewports && !info->isOnDesktop(m_desktop))
+    if (!info->isOnDesktop(m_desktop))
       return false;
 
-    if (m_useViewports) {
-        QRect r = mapGeometryToViewport(*info);
-
-        if (!info->hasState(NET::Sticky) &&
-            !QApplication::desktop()->geometry().contains(r.topLeft()) &&
-            !QApplication::desktop()->geometry().contains(r.topRight()))
-            return false;
-    }
-
     if (info->state() & NET::SkipPager || info->state() & NET::Shaded )
       return false;
 
@@ -495,6 +487,13 @@
     {
         QString label = (m_pager->labelType() == PagerSettings::EnumLabelType::LabelNumber) ?
                             QString::number(m_desktop) : m_desktopName;
+        if (m_useViewports)
+        {
+            QSize s(m_pager->kwin()->numberOfViewports(m_desktop));
+            label += ":";
+            label += QString::number((m_viewport.y() - 1) * s.width() +
+                                     m_viewport.x() - 1);
+        }
         bp.drawText(0, 0, w, h, AlignCenter, label);
     }
 
@@ -550,7 +549,7 @@
     QPoint p = mapPointToViewport(QPoint(pos.x() * dw / w, pos.y() * dh / h));
 
     Task::Ptr wasWindow = m_currentWindow;
-    m_currentWindow = TaskManager::the()->findTask(m_useViewports ? 1 : m_desktop, p);
+    m_currentWindow = TaskManager::the()->findTask(m_desktop, p);
 
     if (wasWindow != m_currentWindow)
     {
@@ -625,27 +624,31 @@
             int dh = QApplication::desktop()->height();
             int w = width();
             int h = height();
-            QRect location = mapGeometryToViewport(task->info());
-            QPoint pos = mapPointToViewport(e->pos());
-            int deltaX = pos.x() - m_pager->clickPos.x();
-            int deltaY = pos.y() - m_pager->clickPos.y();
+            QRect location = task->info().frameGeometry();
 
-            if (abs(deltaX) < 3)
+            QPoint pos(e->pos().x() * dw / w, e->pos().y() * dh / h);
+            QPoint newPos = mapPointToViewport(pos);
+            int dx = (m_pager->clickPos.x() * dw / w) - location.x();
+            int dy = (m_pager->clickPos.y() * dh / h) - location.y();
+            int deltaX = e->pos().x() - m_pager->clickPos.x();
+            int deltaY = e->pos().y() - m_pager->clickPos.y();
+
+            if (abs(deltaX) < 3 && e->source() == this)
             {
                 deltaX = 0;
             }
             else
             {
-                deltaX = deltaX * dw / w;
+                deltaX = newPos.x() - location.x() - dy;
             }
 
-            if (abs(deltaY) < 3)
+            if (abs(deltaY) < 3 && e->source() == this)
             {
                 deltaY = 0;
             }
             else
             {
-                deltaY = deltaY * dh / h;
+                deltaY = newPos.y() - location.y() - dx;
             }
 
             location.moveBy(deltaX, deltaY);
@@ -696,12 +699,12 @@
 
 void KMiniPagerButton::slotDragSwitch()
 {
-    emit buttonSelected(m_desktop);
+    emit buttonSelected(m_desktop, m_viewport);
 }
 
 void KMiniPagerButton::slotClicked()
 {
-    emit buttonSelected(m_desktop);
+    emit buttonSelected(m_desktop, m_viewport);
 }
 
 void KMiniPagerButton::rename()


>> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<


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

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