--Boundary_(ID_fnDPeKEp8JO61okS3nM4rQ) Content-type: text/plain; charset=utf-8 Content-transfer-encoding: 7BIT Content-disposition: inline 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 --Boundary_(ID_fnDPeKEp8JO61okS3nM4rQ) Content-type: text/x-diff; charset=utf-8; name=kicker_viewport_fix.patch Content-transfer-encoding: 7BIT Content-disposition: attachment; filename=kicker_viewport_fix.patch 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::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() --Boundary_(ID_fnDPeKEp8JO61okS3nM4rQ) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline >> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe << --Boundary_(ID_fnDPeKEp8JO61okS3nM4rQ)--