diff --git a/CMakeLists.txt b/CMakeLists.txt index 17f1453879..ce69e8492a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -195,7 +195,7 @@ elseif(OPENGLES_FOUND) endif(OPENGL_FOUND) install(TARGETS kdeinit_kwin ${INSTALL_TARGETS_DEFAULT_ARGS} ) -#install(TARGETS kwin ${INSTALL_TARGETS_DEFAULT_ARGS} ) +install(TARGETS kwin ${INSTALL_TARGETS_DEFAULT_ARGS} ) if(OPENGLES_FOUND) kde4_add_kdeinit_executable( kwin_gles ${kwin_KDEINIT_SRCS}) diff --git a/activation.cpp b/activation.cpp index 298728719a..7c07d5e1bb 100644 --- a/activation.cpp +++ b/activation.cpp @@ -414,7 +414,7 @@ Client *Workspace::clientUnderMouse(int screen) const } // rule out clients which are not really visible. - // the screen test is rather superflous for xrandr & twinview since the geometry would differ -> TODO: might be dropped + // the screen test is rather superfluous for xrandr & twinview since the geometry would differ -> TODO: might be dropped if (!(client->isShown(false) && client->isOnCurrentDesktop() && client->isOnCurrentActivity() && client->isOnScreen(screen))) continue; diff --git a/clients/aurorae/src/aurorae.cpp b/clients/aurorae/src/aurorae.cpp index ed5942eff0..4277b65bef 100644 --- a/clients/aurorae/src/aurorae.cpp +++ b/clients/aurorae/src/aurorae.cpp @@ -85,6 +85,9 @@ bool AuroraeFactory::reset(unsigned long changed) if (changed & SettingButtons) { emit buttonsChanged(); } + if (changed & SettingFont){ + emit titleFontChanged(); + } const KConfig conf("auroraerc"); const KConfigGroup group(&conf, "Engine"); const QString themeName = group.readEntry("ThemeName", "example-deco"); @@ -161,6 +164,16 @@ bool AuroraeFactory::customButtonPositions() return options()->customButtonPositions(); } +QFont AuroraeFactory::activeTitleFont() +{ + return options()->font(); +} + +QFont AuroraeFactory::inactiveTitleFont() +{ + return options()->font(false); +} + AuroraeFactory *AuroraeFactory::s_instance = NULL; /******************************************************* @@ -193,6 +206,7 @@ void AuroraeClient::init() createMainWidget(); widget()->setAttribute(Qt::WA_TranslucentBackground); widget()->setAttribute(Qt::WA_NoSystemBackground); + widget()->installEventFilter(this); m_view = new QGraphicsView(m_scene, widget()); m_view->setAttribute(Qt::WA_TranslucentBackground); m_view->setWindowFlags(Qt::X11BypassWindowManagerHint); @@ -213,6 +227,23 @@ void AuroraeClient::init() connect(AuroraeFactory::instance()->theme(), SIGNAL(themeChanged()), SLOT(themeChanged())); } +bool AuroraeClient::eventFilter(QObject *object, QEvent *event) +{ + // we need to filter the wheel events on the decoration + // QML does not yet provide a way to accept wheel events, this will change with Qt 5 + // TODO: remove in KDE5 + // see BUG: 304248 + if (object != widget() || event->type() != QEvent::Wheel) { + return KDecorationUnstable::eventFilter(object, event); + } + QWheelEvent *wheel = static_cast(event); + if (mousePosition(wheel->pos()) == PositionCenter) { + titlebarMouseWheelOperation(wheel->delta()); + return true; + } + return false; +} + void AuroraeClient::activeChange() { emit activeChanged(); @@ -437,6 +468,34 @@ void AuroraeClient::doCloseWindow() KDecorationUnstable::closeWindow(); } +void AuroraeClient::maximize(int button) +{ + // a maximized window does not need to have a window decoration + // in that case we need to delay handling by one cycle + // BUG: 304870 + QMetaObject::invokeMethod(qobject_cast< KDecorationUnstable* >(this), + "doMaximzie", + Qt::QueuedConnection, + Q_ARG(int, button)); +} + +void AuroraeClient::doMaximzie(int button) +{ + KDecorationUnstable::maximize(static_cast(button)); +} + +void AuroraeClient::titlebarDblClickOperation() +{ + // the double click operation can result in a window being maximized + // see maximize + QMetaObject::invokeMethod(qobject_cast< KDecorationUnstable* >(this), "doTitlebarDblClickOperation", Qt::QueuedConnection); +} + +void AuroraeClient::doTitlebarDblClickOperation() +{ + KDecorationUnstable::titlebarDblClickOperation(); +} + } // namespace Aurorae extern "C" diff --git a/clients/aurorae/src/aurorae.h b/clients/aurorae/src/aurorae.h index 9c20787869..fabd828ff3 100644 --- a/clients/aurorae/src/aurorae.h +++ b/clients/aurorae/src/aurorae.h @@ -41,6 +41,8 @@ class AuroraeFactory : public QObject, public KDecorationFactoryUnstable Q_PROPERTY(QString leftButtons READ leftButtons NOTIFY buttonsChanged) Q_PROPERTY(QString rightButtons READ rightButtons NOTIFY buttonsChanged) Q_PROPERTY(bool customButtonPositions READ customButtonPositions NOTIFY buttonsChanged) + Q_PROPERTY(QFont activeTitleFont READ activeTitleFont NOTIFY titleFontChanged) + Q_PROPERTY(QFont inactiveTitleFont READ inactiveTitleFont NOTIFY titleFontChanged) public: ~AuroraeFactory(); @@ -58,12 +60,16 @@ public: QString rightButtons(); bool customButtonPositions(); + QFont activeTitleFont(); + QFont inactiveTitleFont(); + private: AuroraeFactory(); void init(); Q_SIGNALS: void buttonsChanged(); + void titleFontChanged(); private: static AuroraeFactory *s_instance; @@ -105,6 +111,7 @@ class AuroraeClient : public KDecorationUnstable public: AuroraeClient(KDecorationBridge* bridge, KDecorationFactory* factory); virtual ~AuroraeClient(); + virtual bool eventFilter(QObject *object, QEvent *event); virtual void activeChange(); virtual void borders(int& left, int& right, int& top, int& bottom) const; virtual void captionChange(); @@ -144,10 +151,14 @@ public slots: void titleReleased(Qt::MouseButton button, Qt::MouseButtons buttons); void titleMouseMoved(Qt::MouseButton button, Qt::MouseButtons buttons); void closeWindow(); + void titlebarDblClickOperation(); + void maximize(int button); private slots: void themeChanged(); void doCloseWindow(); + void doTitlebarDblClickOperation(); + void doMaximzie(int button); private: QGraphicsView *m_view; diff --git a/clients/aurorae/src/qml/aurorae.qml b/clients/aurorae/src/qml/aurorae.qml index 00982b4891..acd6d7aa37 100644 --- a/clients/aurorae/src/qml/aurorae.qml +++ b/clients/aurorae/src/qml/aurorae.qml @@ -141,8 +141,9 @@ Decoration { horizontalAlignment: auroraeTheme.horizontalAlignment verticalAlignment: auroraeTheme.verticalAlignment elide: Text.ElideRight - height: auroraeTheme.titleHeight + height: Math.max(auroraeTheme.titleHeight, auroraeTheme.buttonHeight * auroraeTheme.buttonSizeFactor) color: decoration.active ? auroraeTheme.activeTextColor : auroraeTheme.inactiveTextColor + font: decoration.active ? options.activeTitleFont : options.inactiveTitleFont anchors { left: leftButtonGroup.right right: rightButtonGroup.left @@ -155,7 +156,13 @@ Decoration { acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton anchors.fill: parent onDoubleClicked: decoration.titlebarDblClickOperation() - onPressed: decoration.titlePressed(mouse.button, mouse.buttons) + onPressed: { + if (mouse.button == Qt.LeftButton) { + mouse.accepted = false; + } else { + decoration.titlePressed(mouse.button, mouse.buttons); + } + } onReleased: decoration.titleReleased(mouse.button, mouse.buttons) } Behavior on color { diff --git a/composite.cpp b/composite.cpp index 8fbbd5356e..f1823f5969 100644 --- a/composite.cpp +++ b/composite.cpp @@ -187,7 +187,7 @@ void Workspace::slotCompositingOptionsInitialized() fpsInterval = qMax((fpsInterval / vBlankInterval) * vBlankInterval, vBlankInterval); } else vBlankInterval = 1 << 10; // no sync - DO NOT set "0", would cause div-by-zero segfaults. - m_timeSinceLastVBlank = fpsInterval - 1; // means "start now" - we dont't have even a slight idea when the first vsync will occur + m_timeSinceLastVBlank = fpsInterval - 1; // means "start now" - we don't have even a slight idea when the first vsync will occur checkCompositeTimer(); XCompositeRedirectSubwindows(display(), rootWindow(), CompositeRedirectManual); new EffectsHandlerImpl(scene->compositingType()); // sets also the 'effects' pointer diff --git a/effects.cpp b/effects.cpp index 216a45c720..99866914f4 100644 --- a/effects.cpp +++ b/effects.cpp @@ -1359,9 +1359,9 @@ void EffectsHandlerImpl::reconfigureEffect(const QString& name) } } -bool EffectsHandlerImpl::isEffectLoaded(const QString& name) +bool EffectsHandlerImpl::isEffectLoaded(const QString& name) const { - for (QVector< EffectPair >::iterator it = loaded_effects.begin(); it != loaded_effects.end(); ++it) + for (QVector< EffectPair >::const_iterator it = loaded_effects.constBegin(); it != loaded_effects.constEnd(); ++it) if ((*it).first == name) return true; @@ -1430,6 +1430,28 @@ void EffectsHandlerImpl::slotHideOutline() emit hideOutline(); } +QString EffectsHandlerImpl::supportInformation(const QString &name) const +{ + if (!isEffectLoaded(name)) { + return QString(); + } + for (QVector< EffectPair >::const_iterator it = loaded_effects.constBegin(); it != loaded_effects.constEnd(); ++it) { + if ((*it).first == name) { + QString support((*it).first + ":\n"); + const QMetaObject *metaOptions = (*it).second->metaObject(); + for (int i=0; ipropertyCount(); ++i) { + const QMetaProperty property = metaOptions->property(i); + if (QLatin1String(property.name()) == "objectName") { + continue; + } + support.append(QLatin1String(property.name()) % ": " % (*it).second->property(property.name()).toString() % '\n'); + } + return support; + } + } + return QString(); +} + //**************************************** // EffectWindowImpl //**************************************** diff --git a/effects.h b/effects.h index a65909d231..014c4cf497 100644 --- a/effects.h +++ b/effects.h @@ -167,7 +167,8 @@ public: void toggleEffect(const QString& name); void unloadEffect(const QString& name); void reconfigureEffect(const QString& name); - bool isEffectLoaded(const QString& name); + bool isEffectLoaded(const QString& name) const; + QString supportInformation(const QString& name) const; QStringList loadedEffects() const; QStringList listOfEffects() const; diff --git a/effects/blur/blur.cpp b/effects/blur/blur.cpp index a121f10d72..d58cd2728b 100644 --- a/effects/blur/blur.cpp +++ b/effects/blur/blur.cpp @@ -672,5 +672,10 @@ void BlurEffect::doCachedBlur(EffectWindow *w, const QRegion& region, const floa shader->unbind(); } +int BlurEffect::blurRadius() const +{ + return shader->radius(); +} + } // namespace KWin diff --git a/effects/blur/blur.h b/effects/blur/blur.h index ce2eac40ff..a3820856a8 100644 --- a/effects/blur/blur.h +++ b/effects/blur/blur.h @@ -35,6 +35,8 @@ class BlurShader; class BlurEffect : public KWin::Effect { Q_OBJECT + Q_PROPERTY(int blurRadius READ blurRadius) + Q_PROPERTY(bool cacheTexture READ isCacheTexture) public: BlurEffect(); ~BlurEffect(); @@ -48,6 +50,12 @@ public: void drawWindow(EffectWindow *w, int mask, QRegion region, WindowPaintData &data); void paintEffectFrame(EffectFrame *frame, QRegion region, double opacity, double frameOpacity); + // for dynamic setting extraction + int blurRadius() const; + bool isCacheTexture() const { + return m_shouldCache; + } + public Q_SLOTS: void slotWindowAdded(KWin::EffectWindow *w); void slotWindowDeleted(KWin::EffectWindow *w); diff --git a/effects/boxswitch/boxswitch.desktop b/effects/boxswitch/boxswitch.desktop index 3f860df849..132da7dec2 100644 --- a/effects/boxswitch/boxswitch.desktop +++ b/effects/boxswitch/boxswitch.desktop @@ -93,7 +93,7 @@ Comment[eo]=Montri miniaturojn de fenestroj en alt+taba fenestr-ŝanĝilo Comment[es]=Muestra miniaturas de ventanas en el conmutador de ventanas alt+tab Comment[et]=Akende pisipiltide näitamine Alt+TAB aknavahetajas Comment[eu]=Bistaratu leihoen koadro-txikiak alt+tab leiho aldatzailean -Comment[fi]=Näyttää ikkunoiden pienoiskuvat Alt+Sarkain-ikkunanvaihdossa +Comment[fi]=Näyttää ikkunoiden pienoiskuvat Alt+Sarkain-tehtävänvalitsimessa Comment[fr]=Affiche des aperçus des fenêtres dans le changeur de fenêtres en utilisant la combinaison « Alt+Tab » Comment[fy]=Lit finsterminiatueren sjen ûnder rinnen troch finsters mei Alt+Tab Comment[ga]=Taispeáin mionsamhlacha fuinneog sa mhalartóir fuinneog Alt+Táb diff --git a/effects/coverswitch/coverswitch.cpp b/effects/coverswitch/coverswitch.cpp index 9370cba1c2..22c9576a69 100644 --- a/effects/coverswitch/coverswitch.cpp +++ b/effects/coverswitch/coverswitch.cpp @@ -912,47 +912,62 @@ void CoverSwitchEffect::windowInputMouseEvent(Window w, QEvent* e) // we don't want click events during animations if (animation) return; - QPoint pos = static_cast< QMouseEvent* >(e)->pos(); + QMouseEvent* event = static_cast< QMouseEvent* >(e); - // determine if a window has been clicked - // not interested in events above a fullscreen window (ignoring panel size) - if (pos.y() < (area.height()*scaleFactor - area.height()) * 0.5f *(1.0f / scaleFactor)) - return; + switch (event->button()) { + case Qt::XButton1: // wheel up + selectPreviousWindow(); + break; + case Qt::XButton2: // wheel down + selectNextWindow(); + break; + case Qt::LeftButton: + case Qt::RightButton: + case Qt::MidButton: + default: + QPoint pos = event->pos(); - // if there is no selected window (that is no window at all) we cannot click it - if (!selected_window) - return; - - if (pos.x() < (area.width()*scaleFactor - selected_window->width()) * 0.5f *(1.0f / scaleFactor)) { - float availableSize = (area.width() * scaleFactor - area.width()) * 0.5f * (1.0f / scaleFactor); - for (int i = 0; i < leftWindows.count(); i++) { - int windowPos = availableSize / leftWindows.count() * i; - if (pos.x() < windowPos) - continue; - if (i + 1 < leftWindows.count()) { - if (pos.x() > availableSize / leftWindows.count()*(i + 1)) - continue; - } - - effects->setTabBoxWindow(leftWindows[i]); + // determine if a window has been clicked + // not interested in events above a fullscreen window (ignoring panel size) + if (pos.y() < (area.height()*scaleFactor - area.height()) * 0.5f *(1.0f / scaleFactor)) return; - } - } - if (pos.x() > area.width() - (area.width()*scaleFactor - selected_window->width()) * 0.5f *(1.0f / scaleFactor)) { - float availableSize = (area.width() * scaleFactor - area.width()) * 0.5f * (1.0f / scaleFactor); - for (int i = 0; i < rightWindows.count(); i++) { - int windowPos = area.width() - availableSize / rightWindows.count() * i; - if (pos.x() > windowPos) - continue; - if (i + 1 < rightWindows.count()) { - if (pos.x() < area.width() - availableSize / rightWindows.count()*(i + 1)) - continue; - } - - effects->setTabBoxWindow(rightWindows[i]); + // if there is no selected window (that is no window at all) we cannot click it + if (!selected_window) return; + + if (pos.x() < (area.width()*scaleFactor - selected_window->width()) * 0.5f *(1.0f / scaleFactor)) { + float availableSize = (area.width() * scaleFactor - area.width()) * 0.5f * (1.0f / scaleFactor); + for (int i = 0; i < leftWindows.count(); i++) { + int windowPos = availableSize / leftWindows.count() * i; + if (pos.x() < windowPos) + continue; + if (i + 1 < leftWindows.count()) { + if (pos.x() > availableSize / leftWindows.count()*(i + 1)) + continue; + } + + effects->setTabBoxWindow(leftWindows[i]); + return; + } } + + if (pos.x() > area.width() - (area.width()*scaleFactor - selected_window->width()) * 0.5f *(1.0f / scaleFactor)) { + float availableSize = (area.width() * scaleFactor - area.width()) * 0.5f * (1.0f / scaleFactor); + for (int i = 0; i < rightWindows.count(); i++) { + int windowPos = area.width() - availableSize / rightWindows.count() * i; + if (pos.x() > windowPos) + continue; + if (i + 1 < rightWindows.count()) { + if (pos.x() < area.width() - availableSize / rightWindows.count()*(i + 1)) + continue; + } + + effects->setTabBoxWindow(rightWindows[i]); + return; + } + } + break; } } @@ -1009,24 +1024,33 @@ void CoverSwitchEffect::updateCaption() void CoverSwitchEffect::slotTabBoxKeyEvent(QKeyEvent *event) { - if (!mActivated || !selected_window) { - return; - } - const int index = effects->currentTabBoxWindowList().indexOf(selected_window); - int newIndex = index; if (event->type() == QEvent::KeyPress) { switch (event->key()) { case Qt::Key_Left: - newIndex = (index - 1); + selectPreviousWindow(); break; case Qt::Key_Right: - newIndex = (index + 1); + selectNextWindow(); break; default: // nothing break; } } +} + +void CoverSwitchEffect::selectNextOrPreviousWindow(bool forward) +{ + if (!mActivated || !selected_window) { + return; + } + const int index = effects->currentTabBoxWindowList().indexOf(selected_window); + int newIndex = index; + if (forward) { + ++newIndex; + } else { + --newIndex; + } if (newIndex == effects->currentTabBoxWindowList().size()) { newIndex = 0; } else if (newIndex < 0) { diff --git a/effects/coverswitch/coverswitch.desktop b/effects/coverswitch/coverswitch.desktop index bbfe499328..143735feee 100644 --- a/effects/coverswitch/coverswitch.desktop +++ b/effects/coverswitch/coverswitch.desktop @@ -86,7 +86,7 @@ Comment[eo]=Montri iPod-an efekton kiel alt+tab fenestr-ŝanĝilo Comment[es]=Muestra un efecto de cover flow en el conmutador de ventanas alt+tab Comment[et]=Cover Flow efekti näitamine Alt+TAB aknavahetajas Comment[eu]=Alt+tab leiho aldatzailearentzako estalki isuri efektua bistaratzen du -Comment[fi]=Näyttää levykansitehosteen Alt+Sarkain-ikkunanvaihdossa +Comment[fi]=Näyttää levykansitehosteen Alt+Sarkain-tehtävänvalitsimessa Comment[fr]=Affiche un effet de défilement circulaire dans le changeur de fenêtres en utilisant la combinaison « Alt+Tab » Comment[fy]=Lit finsters as lânkommende albumhoezen sjen ûnder it rinnen troch de finsters mei Alt+Tab Comment[ga]=Taispeáin maisíocht le Sruth Clúdach sa mhalartóir fuinneog Alt+Táb diff --git a/effects/coverswitch/coverswitch.h b/effects/coverswitch/coverswitch.h index cfc1cdd931..429bb718d7 100644 --- a/effects/coverswitch/coverswitch.h +++ b/effects/coverswitch/coverswitch.h @@ -38,6 +38,18 @@ class CoverSwitchEffect : public Effect { Q_OBJECT + Q_PROPERTY(int animationDuration READ configuredAnimationDuration) + Q_PROPERTY(bool animateSwitch READ isAnimateSwitch) + Q_PROPERTY(bool animateStart READ isAnimateStart) + Q_PROPERTY(bool animateStop READ isAnimateStop) + Q_PROPERTY(bool reflection READ isReflection) + Q_PROPERTY(bool windowTitle READ isWindowTitle) + Q_PROPERTY(qreal zPosition READ windowZPosition) + Q_PROPERTY(bool dynamicThumbnails READ isDynamicThumbnails) + Q_PROPERTY(int thumbnailWindows READ configurredThumbnailWindows) + Q_PROPERTY(bool primaryTabBox READ isPrimaryTabBox) + Q_PROPERTY(bool secondaryTabBox READ isSecondaryTabBox) + // TODO: mirror colors public: CoverSwitchEffect(); ~CoverSwitchEffect(); @@ -52,6 +64,41 @@ public: static bool supported(); + // for properties + int configuredAnimationDuration() const { + return animationDuration; + } + bool isAnimateSwitch() const { + return animateSwitch; + } + bool isAnimateStart() const { + return animateStart; + } + bool isAnimateStop() const { + return animateStop; + } + bool isReflection() const { + return reflection; + } + bool isWindowTitle() const { + return windowTitle; + } + qreal windowZPosition() const { + return zPosition; + } + bool isDynamicThumbnails() const { + return dynamicThumbnails; + } + int configurredThumbnailWindows() const { + return thumbnailWindows; + } + bool isPrimaryTabBox() const { + return primaryTabBox; + } + bool isSecondaryTabBox() const { + return secondaryTabBox; + } + public Q_SLOTS: void slotWindowClosed(KWin::EffectWindow *c); void slotTabBoxAdded(int mode); @@ -65,6 +112,9 @@ private: void paintWindowCover(EffectWindow* w, bool reflectedWindow, WindowPaintData& data); void paintFrontWindow(EffectWindow* frontWindow, int width, int leftWindows, int rightWindows, bool reflectedWindow); void paintWindows(const EffectWindowList& windows, bool left, bool reflectedWindows, EffectWindow* additionalWindow = NULL); + void selectNextOrPreviousWindow(bool forward); + inline void selectNextWindow() { selectNextOrPreviousWindow(true); } + inline void selectPreviousWindow() { selectNextOrPreviousWindow(false); } void abort(); /** * Updates the caption of the caption frame. diff --git a/effects/cube/cube.cpp b/effects/cube/cube.cpp index 7279d48d0a..bfd7263b59 100644 --- a/effects/cube/cube.cpp +++ b/effects/cube/cube.cpp @@ -1167,7 +1167,8 @@ void CubeEffect::postPaintScreen() delete m_cubeCapBuffer; m_cubeCapBuffer = NULL; - desktopNameFrame->free(); + if (desktopNameFrame) + desktopNameFrame->free(); } effects->addRepaintFull(); } diff --git a/effects/cube/cube.h b/effects/cube/cube.h index cb2b576d41..e68aafe98c 100644 --- a/effects/cube/cube.h +++ b/effects/cube/cube.h @@ -38,6 +38,23 @@ class CubeEffect : public Effect { Q_OBJECT + Q_PROPERTY(qreal cubeOpacity READ configuredCubeOpacity) + Q_PROPERTY(bool opacityDesktopOnly READ isOpacityDesktopOnly) + Q_PROPERTY(bool displayDesktopName READ isDisplayDesktopName) + Q_PROPERTY(bool reflection READ isReflection) + Q_PROPERTY(int rotationDuration READ configuredRotationDuration) + Q_PROPERTY(QColor backgroundColor READ configuredBackgroundColor) + Q_PROPERTY(QColor capColor READ configuredCapColor) + Q_PROPERTY(bool paintCaps READ isPaintCaps) + Q_PROPERTY(bool closeOnMouseRelease READ isCloseOnMouseRelease) + Q_PROPERTY(qreal zPosition READ configuredZPosition) + Q_PROPERTY(bool useForTabBox READ isUseForTabBox) + Q_PROPERTY(bool invertKeys READ isInvertKeys) + Q_PROPERTY(bool invertMouse READ isInvertMouse) + Q_PROPERTY(qreal capDeformationFactor READ configuredCapDeformationFactor) + Q_PROPERTY(bool useZOrdering READ isUseZOrdering) + Q_PROPERTY(bool texturedCaps READ isTexturedCaps) + // TODO: electric borders: not a registered type public: CubeEffect(); ~CubeEffect(); @@ -58,6 +75,56 @@ public: void unregisterCubeInsideEffect(CubeInsideEffect* effect); static bool supported(); + + // for properties + qreal configuredCubeOpacity() const { + return cubeOpacity; + } + bool isOpacityDesktopOnly() const { + return opacityDesktopOnly; + } + bool isDisplayDesktopName() const { + return displayDesktopName; + } + bool isReflection() const { + return reflection; + } + int configuredRotationDuration() const { + return rotationDuration; + } + QColor configuredBackgroundColor() const { + return backgroundColor; + } + QColor configuredCapColor() const { + return capColor; + } + bool isPaintCaps() const { + return paintCaps; + } + bool isCloseOnMouseRelease() const { + return closeOnMouseRelease; + } + qreal configuredZPosition() const { + return zPosition; + } + bool isUseForTabBox() const { + return useForTabBox; + } + bool isInvertKeys() const { + return invertKeys; + } + bool isInvertMouse() const { + return invertMouse; + } + qreal configuredCapDeformationFactor() const { + return capDeformationFactor; + } + bool isUseZOrdering() const { + return useZOrdering; + } + bool isTexturedCaps() const { + return texturedCaps; + } private slots: void toggleCube(); void toggleCylinder(); diff --git a/effects/cube/cubeslide.h b/effects/cube/cubeslide.h index 96b814840c..7ef858531d 100644 --- a/effects/cube/cubeslide.h +++ b/effects/cube/cubeslide.h @@ -33,6 +33,11 @@ class CubeSlideEffect : public Effect { Q_OBJECT + Q_PROPERTY(int rotationDuration READ configuredRotationDuration) + Q_PROPERTY(bool dontSlidePanels READ isDontSlidePanels) + Q_PROPERTY(bool dontSlideStickyWindows READ isDontSlideStickyWindows) + Q_PROPERTY(bool usePagerLayout READ isUsePagerLayout) + Q_PROPERTY(bool useWindowMoving READ isUseWindowMoving) public: CubeSlideEffect(); ~CubeSlideEffect(); @@ -46,6 +51,22 @@ public: static bool supported(); + // for properties + int configuredRotationDuration() const { + return rotationDuration; + } + bool isDontSlidePanels() const { + return dontSlidePanels; + } + bool isDontSlideStickyWindows() const { + return dontSlideStickyWindows; + } + bool isUsePagerLayout() const { + return usePagerLayout; + } + bool isUseWindowMoving() const { + return useWindowMoving; + } private Q_SLOTS: void slotDesktopChanged(int old, int current); void slotWindowStepUserMovedResized(KWin::EffectWindow *w); diff --git a/effects/dashboard/dashboard.cpp b/effects/dashboard/dashboard.cpp index 6780f80332..693f38fb7f 100644 --- a/effects/dashboard/dashboard.cpp +++ b/effects/dashboard/dashboard.cpp @@ -156,11 +156,6 @@ void DashboardEffect::slotWindowActivated(EffectWindow *w) transformWindow = true; window = w; - if (blur) { - w->setData(WindowBlurBehindRole, w->geometry()); - w->setData(WindowForceBlurRole, QVariant(true)); - } - effects->addRepaintFull(); } else { if (transformWindow) { @@ -175,6 +170,10 @@ void DashboardEffect::slotWindowAdded(EffectWindow* w) if (isDashboard(w)) { // Tell other windowAdded() effects to ignore this window w->setData(WindowAddedGrabRole, QVariant::fromValue(static_cast(this))); + if (blur) { + w->setData(WindowBlurBehindRole, w->geometry()); + w->setData(WindowForceBlurRole, QVariant(true)); + } activateAnimation = true; deactivateAnimation = false; diff --git a/effects/dashboard/dashboard.h b/effects/dashboard/dashboard.h index 80df408c26..fe2ca52e6e 100644 --- a/effects/dashboard/dashboard.h +++ b/effects/dashboard/dashboard.h @@ -34,6 +34,9 @@ namespace KWin class DashboardEffect : public KWin::Effect { Q_OBJECT + Q_PROPERTY(qreal brightness READ configuredBrightness) + Q_PROPERTY(qreal saturation READ configuredSaturation) + Q_PROPERTY(bool blur READ isBlur) public: DashboardEffect(); ~DashboardEffect(); @@ -45,6 +48,16 @@ public: virtual void unpropagate(); virtual bool isActive() const; + // for properties + qreal configuredBrightness() const { + return brightness; + } + qreal configuredSaturation() const { + return saturation; + } + bool isBlur() const { + return blur; + } public Q_SLOTS: void slotWindowAdded(KWin::EffectWindow* c); void slotWindowClosed(KWin::EffectWindow *c); diff --git a/effects/desktopgrid/desktopgrid.h b/effects/desktopgrid/desktopgrid.h index 1bdf1c2426..c97666e296 100644 --- a/effects/desktopgrid/desktopgrid.h +++ b/effects/desktopgrid/desktopgrid.h @@ -63,6 +63,13 @@ class DesktopGridEffect : public Effect { Q_OBJECT + Q_PROPERTY(int zoomDuration READ configuredZoomDuration) + Q_PROPERTY(int border READ configuredBorder) + Q_PROPERTY(Qt::Alignment desktopNameAlignment READ configuredDesktopNameAlignment) + Q_PROPERTY(int layoutMode READ configuredLayoutMode) + Q_PROPERTY(int customLayoutRows READ configuredCustomLayoutRows) + Q_PROPERTY(bool usePresentWindows READ isUsePresentWindows) + // TODO: electric borders public: DesktopGridEffect(); ~DesktopGridEffect(); @@ -79,6 +86,25 @@ public: enum { LayoutPager, LayoutAutomatic, LayoutCustom }; // Layout modes + // for properties + int configuredZoomDuration() const { + return zoomDuration; + } + int configuredBorder() const { + return border; + } + Qt::Alignment configuredDesktopNameAlignment() const { + return desktopNameAlignment; + } + int configuredLayoutMode() const { + return layoutMode; + } + int configuredCustomLayoutRows() const { + return customLayoutRows; + } + bool isUsePresentWindows() const { + return m_usePresentWindows; + } private slots: void toggle(); // slots for global shortcut changed diff --git a/effects/dialogparent/dialogparent.h b/effects/dialogparent/dialogparent.h index 95814b0188..d439cc63c9 100644 --- a/effects/dialogparent/dialogparent.h +++ b/effects/dialogparent/dialogparent.h @@ -38,6 +38,7 @@ class DialogParentEffect : public Effect { Q_OBJECT + Q_PROPERTY(int changeTime READ configuredChangeTime) public: DialogParentEffect(); virtual void reconfigure(ReconfigureFlags); @@ -48,6 +49,10 @@ public: virtual bool isActive() const; + // for properties + int configuredChangeTime() const { + return changeTime; + } public Q_SLOTS: void slotWindowClosed(KWin::EffectWindow *c); void slotWindowActivated(KWin::EffectWindow *c); diff --git a/effects/diminactive/diminactive.h b/effects/diminactive/diminactive.h index b9c3c281d9..f1972ab557 100644 --- a/effects/diminactive/diminactive.h +++ b/effects/diminactive/diminactive.h @@ -34,12 +34,33 @@ class DimInactiveEffect : public Effect { Q_OBJECT + Q_PROPERTY(bool dimPanels READ isDimPanels) + Q_PROPERTY(bool dimDesktop READ isDimDesktop) + Q_PROPERTY(bool dimKeepAbove READ isDimKeepAbove) + Q_PROPERTY(bool dimByGroup READ isDimByGroup) + Q_PROPERTY(int dimStrength READ configuredDimStrength) public: DimInactiveEffect(); virtual void reconfigure(ReconfigureFlags); virtual void prePaintScreen(ScreenPrePaintData& data, int time); virtual void paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data); + // for properties + bool isDimPanels() const { + return dim_panels; + } + bool isDimDesktop() const { + return dim_desktop; + } + bool isDimKeepAbove() const { + return dim_keepabove; + } + bool isDimByGroup() const { + return dim_by_group; + } + int configuredDimStrength() const { + return dim_strength; + } public Q_SLOTS: void slotWindowActivated(KWin::EffectWindow* c); void slotWindowDeleted(KWin::EffectWindow *w); diff --git a/effects/fallapart/fallapart.h b/effects/fallapart/fallapart.h index 8dfcf29a3a..73786d7e01 100644 --- a/effects/fallapart/fallapart.h +++ b/effects/fallapart/fallapart.h @@ -30,6 +30,7 @@ class FallApartEffect : public Effect { Q_OBJECT + Q_PROPERTY(int blockSize READ configuredBlockSize) public: FallApartEffect(); virtual void reconfigure(ReconfigureFlags); @@ -39,6 +40,10 @@ public: virtual void postPaintScreen(); virtual bool isActive() const; + // for properties + int configuredBlockSize() const { + return blockSize; + } public Q_SLOTS: void slotWindowClosed(KWin::EffectWindow *c); void slotWindowDeleted(KWin::EffectWindow *w); diff --git a/effects/flipswitch/flipswitch.cpp b/effects/flipswitch/flipswitch.cpp index ab657ed5ff..78fdca621c 100644 --- a/effects/flipswitch/flipswitch.cpp +++ b/effects/flipswitch/flipswitch.cpp @@ -641,6 +641,7 @@ void FlipSwitchEffect::setActive(bool activate, FlipSwitchMode mode) switch(m_mode) { case TabboxMode: m_selectedWindow = effects->currentTabBoxWindow(); + m_input = effects->createFullScreenInputWindow(this, Qt::ArrowCursor); break; case CurrentDesktopMode: m_selectedWindow = effects->activeWindow(); @@ -687,8 +688,7 @@ void FlipSwitchEffect::setActive(bool activate, FlipSwitchMode mode) } } else m_startStopTimeLine.setCurveShape(QTimeLine::EaseInOutCurve); - if (mode != TabboxMode) - effects->destroyInputWindow(m_input); + effects->destroyInputWindow(m_input); if (m_hasKeyboardGrab) { effects->ungrabKeyboard(); m_hasKeyboardGrab = false; @@ -827,14 +827,37 @@ void FlipSwitchEffect::adjustWindowMultiScreen(const KWin::EffectWindow* w, Wind } } else { if (clientRect.width() != fullRect.width() && clientRect.x() < rect.x()) { - data.translate(- clientRect.width()); + data.translate(- (m_screenArea.x() - clientRect.x())); } if (clientRect.height() != fullRect.height() && clientRect.y() < m_screenArea.y()) { - data.translate(0.0, - clientRect.height()); + data.translate(0.0, - (m_screenArea.y() - clientRect.y())); } } } +void FlipSwitchEffect::selectNextOrPreviousWindow(bool forward) +{ + if (!m_active || !m_selectedWindow) { + return; + } + const int index = effects->currentTabBoxWindowList().indexOf(m_selectedWindow); + int newIndex = index; + if (forward) { + ++newIndex; + } else { + --newIndex; + } + if (newIndex == effects->currentTabBoxWindowList().size()) { + newIndex = 0; + } else if (newIndex < 0) { + newIndex = effects->currentTabBoxWindowList().size() -1; + } + if (index == newIndex) { + return; + } + effects->setTabBoxWindow(effects->currentTabBoxWindowList().at(newIndex)); +} + //************************************************************* // Keyboard handling @@ -937,35 +960,21 @@ void FlipSwitchEffect::grabbedKeyboardEvent(QKeyEvent* e) void FlipSwitchEffect::slotTabBoxKeyEvent(QKeyEvent *event) { - if (!m_active || !m_selectedWindow) { - return; - } - const int index = effects->currentTabBoxWindowList().indexOf(m_selectedWindow); - int newIndex = index; if (event->type() == QEvent::KeyPress) { switch (event->key()) { case Qt::Key_Up: case Qt::Key_Left: - newIndex = (index - 1); + selectPreviousWindow(); break; case Qt::Key_Down: case Qt::Key_Right: - newIndex = (index + 1); + selectNextWindow(); break; default: // nothing break; } } - if (newIndex == effects->currentTabBoxWindowList().size()) { - newIndex = 0; - } else if (newIndex < 0) { - newIndex = effects->currentTabBoxWindowList().size() -1; - } - if (index == newIndex) { - return; - } - effects->setTabBoxWindow(effects->currentTabBoxWindowList().at(newIndex)); } bool FlipSwitchEffect::isActive() const @@ -989,6 +998,37 @@ void FlipSwitchEffect::updateCaption() } } +//************************************************************* +// Mouse handling +//************************************************************* + +void FlipSwitchEffect::windowInputMouseEvent(Window w, QEvent* e) +{ + assert(w == m_input); + Q_UNUSED(w); + if (e->type() != QEvent::MouseButtonPress) + return; + // we don't want click events during animations + if (m_animation) + return; + QMouseEvent* event = static_cast< QMouseEvent* >(e); + + switch (event->button()) { + case Qt::XButton1: // wheel up + selectPreviousWindow(); + break; + case Qt::XButton2: // wheel down + selectNextWindow(); + break; + case Qt::LeftButton: + case Qt::RightButton: + case Qt::MidButton: + default: + // TODO: Change window on mouse button click + break; + } +} + //************************************************************* // Item Info //************************************************************* diff --git a/effects/flipswitch/flipswitch.desktop b/effects/flipswitch/flipswitch.desktop index badf4738d2..3409d0e266 100644 --- a/effects/flipswitch/flipswitch.desktop +++ b/effects/flipswitch/flipswitch.desktop @@ -84,7 +84,7 @@ Comment[eo]=Turni inter la fenestroj kiuj estas en la stako de la alt+taba fenes Comment[es]=Cambia entre las ventanas apiladas con el conmutador de ventanas alt+tab Comment[et]=Lehitseb läbi pinus asuvate akende Alt+TAB abil Comment[eu]=Irauli pila baten dauden leihoak alt+tab leiho aldatzailearekin -Comment[fi]=Vaihda niiden ikkunoiden välillä, jotka ovat Alt+Sarkain-ikkunavaihtajan pinossa +Comment[fi]=Vaihda niiden ikkunoiden välillä, jotka ovat Alt+Sarkain-tehtävävalitsimen pinossa Comment[fr]=Affiche le changeur de fenêtres « Alt + Tab » avec les fenêtres empilées en perspective Comment[fy]=Lit de finsters stapele sjen ûnder it trochrinnen fan de finsters mei Alt+Tab Comment[ga]=Ransaíonn fuinneoga i gcruach sa mhalartóir fuinneog Alt+Táb diff --git a/effects/flipswitch/flipswitch.h b/effects/flipswitch/flipswitch.h index a645b2a2a7..463569d25c 100644 --- a/effects/flipswitch/flipswitch.h +++ b/effects/flipswitch/flipswitch.h @@ -35,6 +35,14 @@ class FlipSwitchEffect : public Effect { Q_OBJECT + Q_PROPERTY(bool tabBox READ isTabBox) + Q_PROPERTY(bool tabBoxAlternative READ isTabBoxAlternative) + Q_PROPERTY(int duration READ duration) + Q_PROPERTY(int angle READ angle) + Q_PROPERTY(qreal xPosition READ xPosition) + Q_PROPERTY(qreal yPosition READ yPosition) + Q_PROPERTY(bool windowTitle READ isWindowTitle) + // TODO: electric borders public: FlipSwitchEffect(); ~FlipSwitchEffect(); @@ -47,9 +55,33 @@ public: virtual void paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data); virtual bool borderActivated(ElectricBorder border); virtual void grabbedKeyboardEvent(QKeyEvent* e); + virtual void windowInputMouseEvent(Window w, QEvent* e); virtual bool isActive() const; static bool supported(); + + // for properties + bool isTabBox() const { + return m_tabbox; + } + bool isTabBoxAlternative() const { + return m_tabboxAlternative; + } + int duration() const { + return m_timeLine.duration(); + } + int angle() const { + return m_angle; + } + qreal xPosition() const { + return m_xPosition; + } + qreal yPosition() const { + return m_yPosition; + } + bool isWindowTitle() const { + return m_windowTitle; + } private Q_SLOTS: void toggleActiveCurrent(); void toggleActiveAllDesktops(); @@ -77,6 +109,9 @@ private: bool isSelectableWindow(EffectWindow *w) const; void scheduleAnimation(const SwitchingDirection& direction, int distance = 1); void adjustWindowMultiScreen(const EffectWindow *w, WindowPaintData& data); + void selectNextOrPreviousWindow(bool forward); + inline void selectNextWindow() { selectNextOrPreviousWindow(true); } + inline void selectPreviousWindow() { selectNextOrPreviousWindow(false); } /** * Updates the caption of the caption frame. * Taking care of rewording the desktop client. diff --git a/effects/glide/glide.h b/effects/glide/glide.h index 6e0cbda6ee..3de59951d7 100644 --- a/effects/glide/glide.h +++ b/effects/glide/glide.h @@ -34,6 +34,9 @@ class GlideEffect : public Effect { Q_OBJECT + Q_PROPERTY(int duration READ configuredDuration) + Q_PROPERTY(int effect READ configuredEffect) + Q_PROPERTY(int angle READ configuredAngle) public: GlideEffect(); ~GlideEffect(); @@ -45,6 +48,17 @@ public: virtual bool isActive() const; static bool supported(); + + // for properties + int configuredDuration() const { + return duration; + } + int configuredEffect() const { + return effect; + } + int configuredAngle() const { + return angle; + } public Q_SLOTS: void slotWindowAdded(KWin::EffectWindow* c); void slotWindowClosed(KWin::EffectWindow *c); diff --git a/effects/login/CMakeLists.txt b/effects/login/CMakeLists.txt index a60ad04efb..3ba7ed66cb 100644 --- a/effects/login/CMakeLists.txt +++ b/effects/login/CMakeLists.txt @@ -23,4 +23,4 @@ set( kwin4_effect_builtins_config_sources ${kwin4_effect_builtins_config_sources # .desktop files install( FILES login/login_config.desktop - DESTINATION ${SERVICES_INSTALL_DIR}/kwin ) \ No newline at end of file + DESTINATION ${SERVICES_INSTALL_DIR}/kwin ) diff --git a/effects/login/login.h b/effects/login/login.h index a25da79a80..6994232d10 100644 --- a/effects/login/login.h +++ b/effects/login/login.h @@ -31,6 +31,7 @@ class LoginEffect : public Effect { Q_OBJECT + Q_PROPERTY(bool fadeToBlack READ isFadeToBlack) public: LoginEffect(); virtual void prePaintScreen(ScreenPrePaintData& data, int time); @@ -40,6 +41,10 @@ public: virtual void reconfigure(ReconfigureFlags); virtual bool isActive() const; + // for properties + bool isFadeToBlack() const { + return m_fadeToBlack; + } public Q_SLOTS: void slotWindowClosed(KWin::EffectWindow *w); diff --git a/effects/logout/logout.h b/effects/logout/logout.h index f3f69b21fb..342b4382af 100644 --- a/effects/logout/logout.h +++ b/effects/logout/logout.h @@ -36,6 +36,7 @@ class LogoutEffect : public Effect { Q_OBJECT + Q_PROPERTY(bool useBlur READ isUseBlur) public: LogoutEffect(); ~LogoutEffect(); @@ -45,6 +46,11 @@ public: virtual void postPaintScreen(); virtual void paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data); virtual bool isActive() const; + + // for properties + bool isUseBlur() const { + return useBlur; + } public Q_SLOTS: void slotWindowAdded(KWin::EffectWindow* w); void slotWindowClosed(KWin::EffectWindow *w); diff --git a/effects/lookingglass/lookingglass.h b/effects/lookingglass/lookingglass.h index 892f9a20ce..8ce9f1323d 100644 --- a/effects/lookingglass/lookingglass.h +++ b/effects/lookingglass/lookingglass.h @@ -40,6 +40,7 @@ class GLVertexBuffer; class LookingGlassEffect : public Effect { Q_OBJECT + Q_PROPERTY(int initialRadius READ initialRadius) public: LookingGlassEffect(); virtual ~LookingGlassEffect(); @@ -52,6 +53,10 @@ public: static bool supported(); + // for properties + int initialRadius() const { + return initialradius; + } public slots: void toggle(); void zoomIn(); diff --git a/effects/magiclamp/magiclamp.h b/effects/magiclamp/magiclamp.h index 6131a16293..3845e548c0 100644 --- a/effects/magiclamp/magiclamp.h +++ b/effects/magiclamp/magiclamp.h @@ -32,6 +32,7 @@ class MagicLampEffect : public Effect { Q_OBJECT + Q_PROPERTY(int animationDuration READ animationDuration) public: MagicLampEffect(); @@ -44,6 +45,10 @@ public: static bool supported(); + // for properties + int animationDuration() const { + return mAnimationDuration; + } public Q_SLOTS: void slotWindowDeleted(KWin::EffectWindow *w); void slotWindowMinimized(KWin::EffectWindow *w); diff --git a/effects/magnifier/magnifier.h b/effects/magnifier/magnifier.h index 979685373a..a838cf4c3b 100644 --- a/effects/magnifier/magnifier.h +++ b/effects/magnifier/magnifier.h @@ -34,6 +34,8 @@ class MagnifierEffect : public Effect { Q_OBJECT + Q_PROPERTY(QSize magnifierSize READ magnifierSize) + Q_PROPERTY(qreal targetZoom READ targetZoom) public: MagnifierEffect(); virtual ~MagnifierEffect(); @@ -43,6 +45,14 @@ public: virtual void postPaintScreen(); virtual bool isActive() const; static bool supported(); + + // for properties + QSize magnifierSize() const { + return magnifier_size; + } + qreal targetZoom() const { + return target_zoom; + } private slots: void zoomIn(); void zoomOut(); diff --git a/effects/mousemark/mousemark.h b/effects/mousemark/mousemark.h index ccf551d846..34372cd033 100644 --- a/effects/mousemark/mousemark.h +++ b/effects/mousemark/mousemark.h @@ -32,12 +32,22 @@ class MouseMarkEffect : public Effect { Q_OBJECT + Q_PROPERTY(int width READ configuredWidth) + Q_PROPERTY(QColor color READ configuredColor) public: MouseMarkEffect(); ~MouseMarkEffect(); virtual void reconfigure(ReconfigureFlags); virtual void paintScreen(int mask, QRegion region, ScreenPaintData& data); virtual bool isActive() const; + + // for properties + int configuredWidth() const { + return width; + } + QColor configuredColor() const { + return color; + } private slots: void clear(); void clearLast(); diff --git a/effects/outline/outline.desktop b/effects/outline/outline.desktop index 887767997c..fe0c0ee53d 100644 --- a/effects/outline/outline.desktop +++ b/effects/outline/outline.desktop @@ -6,6 +6,7 @@ Name[ca@valencia]=Contorn Name[cs]=Obrys Name[da]=Omrids Name[de]=Umriss +Name[el]=Περίγραμμα Name[es]=Contorno Name[et]=Kontuur Name[eu]=Zirriborroa @@ -53,6 +54,7 @@ Comment[ca@valencia]=Efecte auxiliar per dibuixar un contorn Comment[cs]=Pomocný efekt pro vykreslení obrysu Comment[da]=Hjælpeeffekt til at rendere et omrids Comment[de]=Hilfseffekt, der einen Umriss zeichnet. +Comment[el]=Εφέ αποτύπωσης ενός περιγράμματος Comment[es]=Efecto de ayuda para representar un contorno Comment[et]=Abiefekt kontuuri renderdamiseks Comment[eu]=Zirriborro bat errendatzeko efektu laguntzailea diff --git a/effects/presentwindows/presentwindows.h b/effects/presentwindows/presentwindows.h index 71052660b5..e891715aa4 100644 --- a/effects/presentwindows/presentwindows.h +++ b/effects/presentwindows/presentwindows.h @@ -67,6 +67,23 @@ class PresentWindowsEffect : public Effect { Q_OBJECT + Q_PROPERTY(int layoutMode READ layoutMode) + Q_PROPERTY(bool showCaptions READ isShowCaptions) + Q_PROPERTY(bool showIcons READ isShowIcons) + Q_PROPERTY(bool doNotCloseWindows READ isDoNotCloseWindows) + Q_PROPERTY(bool ignoreMinimized READ isIgnoreMinimized) + Q_PROPERTY(int accuracy READ accuracy) + Q_PROPERTY(bool fillGaps READ isFillGaps) + Q_PROPERTY(int fadeDuration READ fadeDuration) + Q_PROPERTY(bool showPanel READ isShowPanel) + Q_PROPERTY(int leftButtonWindow READ leftButtonWindow) + Q_PROPERTY(int rightButtonWindow READ rightButtonWindow) + Q_PROPERTY(int middleButtonWindow READ middleButtonWindow) + Q_PROPERTY(int leftButtonDesktop READ leftButtonDesktop) + Q_PROPERTY(int middleButtonDesktop READ middleButtonDesktop) + Q_PROPERTY(int rightButtonDesktop READ rightButtonDesktop) + Q_PROPERTY(bool dragToClose READ isDragToClose) + // TODO: electric borders private: // Structures struct WindowData { @@ -130,6 +147,55 @@ public: DesktopShowDesktopAction = 3 // Minimizes all windows }; + // for properties + int layoutMode() const { + return m_layoutMode; + } + bool isShowCaptions() const { + return m_showCaptions; + } + bool isShowIcons() const { + return m_showIcons; + } + bool isDoNotCloseWindows() const { + return m_doNotCloseWindows; + } + bool isIgnoreMinimized() const { + return m_ignoreMinimized; + } + int accuracy() const { + return m_accuracy; + } + bool isFillGaps() const { + return m_fillGaps; + } + int fadeDuration() const { + return m_fadeDuration; + } + bool isShowPanel() const { + return m_showPanel; + } + int leftButtonWindow() const { + return m_leftButtonWindow; + } + int rightButtonWindow() const { + return m_rightButtonWindow; + } + int middleButtonWindow() const { + return m_middleButtonWindow; + } + int leftButtonDesktop() const { + return m_leftButtonDesktop; + } + int middleButtonDesktop() const { + return m_middleButtonDesktop; + } + int rightButtonDesktop() const { + return m_rightButtonDesktop; + } + bool isDragToClose() const { + return m_dragToClose; + } public slots: void setActive(bool active); void toggleActive() { diff --git a/effects/resize/resize.h b/effects/resize/resize.h index d6c815c6c1..31f4ff3543 100644 --- a/effects/resize/resize.h +++ b/effects/resize/resize.h @@ -30,6 +30,8 @@ class ResizeEffect : public Effect { Q_OBJECT + Q_PROPERTY(bool textureScale READ isTextureScale) + Q_PROPERTY(bool outline READ isOutline) public: ResizeEffect(); ~ResizeEffect(); @@ -42,6 +44,13 @@ public: virtual void paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data); virtual void reconfigure(ReconfigureFlags); + bool isTextureScale() const { + return m_features & TextureScale; + } + bool isOutline() const { + return m_features & Outline; + } + public Q_SLOTS: void slotWindowStartUserMovedResized(KWin::EffectWindow *w); void slotWindowStepUserMovedResized(KWin::EffectWindow *w, const QRect &geometry); diff --git a/effects/screenshot/screenshot.desktop b/effects/screenshot/screenshot.desktop index 9ff1a13de3..8daa78a3eb 100644 --- a/effects/screenshot/screenshot.desktop +++ b/effects/screenshot/screenshot.desktop @@ -15,7 +15,7 @@ Name[es]=Captura de pantalla Name[et]=Ekraanipilt Name[eu]=Pantaila-argazkia Name[fa]=عکس صفحه -Name[fi]=Ruudun kaappaus +Name[fi]=Kuvankaappaus Name[fr]=Capture d'écran Name[ga]=Seat den Scáileán Name[he]=צילום מסך diff --git a/effects/sheet/sheet.h b/effects/sheet/sheet.h index abee09ae25..305f834828 100644 --- a/effects/sheet/sheet.h +++ b/effects/sheet/sheet.h @@ -33,6 +33,7 @@ class SheetEffect : public Effect { Q_OBJECT + Q_PROPERTY(int duration READ configuredDuration) public: SheetEffect(); virtual void reconfigure(ReconfigureFlags); @@ -44,6 +45,10 @@ public: static bool supported(); + // for properties + int configuredDuration() const { + return duration; + } public Q_SLOTS: void slotWindowAdded(KWin::EffectWindow* c); void slotWindowClosed(KWin::EffectWindow *c); diff --git a/effects/showfps/showfps.h b/effects/showfps/showfps.h index 61be61faf3..00b45c5e61 100644 --- a/effects/showfps/showfps.h +++ b/effects/showfps/showfps.h @@ -33,6 +33,14 @@ class GLTexture; class ShowFpsEffect : public Effect { + Q_OBJECT + Q_PROPERTY(qreal alpha READ configuredAlpha) + Q_PROPERTY(int x READ configuredX) + Q_PROPERTY(int y READ configuredY) + Q_PROPERTY(QRect fpsTextRect READ configuredFpsTextRect) + Q_PROPERTY(int textAlign READ configuredTextAlign) + Q_PROPERTY(QFont textFont READ configuredTextFont) + Q_PROPERTY(QColor textColor READ configuredTextColor) public: ShowFpsEffect(); virtual void reconfigure(ReconfigureFlags); @@ -41,6 +49,29 @@ public: virtual void paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data); virtual void postPaintScreen(); enum { INSIDE_GRAPH, NOWHERE, TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT }; // fps text position + + // for properties + qreal configuredAlpha() const { + return alpha; + } + int configuredX() const { + return x; + } + int configuredY() const { + return y; + } + QRect configuredFpsTextRect() const { + return fpsTextRect; + } + int configuredTextAlign() const { + return textAlign; + } + QFont configuredTextFont() const { + return textFont; + } + QColor configuredTextColor() const { + return textColor; + } private: void paintGL(int fps); #ifdef KWIN_HAVE_XRENDER_COMPOSITING diff --git a/effects/slidingpopups/slidingpopups.h b/effects/slidingpopups/slidingpopups.h index dd51af9d98..ff21eebad4 100644 --- a/effects/slidingpopups/slidingpopups.h +++ b/effects/slidingpopups/slidingpopups.h @@ -33,6 +33,8 @@ class SlidingPopupsEffect : public Effect { Q_OBJECT + Q_PROPERTY(int fadeInTime READ fadeInTime) + Q_PROPERTY(int fadeOutTime READ fadeOutTime) public: SlidingPopupsEffect(); ~SlidingPopupsEffect(); @@ -44,6 +46,13 @@ public: virtual bool isActive() const; // TODO react also on virtual desktop changes + // for properties + int fadeInTime() const { + return mFadeInTime; + } + int fadeOutTime() const { + return mFadeOutTime; + } public Q_SLOTS: void slotWindowAdded(KWin::EffectWindow *c); void slotWindowClosed(KWin::EffectWindow *c); diff --git a/effects/startupfeedback/startupfeedback.cpp b/effects/startupfeedback/startupfeedback.cpp index f3388b56a9..ff6a51e4ec 100644 --- a/effects/startupfeedback/startupfeedback.cpp +++ b/effects/startupfeedback/startupfeedback.cpp @@ -165,6 +165,8 @@ void StartupFeedbackEffect::prePaintScreen(ScreenPrePaintData& data, int time) } data.paint.unite(m_dirtyRect); m_dirtyRect = QRect(); + m_currentGeometry = feedbackRect(); + data.paint.unite(m_currentGeometry); } effects->prePaintScreen(data, time); } @@ -311,12 +313,12 @@ void StartupFeedbackEffect::start(const QString& icon) if (!m_active) effects->startMousePolling(); m_active = true; - m_dirtyRect = m_currentGeometry = feedbackRect(); QPixmap iconPixmap = KIconLoader::global()->loadIcon(icon, KIconLoader::Small, 0, KIconLoader::DefaultState, QStringList(), 0, true); // return null pixmap if not found if (iconPixmap.isNull()) iconPixmap = SmallIcon("system-run"); prepareTextures(iconPixmap); + m_dirtyRect = m_currentGeometry = feedbackRect(); effects->addRepaintFull(); } diff --git a/effects/thumbnailaside/thumbnailaside.h b/effects/thumbnailaside/thumbnailaside.h index 5bb66589cf..841f462ad5 100644 --- a/effects/thumbnailaside/thumbnailaside.h +++ b/effects/thumbnailaside/thumbnailaside.h @@ -39,10 +39,28 @@ class ThumbnailAsideEffect : public Effect { Q_OBJECT + Q_PROPERTY(int maxWidth READ configuredMaxWidth) + Q_PROPERTY(int spacing READ configuredSpacing) + Q_PROPERTY(qreal opacity READ configuredOpacity) + Q_PROPERTY(int screen READ configuredScreen) public: ThumbnailAsideEffect(); virtual void reconfigure(ReconfigureFlags); virtual void paintScreen(int mask, QRegion region, ScreenPaintData& data); + + // for properties + int configuredMaxWidth() const { + return maxwidth; + } + int configuredSpacing() const { + return spacing; + } + qreal configuredOpacity() const { + return opacity; + } + int configuredScreen() const { + return screen; + } private slots: void toggleCurrentThumbnail(); void slotWindowClosed(KWin::EffectWindow *w); diff --git a/effects/trackmouse/trackmouse.cpp b/effects/trackmouse/trackmouse.cpp index 888f8a40bc..9c0d863dc8 100644 --- a/effects/trackmouse/trackmouse.cpp +++ b/effects/trackmouse/trackmouse.cpp @@ -138,9 +138,12 @@ void TrackMouseEffect::paintScreen(int mask, QRegion region, ScreenPaintData& da matrix.translate(p.x(), p.y(), 0.0); matrix.rotate(i ? -2*m_angle : m_angle, 0, 0, 1.0); matrix.translate(-p.x(), -p.y(), 0.0); - if (shader) + if (shader) { shader->setUniform(GLShader::ModelViewMatrix, matrix); - else + shader->setUniform(GLShader::Saturation, 1.0); + shader->setUniform(GLShader::ModulationConstant, QVector4D(1.0, 1.0, 1.0, 1.0)); + shader->setUniform(GLShader::AlphaToOne, 0); + } else pushMatrix(matrix); m_texture[i]->bind(); m_texture[i]->render(region, m_lastRect[i]); diff --git a/effects/trackmouse/trackmouse.h b/effects/trackmouse/trackmouse.h index 731e760eb3..a475714a6b 100644 --- a/effects/trackmouse/trackmouse.h +++ b/effects/trackmouse/trackmouse.h @@ -34,6 +34,8 @@ class TrackMouseEffect : public Effect { Q_OBJECT + Q_PROPERTY(Qt::KeyboardModifiers modifiers READ modifiers) + Q_PROPERTY(bool mousePolling READ isMousePolling) public: TrackMouseEffect(); virtual ~TrackMouseEffect(); @@ -42,6 +44,14 @@ public: virtual void postPaintScreen(); virtual void reconfigure(ReconfigureFlags); virtual bool isActive() const; + + // for properties + Qt::KeyboardModifiers modifiers() const { + return m_modifiers; + } + bool isMousePolling() const { + return m_mousePolling; + } private slots: void toggle(); void slotMouseChanged(const QPoint& pos, const QPoint& old, diff --git a/effects/translucency/translucency.h b/effects/translucency/translucency.h index 193af57fea..35f5448019 100644 --- a/effects/translucency/translucency.h +++ b/effects/translucency/translucency.h @@ -31,12 +31,61 @@ class TranslucencyEffect : public Effect { Q_OBJECT + Q_PROPERTY(qreal decoration READ configuredDecoration) + Q_PROPERTY(qreal moveResize READ configuredMoveResize) + Q_PROPERTY(qreal dialogs READ configuredDialogs) + Q_PROPERTY(qreal inactive READ configuredInactive) + Q_PROPERTY(qreal comboboxPopups READ configuredComboboxPopups) + Q_PROPERTY(qreal menus READ configuredMenus) + Q_PROPERTY(bool individualMenuConfig READ isIndividualMenuConfig) + Q_PROPERTY(qreal dropDownMenus READ configuredDropDownMenus) + Q_PROPERTY(qreal popupMenus READ configuredPopupMenus) + Q_PROPERTY(qreal tornOffMenus READ configuredTornOffMenus) + Q_PROPERTY(int moveResizeDuration READ configuredMoveResizeDuration) + Q_PROPERTY(int activeInactiveDuration READ configuredActiveInactiveDuration) public: TranslucencyEffect(); virtual void reconfigure(ReconfigureFlags); virtual void prePaintWindow(EffectWindow* w, WindowPrePaintData& data, int time); virtual void paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data); + // for properties + qreal configuredDecoration() const { + return decoration; + } + qreal configuredMoveResize() const { + return moveresize; + } + qreal configuredDialogs() const { + return dialogs; + } + qreal configuredInactive() const { + return inactive; + } + qreal configuredComboboxPopups() const { + return comboboxpopups; + } + qreal configuredMenus() const { + return menus; + } + bool isIndividualMenuConfig() const { + return individualmenuconfig; + } + qreal configuredDropDownMenus() const { + return dropdownmenus; + } + qreal configuredPopupMenus() const { + return popupmenus; + } + qreal configuredTornOffMenus() const { + return tornoffmenus; + } + int configuredMoveResizeDuration() const { + return moveresize_timeline.duration(); + } + int configuredActiveInactiveDuration() const { + return activeinactive_timeline.duration(); + } public Q_SLOTS: void slotWindowActivated(KWin::EffectWindow* w); void slotWindowStartStopUserMovedResized(KWin::EffectWindow *w); diff --git a/effects/windowgeometry/windowgeometry.h b/effects/windowgeometry/windowgeometry.h index 789ccfc395..5362b1f762 100644 --- a/effects/windowgeometry/windowgeometry.h +++ b/effects/windowgeometry/windowgeometry.h @@ -29,6 +29,8 @@ namespace KWin class WindowGeometry : public Effect { Q_OBJECT + Q_PROPERTY(bool handlesMoves READ isHandlesMoves) + Q_PROPERTY(bool handlesResizes READ isHandlesResizes) public: WindowGeometry(); ~WindowGeometry(); @@ -40,6 +42,13 @@ public: void paintScreen(int mask, QRegion region, ScreenPaintData &data); virtual bool isActive() const; + // for properties + bool isHandlesMoves() const { + return iHandleMoves; + } + bool isHandlesResizes() const { + return iHandleResizes; + } private slots: void toggle(); void slotWindowStartUserMovedResized(KWin::EffectWindow *w); diff --git a/effects/wobblywindows/wobblywindows.h b/effects/wobblywindows/wobblywindows.h index 94c2e9abf4..69d1f879ea 100644 --- a/effects/wobblywindows/wobblywindows.h +++ b/effects/wobblywindows/wobblywindows.h @@ -25,6 +25,22 @@ struct ParameterSet; class WobblyWindowsEffect : public Effect { Q_OBJECT + Q_PROPERTY(qreal stiffness READ stiffness) + Q_PROPERTY(qreal drag READ drag) + Q_PROPERTY(qreal moveFactor READ moveFactor) + Q_PROPERTY(qreal xTesselation READ xTesselation) + Q_PROPERTY(qreal yTesselation READ yTesselation) + Q_PROPERTY(qreal minVelocity READ minVelocity) + Q_PROPERTY(qreal maxVelocity READ maxVelocity) + Q_PROPERTY(qreal stopVelocity READ stopVelocity) + Q_PROPERTY(qreal minAcceleration READ minAcceleration) + Q_PROPERTY(qreal maxAcceleration READ maxAcceleration) + Q_PROPERTY(qreal stopAcceleration READ stopAcceleration) + Q_PROPERTY(bool moveEffectEnabled READ isMoveEffectEnabled) + Q_PROPERTY(bool openEffectEnabled READ isOpenEffectEnabled) + Q_PROPERTY(bool closeEffectEnabled READ isCloseEffectEnabled) + Q_PROPERTY(bool moveWobble READ isMoveWobble) + Q_PROPERTY(bool resizeWobble READ isResizeWobble) public: WobblyWindowsEffect(); @@ -57,6 +73,55 @@ public: static bool supported(); + // for properties + qreal stiffness() const { + return m_stiffness; + } + qreal drag() const { + return m_drag; + } + qreal moveFactor() const { + return m_move_factor; + } + qreal xTesselation() const { + return m_xTesselation; + } + qreal yTesselation() const { + return m_yTesselation; + } + qreal minVelocity() const { + return m_minVelocity; + } + qreal maxVelocity() const { + return m_maxVelocity; + } + qreal stopVelocity() const { + return m_stopVelocity; + } + qreal minAcceleration() const { + return m_minAcceleration; + } + qreal maxAcceleration() const { + return m_maxAcceleration; + } + qreal stopAcceleration() const { + return m_stopAcceleration; + } + bool isMoveEffectEnabled() const { + return m_moveEffectEnabled; + } + bool isOpenEffectEnabled() const { + return m_openEffectEnabled; + } + bool isCloseEffectEnabled() const { + return m_closeEffectEnabled; + } + bool isMoveWobble() const { + return m_moveWobble; + } + bool isResizeWobble() const { + return m_resizeWobble; + } public Q_SLOTS: void slotWindowAdded(KWin::EffectWindow *w); void slotWindowClosed(KWin::EffectWindow *w); diff --git a/effects/zoom/zoom.h b/effects/zoom/zoom.h index d809b21877..8053fa9962 100644 --- a/effects/zoom/zoom.h +++ b/effects/zoom/zoom.h @@ -36,6 +36,14 @@ class ZoomEffect : public Effect { Q_OBJECT + Q_PROPERTY(qreal zoomFactor READ configuredZoomFactor) + Q_PROPERTY(int mousePointer READ configuredMousePointer) + Q_PROPERTY(int mouseTracking READ configuredMouseTracking) + Q_PROPERTY(bool enableFocusTracking READ isEnableFocusTracking) + Q_PROPERTY(bool followFocus READ isFollowFocus) + Q_PROPERTY(int focusDelay READ configuredFocusDelay) + Q_PROPERTY(qreal moveFactor READ configuredMoveFactor) + Q_PROPERTY(qreal targetZoom READ targetZoom) public: ZoomEffect(); virtual ~ZoomEffect(); @@ -44,6 +52,31 @@ public: virtual void paintScreen(int mask, QRegion region, ScreenPaintData& data); virtual void postPaintScreen(); virtual bool isActive() const; + // for properties + qreal configuredZoomFactor() const { + return zoomFactor; + } + int configuredMousePointer() const { + return mousePointer; + } + int configuredMouseTracking() const { + return mouseTracking; + } + bool isEnableFocusTracking() const { + return enableFocusTracking; + } + bool isFollowFocus() const { + return followFocus; + } + int configuredFocusDelay() const { + return focusDelay; + } + qreal configuredMoveFactor() const { + return moveFactor; + } + qreal targetZoom() const { + return target_zoom; + } private slots: inline void zoomIn() { zoomIn(-1.0); }; void zoomIn(double to); diff --git a/geometry.cpp b/geometry.cpp index dbfb41d8c8..edca21903f 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -64,7 +64,9 @@ void Workspace::desktopResized() { QRect geom; for (int i = 0; i < QApplication::desktop()->screenCount(); i++) { - geom |= QApplication::desktop()->screenGeometry(i); + //do NOT use - QApplication::desktop()->screenGeometry(i) there could be a virtual geometry + // see bug #302783 + geom |= QApplication::desktop()->screen(i)->geometry(); } NETSize desktop_geometry; desktop_geometry.width = geom.width(); @@ -2535,7 +2537,8 @@ bool Client::startMoveResize() geom_restore = geometry(); // "restore" to current geometry setMaximize(false, false); } - } + } else if (quick_tile_mode != QuickTileNone) // no longer now - we move, resize is handled below + setQuickTileMode(QuickTileNone); // otherwise we mess every second tile, bug #303937 } else if ((maximizeMode() == MaximizeFull && options->electricBorderMaximize()) || (quick_tile_mode != QuickTileNone && isMovable() && mode == PositionCenter)) { // Exit quick tile mode when the user attempts to move a tiled window, cannot use isMove() yet diff --git a/kcmkwin/kwincompositing/kwincompositing.desktop b/kcmkwin/kwincompositing/kwincompositing.desktop index 64971c8524..da61cf41ee 100644 --- a/kcmkwin/kwincompositing/kwincompositing.desktop +++ b/kcmkwin/kwincompositing/kwincompositing.desktop @@ -184,6 +184,7 @@ Comment[zh_TW]=設定桌面效果 X-KDE-Keywords=kwin,window,manager,compositing,effect,3D effects,2D effects,OpenGL,XRender,video settings,graphical effects,desktop effects,animations,various animations,window management effects,window switching effect,desktop switching effect,animations,animation speed,desktop animations,drivers,driver settings,rendering,render,invert effect,looking glass effect,magnifier effect,snap helper effect,track mouse effect,zoom effect,blur effect,dashboard effect,explosion effect,fade effect,fade desktop effect,fall apart effect,glide effect,highlight window effect,login effect,logout effect,magic lamp effect,minimize animation effect,mouse mark effect,scale in effect,screenshot effect,sheet effect,slide effect,sliding popups effect,taskbar thumbnails effect,thumbnail aside effect,translucency,translucency effect,transparency,window geometry effect,wobbly windows effect,startup feedback effect,dialog parent effect,dim inactive effect,dim screen effect,slide back effect,eye candy,candy,show FPS effect,show paint effect,box switch effect,cover switch effect,desktop cube effect,desktop cube animation effect,desktop grid effect,flip switch effect,outline effect,present windows effect,resize window effect X-KDE-Keywords[ca]=kwin,finestra,gestor,composició,efecte,efectes 3D,efectes 2D,OpenGL,XRender,arranjament de vídeo,efectes gràfics,efectes d'escriptori,animacions,animacions diverses,efectes de gestió de finestra,efecte de canvi de finestra,efecte de canvi d'escriptori,animacions,velocitat d'animació,animacions d'escriptori,controladors,configuració de controladors,renderització,render,efecte d'inversió,efecte d'aparença de vidre,efecte de lupa,efecte ajudant de desplaçament,efecte de seguiment de ratolí,efecte de zoom,efecte de difuminat,efecte de tauler,efecte d'explosió,efecte d'esvaïment,efecte d'esvaïment d'escriptori,efecte de trencament,efecte de lliscament,efecte de ressaltat de finestra,efecte de connexió,efecte de desconnexió,efecte de làmpada màgica,efecte d'animació de minimització,efecte de marca de ratolí,efecte d'apropament,efecte de captura de pantalla,efecte de full,efecte de diapositiva,efecte de missatges emergents lliscants,efecte de miniatures de barra de tasques,efecte de miniatures laterals,translucidesa,efecte de translucidesa,transparència,efecte de geometria de finestra,efecte de finestres sacsejades,efecte de confirmació d'engegada,efecte de diàleg principal,efecte d'enfosquiment d'inactiu,efecte d'enfosquiment de pantalla, efecte de diapositiva prèvia,decoració,efecte per mostrar FPS,efecte de mostra de pintat,efecte de canvi de caixa,efecte de canvi de coberta,efecte de cub d'escriptori,efecte d'animació de cub d'escriptori,efecte de graella d'escriptori,efecte de canvi en roda,efecte de contorn,efecte de presentació de finestres,efecte de redimensió de finestra X-KDE-Keywords[da]=kwin,vindue,vindueshåndtering,compositing,effekter,3D-effekter,2D-effekter,OpenGL,XRender,grafiske effekter,skrivebordseffekter,animationer,diverse animationer,vindueshåndteringseffekter,effekt til skift af vinduer,effekt til skrivebordsskift,animationshastighed,skrivebordsanimationer,drivere,driverindstillinger,rendering,render,invertereffect,kikkerteffekt,forstørrelsesglaseffekt,hægtehjælpereffekt,følg musen-effekt,zoomeffect,sløreffekt,instrumentbræt,eksplosionseffekt,fade-effect,svæve-effect,fremhæv vindue-effekt,login-effekt,log ud-effekt,magisk lampe-effekt,minimer-effekt,musemærke-effekt,skalerind-effekt,skærmbillede-effekt,glide-effekt,glidende pop-op-effekt,opgavelinjeminiaturer-effekt,gennemsigtighed,transparens,ugennemsigtighed,vinduesgeometri-effekt,wobbly,blævrende vinduer,eye candy,øjeguf,vis FPS-effekt,cube,terning,gitter +X-KDE-Keywords[es]=kwin,ventana,gestor,composición,efecto,efectos 3D,efectos 2D,OpenGL,XRender,preferencias de vídeo,efectos gráficos,efectos del escritorio,animaciones,animaciones diversas,efectos de la gestión de ventanas,efecto de cambio de ventana,efecto de cambio de escritorio,velocidad de animación,animaciones del escritorio,controladores,preferencias del controlador,renderización,renderizar,efecto de inversión,efecto de espejo,efecto de lupa,efecto auxiliar de instantánea,efecto de seguimiento del ratón,efecto de ampliación,efecto borroso,efecto del tablero de mandos,efecto de explosión,efecto de desvanecimiento,efecto de desvanecimiento del escritorio,efecto de romper en pedazos,efecto de planeo,efecto de resaltar ventanas,efecto de inicio de sesion,efecto de final de sesión,efecto de lámpara mágica,efecto de animación al minimizar,efecto de marcas del ratón,efecto de escalado,efecto de captura de pantalla,efecto de hoja,efecto de deslizamiento,efecto de ventanas emergentes deslizantes,efecto de miniaturas de la barra de tareas,efecto de miniaturas laterales,transparencia,efecto de transparencia,efecto de geometría de las ventanas,efecto de ventanas gelatinosas,efecto de notificación de inicio,efecto de padre de la ventana,efecto de oscurecer inactiva,efecto de oscurecer la pantalla,efecto atrás,efectos atractivos,efecto de mostrar FPS,efecto de mostrar pintura,efecto de selección de ventana en caja,efecto de selección de ventana en modo carátula,efecto de cubo del escritorio,efecto de animación del cubo del escritorio,efecto de rejilla del escritorio,efecto de selección de ventana en modo cascada,efecto de contorno,efecto de presentación de ventanas,efecto de cambiar tamaño de las ventanas X-KDE-Keywords[et]=kwin,aken,hakdur,komposiit,efekt,3D efektid,ruumilised efektid,2D efektid,OpenGL,XRender,videoseadistused,graafikaefektid,töölauaefektid,animatsioonid,eri animatsioonid,aknahaldusefektid,akna lülitamise efekt,töölaua lülitamise efekt,animatsioonid,animatsiooni kiirus,töölauaanimatsioonid,draiverid,draiveri seadistused,renderdamine,renderdus,inverteerimisefekt,pikksilmaefekt,suurendusklaasiefekt,tõmbe abistaja efekt,hiire jälgimise efekt,suurendusefekt,häguefekt,vidinavaate efekt,plahvatuseefekt,hääbumisefekt,töölaua kadumise efekt,lagunemise efekt,liuglemisefekt,akna esiletõstmise efekt,sisselogimisefekt,väljalogimisefekt,maagilise laterna efekt,minimeerimisanimatsiooni efekt,hiirega tähistamise efekt,skaleerimisefekt,ekraanipildi efekt,leheefekt,slaidiefekt,liuglevate hüpikakende efekt,tegumiriba pisipiltide efekt,kõrvalasuvate pisipiltide efekt,läbipaistvus,läbipaistvuseefekt,akende geomeetria efekt,vonklevate akende efekt,käivitamise tagasiside efekt,dialoogi eellase efekt,tuhmi mitteaktiivse efekt,tuhmi ekraani efekt,tagasiliugumise efekt,silmarõõm,FPS-i näitamise efekt,joonistamise näitamise efekt,kastina lülitamise efekt,vaiplülitamise efekt,töölauakuubiku efekt, töölauakuubiku animatsiooni efekt,töölauavõrgustiku efekt,pööramisega lülitamise efekt,kontuuriefekt,aktiivsete akende efekt, akende suuruse muutmise efekt X-KDE-Keywords[hu]=kwin,ablak,kezelő,kompozitálás,hatás,3D hatás,2D hatás,OpenGL,XRender,videobeállítások,grafikai hatások,asztali hatások,animációk,különféle animációk,ablakkezelő hatások,ablakváltó hatások,asztalváltó hatások,animációk,animáció sebesség,asztali animációk,meghajtók,meghajtó beállítások,leképezés,renderelés,fordított hatás,tükörhatás,nagyító hatás,elkapás segítő hatás,egérkövetés hatás,nagyítás hatás,elmosás hatás,áttekintő hatás,robbanás hatás,elhalványulás hatás,asztal elhalványulása hatás,széteső hatás,csúszás hatás,ablak kiemelése hatás,belépés hatás,kilépés hatás,varázslámpa hatás,minimalizálás animáció hatás,egérjelölés hatás,méretezés hatás,képernyőkép hatás,munkalap hatás,dia hatás,csúszó felugrók hatás,feladatsáv bélyegképek hatás,bélyegképek félre hatás,áttetszőség,áttetszőség hatás,átlátszóság,ablak geometria hatás,ingó ablak hatás,indulási visszajelzés hatás,párbeszédablak szülő hatás,dim inaktív hatás,dim kijelző hatás,dia vissza hatás,látványelem,édesség,FPS megjelenítése hatás,festék megjelenése hatás,dobozváltás hatás,eltakarás váltás hatás,asztal kocka hatás,asztal kockaanimáció hatás,asztal rács hatás,tükrözésváltás hatás,körvonal hatás,jelenlegi ablakok hatás,ablak átméretezése hatás X-KDE-Keywords[ia]=kwin,fenestra,gerente,componente,effecto,effectos 3D,effectos 2D,OpenGL,XRender,preferentias de video,effectos graphic,effectos de scriptorio,animationes,varie animationes,effectos de gestion de genestra,effecto de commutation de fenestra, effecto de commutation de scriptorio,animationes,velocitate de animation,animationes de scriptorio,drivers, preferentias de driver,rendering,render,effecto de inverter,effecto speculo,effecto aggrandor,effecto de adjuta de photo (snap),effecto de tracia de mus,effecto zoom,effecto indistincte,effecto tabuliero,effecto explosion,effecto discolorate,effect de scriptorio discolorate,effecto de collapsar,effecto glissante, effecto de fenestra evidentiare,effecto de authenticar se,effecto de clauder session ,effecto lampada magic,minimisa effecto de animation,effecto de marca de mus,effecto de scalar,effecto de captura schermo,effecto folio,effecto diapositiva, effecto de popups glissante,effecto de miniatura de barra de carga,effecto de miniatura a parte,translucentia, effecto translucentia,transparentia, effecto de geometria de fenestra, effecto de fenestra tremulante,effecto de retro action, effecto de geniytor de dialogo, effecto inactive obscur, effecto de schermo obscur,effecto de retro glissar,eye candy,candy,monstra effecto FPS,monstra effecto pictura, effecto commuta cassa,effecto de commuta coperturat,effecto cubo de scriptorio,animation de cubo de scriptorio,effecto grillia de scriptorio,effecto flip switch,effecto contorno,effecto de fenestra actual,effect de fenestra redimensionante diff --git a/kcmkwin/kwindecoration/decorationmodel.cpp b/kcmkwin/kwindecoration/decorationmodel.cpp index 3d3bb862f8..4915d10098 100644 --- a/kcmkwin/kwindecoration/decorationmodel.cpp +++ b/kcmkwin/kwindecoration/decorationmodel.cpp @@ -37,6 +37,18 @@ along with this program. If not, see . #include #include "kwindecoration.h" +/* WARNING ------------------------------------------------------------------------- +* it is *ABSOLUTELY* mandatory to manage loadPlugin() and destroyPreviousPlugin() +* using disablePreview() +* +* loadPlugin() moves the present factory pointer to "old_fact" which is then deleted +* by the succeeding destroyPreviousPlugin() +* +* So if you loaded a new plugin and that changed the current factory, call disablePreview() +* BEFORE the following destroyPreviousPlugin() destroys the factory for the current m_preview->deco->factory +* (which is invoked on deco deconstruction) +* WARNING ------------------------------------------------------------------------ */ + namespace KWin { @@ -192,10 +204,12 @@ QVariant DecorationModel::data(const QModelIndex& index, int role) const return static_cast< int >(m_decorations[ index.row()].borderSize); case BorderSizesRole: { QList< QVariant > sizes; - if (m_plugins->loadPlugin(m_decorations[ index.row()].libraryName) && - m_plugins->factory() != NULL) { + const bool mustDisablePreview = m_plugins->factory() && m_plugins->factory() == m_preview->factory(); + if (m_plugins->loadPlugin(m_decorations[index.row()].libraryName) && m_plugins->factory()) { foreach (KDecorationDefines::BorderSize size, m_plugins->factory()->borderSizes()) // krazy:exclude=foreach sizes << int(size); + if (mustDisablePreview) // it's nuked with destroyPreviousPlugin() + m_preview->disablePreview(); // so we need to get rid of m_preview->deco first m_plugins->destroyPreviousPlugin(); } return sizes; @@ -312,6 +326,9 @@ void DecorationModel::regeneratePreview(const QModelIndex& index, const QSize& s document.setHtml(html); bool enabled = false; bool loaded; + // m_preview->deco management is not required + // either the deco loads and the following recreateDecoration will sanitize decos (on new factory) + // or the deco does not load and destroyPreviousPlugin() is not called if ((loaded = m_plugins->loadPlugin(data.libraryName)) && m_preview->recreateDecoration(m_plugins)) { enabled = true; m_preview->enablePreview(); diff --git a/kcmkwin/kwindecoration/kwindecoration.cpp b/kcmkwin/kwindecoration/kwindecoration.cpp index 34d9b48261..1f7a20969b 100644 --- a/kcmkwin/kwindecoration/kwindecoration.cpp +++ b/kcmkwin/kwindecoration/kwindecoration.cpp @@ -121,6 +121,7 @@ KWinDecorationModule::KWinDecorationModule(QWidget* parent, const QVariantList & connect(m_ui->decorationList->verticalScrollBar(), SIGNAL(valueChanged(int)), SLOT(updateViewPosition(int))); m_ui->decorationList->installEventFilter(this); + m_ui->decorationList->viewport()->installEventFilter(this); KAboutData *about = new KAboutData(I18N_NOOP("kcmkwindecoration"), 0, @@ -404,6 +405,10 @@ bool KWinDecorationModule::eventFilter(QObject *o, QEvent *e) return true; } } + } else if (m_ui->decorationList->viewport()) { + if (e->type() == QEvent::Wheel) { + return static_cast(e)->orientation() == Qt::Horizontal; + } } return KCModule::eventFilter(o, e); } diff --git a/kcmkwin/kwindecoration/kwindecoration.desktop b/kcmkwin/kwindecoration/kwindecoration.desktop index 17510c61c1..e95284242d 100644 --- a/kcmkwin/kwindecoration/kwindecoration.desktop +++ b/kcmkwin/kwindecoration/kwindecoration.desktop @@ -166,7 +166,7 @@ X-KDE-Keywords[da]=kwin,vindueshåndtering,window,manager,kant,stil,tema,udseend X-KDE-Keywords[de]=KWin,Kwm,Fenster,Manager,Rahmen,Design,Stile,Themes,Optik,Erscheinungsbild,Layout,Knöpfe,Ränder,Dekorationen X-KDE-Keywords[es]=kwin,ventana,gestor,borde,estilo,tema,aspecto,sensación,disposición,botón,asa,borde,kwm,decoración X-KDE-Keywords[et]=kwin,aken,haldur,piire,stiil,teema,välimus,paigutus,nupp,pide,serv,kwm,dekoratsioon -X-KDE-Keywords[fi]=kwin,ikkuna,hallinta,ikkunaohjelma,kehys,reunus,tyyli,teema,ulkoasu,käyttäytyminen,asettelu,painike,kahva,kulma,reuna,kwm,koriste +X-KDE-Keywords[fi]=kwin,ikkuna,hallinta,ikkunaohjelma,kehys,reunus,tyyli,teema,ulkoasu,toiminta,asettelu,painike,kahva,kulma,reuna,kwm,koriste X-KDE-Keywords[fr]=kwin,fenêtre,gestionnaire,composition,bordure,style,thème,apparence,comportement,disposition,bouton,prise en main,bord,kwm,décoration X-KDE-Keywords[ga]=kwin,fuinneog,bainisteoir,imlíne,stíl,téama,cuma,brath,leagan amach,cnaipe,hanla,ciumhais,kwm,maisiúchán X-KDE-Keywords[hu]=kwin,ablak,kezelő,szegély,stílus,téma,kinézet,megjelenés,elrendezés,gomb,kezel,szél,kwm,dekoráció diff --git a/kcmkwin/kwindecoration/preview.cpp b/kcmkwin/kwindecoration/preview.cpp index fe802c7345..587df7c5b7 100644 --- a/kcmkwin/kwindecoration/preview.cpp +++ b/kcmkwin/kwindecoration/preview.cpp @@ -103,6 +103,11 @@ void KDecorationPreview::disablePreview() no_preview->show(); } +KDecorationFactory *KDecorationPreview::factory() const +{ + return deco[Active] ? deco[Active]->factory() : 0; +} + void KDecorationPreview::paintEvent(QPaintEvent* e) { Q_UNUSED(e); diff --git a/kcmkwin/kwindecoration/preview.h b/kcmkwin/kwindecoration/preview.h index 20ee869f9b..52645fd767 100644 --- a/kcmkwin/kwindecoration/preview.h +++ b/kcmkwin/kwindecoration/preview.h @@ -50,6 +50,7 @@ public: bool recreateDecoration(KDecorationPlugins* plugin); void enablePreview(); void disablePreview(); + KDecorationFactory *factory() const; void setPreviewMask(const QRegion&, int, bool); QRegion unobscuredRegion(bool, const QRegion&) const; QRect windowGeometry(bool) const; diff --git a/kcmkwin/kwinoptions/kwinactions.desktop b/kcmkwin/kwinoptions/kwinactions.desktop index 7d1daea774..678dd994a6 100644 --- a/kcmkwin/kwinoptions/kwinactions.desktop +++ b/kcmkwin/kwinoptions/kwinactions.desktop @@ -125,7 +125,7 @@ Comment[es]=Configuración del teclado y del ratón Comment[et]=Klaviatuuri ja hiire seadistamine Comment[eu]=Konfiguratu teklatua eta saguaren ezarpenak Comment[fa]=پیکربندی تنظیمات صفحه کلید و موشی -Comment[fi]=Muokkaa näppäimistön ja hiiren asetuksia +Comment[fi]=Näppäimistön ja hiiren asetukset Comment[fr]=Configuration des paramètres du clavier et de la souris Comment[fy]=Hjir kinne jo de ynstellings fan toetseboerd en mûs ynstelle Comment[ga]=Cumraigh socruithe an mhéarchláir agus na luiche diff --git a/kcmkwin/kwinoptions/kwinadvanced.desktop b/kcmkwin/kwinoptions/kwinadvanced.desktop index 0a7139c167..853901fc38 100644 --- a/kcmkwin/kwinoptions/kwinadvanced.desktop +++ b/kcmkwin/kwinoptions/kwinadvanced.desktop @@ -189,6 +189,7 @@ Comment[zh_TW]=設定進階視窗管理功能 X-KDE-Keywords=shading,border,hover,active borders,tiling,tabs,tabbing,window tabbing,window grouping,window tiling,window placement,placement of windows,window advanced behavior X-KDE-Keywords[ca]=ombra,vora,passar per sobre,vores actives,mosaic,pestanyes,pestanyes de finestra,agrupació de finestres,mosaic de finestres,col·locació de finestres,comportament avançat de finestra X-KDE-Keywords[da]=kant,hover,aktive kanter,tiling,faneblade,vinduesfaneblade,gruppering af vinduer,vinduesplacering,placering af vinduer,avanceret vinduesopførsel +X-KDE-Keywords[es]=sombra,borde,pasada,bordes activos,mosaico,pestañas,páginas en pestañas,pestañas de páginas,agrupación de ventanas,ventanas en mosaico,posicionamiento de ventanas,comportamiento avanzado de las ventanas X-KDE-Keywords[et]=varjamine,piire,kohalviibimine,aktiivsed piirded,paanimine,kaardid,aknad kaartidena,akende rühmitamine,akende paanimine,akende paigutus, akende täpne käitumine X-KDE-Keywords[fi]=shading,border,hover,active borders,tiling,tabs,tabbing,window tabbing,window grouping,window tiling,window placement,placement of windows,window advanced behavior,varjostus,raja,kohdistus,aktiiviset reunat,välilehdet,ikkunoiden ryhmittely,ikkunoiden sijoittelu,ikkunoiden lisäasetukset X-KDE-Keywords[hu]=árnyékolás,szegély,lebegés,aktív szegélyek,csempézés,bejárás,ablakbejárás,ablakcsoportosítás,ablakcsempézés,ablakelhelyezés,ablakok elhelyezése,ablak speciális viselkedése diff --git a/kcmkwin/kwinoptions/kwinfocus.desktop b/kcmkwin/kwinoptions/kwinfocus.desktop index 1f76b28ab0..ed0ea1f9e5 100644 --- a/kcmkwin/kwinoptions/kwinfocus.desktop +++ b/kcmkwin/kwinoptions/kwinfocus.desktop @@ -186,6 +186,7 @@ Comment[zh_TW]=設定視窗焦點政策 X-KDE-Keywords=focus,placement,auto raise,raise,click raise,keyboard,CDE,alt-tab,all desktop,focus follows mouse,focus prevention,focus stealing,focus policy,window focus behavior,window screen behavior X-KDE-Keywords[ca]=focus,col·locació,elevació automàtica,elevació,elevació en clic,teclat,CDE,alt-tab,tots els escriptoris,focus segueix el ratolí,prevenció de focus,robatori de focus,política de focus,comportament de focus de finestra,comportament de pantalla de finestra X-KDE-Keywords[da]=fokus,placering,autohæv,hæv,klikhæv,tastatur,CDE,alt-tab,alle skriveborde,fokus følger mus,fokusforhindring,stjæler fokus,fokuspolitik,opførsel for vinduesfokus +X-KDE-Keywords[es]=foco,posicionamiento,auto levantar,levantar,clic para levantar,teclado,CDE,alt-tab,todo el escritorio,el foco sigue al ratón,prevención de foco,robo del foco,política del foco,comportamiento del foco de las ventanas,comportamiento de la pantalla de ventanas X-KDE-Keywords[et]=fookus,asetus,paigutus,automaatne esiletoomine,klõpsuga esiletoomine,klaviatuur,CDE,alt-tab,kõik töölauad,fookus järgib hiirt,fookuse vältimine,fookuse röövimine,fookuse reegel,akna fookuse käitumine X-KDE-Keywords[hu]=fókusz,elhelyezés,automatikus felemelés,felemelés,kattintásra felemelés,billentyűzet,CDE,alt-tab,összes asztal,egérkövető fókusz,fókuszmegelőzés,fókuszlopás,fókusz házirend,ablakfókusz működése,ablakképernyő működése X-KDE-Keywords[ia]=focus,placiamento,auto raise,raise,click raise,clavierp,CDE,alt-tab,all desktop,focus seque mus,prevention de focus,focus stealing,politica de focus,comportamento de foco de fenestra,comportamento de schermo de fenestra diff --git a/kcmkwin/kwinoptions/kwinoptions.desktop b/kcmkwin/kwinoptions/kwinoptions.desktop index 7df86c129b..2931d0702a 100644 --- a/kcmkwin/kwinoptions/kwinoptions.desktop +++ b/kcmkwin/kwinoptions/kwinoptions.desktop @@ -37,7 +37,7 @@ Name[es]=Comportamiento de la ventana Name[et]=Akende käitumine Name[eu]=Leihoen portaera Name[fa]=رفتار پنجره -Name[fi]=Ikkunoiden käyttäytyminen +Name[fi]=Ikkunoiden toiminta Name[fr]=Comportement des fenêtres Name[fy]=Finstergedrach Name[ga]=Oibriú na bhFuinneog @@ -196,7 +196,7 @@ X-KDE-Keywords[da]=fokus,placering,vinduesopførsel,animation,hæv,autohæv,vind X-KDE-Keywords[de]=Aktivierung,Platzierung,Fensterverhalten,Animation,Nach vorn/hinten, Fenster,Rahmen,Umrandung,Titelleiste,Doppelklick X-KDE-Keywords[es]=foco,localización,comportamiento de la ventana,animación,elevación,autoelevación,ventanas,marco,barra de título,doble clic X-KDE-Keywords[et]=fookus,asetus,paigutus,akende käitumine,animeerimine,animatsioon,esiletoomine,automaatne esiletoomine,aknad,raam,tiitliriba,topeltklõps -X-KDE-Keywords[fi]=kohdistus,sijoittelu,sijoitus,ikkunoiden käyttäytyminen,animaatio,nosta,automaattinen nosto,ikkunat,kehys,otsikkopalkki,kaksoisnapsautus,tuplanapsautus,kaksoisklikkaus,tuplaklikkaus +X-KDE-Keywords[fi]=kohdistus,sijoittelu,sijoitus,ikkunoiden toiminta,animaatio,nosta,automaattinen nosto,ikkunat,kehys,otsikkopalkki,kaksoisnapsautus,tuplanapsautus,kaksoisklikkaus,tuplaklikkaus X-KDE-Keywords[fr]=focus,placement,comportement de la fenêtre,animation,agrandissement,agrandissement automatique,fenêtres,cadre,barre de titre,double clic X-KDE-Keywords[ga]=fócas,láithriú,oibriú na bhfuinneog,beochan,ardaigh,uathardaigh,fuinneoga,fráma,ceannteideal,déchliceáil X-KDE-Keywords[hu]=fókus,elhelyezés,ablakműködés,animáció,felemelés,automatikus felemelés,ablakok,keret,címsor,dupla kattintás diff --git a/kcmkwin/kwinrules/kwinrules.desktop b/kcmkwin/kwinrules/kwinrules.desktop index e098003466..80723e783f 100644 --- a/kcmkwin/kwinrules/kwinrules.desktop +++ b/kcmkwin/kwinrules/kwinrules.desktop @@ -165,7 +165,7 @@ X-KDE-Keywords[da]=størrelse,position,tilstand,vinduesopførsel,vinduer,specifi X-KDE-Keywords[de]=Größe,Position,Status,Fensterverhalten,Fenster,Regeln X-KDE-Keywords[es]=tamaño,posición,estado,comportamiento de la ventana,ventanas,específicos,soluciones,recordatorio,reglas X-KDE-Keywords[et]=suurus,asukoht,olek,akende käitumine,aknad,meeldejätmine,reeglid -X-KDE-Keywords[fi]=koko,sijainti,tila,ikkunan käyttäytyminen,ikkunat,erikoisasetukset,ikkunakohtaiset,korjaukset,muista,muistaminen,säännöt +X-KDE-Keywords[fi]=koko,sijainti,tila,ikkunoiden toiminta,ikkunat,erikoisasetukset,ikkunakohtaiset,korjaukset,muista,muistaminen,säännöt X-KDE-Keywords[fr]=taille,position,état,comportement de la fenêtre,fenêtres,spécifique,contournements,rappel,règles X-KDE-Keywords[ga]=méid,ionad,staid,oibriú na bhfuinneog,fuinneoga,sainiúil,réitigh seiftithe,meabhraigh,rialacha X-KDE-Keywords[hu]=méret,elhelyezkedés,állapot,ablakműködés,ablakok,specifikus,kerülő megoldások,megjegyzés,szabályok diff --git a/kcmkwin/kwinscripts/kwinscripts.desktop b/kcmkwin/kwinscripts/kwinscripts.desktop index 1c65f14a8b..7e669ea280 100644 --- a/kcmkwin/kwinscripts/kwinscripts.desktop +++ b/kcmkwin/kwinscripts/kwinscripts.desktop @@ -61,6 +61,7 @@ Name[pa]=KWin ਸਕ੍ਰਿਪਟ Name[pl]=Skrypty KWin Name[pt]=Programas do KWin Name[pt_BR]=Scripts do KWin +Name[sk]=KWin skripty Name[sl]=Skripti KWin Name[sr]=К‑винове скрипте Name[sr@ijekavian]=К‑винове скрипте @@ -78,9 +79,10 @@ Comment[ca]=Gestiona scripts del KWin Comment[cs]=Spravovat skripty KWinu Comment[da]=Håndtér KWin-scripts Comment[de]=KWin-Skripte verwalten +Comment[el]=Διαχείριση σεναρίων KWin Comment[es]=Gestionar guiones de KWin Comment[et]=KWini skriptide haldamine -Comment[fi]=Hallitse KWin-skriptejä +Comment[fi]=KWin-skriptien hallinta Comment[hu]=KWin szkriptek kezelése Comment[ia]=Gere scriptos de KWin Comment[it]=Gestione script kwin diff --git a/kcmkwin/kwintabbox/main.cpp b/kcmkwin/kwintabbox/main.cpp index 5850416e3a..412af78108 100644 --- a/kcmkwin/kwintabbox/main.cpp +++ b/kcmkwin/kwintabbox/main.cpp @@ -267,18 +267,12 @@ void KWinTabBoxConfig::loadConfig(const KConfigGroup& config, KWin::TabBox::TabB config.readEntry("MultiScreenMode", TabBoxConfig::defaultMultiScreenMode()))); tabBoxConfig.setClientSwitchingMode(TabBoxConfig::ClientSwitchingMode( config.readEntry("SwitchingMode", TabBoxConfig::defaultSwitchingMode()))); - tabBoxConfig.setLayout(TabBoxConfig::LayoutMode( - config.readEntry("LayoutMode", TabBoxConfig::defaultLayoutMode()))); tabBoxConfig.setShowOutline(config.readEntry("ShowOutline", TabBoxConfig::defaultShowOutline())); tabBoxConfig.setShowTabBox(config.readEntry("ShowTabBox", TabBoxConfig::defaultShowTabBox())); tabBoxConfig.setHighlightWindows(config.readEntry("HighlightWindows", TabBoxConfig::defaultHighlightWindow())); - tabBoxConfig.setMinWidth(config.readEntry("MinWidth", TabBoxConfig::defaultMinWidth())); - tabBoxConfig.setMinHeight(config.readEntry("MinHeight", TabBoxConfig::defaultMinHeight())); - tabBoxConfig.setLayoutName(config.readEntry("LayoutName", TabBoxConfig::defaultLayoutName())); - tabBoxConfig.setSelectedItemLayoutName(config.readEntry("SelectedLayoutName", TabBoxConfig::defaultSelectedItemLayoutName())); } void KWinTabBoxConfig::saveConfig(KConfigGroup& config, const KWin::TabBox::TabBoxConfig& tabBoxConfig) @@ -291,18 +285,13 @@ void KWinTabBoxConfig::saveConfig(KConfigGroup& config, const KWin::TabBox::TabB config.writeEntry("ShowDesktopMode", int(tabBoxConfig.showDesktopMode())); config.writeEntry("MultiScreenMode", int(tabBoxConfig.clientMultiScreenMode())); config.writeEntry("SwitchingMode", int(tabBoxConfig.clientSwitchingMode())); - config.writeEntry("LayoutMode", int(tabBoxConfig.layout())); config.writeEntry("LayoutName", tabBoxConfig.layoutName()); - config.writeEntry("SelectedLayoutName", tabBoxConfig.selectedItemLayoutName()); // check boxes config.writeEntry("ShowOutline", tabBoxConfig.isShowOutline()); config.writeEntry("ShowTabBox", tabBoxConfig.isShowTabBox()); config.writeEntry("HighlightWindows", tabBoxConfig.isHighlightWindows()); - // spin boxes - config.writeEntry("MinWidth", tabBoxConfig.minWidth()); - config.writeEntry("MinHeight", tabBoxConfig.minHeight()); config.sync(); } diff --git a/kcmkwin/kwintabbox/qml/main.qml b/kcmkwin/kwintabbox/qml/main.qml index 7f55ff9b7f..300474b70f 100644 --- a/kcmkwin/kwintabbox/qml/main.qml +++ b/kcmkwin/kwintabbox/qml/main.qml @@ -56,4 +56,4 @@ Item { } visible: true } -} \ No newline at end of file +} diff --git a/kwin.notifyrc b/kwin.notifyrc index 3937877050..be477a879d 100644 --- a/kwin.notifyrc +++ b/kwin.notifyrc @@ -7125,8 +7125,10 @@ Action=Popup [Event/fullscreen] Name=Window Fullscreen Set Name[ca]=Estableix a pantalla completa +Name[cs]=Okno nastaveno na celou obrazovku Name[da]=Fuldskærmsvindue sat Name[el]=Ορίστηκε πλήρης οθόνη +Name[es]=Ventana a pantalla completa activa Name[et]=Aken täisekraanirežiimis Name[fi]=Ikkunan koko näytön tila asetettu Name[hu]=Ablak teljes képernyőre állítása @@ -7153,9 +7155,11 @@ Name[zh_CN]=窗口全屏已设置 Name[zh_TW]=已設定成全螢幕 Comment=A window has been set to fullscreen Comment[ca]=Una finestra s'ha definit a pantalla completa +Comment[cs]=Okno bylo nastaveno na celou obrazovku Comment[da]=Et vindue er blevet sat til fuldskærm Comment[de]=Ein Fenster ist in den Vollbildmodus versetzt worden Comment[el]=Ένα παράθυρο ορίστηκε σε πλήρης οθόνη +Comment[es]=Una ventana se ha activado a pantalla completa Comment[et]=Aken on viidud täisekraani Comment[fi]=Ikkuna on asetettu koko näytön tilaan Comment[hu]=Az ablak teljes képernyőre lett állítva @@ -7185,8 +7189,10 @@ Comment[zh_TW]=已將視窗設定成全螢幕 [Event/unfullscreen] Name=Window Fullscreen Restored Name[ca]=Finestra a pantalla completa restaurada +Name[cs]=Okno obnoveno z celé obrazovky Name[da]=Fuldskærmsvindue gendannet Name[el]=Επαναφορά παραθύρου πλήρης οθόνης +Name[es]=Ventana a pantalla completa restaurada Name[et]=Aken on täisekraanist taastatud Name[fi]=Ikkunan koko näytön tila palautettu Name[hu]=Az ablak teljes képernyőről visszaállítva @@ -7213,9 +7219,11 @@ Name[zh_CN]=窗口全屏已恢复 Name[zh_TW]=已還原全螢幕 Comment=A window has been restored from fullscreen Comment[ca]=Una finestra s'ha restaurat des de pantalla completa +Comment[cs]=Okno bylo obnoveno z celé obrazovky Comment[da]=Et vindue er blevet gendannet fra fuldskærm Comment[de]=Ein Fenster ist aus dem Vollbildmodus wiederhergestellt worden Comment[el]=Ένα παράθυρο επανήλθε από πλήρης οθόνη +Comment[es]=Una ventana se ha restaurado desde pantalla completa Comment[et]=Aken on täisekraanist taastatud Comment[fi]=Ikkuna on palautettu koko näytön tilasta Comment[hu]=Az ablak vissza lett állítva a teljes képernyőről diff --git a/libkdecorations/kdecoration_plugins_p.cpp b/libkdecorations/kdecoration_plugins_p.cpp index c131a41ff9..bcdc1d8ea9 100644 --- a/libkdecorations/kdecoration_plugins_p.cpp +++ b/libkdecorations/kdecoration_plugins_p.cpp @@ -228,7 +228,7 @@ bool KDecorationPlugins::loadPlugin(QString nameStr) if (!create_ptr) { // this means someone probably attempted to load "some" kwin plugin/lib as deco // and thus cheated on the "isLoaded" shortcut -> try the default and yell a warning if (nameStr != defaultPlugin) { - kWarning(1212) << i18n("The library %1 was attempted to be load as decoration plugin but is NOT", nameStr); + kWarning(1212) << i18n("The library %1 was attempted to be loaded as a decoration plugin but it is NOT", nameStr); return loadPlugin(defaultPlugin); } else { // big time trouble! diff --git a/org.kde.KWin.xml b/org.kde.KWin.xml index da7c55afb8..e8f4fb7eca 100644 --- a/org.kde.KWin.xml +++ b/org.kde.KWin.xml @@ -58,6 +58,10 @@ + + + + diff --git a/scene_opengl_glx.cpp b/scene_opengl_glx.cpp index b016bba932..e0654b5861 100644 --- a/scene_opengl_glx.cpp +++ b/scene_opengl_glx.cpp @@ -633,7 +633,7 @@ void SceneOpenGL::screenGeometryChanged(const QSize &size) m_overlayWindow->setup(buffer); XSync(display(), false); // ensure X11 stuff has applied //// glXMakeCurrent(display(), glxbuffer, ctxbuffer); // reactivate context //// - glViewport(0,0, size.width(), size.height()); // adjust viewport last - should btw. be superflous on the Pixmap buffer - iirc glXCreatePixmap sets the context anyway. //// + glViewport(0,0, size.width(), size.height()); // adjust viewport last - should btw. be superfluous on the Pixmap buffer - iirc glXCreatePixmap sets the context anyway. //// } ShaderManager::instance()->resetAllShaders(); m_resetModelViewProjectionMatrix = true; diff --git a/scripting/kwinscript.desktop b/scripting/kwinscript.desktop index 0c1772bc06..6ba5719f54 100644 --- a/scripting/kwinscript.desktop +++ b/scripting/kwinscript.desktop @@ -22,6 +22,7 @@ Comment[pa]=KWin ਸਕ੍ਰਿਪਟ Comment[pl]=Skrypt KWin Comment[pt]=Programa do KWin Comment[pt_BR]=Script do KWin +Comment[sk]=KWin skript Comment[sl]=Skript KWin Comment[sr]=К‑винова скрипта Comment[sr@ijekavian]=К‑винова скрипта diff --git a/scripts/desktopchangeosd/metadata.desktop b/scripts/desktopchangeosd/metadata.desktop index c681eeaed9..ac59928ff2 100644 --- a/scripts/desktopchangeosd/metadata.desktop +++ b/scripts/desktopchangeosd/metadata.desktop @@ -1,8 +1,10 @@ [Desktop Entry] Name=Desktop Change OSD Name[ca]=OSD de canvi d'escriptori +Name[cs]=OSD změny plochy Name[da]=OSD til skrivebordsskift Name[el]=OSD αλλαγής επιφάνειας εργασίας +Name[es]=Información en pantalla sobre cambio de escritorio Name[et]=Töölaua muutmise ekraaniesitus Name[fi]=Työpöydänvaihdon ilmoitus Name[hu]=Asztal változtatás OSD @@ -29,9 +31,12 @@ Name[zh_CN]=桌面更改屏幕显示 Name[zh_TW]=螢幕顯示桌面變更 Comment=An on screen display indicating the desktop change Comment[ca]=En un missatge per pantalla indicant el canvi d'escriptori +Comment[cs]=Displej označující změnu plochy Comment[da]=Et on-screen-display som indikerer skift af skrivebord +Comment[es]=Una información en pantalla que indica el cambio de escritorio Comment[et]=Töölaua muutumist näitab ekraanikuva Comment[fi]=Näytölle ilmestyvä ilmoitus työpöydän vaihdosta +Comment[hu]=Egy képernyőn megjelenő kijelzés, amely jelzi az asztal változásait Comment[ia]=Un monstrator sur le schermo indicante le modification de scriptorio Comment[it]=Un display sullo schermo che indica il cambio di desktop Comment[kk]=Үстел ауыстыруын көрсететін экран дисплейі diff --git a/scripts/synchronizeskipswitcher/metadata.desktop b/scripts/synchronizeskipswitcher/metadata.desktop index e2e310ff99..168813444f 100644 --- a/scripts/synchronizeskipswitcher/metadata.desktop +++ b/scripts/synchronizeskipswitcher/metadata.desktop @@ -1,7 +1,9 @@ [Desktop Entry] Name=Synchronize Skip Switcher with Taskbar Name[ca]=Sincronitza el «Ignora el commutador» amb la barra de tasques +Name[cs]=Synchronizovat přepínač přeskakování s pruhem úloh Name[da]=Synkronisér skip-skifter med opgavelinjen +Name[es]=Sincronizar «Omitir cambiador» con la barra de tareas Name[et]=Vahelejätmise lülitaja sünkroonimine tegumiribaga Name[hu]=Skip-váltó szinkronizálása a feladatsávval Name[ia]=Synchronisa Commutator de salto con Barra de carga @@ -26,8 +28,11 @@ Name[x-test]=xxSynchronize Skip Switcher with Taskbarxx Name[zh_TW]=將工作列中設定要忽略的視窗也套用在視窗切換器 Comment=Hides all windows marked as Skip Taskbar to be also excluded from window switchers (e.g. Alt+Tab) Comment[ca]=Oculta totes les finestres marcades com a «Ignora la barra de tasques» que també s'excloguin del commutador de finestres (p. ex. Alt+Tab) +Comment[cs]=Skryje všechna okna označená k přeskočení v pruhu úloh také pro přepínače oken (např. Alt+Tab) Comment[da]=Skjuler alle vinduer der er markeret som "Skip opgavelinje", så de også udelades fra vinduesskiftere (f.eks. Alt+Tab) +Comment[es]=Oculta todas las ventanas marcadas como «Omitir barra de tareas» para que también sean excluidas de los selectores de ventana (por ejemplo, Alt+Tab) Comment[et]=Kõigi tegumiribalt väljajäetavaks märgitud akende peitmine, et neid ei kaasataks ka aknavahetajatesse (nt Alt+Tab) +Comment[hu]=A Skip feladatsávként megjelölt összes ablak elrejtése, kivéve az ablakváltókat (például Alt+Tab) Comment[ia]=Cela omne fenestras marcate como barra de cargas de salto pro anque esser excludite ex commutatores de fenestra (p.ex.Alt+Tab) Comment[it]=Nascondi tutte le finestre marcate come Salta barra delle applicazioni che sono escluse anche dallo scambiafinestre (es. Alt+Tab) Comment[kk]=Көрсетілмейтін деп белгіленген бүкіл терезелерін терезе ауыстырғышында да (мысалы, Alt-Tab дегенде) көрсетпеу diff --git a/scripts/videowall/metadata.desktop b/scripts/videowall/metadata.desktop index bd8cfcd9fd..21f6a0eb1c 100644 --- a/scripts/videowall/metadata.desktop +++ b/scripts/videowall/metadata.desktop @@ -5,6 +5,7 @@ Name[cs]=Video stěna Name[da]=Videovæg Name[de]=Video-Wand Name[el]=Τοίχος με οθόνες +Name[es]=Panel de vídeo Name[et]=Videosein Name[fi]=Videoseinä Name[hu]=Videófal @@ -31,6 +32,7 @@ Name[zh_TW]=影像牆 Comment=Spans fullscreen video player over all attached screens to create a Video Wall Comment[ca]=Expandeix el reproductor de vídeo a pantalla completa per totes les pantalles enganxades per crear un mur de vídeo. Comment[da]=Udfolder videoafspiller i fuldskærm over alle tilsluttede skærme og danner derved en videovæg +Comment[es]=Extiende el reproductor de vídeo a pantalla completa sobre todas las pantallas conectadas para crear un panel de vídeo Comment[et]=Täisekraan-videomängija laiendamine kõigile ühendatud ekraanile videoseina loomiseks Comment[fi]=Levittää koko näytön tilassa olevan videotoistimen kaikkiin yhdistettyihin näyttöihin luoden videoseinän Comment[hu]=Kiterjeszti a teljes képernyős videólejátszót az összes csatolt kijelzőre, hogy videófalat hozzon létre diff --git a/tabbox/clientmodel.cpp b/tabbox/clientmodel.cpp index b78c1f5ce4..ddb0659a54 100644 --- a/tabbox/clientmodel.cpp +++ b/tabbox/clientmodel.cpp @@ -106,39 +106,13 @@ QString ClientModel::longestCaption() const int ClientModel::columnCount(const QModelIndex& parent) const { Q_UNUSED(parent) - int count = 1; - switch(tabBox->config().layout()) { - case TabBoxConfig::HorizontalLayout: - count = m_clientList.count(); - break; - case TabBoxConfig::VerticalLayout: - count = 1; - break; - case TabBoxConfig::HorizontalVerticalLayout: - count = qRound(sqrt(float(m_clientList.count()))); - if (count * count < m_clientList.count()) - count++; - break; - } - return qMax(count, 1); + return 1; } int ClientModel::rowCount(const QModelIndex& parent) const { Q_UNUSED(parent) - int count = 1; - switch(tabBox->config().layout()) { - case TabBoxConfig::HorizontalLayout: - count = 1; - break; - case TabBoxConfig::VerticalLayout: - count = m_clientList.count(); - break; - case TabBoxConfig::HorizontalVerticalLayout: - count = qRound(sqrt(float(m_clientList.count()))); - break; - } - return qMax(count, 1); + return m_clientList.count(); } QModelIndex ClientModel::parent(const QModelIndex& child) const diff --git a/tabbox/desktopmodel.cpp b/tabbox/desktopmodel.cpp index 0be873980b..0e43ce8e42 100644 --- a/tabbox/desktopmodel.cpp +++ b/tabbox/desktopmodel.cpp @@ -64,41 +64,13 @@ QVariant DesktopModel::data(const QModelIndex& index, int role) const int DesktopModel::columnCount(const QModelIndex& parent) const { Q_UNUSED(parent) - int count = 1; - switch(tabBox->config().layout()) { - case TabBoxConfig::HorizontalLayout: - count = m_desktopList.count(); - break; - case TabBoxConfig::VerticalLayout: - count = 1; - break; - case TabBoxConfig::HorizontalVerticalLayout: - count = qRound(sqrt(float(m_desktopList.count()))); - if (count * count < m_desktopList.count()) - count++; - // TODO: pager layout? - break; - } - return qMax(count, 1); + return 1; } int DesktopModel::rowCount(const QModelIndex& parent) const { Q_UNUSED(parent) - int count = 1; - switch(tabBox->config().layout()) { - case TabBoxConfig::HorizontalLayout: - count = 1; - break; - case TabBoxConfig::VerticalLayout: - count = m_desktopList.count(); - break; - case TabBoxConfig::HorizontalVerticalLayout: - count = qRound(sqrt(float(m_desktopList.count()))); - // TODO: pager layout? - break; - } - return qMax(count, 1); + return m_desktopList.count(); } QModelIndex DesktopModel::parent(const QModelIndex& child) const diff --git a/tabbox/kwinwindowswitcher.desktop b/tabbox/kwinwindowswitcher.desktop index b71c912a7f..32888adb79 100644 --- a/tabbox/kwinwindowswitcher.desktop +++ b/tabbox/kwinwindowswitcher.desktop @@ -6,6 +6,8 @@ Comment=KWin Window Switcher Layout Comment[ca]=Disposició del commutador de finestres del KWin Comment[da]=Layout til KWins vinduesskifter Comment[de]=Fensterwechsler-Layout +Comment[el]=Διάταξη εναλλαγής παραθύρων Kwin +Comment[es]=Esquema del cambiador de ventanas de KWin Comment[et]=KWini aknavahetaja paigutus Comment[fi]=KWinin tehtävänvalitsimen asettelu Comment[hu]=KWin ablakváltó elrendezés diff --git a/tabbox/qml/clients/big_icons/contents/ui/main.qml b/tabbox/qml/clients/big_icons/contents/ui/main.qml index a95264ed70..7115b7f4d9 100644 --- a/tabbox/qml/clients/big_icons/contents/ui/main.qml +++ b/tabbox/qml/clients/big_icons/contents/ui/main.qml @@ -63,6 +63,7 @@ Item { } } Item { + id: captionFrame anchors { top: icons.bottom left: parent.left @@ -73,11 +74,23 @@ Item { bottomMargin: background.margins.bottom } Text { + function constrainWidth() { + if (textItem.width > textItem.maxWidth && textItem.width > 0 && textItem.maxWidth > 0) { + textItem.width = textItem.maxWidth; + } else { + textItem.width = undefined; + } + } + function calculateMaxWidth() { + textItem.maxWidth = bigIconsTabBox.width - captionFrame.anchors.leftMargin - captionFrame.anchors.rightMargin - captionFrame.anchors.rightMargin; + } id: textItem + property int maxWidth: 0 text: icons.currentItem ? icons.currentItem.data.caption : "" horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter color: theme.textColor + elide: Text.ElideMiddle font { bold: true } @@ -85,6 +98,15 @@ Item { verticalCenter: parent.verticalCenter horizontalCenter: parent.horizontalCenter } + onTextChanged: textItem.constrainWidth() + Component.onCompleted: textItem.calculateMaxWidth() + Connections { + target: bigIconsTabBox + onWidthChanged: { + textItem.calculateMaxWidth(); + textItem.constrainWidth(); + } + } } } } diff --git a/tabbox/qml/clients/big_icons/metadata.desktop b/tabbox/qml/clients/big_icons/metadata.desktop index b1000b7156..4175f3788f 100644 --- a/tabbox/qml/clients/big_icons/metadata.desktop +++ b/tabbox/qml/clients/big_icons/metadata.desktop @@ -19,6 +19,7 @@ Name[pa]=ਵੱਡੇ ਆਈਕਾਨ Name[pl]=Duże ikony Name[pt]=Ícones Grandes Name[pt_BR]=Ícones grandes +Name[sk]=Veľké ikony Name[sl]=Velike ikone Name[sr]=Велике иконе Name[sr@ijekavian]=Велике иконе @@ -35,10 +36,12 @@ Comment=A window switcher layout using large icons to represent the window Comment[ca]=Una disposició del commutador de finestres que utilitza icones grans per representar la finestra Comment[da]=Et vinduesskifter-layout som bruger store ikoner til at repræsentere vinduet Comment[de]=Ein Fensterwechsler-Layout, das große Symbole zur Darstellung der Fenster verwendet +Comment[es]=Un esquema de cambiador de ventanas que usa iconos grandes para representar las ventanas Comment[et]=Aknavahetaja paigutus suurte, aknaid tähistavate ikoonidega Comment[fi]=Tehtävänvalitsimen asettelu, jossa ikkunat esitetään suurilla kuvakkeilla Comment[hu]=Egy ablakváltó elrendezés, amely nagy ikonokat használ az ablak ábrázolásához Comment[ia]=Un disposition de commutator de fenestra usante icones grande pro representar le fenestra +Comment[it]=Una disposizione di cambiafinestre che usa icone grandi per rappresentare le finestre Comment[kk]=Терезелерді үлкен таңбашалармен белгілейтін терезе ауыстырғышының қалыпы Comment[km]=ប្លង់​កម្មវិធី​ប្ដូរ​បង្អួច ដោយ​ប្រើ​រូបតំណាង​ធំ ដើម្បី​បង្ហាញ​បង្អួច​ឡើងវិញ Comment[nb]=En vindusbytterutforming som bruker store ikoner for å representere vinduer diff --git a/tabbox/qml/clients/compact/metadata.desktop b/tabbox/qml/clients/compact/metadata.desktop index 1e4c838fcc..bb09eddc05 100644 --- a/tabbox/qml/clients/compact/metadata.desktop +++ b/tabbox/qml/clients/compact/metadata.desktop @@ -35,10 +35,12 @@ Comment=A compact window switcher layout Comment[ca]=Una disposició del commutador de finestres compacta Comment[da]=Et kompakt layout til vinduesskifter Comment[de]=Ein kompaktes Fensterwechsler-Layout +Comment[es]=Un esquema de cambiador de ventanas compacto Comment[et]=Kompaktne aknavahetaja paigutus Comment[fi]=Tiivis tehtävänvalitsimen asettelu Comment[hu]=Egy kompakt ablakváltó elrendezés Comment[ia]=Un disposition de commutator de fenestra compacte +Comment[it]=Una disposizione compatta di cambiafinestre Comment[kk]=Ықшамды терезе ауыстырғышының қалыпы Comment[km]=បង្រួម​ប្លង់​កម្មវិធី​ប្ដូរ​បង្អួច Comment[nb]=En kompakt utforming av vindusbytter diff --git a/tabbox/qml/clients/informative/metadata.desktop b/tabbox/qml/clients/informative/metadata.desktop index c1d6223513..647754bb26 100644 --- a/tabbox/qml/clients/informative/metadata.desktop +++ b/tabbox/qml/clients/informative/metadata.desktop @@ -19,6 +19,7 @@ Name[pa]=ਜਾਣਕਾਰੀ Name[pl]=Informacyjny Name[pt]=Informativa Name[pt_BR]=Informativo +Name[sk]=Informatívne Name[sl]=Informativno Name[sr]=Информативно Name[sr@ijekavian]=Информативно @@ -34,10 +35,12 @@ Name[zh_TW]=資訊提供 Comment=An informative window switcher layout including desktop name Comment[ca]=Una disposició del commutador de finestres informativa que inclou el nom d'escriptori Comment[da]=Et informativt vinduesskifter-layout som medtager navnet på skrivebordet +Comment[es]=Un esquema de cambiador de ventanas informativo que incluye el nombre del escritorio Comment[et]=Informatiivne aknavahetaja paigutus koos töölauanimedega Comment[fi]=Informatiivinen tehtävänvalitsimen asettelu, joka näyttää myös työpöydän nimen Comment[hu]=Egy informatív ablakváltó elrendezés az asztal nevét tartalmazva Comment[ia]=Un disposition de commutator de fenestra informative includente nomine de scriptorio +Comment[it]=Una disposizione informative di cambiafinestre che include il nome del desktop Comment[kk]=Мәліметті терезе ауыстырғышының қалыпы Comment[km]=ប្លង់​កម្មវិធី​ប្ដូរ​បង្អួច​ព័ត៌មាន រួមមាន​ឈ្មោះ​ផ្ទៃតុ Comment[nb]=En informativ utforming av vindusbytter som tar med skrivebordsnavnet diff --git a/tabbox/qml/clients/present_windows/metadata.desktop b/tabbox/qml/clients/present_windows/metadata.desktop index 05a3bc2bfd..6deb314640 100644 --- a/tabbox/qml/clients/present_windows/metadata.desktop +++ b/tabbox/qml/clients/present_windows/metadata.desktop @@ -4,6 +4,7 @@ Name[ca]=Graella Name[cs]=Mřížka Name[da]=Gitter Name[de]=Raster +Name[el]=Κάνναβος Name[es]=Rejilla Name[et]=Võrgustik Name[fi]=Ruudukko @@ -19,6 +20,7 @@ Name[pa]=ਗਰਿੱਡ Name[pl]=Siatka Name[pt]=Grelha Name[pt_BR]=Grade +Name[sk]=Mriežka Name[sl]=Mreža Name[sr]=Мрежа Name[sr@ijekavian]=Мрежа @@ -35,10 +37,12 @@ Comment=A Window Switcher layout showing all windows as thumbnails in a grid Comment[ca]=Una disposició del commutador de finestres que mostra totes les finestres com a miniatures en una graella Comment[da]=Et vinduesskifter-layout som viser alle vinduer som miniaturer i et gitter Comment[de]=Ein Fensterwechsler-Layout, das Vorschauen aller Fenster in einem Raster anzeigt +Comment[es]=Un esquema de cambiador de ventanas que muestra todas las ventanas como miniaturas en una rejilla Comment[et]=Aknavahetaja paigutus kõigi akende näitamisega pisipiltidena võrgustikus Comment[fi]=Tehtävänvalitsimen asettelu, joka näyttää kaikkien ikkunoiden pienoiskuvat ruudukossa Comment[hu]=Egy ablakváltó elrendezés, amely az összes ablakot rácsban jeleníti meg bélyegképekként Comment[ia]=Un disposition de commutator de fenestra monstrante fenestras como miniaturas in un grillia +Comment[it]=Una disposizione di cambiafinestre che mostra tutte le finestre come miniature in una griglia Comment[kk]=Бүкіл терезе нобайлары тор құрып көрсететілін терезе ауыстырғышының қалыпы Comment[km]=ប្លង់​កម្មវិធី​ប្ដូរ​បង្អួច ដោយ​បង្ហាញ​បង្អួច​ទាំងអស់​ជា​រូបភាព​តូចៗ​ក្នុង​ក្រឡាចត្រង្គ Comment[nb]=En vindusbytterutforming som viser alle vinduer som minibilder i et rutenett diff --git a/tabbox/qml/clients/small_icons/metadata.desktop b/tabbox/qml/clients/small_icons/metadata.desktop index 1e143d42e0..603e038dff 100644 --- a/tabbox/qml/clients/small_icons/metadata.desktop +++ b/tabbox/qml/clients/small_icons/metadata.desktop @@ -19,6 +19,7 @@ Name[pa]=ਛੋਟੇ ਆਈਕਾਨ Name[pl]=Małe ikony Name[pt]=Ícones Pequenos Name[pt_BR]=Ícones pequenos +Name[sk]=Malé ikony Name[sl]=Majhne ikone Name[sr]=Мале иконе Name[sr@ijekavian]=Мале иконе @@ -34,10 +35,12 @@ Comment=A window switcher layout using small icons to represent the window Comment[ca]=Una disposició del commutador de finestres que utilitza icones petites per representar la finestra Comment[da]=Et vinduesskifter-layout som bruger små ikoner til at repræsentere vinduet Comment[de]=Ein Fensterwechsler-Layout, das kleine Symbole zur Darstellung der Fenster verwendet +Comment[es]=Un esquema de cambiador de ventanas que usa iconos pequeños para representar las ventanas Comment[et]=Aknavahetaja paigutus väikeste, aknaid tähistavate ikoonidega Comment[fi]=Tehtävänvalitsimen asettelu, jossa ikkunat esitetään pienillä kuvakkeilla Comment[hu]=Egy ablakváltó elrendezés, amely kis ikonokat használ az ablak ábrázolásához Comment[ia]=Un disposition de commutator de fenestra usante parve icones pro representar le fenestra +Comment[it]=Una disposizione di cambiafinestre che usa icone piccole per rappresentare le finestre Comment[kk]=Терезелерді шағын таңбашалармен белгілейтін терезе ауыстырғышының қалыпы Comment[km]=ប្លង់​កម្មវិធី​ប្ដូរ​បង្អួច ដោយ​ប្រើ​រូបតំណាង​តូច ដើម្បី​បង្ហាញ​បង្អួច​ឡើង​វិញ Comment[nb]=En vindusbytterutforming som bruker små ikoner for å representere vinduer diff --git a/tabbox/qml/clients/text/metadata.desktop b/tabbox/qml/clients/text/metadata.desktop index de45962c11..b97c708a29 100644 --- a/tabbox/qml/clients/text/metadata.desktop +++ b/tabbox/qml/clients/text/metadata.desktop @@ -1,6 +1,7 @@ [Desktop Entry] Name=Text Icons Name[ca]=Icones de text +Name[cs]=Textové ikony Name[da]=Tekstikoner Name[de]=Text-Symbole Name[es]=Iconos de texto @@ -32,10 +33,12 @@ Comment=A window switcher layout only showing window captions Comment[ca]=Una disposició del commutador de finestres que només mostra els títols de finestra Comment[da]=Et vinduesskifter-layout som kun viser vinduestitler Comment[de]=Ein Fensterwechsler-Layout, das nur die Titel der Fenster anzeigt +Comment[es]=Un esquema de cambiador de ventanas que solo muestra los títulos de las ventanas Comment[et]=Aknavahetaja paigutus ainult aknatiitlite näitamisega Comment[fi]=Tehtävänvalitsimen asettelu, jossa näytetään vain ikkunoiden otsikot Comment[hu]=Egy ablakváltó elrendezés, amely csak az ablakfeliratokat jeleníti meg Comment[ia]=Un disposition de commutator de fenestra monstrante solo legendas de fenestra +Comment[it]=Una disposizione di cambiafinestre che mostra solo i titoli delle finestre Comment[kk]=Тек атауын көрсететін терезе ауыстырғышының қалыпы Comment[km]=ប្លង់​កម្មវិធី​បង្អួច បង្ហាញ​តែ​ចំណង​ជើង​បង្អួច Comment[nb]=En vindusbytterutforming som bare viser vindustekster diff --git a/tabbox/qml/clients/thumbnails/metadata.desktop b/tabbox/qml/clients/thumbnails/metadata.desktop index a58f9f0c7f..cf3ab40db5 100644 --- a/tabbox/qml/clients/thumbnails/metadata.desktop +++ b/tabbox/qml/clients/thumbnails/metadata.desktop @@ -34,10 +34,12 @@ Comment=A window switcher layout using live thumbnails Comment[ca]=Una disposició del commutador de finestres que utilitza miniatures animades Comment[da]=Et vinduesskifter-layout som bruger aktive miniaturer Comment[de]=Ein Fensterwechsler-Layout, das Live-Vorschauen verwendet +Comment[es]=Un esquema de cambiador de ventanas que usa miniaturas en tiempo real Comment[et]=Aknavahetaja paigutus reaalajas pisipiltidega Comment[fi]=Tehtävänvalitsimen asettelu, joka käyttää pienoiskuvia Comment[hu]=Egy ablakváltó elrendezés, amely élő bélyegképeket használ Comment[ia]=Un disposition de commutator de fenestra usante miniaturas vive +Comment[it]=Una disposizione di cambiafinestre che usa miniature dinamiche Comment[kk]="Тірі" нобайларын көрсететілін терезе ауыстырғышының қалыпы Comment[km]=ប្លង់​កម្មវិធី​ប្ដូរ​បង្អួច ដោយ​ប្រើ​រូបភាព​តូចៗ​បន្ត​ផ្ទាល់ Comment[nb]=En vindusbytterutforming som bruker sanntids minibilder diff --git a/tabbox/qml/clients/window_strip/metadata.desktop b/tabbox/qml/clients/window_strip/metadata.desktop index c5a8a7f610..3b6eb8c26a 100644 --- a/tabbox/qml/clients/window_strip/metadata.desktop +++ b/tabbox/qml/clients/window_strip/metadata.desktop @@ -1,12 +1,14 @@ [Desktop Entry] Name=Window Strip Name[ca]=Cinta de finestres +Name[cs]=Pruh oken Name[da]=Vinduesstribe Name[es]=Tira de ventanas Name[et]=Aknariba Name[fi]=Ikkunanauha Name[hu]=Ablakszalag Name[ia]=Lista de fenestra +Name[it]=Striscia di finestre Name[kk]=Терезе жолағы Name[km]=ស្គ្រីប​វីនដូ Name[nb]=Vindusstripe @@ -28,10 +30,13 @@ Name[zh_TW]=視窗帶 Comment=Window switcher layout for Plasma Active Comment[ca]=Disposició del commutador de finestres pel Plasma Active Comment[da]=Et vinduesskifter-layout til Plasma Active +Comment[el]=Διάταξη εναλλαγής παραθύρων για το Plasma Active +Comment[es]=Esquema de cambiador de ventanas para Plasma Active Comment[et]=Plasma Active'i aknavahetaja paigutus Comment[fi]=Plasma Activen tehtävänvalitsimen asettelu Comment[hu]=Ablakváltó elrendezés a Plazma aktívhoz Comment[ia]=Disposition de commutator de fenestra per Plasma Active +Comment[it]=Disposizione di cambiafinestre per Plasma Active Comment[kk]=Plasma Activt-тың терезе ауыстырғышының қалыпы Comment[km]=ប្លង់​កម្មវិធី​ប្ដូរ​បង្អួជ​សម្រាប់​ប្លាស្មា​សកម្ម Comment[nb]=Vindusbytterutforming for Plasma Active diff --git a/tabbox/tabbox.cpp b/tabbox/tabbox.cpp index 098d7598c0..0c8fcb38cc 100644 --- a/tabbox/tabbox.cpp +++ b/tabbox/tabbox.cpp @@ -405,7 +405,6 @@ TabBox::TabBox(QObject *parent) m_defaultConfig.setShowDesktopMode(TabBoxConfig::DoNotShowDesktopClient); m_defaultConfig.setClientMultiScreenMode(TabBoxConfig::IgnoreMultiScreen); m_defaultConfig.setClientSwitchingMode(TabBoxConfig::FocusChainSwitching); - m_defaultConfig.setLayout(TabBoxConfig::VerticalLayout); m_alternativeConfig = TabBoxConfig(); m_alternativeConfig.setTabBoxMode(TabBoxConfig::ClientTabBox); @@ -416,7 +415,6 @@ TabBox::TabBox(QObject *parent) m_alternativeConfig.setShowDesktopMode(TabBoxConfig::DoNotShowDesktopClient); m_alternativeConfig.setClientMultiScreenMode(TabBoxConfig::IgnoreMultiScreen); m_alternativeConfig.setClientSwitchingMode(TabBoxConfig::FocusChainSwitching); - m_alternativeConfig.setLayout(TabBoxConfig::VerticalLayout); m_defaultCurrentApplicationConfig = m_defaultConfig; m_defaultCurrentApplicationConfig.setClientApplicationsMode(TabBoxConfig::AllWindowsCurrentApplication); @@ -429,14 +427,12 @@ TabBox::TabBox(QObject *parent) m_desktopConfig.setShowTabBox(true); m_desktopConfig.setShowDesktopMode(TabBoxConfig::DoNotShowDesktopClient); m_desktopConfig.setDesktopSwitchingMode(TabBoxConfig::MostRecentlyUsedDesktopSwitching); - m_desktopConfig.setLayout(TabBoxConfig::VerticalLayout); m_desktopListConfig = TabBoxConfig(); m_desktopListConfig.setTabBoxMode(TabBoxConfig::DesktopTabBox); m_desktopListConfig.setShowTabBox(true); m_desktopListConfig.setShowDesktopMode(TabBoxConfig::DoNotShowDesktopClient); m_desktopListConfig.setDesktopSwitchingMode(TabBoxConfig::StaticDesktopSwitching); - m_desktopListConfig.setLayout(TabBoxConfig::VerticalLayout); m_tabBox = new TabBoxHandlerImpl(this); QTimer::singleShot(0, this, SLOT(handlerReady())); connect(m_tabBox, SIGNAL(selectedIndexChanged()), SIGNAL(itemSelected())); diff --git a/tabbox/tabboxconfig.cpp b/tabbox/tabboxconfig.cpp index 42fdbcf398..5ad552cfb7 100644 --- a/tabbox/tabboxconfig.cpp +++ b/tabbox/tabboxconfig.cpp @@ -32,7 +32,6 @@ public: , highlightWindows(TabBoxConfig::defaultHighlightWindow()) , showOutline(TabBoxConfig::defaultShowOutline()) , tabBoxMode(TabBoxConfig::ClientTabBox) - , layout(TabBoxConfig::defaultLayoutMode()) , clientDesktopMode(TabBoxConfig::defaultDesktopMode()) , clientActivitiesMode(TabBoxConfig::defaultActivitiesMode()) , clientApplicationsMode(TabBoxConfig::defaultApplicationsMode()) @@ -41,10 +40,7 @@ public: , clientMultiScreenMode(TabBoxConfig::defaultMultiScreenMode()) , clientSwitchingMode(TabBoxConfig::defaultSwitchingMode()) , desktopSwitchingMode(TabBoxConfig::MostRecentlyUsedDesktopSwitching) - , minWidth(TabBoxConfig::defaultMinWidth()) - , minHeight(TabBoxConfig::defaultMinHeight()) - , layoutName(TabBoxConfig::defaultLayoutName()) - , selectedItemLayoutName(TabBoxConfig::defaultSelectedItemLayoutName()) { + , layoutName(TabBoxConfig::defaultLayoutName()) { } ~TabBoxConfigPrivate() { } @@ -53,7 +49,6 @@ public: bool showOutline; TabBoxConfig::TabBoxMode tabBoxMode; - TabBoxConfig::LayoutMode layout; TabBoxConfig::ClientDesktopMode clientDesktopMode; TabBoxConfig::ClientActivitiesMode clientActivitiesMode; TabBoxConfig::ClientApplicationsMode clientApplicationsMode; @@ -62,10 +57,7 @@ public: TabBoxConfig::ClientMultiScreenMode clientMultiScreenMode; TabBoxConfig::ClientSwitchingMode clientSwitchingMode; TabBoxConfig::DesktopSwitchingMode desktopSwitchingMode; - int minWidth; - int minHeight; QString layoutName; - QString selectedItemLayoutName; }; TabBoxConfig::TabBoxConfig() @@ -84,17 +76,14 @@ TabBoxConfig& TabBoxConfig::operator=(const KWin::TabBox::TabBoxConfig& object) d->highlightWindows = object.isHighlightWindows(); d->showOutline = object.isShowOutline(); d->tabBoxMode = object.tabBoxMode(); - d->layout = object.layout(); d->clientDesktopMode = object.clientDesktopMode(); d->clientActivitiesMode = object.clientActivitiesMode(); d->clientApplicationsMode = object.clientApplicationsMode(); d->clientMinimizedMode = object.clientMinimizedMode(); d->showDesktopMode = object.showDesktopMode(); d->clientMultiScreenMode = object.clientMultiScreenMode(); + d->clientSwitchingMode = object.clientSwitchingMode(); d->desktopSwitchingMode = object.desktopSwitchingMode(); - d->selectedItemLayoutName = object.selectedItemLayoutName(); - d->minWidth = object.minWidth(); - d->minHeight = object.minHeight(); d->layoutName = object.layoutName(); return *this; } @@ -139,16 +128,6 @@ TabBoxConfig::TabBoxMode TabBoxConfig::tabBoxMode() const return d->tabBoxMode; } -void TabBoxConfig::setLayout(TabBoxConfig::LayoutMode layout) -{ - d->layout = layout; -} - -TabBoxConfig::LayoutMode TabBoxConfig::layout() const -{ - return d->layout; -} - TabBoxConfig::ClientDesktopMode TabBoxConfig::clientDesktopMode() const { return d->clientDesktopMode; @@ -229,26 +208,6 @@ void TabBoxConfig::setDesktopSwitchingMode(DesktopSwitchingMode switchingMode) d->desktopSwitchingMode = switchingMode; } -int TabBoxConfig::minWidth() const -{ - return d->minWidth; -} - -void TabBoxConfig::setMinWidth(int value) -{ - d->minWidth = value; -} - -int TabBoxConfig::minHeight() const -{ - return d->minHeight; -} - -void TabBoxConfig::setMinHeight(int value) -{ - d->minHeight = value; -} - QString& TabBoxConfig::layoutName() const { return d->layoutName; @@ -259,15 +218,5 @@ void TabBoxConfig::setLayoutName(const QString& name) d->layoutName = name; } -QString& TabBoxConfig::selectedItemLayoutName() const -{ - return d->selectedItemLayoutName; -} - -void TabBoxConfig::setSelectedItemLayoutName(const QString& name) -{ - d->selectedItemLayoutName = name; -} - } // namespace TabBox } // namespace KWin diff --git a/tabbox/tabboxconfig.h b/tabbox/tabboxconfig.h index db02d232bb..83cdf9a572 100644 --- a/tabbox/tabboxconfig.h +++ b/tabbox/tabboxconfig.h @@ -51,15 +51,6 @@ class TabBoxConfigPrivate; class TabBoxConfig { public: - /** - * LayoutMode defines how the items will be displayed in the - * main TableView of the TabBox. - */ - enum LayoutMode { - VerticalLayout, ///< Items are laid out vertically - HorizontalLayout, ///< Items are laid out horizontally - HorizontalVerticalLayout ///< Items are laid out in a tabular. Number of columns might be greater by one than number of rows - }; /** * ClientDesktopMode defines whether windows from the current desktop or from all * desktops are included in the TabBoxClient List in the TabBoxClientModel @@ -169,12 +160,6 @@ public: */ TabBoxMode tabBoxMode() const; /** - * @return The currently used layout - * @see setLayout - * @see defaultLayoutMode - */ - LayoutMode layout() const; - /** * @return The current ClientDesktopMode * This option only applies for TabBoxMode ClientTabBox. * @see setClientDesktopMode @@ -230,29 +215,10 @@ public: */ DesktopSwitchingMode desktopSwitchingMode() const; /** - * @return The minimum width in percent of screen width the TabBox should use. - * @see setMinWidth - * @see minHeight - * @see defaultMinWidth - */ - int minWidth() const; - /** - * @return The minimum height in percent of screen height the TabBox should use. - * @see setMinHeight - * @see minWidth - * @see defaultMinHeight - */ - int minHeight() const; - /** * @return Then name of the current ItemLayout * @see setlayoutName */ QString& layoutName() const; - /** - * @return Then name of the current ItemLayout for selected Item view - * @see setlayoutName - */ - QString& selectedItemLayoutName() const; // setters /** @@ -279,11 +245,6 @@ public: */ void setTabBoxMode(TabBoxMode mode); /** - * @param layout The new LayoutMode to be used. - * @see layout - */ - void setLayout(LayoutMode layout); - /** * @param desktopMode The new ClientDesktopMode to be used. * This option only applies for TabBoxMode ClientTabBox. * @see clientDesktopMode @@ -332,25 +293,10 @@ public: */ void setDesktopSwitchingMode(DesktopSwitchingMode switchingMode); /** - * @param value The minimum width of TabBox in percent of screen width. - * @see minWidth - */ - void setMinWidth(int value); - /** - * @param value The minimum height of TabBox in percent of screen height. - * @see minHeight - */ - void setMinHeight(int value); - /** * @param name The new ItemLayout config name * @see layoutName */ void setLayoutName(const QString& name); - /** - * @param name The new ItemLayout config name for the selected item view - * @see selectedItemLayoutName - */ - void setSelectedItemLayoutName(const QString& name); // some static methods to access default values static ClientDesktopMode defaultDesktopMode() { @@ -374,9 +320,6 @@ public: static ClientSwitchingMode defaultSwitchingMode() { return FocusChainSwitching; } - static LayoutMode defaultLayoutMode() { - return VerticalLayout; - } static bool defaultShowTabBox() { return true; } @@ -386,18 +329,9 @@ public: static bool defaultHighlightWindow() { return true; } - static int defaultMinWidth() { - return 20; - } - static int defaultMinHeight() { - return 20; - } static QString defaultLayoutName() { return QString("thumbnails"); } - static QString defaultSelectedItemLayoutName() { - return QString("Text"); - } private: TabBoxConfigPrivate* d; }; diff --git a/tabbox/tabboxhandler.cpp b/tabbox/tabboxhandler.cpp index 242dcb3f15..66d2acb1af 100644 --- a/tabbox/tabboxhandler.cpp +++ b/tabbox/tabboxhandler.cpp @@ -124,7 +124,11 @@ void TabBoxHandlerPrivate::updateOutline() q->hideOutline(); return; } - TabBoxClient* c = static_cast< TabBoxClient* >(m_clientModel->data(index, ClientModel::ClientRole).value()); + const QVariant client = m_clientModel->data(index, ClientModel::ClientRole); + if (!client.isValid()) { + return; + } + TabBoxClient* c = static_cast< TabBoxClient* >(client.value()); q->showOutline(QRect(c->x(), c->y(), c->width(), c->height())); } diff --git a/tabbox/tests/CMakeLists.txt b/tabbox/tests/CMakeLists.txt index 1a809ed166..a0df42510e 100644 --- a/tabbox/tests/CMakeLists.txt +++ b/tabbox/tests/CMakeLists.txt @@ -15,3 +15,21 @@ set( testTabBoxClientModel_SRCS kde4_add_unit_test( testTabBoxClientModel TESTNAME testTabBoxClientModel ${testTabBoxClientModel_SRCS} ) target_link_libraries( testTabBoxClientModel ${KDE4_KDEUI_LIBS} ${QT_QTDECLARATIVE_LIBRARY} ${X11_LIBRARIES} ${QT_QTTEST_LIBRARY} ) + +######################################################## +# Test TabBox::TabBoxHandler +######################################################## +set( testTabBoxHandler_SRCS + ../clientmodel.cpp + ../desktopmodel.cpp + ../tabboxconfig.cpp + ../tabboxhandler.cpp + test_tabbox_handler.cpp + mock_declarative.cpp + mock_tabboxhandler.cpp + mock_tabboxclient.cpp +) + +kde4_add_unit_test( testTabBoxHandler TESTNAME testTabBoxHandler ${testTabBoxHandler_SRCS} ) + +target_link_libraries( testTabBoxHandler ${KDE4_KDEUI_LIBS} ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTDECLARATIVE_LIBRARY} ${QT_QTTEST_LIBRARY} ${X11_LIBRARIES} ) diff --git a/tabbox/tests/test_tabbox_handler.cpp b/tabbox/tests/test_tabbox_handler.cpp new file mode 100644 index 0000000000..5c081774a7 --- /dev/null +++ b/tabbox/tests/test_tabbox_handler.cpp @@ -0,0 +1,55 @@ +/******************************************************************** +KWin - the KDE window manager +This file is part of the KDE project. + +Copyright (C) 2012 Martin Gräßlin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +#include "mock_tabboxhandler.h" +#include "clientmodel.h" +#include + +using namespace KWin; + +class TestTabBoxHandler : public QObject +{ + Q_OBJECT +private slots: + /** + * Test to verify that update outline does not crash + * if the ModelIndex for which the outline should be + * shown is not valid. That is accessing the Pointer + * to the Client returns an invalid QVariant. + * BUG: 304620 + **/ + void testDontCrashUpdateOutlineNullClient(); +}; + +void TestTabBoxHandler::testDontCrashUpdateOutlineNullClient() +{ + MockTabBoxHandler tabboxhandler; + TabBox::TabBoxConfig config; + config.setTabBoxMode(TabBox::TabBoxConfig::ClientTabBox); + config.setShowOutline(true); + config.setShowTabBox(false); + config.setHighlightWindows(false); + tabboxhandler.setConfig(config); + // now show the tabbox which will attempt to show the outline + tabboxhandler.show(); +} + +QTEST_MAIN(TestTabBoxHandler) + +#include "test_tabbox_handler.moc" diff --git a/tabgroup.cpp b/tabgroup.cpp index e7b133e8f1..b3a51d6123 100644 --- a/tabgroup.cpp +++ b/tabgroup.cpp @@ -104,6 +104,15 @@ bool TabGroup::add(Client* c, Client *other, bool after, bool becomeVisible) if (effects) static_cast(effects)->slotTabAdded(c->effectWindow(), other->effectWindow()); + // next: aling the client states BEFORE adding it to the group + // otherwise the caused indirect state changes would be taken as the dominating ones and break + // the main client + // example: QuickTiling is aligned to None, this restores the former QuickTiled size and alignes + // all other windows in the group - including the actual main client! - to this size and thus + // breaks the actually required alignment to the main windows geometry (because that now has the + // restored geometry of the formerly Q'tiled window) - bug #303937 + updateStates(m_current, All, c); + int index = other ? m_clients.indexOf(other) : m_clients.size(); index += after; if (index > m_clients.size()) @@ -114,7 +123,6 @@ bool TabGroup::add(Client* c, Client *other, bool after, bool becomeVisible) c->setTabGroup(this); // Let the client know which group it belongs to updateMinMaxSize(); - updateStates(m_current, All, c); if (!becomeVisible) c->setClientShown(false); @@ -268,7 +276,7 @@ void TabGroup::updateMinMaxSize() m_maxSize = m_maxSize.boundedTo((*i)->maxSize()); } - // TODO: this actually resolves a conflict that should be catched when adding? + // TODO: this actually resolves a conflict that should be caught when adding? m_maxSize = m_maxSize.expandedTo(m_minSize); // calculate this _once_ to get a common size. @@ -286,12 +294,14 @@ void TabGroup::blockStateUpdates(bool more) { more ? ++m_stateUpdatesBlocked : --m_stateUpdatesBlocked; if (m_stateUpdatesBlocked < 0) { m_stateUpdatesBlocked = 0; - qWarning("TabGroup: Something is messed up with TabGroup::blockStateUpdates() invokation\nReleased more than blocked!"); + qWarning("TabGroup: Something is messed up with TabGroup::blockStateUpdates() invocation\nReleased more than blocked!"); } } void TabGroup::updateStates(Client* main, States states, Client* only) { + if (main == only) + return; // there's no need to only align "us" to "us" if (m_stateUpdatesBlocked > 0) { m_pendingUpdates |= states; return; @@ -300,10 +310,16 @@ void TabGroup::updateStates(Client* main, States states, Client* only) states |= m_pendingUpdates; m_pendingUpdates = TabGroup::None; - ClientList toBeRemoved; - for (ClientList::const_iterator i = m_clients.constBegin(), end = m_clients.constEnd(); i != end; ++i) { + ClientList toBeRemoved, onlyDummy; + ClientList *list = &m_clients; + if (only) { + onlyDummy << only; + list = &onlyDummy; + } + + for (ClientList::const_iterator i = list->constBegin(), end = list->constEnd(); i != end; ++i) { Client *c = (*i); - if (c != main && (!only || c == only)) { + if (c != main) { if ((states & Minimized) && c->isMinimized() != main->isMinimized()) { if (main->isMinimized()) c->minimize(true); diff --git a/useractions.cpp b/useractions.cpp index 7c0fd1e660..a50178256f 100755 --- a/useractions.cpp +++ b/useractions.cpp @@ -214,6 +214,7 @@ void Workspace::discardPopup() delete popup; popup = NULL; desk_popup = NULL; + screen_popup = NULL; activity_popup = NULL; switch_to_tab_popup = NULL; add_tabs_popup = NULL; @@ -251,6 +252,12 @@ void Workspace::clientPopupAboutToShow() } else { initDesktopPopup(); } + if (numScreens() == 1 || (!active_popup_client->isMovable() && !active_popup_client->isMovableAcrossScreens())) { + delete screen_popup; + screen_popup = NULL; + } else { + initScreenPopup(); + } #ifdef KWIN_BUILD_ACTIVITIES updateActivityList(true, false, "showHideActivityMenu"); #endif @@ -407,6 +414,23 @@ void Workspace::initDesktopPopup() action->setText(i18n("Move To &Desktop")); } +void Workspace::initScreenPopup() +{ + if (screen_popup) { + return; + } + + screen_popup = new QMenu(popup); + screen_popup->setFont(KGlobalSettings::menuFont()); + connect(screen_popup, SIGNAL(triggered(QAction*)), SLOT(slotSendToScreen(QAction*))); + connect(screen_popup, SIGNAL(aboutToShow()), SLOT(screenPopupAboutToShow())); + + QAction *action = screen_popup->menuAction(); + // set it as the first item after desktop + popup->insertAction(activity_popup ? activity_popup->menuAction() : mMinimizeOpAction, action); + action->setText(i18n("Move To &Screen")); +} + /*! Creates activity popup. I'm going with checkable ones instead of "copy to" and "move to" menus; I *think* it's an easier way. @@ -474,6 +498,33 @@ void Workspace::desktopPopupAboutToShow() action->setEnabled(false); } +/*! + Adjusts the screen popup to the current values and the location of + the popup client. + */ +void Workspace::screenPopupAboutToShow() +{ + if (!screen_popup) { + return; + } + + screen_popup->clear(); + QActionGroup *group = new QActionGroup(screen_popup); + + for (int i = 0; iaddAction(i18nc("@item:inmenu List of all Screens to send a window to", + "Screen &%1", (i+1))); + action->setData(i); + action->setCheckable(true); + if (active_popup_client && i == active_popup_client->screen()) { + action->setChecked(true); + } + group->addAction(action); + } +} + /*! Adjusts the activity popup to the current values and the location of the popup client. @@ -997,6 +1048,13 @@ QStringList Workspace::listOfEffects() const return listModules; } +QString Workspace::supportInformationForEffect(const QString& name) const +{ + if (effects) + return static_cast(effects)->supportInformation(name); + return QString(); +} + void Workspace::slotActivateAttentionWindow() { if (attention_chain.count() > 0) @@ -1396,6 +1454,24 @@ void Workspace::slotSendToDesktop(QAction *action) } +/*! + Sends the popup client to screen \a screen + + Internal slot for the window operation menu + */ +void Workspace::slotSendToScreen(QAction *action) +{ + const int screen = action->data().toInt(); + if (!active_popup_client) { + return; + } + if (screen >= numScreens()) { + return; + } + + sendClientToScreen(active_popup_client, screen); +} + /*! Toggles whether the popup client is on the \a activity diff --git a/workspace.cpp b/workspace.cpp index 148b60d73a..8a6f322c39 100644 --- a/workspace.cpp +++ b/workspace.cpp @@ -131,6 +131,7 @@ Workspace::Workspace(bool restore) , popup(0) , advanced_popup(0) , desk_popup(0) + , screen_popup(NULL) , activity_popup(0) , add_tabs_popup(0) , switch_to_tab_popup(0) @@ -2343,6 +2344,12 @@ QString Workspace::supportInformation() const foreach (const QString &effect, activeEffects()) { support.append(effect % '\n'); } + support.append("\nEffect Settings:\n"); + support.append( "----------------\n"); + foreach (const QString &effect, loadedEffects()) { + support.append(supportInformationForEffect(effect)); + support.append('\n'); + } } else { support.append("Compositing is not active\n"); } diff --git a/workspace.h b/workspace.h index 5f281b88f8..16630f7569 100644 --- a/workspace.h +++ b/workspace.h @@ -380,6 +380,7 @@ public: void toggleEffect(const QString& name); void reconfigureEffect(const QString& name); void unloadEffect(const QString& name); + QString supportInformationForEffect(const QString& name) const; void updateCompositeBlocking(Client* c = NULL); QStringList loadedEffects() const; @@ -632,9 +633,11 @@ private slots: void entabPopupClient(QAction*); void selectPopupClientTab(QAction*); void desktopPopupAboutToShow(); + void screenPopupAboutToShow(); void activityPopupAboutToShow(); void clientPopupAboutToShow(); void slotSendToDesktop(QAction*); + void slotSendToScreen(QAction*); void slotToggleOnActivity(QAction*); void clientPopupActivated(QAction*); void configureWM(); @@ -715,6 +718,7 @@ private: void init(); void initShortcuts(); void initDesktopPopup(); + void initScreenPopup(); void initActivityPopup(); void initTabbingPopups(); void restartKWin(const QString &reason); @@ -842,6 +846,7 @@ private: QMenu* popup; QMenu* advanced_popup; QMenu* desk_popup; + QMenu* screen_popup; QMenu* activity_popup; QMenu* add_tabs_popup; // Menu to add the group to other group QMenu* switch_to_tab_popup; // Menu to change tab