diff --git a/client.cpp b/client.cpp index 0f497866bb..7230cc5f01 100644 --- a/client.cpp +++ b/client.cpp @@ -352,6 +352,9 @@ void Client::destroyClient() void Client::updateInputWindow() { + if (!Xcb::Extensions::self()->isShapeInputAvailable()) + return; + QRegion region; if (!noBorder()) { diff --git a/clients/aurorae/src/kwindecoration.desktop b/clients/aurorae/src/kwindecoration.desktop index aa2017c7b3..0055e10b45 100644 --- a/clients/aurorae/src/kwindecoration.desktop +++ b/clients/aurorae/src/kwindecoration.desktop @@ -12,6 +12,7 @@ Comment[de]=KWin-Fensterdekoration Comment[el]=Διακοσμήσεις παραθύρου KWin Comment[es]=Decoración de ventanas de KWin Comment[et]=KWini akna dekoratsioon +Comment[eu]=KWin leihoen apaingarriak Comment[fi]=KWin-ikkunakoristus Comment[fr]=Décorations de fenêtres KWin Comment[ga]=Maisiúchán Fuinneog KWin diff --git a/clients/aurorae/themes/plastik/package/contents/ui/main.qml b/clients/aurorae/themes/plastik/package/contents/ui/main.qml index 8832d1d03e..77676bf54b 100644 --- a/clients/aurorae/themes/plastik/package/contents/ui/main.qml +++ b/clients/aurorae/themes/plastik/package/contents/ui/main.qml @@ -271,6 +271,7 @@ Decoration { } Text { id: caption + textFormat: Text.PlainText anchors { top: parent.top left: leftButtonGroup.right diff --git a/clients/aurorae/themes/plastik/package/metadata.desktop b/clients/aurorae/themes/plastik/package/metadata.desktop index 26fa04729f..2f6db64b3f 100644 --- a/clients/aurorae/themes/plastik/package/metadata.desktop +++ b/clients/aurorae/themes/plastik/package/metadata.desktop @@ -98,6 +98,7 @@ Comment[de]=Das klassische Design aus KDE 3 Comment[el]=Το γνωστό κλασικό θέμα από το KDE 3 Comment[es]=El tema clásico conocido desde KDE 3 Comment[et]=Klassikaline KDE 3 ajast tuntud teema +Comment[eu]=KDE 3tik ezaguna den gai klasikoa Comment[fi]=KDE 3:sta tuttu klassinen teema Comment[fr]=Le thème classique connu depuis KDE 3 Comment[gl]=O tema clásico de KDE 3 diff --git a/composite.cpp b/composite.cpp index e2f2f982aa..40c18633af 100644 --- a/composite.cpp +++ b/composite.cpp @@ -961,7 +961,7 @@ void Toplevel::addDamageFull() return; damage_region = rect(); - repaints_region = rect(); + repaints_region |= rect(); emit damaged(this, rect()); } diff --git a/cursor.cpp b/cursor.cpp index 5e35a209e7..a1287a5fc8 100644 --- a/cursor.cpp +++ b/cursor.cpp @@ -227,13 +227,15 @@ void X11Cursor::doStopCursorTracking() void X11Cursor::mousePolled() { - const QPoint last = currentPos(); - const uint16_t lastMask = m_buttonMask; + static QPoint lastPos = currentPos(); + static uint16_t lastMask = m_buttonMask; doGetPos(); // Update if needed - if (last != currentPos() || lastMask != m_buttonMask) { - emit mouseChanged(currentPos(), last, + if (lastPos != currentPos() || lastMask != m_buttonMask) { + emit mouseChanged(currentPos(), lastPos, x11ToQtMouseButtons(m_buttonMask), x11ToQtMouseButtons(lastMask), x11ToQtKeyboardModifiers(m_buttonMask), x11ToQtKeyboardModifiers(lastMask)); + lastPos = currentPos(); + lastMask = m_buttonMask; } } diff --git a/effects.cpp b/effects.cpp index 5ff4536745..6abb6ffb3b 100644 --- a/effects.cpp +++ b/effects.cpp @@ -1023,7 +1023,7 @@ int EffectsHandlerImpl::displayWidth() const int EffectsHandlerImpl::displayHeight() const { - return KWin::displayWidth(); + return KWin::displayHeight(); } EffectWindow* EffectsHandlerImpl::findWindow(WId id) const diff --git a/effects/cube/cube.cpp b/effects/cube/cube.cpp index c45c8176a5..817a2b8e83 100644 --- a/effects/cube/cube.cpp +++ b/effects/cube/cube.cpp @@ -123,6 +123,7 @@ CubeEffect::CubeEffect() connect(effects, SIGNAL(tabBoxAdded(int)), this, SLOT(slotTabBoxAdded(int))); connect(effects, SIGNAL(tabBoxClosed()), this, SLOT(slotTabBoxClosed())); connect(effects, SIGNAL(tabBoxUpdated()), this, SLOT(slotTabBoxUpdated())); + connect(effects, SIGNAL(screenGeometryChanged(const QSize&)), this, SLOT(slotResetShaders())); reconfigure(ReconfigureAll); } @@ -290,6 +291,14 @@ void CubeEffect::slotWallPaperLoaded() watcher->deleteLater(); } +void CubeEffect::slotResetShaders() +{ + ShaderManager::instance()->resetShader(m_capShader, ShaderManager::GenericShader); + ShaderManager::instance()->resetShader(m_reflectionShader, ShaderManager::GenericShader); + ShaderManager::instance()->resetShader(cylinderShader, ShaderManager::GenericShader); + ShaderManager::instance()->resetShader(sphereShader, ShaderManager::GenericShader); +} + bool CubeEffect::loadShader() { if (!(GLPlatform::instance()->supports(GLSL) && diff --git a/effects/cube/cube.h b/effects/cube/cube.h index 396c189ca2..71338c91dd 100644 --- a/effects/cube/cube.h +++ b/effects/cube/cube.h @@ -136,6 +136,7 @@ private Q_SLOTS: void slotTabBoxClosed(); void slotCubeCapLoaded(); void slotWallPaperLoaded(); + void slotResetShaders(); private: enum RotationDirection { Left, diff --git a/effects/dashboard/dashboard.cpp b/effects/dashboard/dashboard.cpp index e5bf396f3e..6e11d6d30a 100644 --- a/effects/dashboard/dashboard.cpp +++ b/effects/dashboard/dashboard.cpp @@ -51,11 +51,14 @@ DashboardEffect::~DashboardEffect() void DashboardEffect::reconfigure(ReconfigureFlags) { + DashboardConfig::self()->readConfig(); brightness = DashboardConfig::brightness()/ 100.0; saturation = DashboardConfig::saturation()/ 100.0; blur = DashboardConfig::blur(); timeline.setDuration(animationTime(500)); + if (transformWindow) + effects->addRepaintFull(); } void DashboardEffect::paintWindow(EffectWindow* w, int mask, QRegion region, WindowPaintData& data) diff --git a/effects/diminactive/diminactive_config.ui b/effects/diminactive/diminactive_config.ui index 569ee65a4d..79d2db1072 100644 --- a/effects/diminactive/diminactive_config.ui +++ b/effects/diminactive/diminactive_config.ui @@ -33,7 +33,7 @@ - + Apply effect to &groups @@ -104,7 +104,7 @@ kcfg_Strength kcfg_DimPanels kcfg_DimDesktop - kcfg_DimGroup + kcfg_DimByGroup diff --git a/effects/highlightwindow/highlightwindow.cpp b/effects/highlightwindow/highlightwindow.cpp index d21135add9..b480c4618f 100644 --- a/effects/highlightwindow/highlightwindow.cpp +++ b/effects/highlightwindow/highlightwindow.cpp @@ -109,12 +109,15 @@ void HighlightWindowEffect::slotWindowAdded(EffectWindow* w) { if (!m_highlightedWindows.isEmpty()) { // The effect is activated thus we need to add it to the opacity hash - if (w->isNormalWindow() || w->isDialog()) // Only fade out windows - m_windowOpacity[w] = isInitiallyHidden(w) ? 0.0 : 0.15; - else - m_windowOpacity[w] = 1.0; + foreach (const WId id, m_highlightedIds) { + if (w == effects->findWindow(id)) { + m_windowOpacity[w] = 1.0; // this window was demanded to be highlighted before it appeared + return; + } + } + m_windowOpacity[w] = 0.15; // this window is not currently highlighted } - slotPropertyNotify(w, m_atom); // Check initial value + slotPropertyNotify(w, m_atom, w); // Check initial value } void HighlightWindowEffect::slotWindowClosed(EffectWindow* w) @@ -128,7 +131,7 @@ void HighlightWindowEffect::slotWindowDeleted(EffectWindow* w) m_windowOpacity.remove(w); } -void HighlightWindowEffect::slotPropertyNotify(EffectWindow* w, long a) +void HighlightWindowEffect::slotPropertyNotify(EffectWindow* w, long a, EffectWindow *addedWindow) { if (a != m_atom) return; // Not our atom @@ -138,7 +141,8 @@ void HighlightWindowEffect::slotPropertyNotify(EffectWindow* w, long a) effects->readRootProperty(m_atom, m_atom, 32); if (byteData.length() < 1) { // Property was removed, clearing highlight - finishHighlighting(); + if (!addedWindow || w != addedWindow) + finishHighlighting(); return; } long* data = reinterpret_cast(byteData.data()); @@ -154,11 +158,13 @@ void HighlightWindowEffect::slotPropertyNotify(EffectWindow* w, long a) //foreach ( EffectWindow* e, m_highlightedWindows ) // effects->setElevatedWindow( e, false ); m_highlightedWindows.clear(); + m_highlightedIds.clear(); for (int i = 0; i < length; i++) { + m_highlightedIds << data[i]; EffectWindow* foundWin = effects->findWindow(data[i]); if (!foundWin) { qDebug() << "Invalid window targetted for highlight. Requested:" << data[i]; - continue; + continue; // might come in later. } m_highlightedWindows.append(foundWin); // TODO: We cannot just simply elevate the window as this will elevate it over diff --git a/effects/highlightwindow/highlightwindow.h b/effects/highlightwindow/highlightwindow.h index 2adefb2d02..4cfd2081e4 100644 --- a/effects/highlightwindow/highlightwindow.h +++ b/effects/highlightwindow/highlightwindow.h @@ -42,7 +42,7 @@ public Q_SLOTS: void slotWindowAdded(KWin::EffectWindow* w); void slotWindowClosed(KWin::EffectWindow *w); void slotWindowDeleted(KWin::EffectWindow *w); - void slotPropertyNotify(KWin::EffectWindow* w, long atom); + void slotPropertyNotify(KWin::EffectWindow* w, long atom, EffectWindow *addedWindow = NULL); private: void prepareHighlighting(); @@ -56,6 +56,7 @@ private: long m_atom; QList m_highlightedWindows; EffectWindow* m_monitorWindow; + QList m_highlightedIds; // Offscreen position cache /*QRect m_thumbArea; // Thumbnail area diff --git a/effects/invert/invert.cpp b/effects/invert/invert.cpp index fd9409728a..acc974a41e 100644 --- a/effects/invert/invert.cpp +++ b/effects/invert/invert.cpp @@ -59,6 +59,7 @@ InvertEffect::InvertEffect() connect(b, SIGNAL(triggered(bool)), this, SLOT(toggleWindow())); connect(effects, SIGNAL(windowClosed(KWin::EffectWindow*)), this, SLOT(slotWindowClosed(KWin::EffectWindow*))); + connect(effects, SIGNAL(screenGeometryChanged(const QSize&)), this, SLOT(resetShader())); } InvertEffect::~InvertEffect() @@ -178,6 +179,11 @@ bool InvertEffect::provides(Feature f) return f == ScreenInversion; } +void InvertEffect::resetShader() +{ + ShaderManager::instance()->resetShader(m_shader, ShaderManager::GenericShader); +} + } // namespace #include "invert.moc" diff --git a/effects/invert/invert.h b/effects/invert/invert.h index 1f946f6c45..229c206fce 100644 --- a/effects/invert/invert.h +++ b/effects/invert/invert.h @@ -54,6 +54,9 @@ public Q_SLOTS: void toggleWindow(); void slotWindowClosed(KWin::EffectWindow *w); +private Q_SLOTS: + void resetShader(); + protected: bool loadData(); diff --git a/effects/kscreen/kscreen.desktop b/effects/kscreen/kscreen.desktop index f5127baafe..53c34675b2 100644 --- a/effects/kscreen/kscreen.desktop +++ b/effects/kscreen/kscreen.desktop @@ -7,6 +7,7 @@ Name[da]=KScreen Name[de]=Kscreen Name[el]=Kscreen Name[es]=Kscreen +Name[eu]=Kscreen Name[fi]=KScreen Name[fr]=KScreen Name[gl]=KScreen @@ -15,8 +16,10 @@ Name[ia]=Kscreen Name[it]=Kscreen Name[kk]=Kscreen Name[ko]=Kscreen +Name[nb]=Kscreen Name[nl]=Kscreen Name[pa]=ਕੇਸਕਰੀਨ +Name[pl]=Kscreen Name[pt]=Kscreen Name[pt_BR]=KScreen Name[ru]=Kscreen @@ -40,6 +43,7 @@ Comment[cs]=Pomocný efekt pro KScreen Comment[da]=Hjælpeeffekt til KScreen Comment[de]=Hilfseffekt für KScreen Comment[es]=Efecto auxiliar para KScreen +Comment[eu]=KScreen-entzako efektu laguntzailea Comment[fi]=Avustajatehoste KScreenille Comment[fr]=Effet d'assistance pour KScreen Comment[gl]=Efecto auxiliar para KScreen. @@ -48,8 +52,10 @@ Comment[ia]=Effecto de adjutante pro KScreen Comment[it]=Effetto di assistenza per KScreen Comment[kk]=KScreen-нің көмек эффекті Comment[ko]=KScreen 도우미 효과 +Comment[nb]=Hjelpereffekt for KScreen Comment[nl]=Effect van hulp voor KScreen Comment[pa]=ਕੇਸਕਰੀਨ ਲਈ ਮੱਦਦ ਪ੍ਰਭਾਵ +Comment[pl]=Efekt pomocniczy dla KScreen Comment[pt]=Efeito auxiliar do KScreen Comment[pt_BR]=Efeito auxiliar do KScreen Comment[ru]=Вспомогательный эффект для KScreen diff --git a/effects/maximize/package/metadata.desktop b/effects/maximize/package/metadata.desktop index e74d6c0f12..b1ee810991 100644 --- a/effects/maximize/package/metadata.desktop +++ b/effects/maximize/package/metadata.desktop @@ -49,6 +49,7 @@ Name[de]=Maximieren Name[el]=Μεγιστοποίηση Name[es]=Maximizar Name[et]=Maksimeerimine +Name[eu]=Maximizatu Name[fi]=Suurentaminen Name[fr]=Maximiser Name[ga]=Uasmhéadaigh diff --git a/effects/mouseclick/mouseclick.desktop b/effects/mouseclick/mouseclick.desktop index cce2fb0952..2cd49a145d 100644 --- a/effects/mouseclick/mouseclick.desktop +++ b/effects/mouseclick/mouseclick.desktop @@ -9,6 +9,7 @@ Name[de]=Animation für Mausklicks Name[el]=Εφέ κίνησης με κλικ του ποντικιού Name[es]=Animación del clic de ratón Name[et]=Hiireklõpsu animeerimine +Name[eu]=Sagu-klikaren animazioa Name[fi]=Hiiren napsautuksen animointi Name[fr]=Animation du clic de la souris Name[gl]=Animación ao premer o rato @@ -52,6 +53,7 @@ Comment[de]=Erzeugt bei jedem Mausklick eine Animation. Dies ist sinnvoll für B Comment[el]=Σχηματίζει εφέ κίνησης όποτε γίνεται κλικ σε κουμπί του ποντικιού. Αυτό είναι χρήσιμο για βιντεοσκόπηση οθόνης / παρουσιάσεις. Comment[es]=Crea una animación cada vez que se pulsa un botón del ratón. Esto resulta útil para las grabaciones de pantalla y para las presentaciones. Comment[et]=Animatsiooni loomine hiirenupu klõpsamise peale. See on kasulik näiteks ekraanisalvestuste või esitluste jaoks. +Comment[eu]=Animazio bat sortzen du saguaren botoi bat klikatzen den bakoitzean. Erabilgarria da pantailaren grabaziorako/aurkezpenetarako. Comment[fi]=Näyttää animoinnin hiirtä napsautettaessa. Tästä on hyötyä näyttötallennuksissa ja esityksissä. Comment[fr]=Crée une animation associé à un clic sur un bouton de la souris. Ceci est utile pour les enregistrement d'écran ou les présentations. Comment[gl]=Crea unha animación cando se preme no botón do rato. Isto é útil nas presentacións e nas gravacións da pantalla. diff --git a/effects/mouseclick/mouseclick_config.desktop b/effects/mouseclick/mouseclick_config.desktop index 6a482daaa0..3e68b125e6 100644 --- a/effects/mouseclick/mouseclick_config.desktop +++ b/effects/mouseclick/mouseclick_config.desktop @@ -16,6 +16,7 @@ Name[de]=Animation für Mausklicks Name[el]=Εφέ κίνησης με κλικ του ποντικιού Name[es]=Animación del clic de ratón Name[et]=Hiireklõpsu animeerimine +Name[eu]=Sagu-klikaren animazioa Name[fi]=Hiiren napsautuksen animointi Name[fr]=Animation du clic de la souris Name[gl]=Animación ao premer o rato diff --git a/effects/scalein/package/contents/code/main.js b/effects/scalein/package/contents/code/main.js index 91f6cfea6c..6ac941c81d 100644 --- a/effects/scalein/package/contents/code/main.js +++ b/effects/scalein/package/contents/code/main.js @@ -26,7 +26,7 @@ var scaleInEffect = { }, isScaleWindow: function (window) { "use strict"; - if (window.popupMenu || window.specialWindow || window.utility || + if (window.popupMenu || window.specialWindow || window.utility || window.minimized || effect.isGrabbed(window, Effect.WindowAddedGrabRole)) { return false; } diff --git a/effects/screenedge/screenedgeeffect.desktop b/effects/screenedge/screenedgeeffect.desktop index 87ebd7f3aa..846e68820a 100644 --- a/effects/screenedge/screenedgeeffect.desktop +++ b/effects/screenedge/screenedgeeffect.desktop @@ -7,6 +7,7 @@ Name[da]=Skærmkant Name[de]=Bildschirmkante Name[el]=Άκρο οθόνης Name[es]=Borde de la pantalla +Name[eu]=Pantailaren ertza Name[fi]=Näytön reuna Name[fr]=Bord de l'écran Name[gl]=Beira da pantalla @@ -46,6 +47,7 @@ Comment[da]=Fremhæver en skærmkant når den nærmer sig Comment[de]=Bildschirmkante bei Annäherung hervorheben Comment[el]=Εμφανίζει τονισμένο το άκρο της οθόνης όταν το πλησιάζετε Comment[es]=Resalta el borde de la pantalla al aproximarse a él +Comment[eu]=Pantailaren ertz bat nabarmentzen du hurbiltzerakoan Comment[fi]=Korostaa näytön reunaa sitä lähestyttäessä Comment[fr]=Mettre en valeur le bord de l'écran à l'approche Comment[gl]=Realza unha beira da pantalla cando se aproxima diff --git a/effects/windowgeometry/windowgeometry.cpp b/effects/windowgeometry/windowgeometry.cpp index bd79745d51..604fca3190 100644 --- a/effects/windowgeometry/windowgeometry.cpp +++ b/effects/windowgeometry/windowgeometry.cpp @@ -155,8 +155,15 @@ void WindowGeometry::slotWindowStepUserMovedResized(EffectWindow *w, const QRect myExtraDirtyArea = QRect(); myCurrentGeometry = geometry; + QPoint center = geometry.center(); const QRect &r = geometry; const QRect &r2 = myOriginalGeometry; + const QRect screen = effects->clientArea(ScreenArea, center, w->desktop()); + QRect expandedGeometry = w->expandedGeometry(); + expandedGeometry = geometry.adjusted(expandedGeometry.x() - w->x(), + expandedGeometry.y() - w->y(), + expandedGeometry.right() - w->geometry().right(), + expandedGeometry.bottom() - w->geometry().bottom()); // sufficient for moves, resizes calculated otherwise int dx = r.x() - r2.x(); @@ -167,7 +174,9 @@ void WindowGeometry::slotWindowStepUserMovedResized(EffectWindow *w, const QRect myMeasure[0]->setText( i18nc(myCoordString_1, r.x(), r.y(), number(dx), number(dy) ) ); else myMeasure[0]->setText( i18nc(myCoordString_0, r.x(), r.y() ) ); - myMeasure[0]->setPosition(w->expandedGeometry().topLeft() + QPoint(6,6)); // "6" is magic number because the unstyled effectframe has 5px padding + QPoint pos = expandedGeometry.topLeft(); + pos = QPoint(qMax(pos.x(), screen.x()), qMax(pos.y(), screen.y())); + myMeasure[0]->setPosition(pos + QPoint(6,6)); // "6" is magic number because the unstyled effectframe has 5px padding // center ---------------------- if (w->isUserResize()) { @@ -188,15 +197,22 @@ void WindowGeometry::slotWindowStepUserMovedResized(EffectWindow *w, const QRect dy = r.bottom() - r2.bottom(); } else myMeasure[1]->setText( i18nc(myCoordString_0, number(dx), number(dy) ) ); - - myMeasure[1]->setPosition(geometry.center()); + const int cdx = myMeasure[1]->geometry().width() / 2 + 3; // "3" = 6/2 is magic number because + const int cdy = myMeasure[1]->geometry().height() / 2 + 3; // the unstyled effectframe has 5px padding + center = QPoint(qMax(center.x(), screen.x() + cdx), + qMax(center.y(), screen.y() + cdy)); + center = QPoint(qMin(center.x(), screen.right() - cdx), + qMin(center.y(), screen.bottom() - cdy)); + myMeasure[1]->setPosition(center); // lower right ---------------------- if (w->isUserResize()) myMeasure[2]->setText( i18nc(myCoordString_1, r.right(), r.bottom(), number(dx), number(dy) ) ); else myMeasure[2]->setText( i18nc(myCoordString_0, r.right(), r.bottom() ) ); - myMeasure[2]->setPosition(w->expandedGeometry().bottomRight() - QPoint(6,6)); // "6" is magic number because the unstyled effectframe has 5px padding + pos = expandedGeometry.bottomRight(); + pos = QPoint(qMin(pos.x(), screen.right()), qMin(pos.y(), screen.bottom())); + myMeasure[2]->setPosition(pos - QPoint(6,6)); // "6" is magic number because the unstyled effectframe has 5px padding myExtraDirtyArea |= myMeasure[0]->geometry(); myExtraDirtyArea |= myMeasure[1]->geometry(); diff --git a/eglonxbackend.cpp b/eglonxbackend.cpp index 7ed3710cc8..29ef5206b1 100644 --- a/eglonxbackend.cpp +++ b/eglonxbackend.cpp @@ -177,7 +177,6 @@ bool EglOnXBackend::initRenderingContext() const EGLint context_attribs_31_core[] = { EGL_CONTEXT_MAJOR_VERSION_KHR, 3, EGL_CONTEXT_MINOR_VERSION_KHR, 1, - EGL_CONTEXT_FLAGS_KHR, EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR, EGL_NONE }; diff --git a/events.cpp b/events.cpp index 4614ea7619..33f53502ac 100644 --- a/events.cpp +++ b/events.cpp @@ -1523,6 +1523,7 @@ void Unmanaged::configureNotifyEvent(xcb_configure_notify_event_t *e) addWorkspaceRepaint(visibleRect()); // damage old area QRect old = geom; geom = newgeom; + emit geometryChanged(); // update shadow region addRepaintFull(); if (old.size() != geom.size()) discardWindowPixmap(); diff --git a/geometry.cpp b/geometry.cpp index e7f67cf3e4..d84d0eb19d 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -378,13 +378,16 @@ QPoint Workspace::adjustClientPosition(Client* c, QPoint pos, bool unrestricted, { QSize borderSnapZone(options->borderSnapZone(), options->borderSnapZone()); QRect maxRect; + int guideMaximized = MaximizeRestore; if (c->maximizeMode() != MaximizeRestore) { - maxRect = clientArea(MovementArea, pos + c->rect().center(), c->desktop()); + maxRect = clientArea(MaximizeArea, pos + c->rect().center(), c->desktop()); QRect geo = c->geometry(); if (c->maximizeMode() & MaximizeHorizontal && (geo.x() == maxRect.left() || geo.right() == maxRect.right())) { + guideMaximized |= MaximizeHorizontal; borderSnapZone.setWidth(qMax(borderSnapZone.width() + 2, maxRect.width() / 16)); } if (c->maximizeMode() & MaximizeVertical && (geo.y() == maxRect.top() || geo.bottom() == maxRect.bottom())) { + guideMaximized |= MaximizeVertical; borderSnapZone.setHeight(qMax(borderSnapZone.height() + 2, maxRect.height() / 16)); } } @@ -473,7 +476,8 @@ QPoint Workspace::adjustClientPosition(Client* c, QPoint pos, bool unrestricted, lrx = lx + (*l)->width(); lry = ly + (*l)->height(); - if (((cy <= lry) && (cy >= ly)) || ((ry >= ly) && (ry <= lry)) || ((cy <= ly) && (ry >= lry))) { + if (!(guideMaximized & MaximizeHorizontal) && + (((cy <= lry) && (cy >= ly)) || ((ry >= ly) && (ry <= lry)) || ((cy <= ly) && (ry >= lry)))) { if ((sOWO ? (cx < lrx) : true) && (qAbs(lrx - cx) < snap) && (qAbs(lrx - cx) < deltaX)) { deltaX = qAbs(lrx - cx); nx = lrx; @@ -484,7 +488,8 @@ QPoint Workspace::adjustClientPosition(Client* c, QPoint pos, bool unrestricted, } } - if (((cx <= lrx) && (cx >= lx)) || ((rx >= lx) && (rx <= lrx)) || ((cx <= lx) && (rx >= lrx))) { + if (!(guideMaximized & MaximizeVertical) && + (((cx <= lrx) && (cx >= lx)) || ((rx >= lx) && (rx <= lrx)) || ((cx <= lx) && (rx >= lrx)))) { if ((sOWO ? (cy < lry) : true) && (qAbs(lry - cy) < snap) && (qAbs(lry - cy) < deltaY)) { deltaY = qAbs(lry - cy); ny = lry; @@ -497,7 +502,7 @@ QPoint Workspace::adjustClientPosition(Client* c, QPoint pos, bool unrestricted, } // Corner snapping - if (nx == lrx || nx + cw == lx) { + if (!(guideMaximized & MaximizeVertical) && (nx == lrx || nx + cw == lx)) { if ((sOWO ? (ry > lry) : true) && (qAbs(lry - ry) < snap) && (qAbs(lry - ry) < deltaY)) { deltaY = qAbs(lry - ry); ny = lry - ch; @@ -507,7 +512,7 @@ QPoint Workspace::adjustClientPosition(Client* c, QPoint pos, bool unrestricted, ny = ly; } } - if (ny == lry || ny + ch == ly) { + if (!(guideMaximized & MaximizeHorizontal) && (ny == lry || ny + ch == ly)) { if ((sOWO ? (rx > lrx) : true) && (qAbs(lrx - rx) < snap) && (qAbs(lrx - rx) < deltaX)) { deltaX = qAbs(lrx - rx); nx = lrx - cw; diff --git a/glxbackend.cpp b/glxbackend.cpp index aff9215ceb..51542c5ccb 100644 --- a/glxbackend.cpp +++ b/glxbackend.cpp @@ -154,7 +154,7 @@ bool GlxBackend::initRenderingContext() const int attribs_31_core_robustness[] = { GLX_CONTEXT_MAJOR_VERSION_ARB, 3, GLX_CONTEXT_MINOR_VERSION_ARB, 1, - GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB | GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB, + GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB, GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB, GLX_LOSE_CONTEXT_ON_RESET_ARB, 0 }; @@ -162,7 +162,6 @@ bool GlxBackend::initRenderingContext() const int attribs_31_core[] = { GLX_CONTEXT_MAJOR_VERSION_ARB, 3, GLX_CONTEXT_MINOR_VERSION_ARB, 1, - GLX_CONTEXT_FLAGS_ARB, GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, 0 }; @@ -222,6 +221,10 @@ bool GlxBackend::initBuffer() if (overlayWindow()->create()) { // Try to create double-buffered window in the overlay XVisualInfo* visual = glXGetVisualFromFBConfig(display(), fbconfig); + if (!visual) { + qCritical() << "Failed to get visual from fbconfig"; + return false; + } XSetWindowAttributes attrs; attrs.colormap = XCreateColormap(display(), rootWindow(), visual->visual, AllocNone); window = XCreateWindow(display(), overlayWindow()->window(), 0, 0, displayWidth(), displayHeight(), diff --git a/kcmkwin/kwincompositing/kwincompositing.desktop b/kcmkwin/kwincompositing/kwincompositing.desktop index 7654edfd8c..7f6384d6dd 100644 --- a/kcmkwin/kwincompositing/kwincompositing.desktop +++ b/kcmkwin/kwincompositing/kwincompositing.desktop @@ -197,7 +197,7 @@ X-KDE-Keywords[ia]=kwin,fenestra,gerente,componente,effecto,effectos 3D,effectos X-KDE-Keywords[it]=kwin,finestra,gestore,composizione,effetto,effetti 3D,effetti 2D,OpenGL,XRender,impostazioni video,effetti grefici,effetti desktop,animazioni,animazioni varie, effetti del gestore delle finestre,effetto dello scambiafinestre, effetto dello scambiatore di desktop,animazioni,velocità animazioni,animazioni desktop,driver,impostazioni driver,disegno,rendering,effetto invertito,effetto vetro,effetto lente,effetto snap helper,effetto evidenzia mouse,effetto ingrandimento, effetto sfocatura,effetto quadro degli strumenti,effetto esplosione,effetto dissolvenza,effetto dissolvenza desktop,effetto caduta,effetto planatura,effetto evidenziazione finestra,effetto schermata di accesso, effetto disconnessione,effetto lampada magica,effetto animazione di minimizzazione,effetto tracciatura mouse, effetto scalatura,effetto istantanea,effetto foglio,effetto diapositiva,effetto scivolamento,effetto icone nella barra delle applicazioni,effetto miniatura su un lato,translucenza,effetto translucenza, trasparenza,effetto geometria finestra,effetto finestre tremolanti,effetto segnale di avvio,effetto finestra padre,effetto oscura finestra inattiva,effetto oscura schermo,effetto scivola all'indietro,gradevole,effetto gradevole,effetto mostra FPS,effetto ridisegno,effetto scambio cubi,effetto scambio copertina,effetto cubi del desktop,effetto animazione cubi del desktop,effetto griglia desktop,effetto scambiatore con inversione,effetto riquadro,effetto finestra presente,effetto ridimensionamento finestra X-KDE-Keywords[kk]=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[km]=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[nb]=kwin,vindusbehandler,sammensetting,effekt,3D-effekter,2D-effekter,OpenGL,XRender,videoinnstillinger,grafiske effekter,skrivebordseffekter,animasjoner,diverse animasjoner,vindusbytteeffekter,effekter ved skrivebordsbytte,animasjoner,animasjonsfart,skrivebordsanimasjoner,drivere,driverinnstillinger,opptegning,opptegner,inverteringseffekt,speileffekt,lupeeffekt,gripehjelpereffekt,musesporeffekt,forstørreeffekt,sløreffekt,kontrollpulteffekt,eksplosjonseffekt,uttoningseffekt,skrivebordtoningseffekt,henfallseffekt,glidereffekt,framhev vindu-effekt,innlogingseffekt,utloggingsefffekt,magisk lampe-effekt, animasjonseffekt ved vindusminimering,musmerkeeffekt,innskalerngseffekt,skjermdumpeffekt,ark-effekt,lysbildeeffekt,glidende oppspretteffekt,effekt for minibilder på oppgavelinja,effekt for minibilder på siden,gjennomskinnelighetseffekt,gjennomsiktighet,vindusgeometri-effekt,skjelvende vinduer-effekt,effekt for oppstartsmelding,effekt for foreldredialog,effekt for mørk inaktiv,effekt for mørk skjerm,gli tilbake-effekt,øyesnop,snop,vis FPS-effekt,vis malingseffekt,boksbytteeffekt,lokkbytteeffekt,skrivebordsterning-effekt,effek for animert skrivebordsterning,effekt for skrivebordsruter,effekt for flipp-bytte,omriss-effekt,effekt for vinduer tilstede,effekt for vinduer som endrer størrelse +X-KDE-Keywords[nb]=kwin,vindusbehandler,sammensetting,effekt,3D-effekter,2D-effekter,OpenGL,XRender,videoinnstillinger,grafiske effekter,skrivebordseffekter,animasjoner,diverse animasjoner,vindusbytteeffekter,effekter ved skrivebordsbytte,animasjoner,animasjonsfart,skrivebordsanimasjoner,drivere,driverinnstillinger,opptegning,opptegner,inverteringseffekt,speileffekt,lupeeffekt,gripehjelpereffekt,musesporeffekt,forstørreeffekt,sløreffekt,kontrollpulteffekt,eksplosjonseffekt,uttoningseffekt,skrivebordtoningseffekt,henfallseffekt,glidereffekt,framhev vindu-effekt,innlogingseffekt,utloggingsefffekt,magisk lampe-effekt, animasjonseffekt ved vindusminimering,musmerkeeffekt,innskaleringseffekt,skjermdumpeffekt,ark-effekt,lysbildeeffekt,glidende oppspretteffekt,effekt for minibilder på oppgavelinja,effekt for minibilder på siden,gjennomskinnelighetseffekt,gjennomsiktighet,vindusgeometri-effekt,skjelvende vinduer-effekt,effekt for oppstartsmelding,effekt for foreldredialog,effekt for mørk inaktiv,effekt for mørk skjerm,gli tilbake-effekt,øyesnop,snop,vis FPS-effekt,vis malingseffekt,boksbytteeffekt,lokkbytteeffekt,skrivebordsterning-effekt,effek for animert skrivebordsterning,effekt for skrivebordsruter,effekt for flipp-bytte,omriss-effekt,effekt for vinduer tilstede,effekt for vinduer som endrer størrelse X-KDE-Keywords[nl]=kwin,venster,beheerder,compositing,effect,3D effecten,2D effecten,OpenGL,XRender,video-instellingen,grafische effecten,bureaubladeffecten,animaties,verrschillende animaties,vensterbeheereffecten,vensteromschakeleffect, bureaublad-omschakeleffect,animaties,animatiesnelheid,bureaubladanimaties,stuurprogramma's,stuurprogramma-instellingen,rendering,render,inversieeffect,vergrootglaseffect,vergrotingseffect,snaphelpereffect,trackmuiseffect,zoomeffect,vervagingseffect,dashboardeffect,explosie-effect,uitvaageffect,uitvaagbureaubladeffect,uiteenvaleffect,glijeffect,vebsteraccentueringseffect,aanmeldeffect,afmeldeffect,magische lampeffect,animatie-effect minimaliseren,muismarkeringseffect,inschaaleffect,schermafdrukeffect,bladeneffect,diaeffect,glijdende pop-upseffect,taakbalkminiatuureffect,miniatuur-opzijeffect,doorzichtigheid,doorzichtigheidseffect,transparantie,vensterafmetingeneffect,wiebelende vensterseffect,opstartterugkoppeleffect,dialoogoudereffect,dim bij inactiviteitseffect,dim het schermeffect,schuif terugeffect,oogstrelend,snoepgoed,FPS toneneffect,verf toneneffect,vak omschakeleffect,deksel schakelaareffect,bureaublad kubuseffect,bureaublad kubus animatie-effect,bureaubladrastereffect,omschakeleffect,omrandingeffect,huidig venstereffect, wijzig grootte van venstereffect X-KDE-Keywords[pl]=kwin,okno,menadżer,kompozycje,efekt,efekty 3D,efekty 2D,OpenGL,XRender, ustawienia wideo,efekty graficzne,efekty pulpitu,animacje,różne animacje,efekty zarządzania oknami,efekty przełączania okien,efekty przełączania pulpitów,animacje, szybkość animacji,animacje pulpitu,sterowniki,ustawienia sterowników,renderowania, efekt odwrócenia,szkło powiększające,efekt powiększenia,efekt pomocnika przyciągania, efekt śledzenia myszy,efekt przybliżenia,efekt rozmycia,efekt tablicy,efekt eksplozji,efekt zanikania,efekt zanikania pulpitu,efekt rozpadania,efekt slajdu,efekt podświetlania okna, efekt logowania,efekt wylogowywania,efekt magicznej lampy,efekt animacji minimalizacji, efekt znacznika myszy,efekt skalowania,efekt zrzutu ekranu,efekt arkusza,efekt slajdu,efekt wysuwających się elementów wyskakujących,efekt prześwitywania,przezroczystość,efekt geometrii okna,efekt chwiejnych okien,efekt odczuć przy starcie,efekt okna rodzica,efekt przyciemniania nieaktywnych,efekt przyciemniania ekranu,efekt przesuwania do tył,efekt pokazania ilości klatek na sekundę X-KDE-Keywords[pt]=kwin,janela,gestor,composição,efeito,efeitos 3D,efeitos 2D,OpenGL,XRender,configuração do vídeo,efeitos gráficos,efeitos do ecrã,animações,diversas animações,~efeitos de gestão das janelas,efeito de mudança da janela,efeito de mudança de ecrã,animações,velocidade da animação,animações do ecrã,controladores,configuração do controlador,desenho,efeito de inversão,efeito de lupa,efeito de lente,efeito de ajuste,efeito de seguimento do rato,efeito de ampliação,efeito de borrão,efeito de quadro,efeito de explosão,efeito de desvanecimento,efeito de desvanecimento do ecrã,efeito de queda,efeito de deslizamento,efeito de realce da janela,efeito de autenticação,efeito de encerramento da sessão,efeito de lâmpada mágica,efeito de animação da minimização,efeito de marcação do rato,efeito de ampliação,efeito de captura do ecrã,efeito de folha,efeito de deslizamento,efeito de janelas deslizantes,efeito de miniaturas das tarefas,efeito de miniatura ao lado,translucidez,efeito de translucidez,transparência,efeito de geometria da janela,efeito de janelas ondulantes,efeito da reacção ao arranque,efeito da janela-mãe,efeito de escurecimento da janela inactiva,efeito de escurecimento do ecrã,efeito de deslize para trás,efeitos visuais,visuais,efeito para mostrar FPS,efeito de pintura,efeito de mudança em caixa,efeito de mudança em capas,efeito de cubo do ecrã,efeito de animação do cubo do ecrã,efeito da grelha do ecrã,efeito de viragem de página,efeito de realce,efeito de apresentação das janelas,feito de dimensionamento das janelas diff --git a/kcmkwin/kwindecoration/kwindecoration.desktop b/kcmkwin/kwindecoration/kwindecoration.desktop index 7adec3c557..794ff49ba4 100644 --- a/kcmkwin/kwindecoration/kwindecoration.desktop +++ b/kcmkwin/kwindecoration/kwindecoration.desktop @@ -170,6 +170,7 @@ X-KDE-Keywords[de]=KWin,Kwm,Fenster,Manager,Rahmen,Design,Stile,Themes,Optik,Ers X-KDE-Keywords[el]=kwin,παράθυρο,διαχειριστής,περίγραμμα,στιλ,θέμα,εμφάνιση,αίσθηση,διάταξη,κουμπί,χειρισμός,άκρη,kwm,διακόσμηση 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[eu]=kwin,leiho,kudeatzaile,muga,estilo,gai,itxura,izaera,antolamendu,botoi,helduleku,ertz,kwm,apainketa X-KDE-Keywords[fi]=kwin,ikkuna,hallinta,ikkunointiohjelma,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 diff --git a/kcmkwin/kwinoptions/kwinactions.desktop b/kcmkwin/kwinoptions/kwinactions.desktop index a75df6076a..c861a2308f 100644 --- a/kcmkwin/kwinoptions/kwinactions.desktop +++ b/kcmkwin/kwinoptions/kwinactions.desktop @@ -107,6 +107,7 @@ Comment[cs]=Nastavení činností myši na oknech Comment[da]=Indstilling af musehandlinger på vinduer Comment[de]=Maus-Aktionen für Fenster einrichten Comment[es]=Configurar las acciones del ratón sobre las ventanas +Comment[eu]=Konfiguratu sagu-ekintzak leihoetan Comment[fi]=Ikkunoiden hiiritoimintojen asetukset Comment[fr]=Configurer les actions de souris pour les fenêtres Comment[gl]=Configura a accións do rato nas xanelas diff --git a/kcmkwin/kwinoptions/kwinoptions.desktop b/kcmkwin/kwinoptions/kwinoptions.desktop index 46e17d617f..e9c088e441 100644 --- a/kcmkwin/kwinoptions/kwinoptions.desktop +++ b/kcmkwin/kwinoptions/kwinoptions.desktop @@ -208,7 +208,7 @@ X-KDE-Keywords[it]=fuoco,posizionamento,comportamento della finestra,animazione, X-KDE-Keywords[kk]=focus,placement,window behavior,animation,raise,auto raise,windows,frame,titlebar,doubleclick X-KDE-Keywords[km]=focus,placement,window behavior,animation,raise,auto raise,windows,frame,titlebar,doubleclick X-KDE-Keywords[ko]=focus,placement,window behavior,animation,raise,auto raise,windows,frame,titlebar,doubleclick,초점,위치,창 행동,애니메이션,올리기,창,프레임,제목 표시줄 -X-KDE-Keywords[nb]=fokus,plassering,vindusppførsel,animering,hev,autohev,vinduer,ramme,tittellinje,dobbeltklikk +X-KDE-Keywords[nb]=fokus,plassering,vindusoppførsel,animering,hev,autohev,vinduer,ramme,tittellinje,dobbeltklikk X-KDE-Keywords[nl]=focus,plaatsing,venstegedrag,animatie,omhoog,automatisch omhoog,vensters,frame,titelbalk,dubbelklik X-KDE-Keywords[pl]=uaktywnienie,umieszczenie,zachowanie okna,animacja,wzniesienie,auto-wzniesienie, okna,ramka,pasek tytułu,podwójne kliknięcie X-KDE-Keywords[pt]=foco,colocação,comportamento da janela,animação,elevar,elevar automaticamente,janelas,contorno,barra de título,duplo-click diff --git a/kcmkwin/kwinscreenedges/main.cpp b/kcmkwin/kwinscreenedges/main.cpp index 99c4365a4c..4e0c31120a 100644 --- a/kcmkwin/kwinscreenedges/main.cpp +++ b/kcmkwin/kwinscreenedges/main.cpp @@ -53,6 +53,7 @@ KWinScreenEdgesConfig::KWinScreenEdgesConfig(QWidget* parent, const QVariantList connect(m_ui->monitor, SIGNAL(changed()), this, SLOT(changed())); connect(m_ui->desktopSwitchCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changed())); + connect(m_ui->activationDelaySpin, SIGNAL(valueChanged(int)), this, SLOT(sanitizeCooldown())); connect(m_ui->activationDelaySpin, SIGNAL(valueChanged(int)), this, SLOT(changed())); connect(m_ui->triggerCooldownSpin, SIGNAL(valueChanged(int)), this, SLOT(changed())); connect(m_ui->quickMaximizeBox, SIGNAL(stateChanged(int)), this, SLOT(changed())); @@ -65,6 +66,8 @@ KWinScreenEdgesConfig::KWinScreenEdgesConfig(QWidget* parent, const QVariantList connect(m_ui->quickTileBox, SIGNAL(stateChanged(int)), this, SLOT(groupChanged())); load(); + + sanitizeCooldown(); } KWinScreenEdgesConfig::~KWinScreenEdgesConfig() @@ -146,6 +149,11 @@ void KWinScreenEdgesConfig::showEvent(QShowEvent* e) monitorShowEvent(); } +void KWinScreenEdgesConfig::sanitizeCooldown() +{ + m_ui->triggerCooldownSpin->setMinimum(m_ui->activationDelaySpin->value() + 50); +} + // Copied from kcmkwin/kwincompositing/main.cpp bool KWinScreenEdgesConfig::effectEnabled(const QString& effect, const KConfigGroup& cfg) const { diff --git a/kcmkwin/kwinscreenedges/main.h b/kcmkwin/kwinscreenedges/main.h index ec802d6be2..d42271022f 100644 --- a/kcmkwin/kwinscreenedges/main.h +++ b/kcmkwin/kwinscreenedges/main.h @@ -56,7 +56,8 @@ public slots: virtual void defaults(); protected: virtual void showEvent(QShowEvent* e); - +private slots: + void sanitizeCooldown(); private: KWinScreenEdgesConfigForm* m_ui; KSharedConfigPtr m_config; diff --git a/kcmkwin/kwinscripts/kwinscripts.desktop b/kcmkwin/kwinscripts/kwinscripts.desktop index 73f78fefc0..6c8ffc055e 100644 --- a/kcmkwin/kwinscripts/kwinscripts.desktop +++ b/kcmkwin/kwinscripts/kwinscripts.desktop @@ -18,6 +18,7 @@ X-KDE-Keywords[de]=KWin-Skript X-KDE-Keywords[el]=σενάριο kwin X-KDE-Keywords[es]=guion de kwin X-KDE-Keywords[et]=kwini skript +X-KDE-Keywords[eu]=kwin script-a X-KDE-Keywords[fi]=kwin-skripti X-KDE-Keywords[fr]=Script de KWin X-KDE-Keywords[ga]=Script kwin @@ -63,6 +64,7 @@ Name[de]=KWin-Skripte Name[el]=Σενάρια KWin Name[es]=Guiones de KWin Name[et]=KWini skriptid +Name[eu]=KWin script-ak Name[fi]=KWin-skriptit Name[fr]=Scripts de KWin Name[ga]=Scripteanna KWin @@ -107,6 +109,7 @@ Comment[de]=KWin-Skripte verwalten Comment[el]=Διαχείριση σεναρίων KWin Comment[es]=Gestionar guiones de KWin Comment[et]=KWini skriptide haldamine +Comment[eu]=Kudeatu KWin script-ak Comment[fi]=KWin-skriptien hallinta Comment[fr]=Gérer les scripts de KWin Comment[ga]=Bainistigh scripteanna KWin diff --git a/kwin.notifyrc b/kwin.notifyrc index ed56672f68..859e5223af 100644 --- a/kwin.notifyrc +++ b/kwin.notifyrc @@ -201,7 +201,9 @@ Name[bs]=Reset grafike Name[ca]=Reinici dels gràfics Name[cs]=Resetovat grafiku Name[da]=Grafiknulstilling +Name[de]=Grafik-Reset Name[es]=Reinicio gráfico +Name[eu]=Grafikoak berrezarri Name[fi]=Grafiikan nollaus Name[fr]=Réinitialisation graphique Name[gl]=Reinicio dos gráficos @@ -211,6 +213,7 @@ Name[it]=Azzeramento grafica Name[kk]=Графиканы ысыру Name[ko]=그래픽 초기화 Name[lt]=Grafikos atstatymas +Name[nb]=Grafikk tilbakestilt Name[nl]=Grafische reset Name[pa]=ਗਰਾਫਿਕਸ ਮੁੜ-ਸੈੱਟ Name[pl]=Reset grafiki @@ -233,7 +236,9 @@ Comment=A graphics reset event occurred Comment[bs]=Grafički reset događaj se desio Comment[ca]=Ha ocorregut un esdeveniment de reinici dels gràfics Comment[da]=En grafiknulstillingshændelse fandt sted +Comment[de]=Ein Zurücksetzen der Grafik ist aufgetreten Comment[es]=Ha ocurrido un evento de reinicio gráfico +Comment[eu]=Grafikoak berrezartzeko gertaera bat jazo da Comment[fi]=Sattui grafiikan nollaustapahtuma Comment[fr]=Un évènement de réinitialisation graphique est intervenu Comment[gl]=Aconteceu un reinicio de gráficos @@ -242,6 +247,7 @@ Comment[ia]=Il necessita un evento de reinitiar le graphic Comment[it]=Si è verificato un evento di azzeramento della grafica Comment[kk]=Графиканы ысыру оқиғасы болды Comment[ko]=그래픽 초기화 이벤트가 발생함 +Comment[nb]=Det har foregått en grafikk-tilbakestilling Comment[nl]=Een gebeurtenis van een grafische reset deed zich voor Comment[pl]=Nastąpiło zdarzenie resetu grafiki Comment[pt]=Ocorreu um evento de reinício gráfico diff --git a/libkwineffects/kwinglplatform.cpp b/libkwineffects/kwinglplatform.cpp index 0d8b5d5c0f..8955612095 100644 --- a/libkwineffects/kwinglplatform.cpp +++ b/libkwineffects/kwinglplatform.cpp @@ -581,7 +581,8 @@ void GLPlatform::detect(OpenGLPlatformInterface platformInterface) GLXContext ctx = glXGetCurrentContext(); m_directRendering = glXIsDirect(display(), ctx); - m_supportsGLSL = m_extensions.contains("GL_ARB_shader_objects") && + m_supportsGLSL = m_directRendering && + m_extensions.contains("GL_ARB_shader_objects") && m_extensions.contains("GL_ARB_fragment_shader") && m_extensions.contains("GL_ARB_vertex_shader"); diff --git a/libkwineffects/kwingltexture.cpp b/libkwineffects/kwingltexture.cpp index 2b76ce1e68..56e5ce41b8 100644 --- a/libkwineffects/kwingltexture.cpp +++ b/libkwineffects/kwingltexture.cpp @@ -46,7 +46,10 @@ namespace KWin bool GLTexturePrivate::sNPOTTextureSupported = false; bool GLTexturePrivate::sFramebufferObjectSupported = false; bool GLTexturePrivate::sSaturationSupported = false; -bool GLTexturePrivate::sTextureFormatBGRA = false; +GLenum GLTexturePrivate::sTextureFormat = GL_RGBA; // custom dummy, GL_BGRA is not present on GLES +uint GLTexturePrivate::s_textureObjectCounter = 0; +uint GLTexturePrivate::s_fbo = 0; + GLTexture::GLTexture() : d_ptr(new GLTexturePrivate()) @@ -97,11 +100,8 @@ GLTexture::GLTexture(int width, int height) glGenTextures(1, &d->m_texture); bind(); #ifdef KWIN_HAVE_OPENGLES - if (GLTexturePrivate::sTextureFormatBGRA) { - glTexImage2D(d->m_target, 0, GL_BGRA_EXT, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, 0); - } else { - glTexImage2D(d->m_target, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - } + glTexImage2D(d->m_target, 0, GLTexturePrivate::sTextureFormat, width, height, + 0, GLTexturePrivate::sTextureFormat, GL_UNSIGNED_BYTE, 0); #else glTexImage2D(d->m_target, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, 0); #endif @@ -133,6 +133,7 @@ GLTexturePrivate::GLTexturePrivate() m_vbo = 0; m_filterChanged = true; m_wrapModeChanged = false; + ++s_textureObjectCounter; } GLTexturePrivate::~GLTexturePrivate() @@ -143,6 +144,11 @@ GLTexturePrivate::~GLTexturePrivate() if (m_texture != 0) { glDeleteTextures(1, &m_texture); } + // Delete the FBO if this is the last Texture + if (--s_textureObjectCounter == 0 && s_fbo) { + glDeleteFramebuffers(1, &s_fbo); + s_fbo = 0; + } } void GLTexturePrivate::initStatic() @@ -151,14 +157,17 @@ void GLTexturePrivate::initStatic() sNPOTTextureSupported = true; sFramebufferObjectSupported = true; sSaturationSupported = true; - sTextureFormatBGRA = hasGLExtension(QStringLiteral("GL_EXT_texture_format_BGRA8888")); + if (hasGLExtension(QStringLiteral("GL_EXT_texture_format_BGRA8888"))) + sTextureFormat = GL_BGRA_EXT; + else + sTextureFormat = GL_RGBA; #else sNPOTTextureSupported = hasGLExtension(QStringLiteral("GL_ARB_texture_non_power_of_two")); sFramebufferObjectSupported = hasGLExtension(QStringLiteral("GL_EXT_framebuffer_object")); sSaturationSupported = ((hasGLExtension(QStringLiteral("GL_ARB_texture_env_crossbar")) && hasGLExtension(QStringLiteral("GL_ARB_texture_env_dot3"))) || hasGLVersion(1, 4)) && (glTextureUnitsCount >= 4) && glActiveTexture != NULL; - sTextureFormatBGRA = true; + sTextureFormat = GL_BGRA; #endif } @@ -215,11 +224,8 @@ bool GLTexture::load(const QImage& image, GLenum target) } bind(); #ifdef KWIN_HAVE_OPENGLES - if (GLTexturePrivate::sTextureFormatBGRA) { - glTexImage2D(d->m_target, 0, GL_BGRA_EXT, img.width(), img.height(), 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, img.bits()); - } else { - glTexImage2D(d->m_target, 0, GL_RGBA, img.width(), img.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, img.bits()); - } + glTexImage2D(d->m_target, 0, GLTexturePrivate::sTextureFormat, img.width(), img.height(), + 0, GLTexturePrivate::sTextureFormat, GL_UNSIGNED_BYTE, img.bits()); #else glTexImage2D(d->m_target, 0, GL_RGBA8, img.width(), img.height(), 0, GL_BGRA, GL_UNSIGNED_BYTE, img.bits()); @@ -258,15 +264,8 @@ void GLTexture::update(const QImage &image, const QPoint &offset, const QRect &s const QImage &img = d->convertToGLFormat(tmpImage.isNull() ? image : tmpImage); bind(); -#ifdef KWIN_HAVE_OPENGLES - if (GLTexturePrivate::sTextureFormatBGRA) { - glTexSubImage2D(d->m_target, 0, offset.x(), offset.y(), width, height, GL_BGRA_EXT, GL_UNSIGNED_BYTE, img.bits()); - } else { - glTexSubImage2D(d->m_target, 0, offset.x(), offset.y(), width, height, GL_RGBA, GL_UNSIGNED_BYTE, img.bits()); - } -#else - glTexSubImage2D(d->m_target, 0, offset.x(), offset.y(), width, height, GL_BGRA, GL_UNSIGNED_BYTE, img.bits()); -#endif + glTexSubImage2D(d->m_target, 0, offset.x(), offset.y(), width, height, + GLTexturePrivate::sTextureFormat, GL_UNSIGNED_BYTE, img.bits()); checkGLError("update texture"); unbind(); setDirty(); @@ -428,6 +427,33 @@ GLenum GLTexture::filter() const return d->m_filter; } +void GLTexture::clear() +{ + Q_D(GLTexture); + if (!GLTexturePrivate::s_fbo && GLRenderTarget::supported() && + GLPlatform::instance()->driver() != Driver_Catalyst) // fail. -> bug #323065 + glGenFramebuffers(1, &GLTexturePrivate::s_fbo); + + if (GLTexturePrivate::s_fbo) { + // Clear the texture + glBindFramebuffer(GL_FRAMEBUFFER, GLTexturePrivate::s_fbo); + glClearColor(0, 0, 0, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, d->m_texture, 0); + glClear(GL_COLOR_BUFFER_BIT); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + } else { + if (const int size = width()*height()) { + uint32_t *buffer = new uint32_t[size]; + memset(buffer, 0, size*sizeof(uint32_t)); + bind(); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width(), height(), + GLTexturePrivate::sTextureFormat, GL_UNSIGNED_BYTE, buffer); + unbind(); + delete[] buffer; + } + } +} + bool GLTexture::isDirty() const { Q_D(const GLTexture); @@ -470,7 +496,7 @@ QImage GLTexturePrivate::convertToGLFormat(const QImage& img) const // Copied from Qt's QGLWidget::convertToGLFormat() QImage res; - if (sTextureFormatBGRA) { + if (sTextureFormat != GL_RGBA) { if (QSysInfo::ByteOrder == QSysInfo::BigEndian) { res = QImage(img.size(), QImage::Format_ARGB32); QImage imgARGB32 = img.convertToFormat(QImage::Format_ARGB32_Premultiplied); diff --git a/libkwineffects/kwingltexture.h b/libkwineffects/kwingltexture.h index 18e0a80081..200d24f322 100644 --- a/libkwineffects/kwingltexture.h +++ b/libkwineffects/kwingltexture.h @@ -93,6 +93,11 @@ public: GLuint texture() const; GLenum target() const; GLenum filter() const; + /** @short + * Make the texture fully transparent + * Warning: this clobbers the current framebuffer binding except on fglrx + */ + void clear(); bool isDirty() const; void setFilter(GLenum filter); void setWrapMode(GLenum mode); diff --git a/libkwineffects/kwingltexture_p.h b/libkwineffects/kwingltexture_p.h index 2afc9aa7a4..0b57d9742b 100644 --- a/libkwineffects/kwingltexture_p.h +++ b/libkwineffects/kwingltexture_p.h @@ -73,7 +73,9 @@ public: static bool sNPOTTextureSupported; static bool sFramebufferObjectSupported; static bool sSaturationSupported; - static bool sTextureFormatBGRA; + static GLenum sTextureFormat; + static uint s_fbo; + static uint s_textureObjectCounter; private: Q_DISABLE_COPY(GLTexturePrivate) }; diff --git a/libkwineffects/kwinglutils.cpp b/libkwineffects/kwinglutils.cpp index 8b53ba4b26..40ce07db91 100644 --- a/libkwineffects/kwinglutils.cpp +++ b/libkwineffects/kwinglutils.cpp @@ -786,6 +786,16 @@ void ShaderManager::resetAllShaders() } } +void ShaderManager::resetShader(GLShader *shader, ShaderType type) +{ + if (!(shader && shader->isValid())) + return; + + pushShader(shader); + resetShader(type); + popShader(); +} + void ShaderManager::pushShader(GLShader *shader) { diff --git a/libkwineffects/kwinglutils.h b/libkwineffects/kwinglutils.h index 20a66013b4..e5c6f7660f 100644 --- a/libkwineffects/kwinglutils.h +++ b/libkwineffects/kwinglutils.h @@ -352,6 +352,12 @@ public: **/ void resetAllShaders(); + /** + * Resets ShaderType @p type uniforms of a custom shader + * @since 4.11.1 + */ + void resetShader(GLShader *shader, ShaderType type); + /** * Creates a GLShader with a built-in vertex shader and a custom fragment shader. * @param vertex The generic vertex shader diff --git a/libkwineffects/kwinxrenderutils.cpp b/libkwineffects/kwinxrenderutils.cpp index cba2d4c30b..c8ecf3922b 100644 --- a/libkwineffects/kwinxrenderutils.cpp +++ b/libkwineffects/kwinxrenderutils.cpp @@ -108,6 +108,11 @@ static xcb_render_picture_t createPicture(xcb_pixmap_t pix, int depth) } XRenderPicture::XRenderPicture(const QImage &img) +{ + fromImage(img); +} + +void XRenderPicture::fromImage(const QImage &img) { const int depth = img.depth(); xcb_pixmap_t xpix = xcb_generate_id(connection()); diff --git a/libkwineffects/kwinxrenderutils.h b/libkwineffects/kwinxrenderutils.h index a5b6ee29df..244ac5ac48 100644 --- a/libkwineffects/kwinxrenderutils.h +++ b/libkwineffects/kwinxrenderutils.h @@ -72,6 +72,7 @@ public: XRenderPicture(xcb_pixmap_t pix, int depth); operator xcb_render_picture_t(); private: + void fromImage(const QImage &img); KSharedPtr< XRenderPictureData > d; }; diff --git a/manage.cpp b/manage.cpp index b54fc0cb5a..c66f5575b2 100644 --- a/manage.cpp +++ b/manage.cpp @@ -377,6 +377,7 @@ bool Client::manage(xcb_window_t w, bool isMapped) if (!placementDone) { // Placement needs to be after setting size Placement::self()->place(this, area); + dontKeepInArea = true; placementDone = true; } @@ -419,7 +420,7 @@ bool Client::manage(xcb_window_t w, bool isMapped) if (pseudo_max != Client::MaximizeRestore) { maximize((MaximizeMode)pseudo_max); // from now on, care about maxmode, since the maximization call will override mode for fix aspects - dontKeepInArea = (max_mode == Client::MaximizeFull); + dontKeepInArea |= (max_mode == Client::MaximizeFull); geom_restore = QRect(); // Use placement when unmaximizing ... if (!(max_mode & Client::MaximizeVertical)) { geom_restore.setY(y()); // ...but only for horizontal direction diff --git a/paintredirector.cpp b/paintredirector.cpp index f82d46d6fe..2a8ff29b59 100644 --- a/paintredirector.cpp +++ b/paintredirector.cpp @@ -28,6 +28,7 @@ DEALINGS IN THE SOFTWARE. #include "client.h" #include "deleted.h" #include "effects.h" +#include #include #include #include @@ -306,21 +307,12 @@ void ImageBasedPaintRedirector::discardScratch() // ------------------------------------------------------------------ - -unsigned int OpenGLPaintRedirector::s_count = 0; -unsigned int OpenGLPaintRedirector::s_fbo = 0; - OpenGLPaintRedirector::OpenGLPaintRedirector(Client *c, QWidget *widget) : ImageBasedPaintRedirector(c, widget) { - s_count++; - for (int i = 0; i < TextureCount; ++i) m_textures[i] = NULL; - if (!s_fbo && GLRenderTarget::supported()) - glGenFramebuffers(1, &s_fbo); - PaintRedirector::resizePixmaps(); } @@ -328,12 +320,6 @@ OpenGLPaintRedirector::~OpenGLPaintRedirector() { for (int i = 0; i < TextureCount; ++i) delete m_textures[i]; - - // Delete the FBO if this is the last OpenGLPaintRedirector - if (--s_count == 0 && s_fbo) { - glDeleteFramebuffers(1, &s_fbo); - s_fbo = 0; - } } void OpenGLPaintRedirector::resizePixmaps(const QRect *rects) @@ -351,8 +337,6 @@ void OpenGLPaintRedirector::resizePixmaps(const QRect *rects) } } - bool fbo_bound = false; - for (int i = 0; i < 2; i++) { if (m_textures[i] && m_textures[i]->size() == size[i]) continue; @@ -366,22 +350,8 @@ void OpenGLPaintRedirector::resizePixmaps(const QRect *rects) m_textures[i] = new GLTexture(size[i].width(), size[i].height()); m_textures[i]->setYInverted(true); m_textures[i]->setWrapMode(GL_CLAMP_TO_EDGE); - - if (s_fbo) { - // Clear the texture - if (!fbo_bound) { - glBindFramebuffer(GL_FRAMEBUFFER, s_fbo); - glClearColor(0, 0, 0, 0); - fbo_bound = true; - } - - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_textures[i]->texture(), 0); - glClear(GL_COLOR_BUFFER_BIT); - } + m_textures[i]->clear(); } - - if (fbo_bound) - glBindFramebuffer(GL_FRAMEBUFFER, 0); } void OpenGLPaintRedirector::preparePaint(const QPixmap &pending) diff --git a/paintredirector.h b/paintredirector.h index f1e1c985b0..9e494e6df4 100644 --- a/paintredirector.h +++ b/paintredirector.h @@ -157,9 +157,6 @@ protected: private: QImage m_tempImage; GLTexture *m_textures[2]; - - static unsigned int s_fbo; - static unsigned int s_count; }; class RasterXRenderPaintRedirector : public ImageBasedPaintRedirector diff --git a/placement.cpp b/placement.cpp index ce7e65c494..f39624c9fc 100644 --- a/placement.cpp +++ b/placement.cpp @@ -28,6 +28,7 @@ along with this program. If not, see . #include #ifndef KCMRULES +#include #include "workspace.h" #include "client.h" #include "options.h" @@ -96,6 +97,30 @@ void Placement::place(Client* c, QRect& area, Policy policy, Policy nextPlacemen placeMaximizing(c, area, nextPlacement); else placeSmart(c, area, nextPlacement); + + if (options->borderSnapZone()) { + // snap to titlebar / snap to window borders on inner screen edges + const QRect geo(c->geometry()); + QPoint corner = geo.topLeft(); + const QPoint cp = c->clientPos(); + const QSize cs = geo.size() - c->clientSize(); + KDecorationDefines::Position titlePos = c->titlebarPosition(); + + const QRect fullRect = workspace()->clientArea(FullArea, c); + if (!(c->maximizeMode() & KDecorationDefines::MaximizeHorizontal)) { + if (titlePos != KDecorationDefines::PositionRight && geo.right() == fullRect.right()) + corner.rx() += cs.width() - cp.x(); + if (titlePos != KDecorationDefines::PositionLeft && geo.x() == fullRect.x()) + corner.rx() -= cp.x(); + } + if (!(c->maximizeMode() & KDecorationDefines::MaximizeVertical)) { + if (titlePos != KDecorationDefines::PositionBottom && geo.bottom() == fullRect.bottom()) + corner.ry() += cs.height() - cp.y(); + if (titlePos != KDecorationDefines::PositionTop && geo.y() == fullRect.y()) + corner.ry() -= cp.y(); + } + c->move(corner); + } } /*! @@ -442,10 +467,7 @@ void Placement::placeCentered(Client* c, const QRect& area, Policy /*next*/) void Placement::placeZeroCornered(Client* c, const QRect& area, Policy /*next*/) { // get the maximum allowed windows space and desk's origin - const QRect maxRect = checkArea(c, area); - - // place the window - c->move(QPoint(maxRect.left(), maxRect.top())); + c->move(checkArea(c, area).topLeft()); } void Placement::placeUtility(Client* c, QRect& area, Policy /*next*/) diff --git a/scene_opengl.cpp b/scene_opengl.cpp index 965cec4c8d..d124b1d43a 100644 --- a/scene_opengl.cpp +++ b/scene_opengl.cpp @@ -633,17 +633,14 @@ bool SceneOpenGL2::supported(OpenGLBackend *backend) SceneOpenGL2::SceneOpenGL2(OpenGLBackend *backend) : SceneOpenGL(Workspace::self(), backend) , m_lanczosFilter(NULL) - , m_colorCorrection(new ColorCorrection(this)) + , m_colorCorrection() { if (!init_ok) { // base ctor already failed return; } // Initialize color correction before the shaders - qDebug() << "Color correction:" << options->isColorCorrected(); - m_colorCorrection->setEnabled(options->isColorCorrected()); - connect(m_colorCorrection, SIGNAL(changed()), Compositor::self(), SLOT(addRepaintFull())); - connect(m_colorCorrection, SIGNAL(errorOccured()), options, SLOT(setColorCorrected()), Qt::QueuedConnection); + slotColorCorrectedChanged(false); connect(options, SIGNAL(colorCorrectedChanged()), this, SLOT(slotColorCorrectedChanged()), Qt::QueuedConnection); if (!ShaderManager::instance()->isValid()) { @@ -717,7 +714,7 @@ SceneOpenGL::Window *SceneOpenGL2::createWindow(Toplevel *t) void SceneOpenGL2::finalDrawWindow(EffectWindowImpl* w, int mask, QRegion region, WindowPaintData& data) { - if (m_colorCorrection->isEnabled()) { + if (!m_colorCorrection.isNull() && m_colorCorrection->isEnabled()) { // Split the painting for separate screens const int numScreens = screens()->count(); for (int screen = 0; screen < numScreens; ++ screen) { @@ -755,12 +752,29 @@ void SceneOpenGL2::resetLanczosFilter() ColorCorrection *SceneOpenGL2::colorCorrection() { - return m_colorCorrection; + return m_colorCorrection.data(); } -void SceneOpenGL2::slotColorCorrectedChanged() +void SceneOpenGL2::slotColorCorrectedChanged(bool recreateShaders) { - m_colorCorrection->setEnabled(options->isColorCorrected()); + qDebug() << "Color correction:" << options->isColorCorrected(); + if (options->isColorCorrected() && m_colorCorrection.isNull()) { + m_colorCorrection.reset(new ColorCorrection(this)); + if (!m_colorCorrection->setEnabled(true)) { + m_colorCorrection.reset(); + return; + } + connect(m_colorCorrection.data(), SIGNAL(changed()), Compositor::self(), SLOT(addRepaintFull())); + connect(m_colorCorrection.data(), SIGNAL(errorOccured()), options, SLOT(setColorCorrected()), Qt::QueuedConnection); + if (recreateShaders) { + // Reload all shaders + ShaderManager::cleanup(); + ShaderManager::instance(); + } + } else { + m_colorCorrection.reset(); + } + Compositor::self()->addRepaintFull(); } @@ -1393,7 +1407,9 @@ void SceneOpenGL2Window::performPaint(int mask, QRegion region, WindowPaintData } } - static_cast(m_scene)->colorCorrection()->setupForOutput(data.screen()); + if (ColorCorrection *cc = static_cast(m_scene)->colorCorrection()) { + cc->setupForOutput(data.screen()); + } shader->setUniform(GLShader::WindowTransformation, transformation(mask, data)); shader->setUniform(GLShader::Saturation, data.saturation()); @@ -1556,7 +1572,9 @@ void SceneOpenGL2Window::prepareStates(TextureType type, qreal opacity, qreal br shader->setUniform(GLShader::ModulationConstant, QVector4D(rgb, rgb, rgb, a)); shader->setUniform(GLShader::Saturation, saturation); - static_cast(m_scene)->colorCorrection()->setupForOutput(screen); + if (ColorCorrection *cc = static_cast(m_scene)->colorCorrection()) { + cc->setupForOutput(screen); + } } void SceneOpenGL2Window::restoreStates(TextureType type, qreal opacity, qreal brightness, qreal saturation) @@ -1569,7 +1587,9 @@ void SceneOpenGL2Window::restoreStates(TextureType type, qreal opacity, qreal br glDisable(GL_BLEND); } - static_cast(m_scene)->colorCorrection()->setupForOutput(-1); + if (ColorCorrection *cc = static_cast(m_scene)->colorCorrection()) { + cc->setupForOutput(-1); + } } //*************************************** diff --git a/scene_opengl.h b/scene_opengl.h index 33a59b93fc..699c8f2115 100644 --- a/scene_opengl.h +++ b/scene_opengl.h @@ -127,7 +127,7 @@ protected: virtual void paintDesktop(int desktop, int mask, const QRegion ®ion, ScreenPaintData &data); private Q_SLOTS: - void slotColorCorrectedChanged(); + void slotColorCorrectedChanged(bool recreateShaders = true); void resetLanczosFilter(); private: @@ -135,7 +135,7 @@ private: private: LanczosFilter *m_lanczosFilter; - ColorCorrection *m_colorCorrection; + QScopedPointer m_colorCorrection; GLuint vao; }; diff --git a/screenedge.cpp b/screenedge.cpp index c34d425b4a..8c7203a262 100644 --- a/screenedge.cpp +++ b/screenedge.cpp @@ -591,7 +591,7 @@ void ScreenEdges::reconfigure() // TODO: migrate settings to a group ScreenEdges KConfigGroup windowsConfig = m_config->group("Windows"); setTimeThreshold(windowsConfig.readEntry("ElectricBorderDelay", 150)); - setReActivationThreshold(windowsConfig.readEntry("ElectricBorderCooldown", 350)); + setReActivationThreshold(qMax(timeThreshold() + 50, windowsConfig.readEntry("ElectricBorderCooldown", 350))); int desktopSwitching = windowsConfig.readEntry("ElectricBorders", static_cast(ElectricDisabled)); if (desktopSwitching == ElectricDisabled) { setDesktopSwitching(false); diff --git a/scripting/kwinscript.desktop b/scripting/kwinscript.desktop index 795fc3bcfe..f6f91bcb95 100644 --- a/scripting/kwinscript.desktop +++ b/scripting/kwinscript.desktop @@ -12,6 +12,7 @@ Comment[de]=KWin-Skript Comment[el]=Σενάριο KWin Comment[es]=Guion de KWin Comment[et]=KWini skript +Comment[eu]=KWin script-a Comment[fi]=KWin-skripti Comment[fr]=Script KWin Comment[ga]=Script KWin diff --git a/scripts/desktopchangeosd/metadata.desktop b/scripts/desktopchangeosd/metadata.desktop index 1f47e38ac3..4bcc3857b5 100644 --- a/scripts/desktopchangeosd/metadata.desktop +++ b/scripts/desktopchangeosd/metadata.desktop @@ -9,6 +9,7 @@ Name[de]=OSD-Arbeitsflächenwechsel Name[el]=OSD αλλαγής επιφάνειας εργασίας Name[es]=Información en pantalla sobre cambio de escritorio Name[et]=Töölaua muutmise ekraaniesitus +Name[eu]=Mahaigain aldaketa OSD Name[fi]=Työpöydänvaihdon ilmoitus Name[fr]=OSD pour le changement de bureau Name[gl]=OSD de cambio de escritorio @@ -50,6 +51,7 @@ Comment[de]=Ein On-Screen-Display (OSD), das den Wechsel der Arbeitsfläche anze Comment[el]=Μια ένδειξη στην οθόνη που δηλώνει την αλλαγή της επιφάνειας εργασίας Comment[es]=Una información en pantalla que indica el cambio de escritorio Comment[et]=Töölaua muutumist näitab ekraanikuva +Comment[eu]=Mahaigain aldaketa adierazten duen pantailan erakusten den informazioa Comment[fi]=Näytölle ilmestyvä ilmoitus työpöydän vaihdosta Comment[fr]=Un affichage sur l'écran (OSD) indiquant le changement de bureau Comment[gl]=Un visor na pantalla que indica o cambio de escritorio diff --git a/scripts/videowall/metadata.desktop b/scripts/videowall/metadata.desktop index 32fe15d3be..7f9e847255 100644 --- a/scripts/videowall/metadata.desktop +++ b/scripts/videowall/metadata.desktop @@ -9,6 +9,7 @@ Name[de]=Video-Wand Name[el]=Τοίχος με οθόνες Name[es]=Panel de vídeo Name[et]=Videosein +Name[eu]=Bideo-horma Name[fi]=Videoseinä Name[fr]=Mur de vidéos Name[ga]=Balla Físe @@ -51,6 +52,7 @@ Comment[de]=Erweitert einen Videospieler im Vollbildmodus über alle Bildschirme Comment[el]=Απλώνει πλήρη οθόνη για το πρόγραμμα αναπαραγωγής βίντεο σε όλες τις προσαρτημένες οθόνες για να δημιουργήσει ένα Video Wall 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[eu]=Pantaila-beteko bideo jotzea lotutako pantaila guztietara zabaltzen du bideo-horma bat sortzeko Comment[fi]=Levittää koko näytön tilassa olevan videotoistimen kaikkiin yhdistettyihin näyttöihin luoden videoseinän Comment[fr]=Étend le lecteur vidéo en mode plein écran sur l'ensemble des écrans connectés afin de créer un mur de vidéos Comment[gl]=Estende un reprodutor de vídeo a pantalla completa por todas as pantallas anexas para crear unha parede de vídeo diff --git a/tabbox/kwindesktopswitcher.desktop b/tabbox/kwindesktopswitcher.desktop index 42cc455d96..c1c2a57bc1 100644 --- a/tabbox/kwindesktopswitcher.desktop +++ b/tabbox/kwindesktopswitcher.desktop @@ -6,6 +6,7 @@ Comment=KWin Desktop Switcher Layout Comment[bs]=Izgled KWin prebacivača radnih površina Comment[ca]=Disposició del commutador d'escriptoris del KWin Comment[da]=Layout til KWins skrivebordsskifter +Comment[de]=Arbeitsflächenwechsler-Layout Comment[es]=Esquema del cambiador de escritorios de KWin Comment[fi]=KWinin työpöydänvalitsimen asettelu Comment[fr]=Une disposition du sélecteur de bureaux KWin diff --git a/tabbox/qml/clients/big_icons/metadata.desktop b/tabbox/qml/clients/big_icons/metadata.desktop index 1f612305e7..b24e0489ef 100644 --- a/tabbox/qml/clients/big_icons/metadata.desktop +++ b/tabbox/qml/clients/big_icons/metadata.desktop @@ -9,6 +9,7 @@ Name[de]=Große Symbole Name[el]=Μεγάλα εικονίδια Name[es]=Iconos grandes Name[et]=Suured ikoonid +Name[eu]=Ikonoak handiak Name[fi]=Suuret kuvakkeet Name[fr]=Grandes icônes Name[ga]=Deilbhíní Móra diff --git a/tabbox/qml/clients/compact/metadata.desktop b/tabbox/qml/clients/compact/metadata.desktop index 42c237312a..88e4762ace 100644 --- a/tabbox/qml/clients/compact/metadata.desktop +++ b/tabbox/qml/clients/compact/metadata.desktop @@ -9,6 +9,7 @@ Name[de]=Kompakt Name[el]=Συμπαγές Name[es]=Compacto Name[et]=Kompaktne +Name[eu]=Trinkoa Name[fi]=Tiivis Name[fr]=Synthétique Name[ga]=Dlúth diff --git a/tabbox/qml/clients/present_windows/metadata.desktop b/tabbox/qml/clients/present_windows/metadata.desktop index 60fa982a4a..f2069de106 100644 --- a/tabbox/qml/clients/present_windows/metadata.desktop +++ b/tabbox/qml/clients/present_windows/metadata.desktop @@ -9,6 +9,7 @@ Name[de]=Raster Name[el]=Κάνναβος Name[es]=Rejilla Name[et]=Võrgustik +Name[eu]=Sareta Name[fi]=Ruudukko Name[fr]=Grille Name[ga]=Greille @@ -54,6 +55,7 @@ Comment[de]=Ein Fensterwechsler-Layout, das Vorschauen aller Fenster in einem Ra Comment[el]=Μια διάταξη εναλλαγής παραθύρων με όλα τα παράθυρα ως εικόνες επισκόπησης σε κάνναβο 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[eu]=Leiho aldaketarako antolamendu bat leiho guztiak sareta batean koadro-txiki gisa erakusten dituena Comment[fi]=Tehtävänvalitsimen asettelu, joka näyttää kaikkien ikkunoiden pienoiskuvat ruudukossa Comment[fr]=Une disposition de sélecteur de fenêtres affichant toutes les fenêtres en miniatures dans une grille Comment[gl]=Unha disposición do alternador de xanelas que mostra nunha grella miniaturas das xanelas diff --git a/tabbox/qml/clients/small_icons/metadata.desktop b/tabbox/qml/clients/small_icons/metadata.desktop index 04ffe45a83..1419462d8d 100644 --- a/tabbox/qml/clients/small_icons/metadata.desktop +++ b/tabbox/qml/clients/small_icons/metadata.desktop @@ -9,6 +9,7 @@ Name[de]=Kleine Symbole Name[el]=Μικρά εικονίδια Name[es]=Iconos pequeños Name[et]=Väikesed ikoonid +Name[eu]=Ikono txikiak Name[fi]=Pienet kuvakkeet Name[fr]=Petites icônes Name[ga]=Deilbhíní Beaga diff --git a/workspace.cpp b/workspace.cpp index da99a58e1d..1b763ae61a 100644 --- a/workspace.cpp +++ b/workspace.cpp @@ -436,8 +436,13 @@ Workspace::~Workspace() // TODO: grabXServer(); // Use stacking_order, so that kwin --replace keeps stacking order - for (ToplevelList::iterator it = stacking_order.begin(), end = stacking_order.end(); it != end; ++it) { - Client *c = qobject_cast(*it); + const ToplevelList stack = stacking_order; + // "mutex" the stackingorder, since anything trying to access it from now on will find + // many dangeling pointers and crash + stacking_order.clear(); + + for (ToplevelList::const_iterator it = stack.constBegin(), end = stack.constEnd(); it != end; ++it) { + Client *c = qobject_cast(const_cast(*it)); if (!c) { continue; } @@ -1458,6 +1463,11 @@ QString Workspace::supportInformation() const } else { support.append(QStringLiteral("no\n")); } + support.append(QStringLiteral("Active screen follows mouse: ")); + if (screens()->isCurrentFollowsMouse()) + support.append(QStringLiteral(" yes\n")); + else + support.append(QStringLiteral(" no\n")); support.append(QStringLiteral("Number of Screens: %1\n").arg(screens()->count())); for (int i=0; icount(); ++i) { const QRect geo = screens()->geometry(i); @@ -1555,6 +1565,11 @@ QString Workspace::supportInformation() const } else { support.append(QStringLiteral("OpenGL 2 Shaders are not used. Legacy OpenGL 1.x code path is used.\n")); } + support.append(QStringLiteral("Painting blocks for vertical retrace: ")); + if (m_compositor->scene()->blocksForRetrace()) + support.append(QStringLiteral(" yes\n")); + else + support.append(QStringLiteral(" no\n")); break; } case XRenderCompositing: diff --git a/xcbutils.h b/xcbutils.h index af37a93a26..88a5156d54 100644 --- a/xcbutils.h +++ b/xcbutils.h @@ -244,7 +244,7 @@ inline xcb_get_input_focus_cookie_t get_input_focus(xcb_connection_t *c, xcb_win class CurrentInput : public Wrapper { public: - CurrentInput() : Wrapper() {} + CurrentInput() : Wrapper(XCB_WINDOW_NONE) {} inline xcb_window_t window() { if (isNull())