Merge branch 'master' into color2
This commit is contained in:
commit
17965a9fd9
94 changed files with 1187 additions and 296 deletions
|
@ -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})
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<QWheelEvent*>(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<Qt::MouseButton>(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"
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
26
effects.cpp
26
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; i<metaOptions->propertyCount(); ++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
|
||||
//****************************************
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -1167,7 +1167,8 @@ void CubeEffect::postPaintScreen()
|
|||
|
||||
delete m_cubeCapBuffer;
|
||||
m_cubeCapBuffer = NULL;
|
||||
desktopNameFrame->free();
|
||||
if (desktopNameFrame)
|
||||
desktopNameFrame->free();
|
||||
}
|
||||
effects->addRepaintFull();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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<void*>(this)));
|
||||
if (blur) {
|
||||
w->setData(WindowBlurBehindRole, w->geometry());
|
||||
w->setData(WindowForceBlurRole, QVariant(true));
|
||||
}
|
||||
|
||||
activateAnimation = true;
|
||||
deactivateAnimation = false;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
//*************************************************************
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 )
|
||||
DESTINATION ${SERVICES_INSTALL_DIR}/kwin )
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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]=צילום מסך
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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]);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -37,6 +37,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include <KStandardDirs>
|
||||
#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();
|
||||
|
|
|
@ -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<QWheelEvent*>(e)->orientation() == Qt::Horizontal;
|
||||
}
|
||||
}
|
||||
return KCModule::eventFilter(o, e);
|
||||
}
|
||||
|
|
|
@ -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ó
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -267,18 +267,12 @@ void KWinTabBoxConfig::loadConfig(const KConfigGroup& config, KWin::TabBox::TabB
|
|||
config.readEntry<int>("MultiScreenMode", TabBoxConfig::defaultMultiScreenMode())));
|
||||
tabBoxConfig.setClientSwitchingMode(TabBoxConfig::ClientSwitchingMode(
|
||||
config.readEntry<int>("SwitchingMode", TabBoxConfig::defaultSwitchingMode())));
|
||||
tabBoxConfig.setLayout(TabBoxConfig::LayoutMode(
|
||||
config.readEntry<int>("LayoutMode", TabBoxConfig::defaultLayoutMode())));
|
||||
|
||||
tabBoxConfig.setShowOutline(config.readEntry<bool>("ShowOutline", TabBoxConfig::defaultShowOutline()));
|
||||
tabBoxConfig.setShowTabBox(config.readEntry<bool>("ShowTabBox", TabBoxConfig::defaultShowTabBox()));
|
||||
tabBoxConfig.setHighlightWindows(config.readEntry<bool>("HighlightWindows", TabBoxConfig::defaultHighlightWindow()));
|
||||
|
||||
tabBoxConfig.setMinWidth(config.readEntry<int>("MinWidth", TabBoxConfig::defaultMinWidth()));
|
||||
tabBoxConfig.setMinHeight(config.readEntry<int>("MinHeight", TabBoxConfig::defaultMinHeight()));
|
||||
|
||||
tabBoxConfig.setLayoutName(config.readEntry<QString>("LayoutName", TabBoxConfig::defaultLayoutName()));
|
||||
tabBoxConfig.setSelectedItemLayoutName(config.readEntry<QString>("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();
|
||||
}
|
||||
|
||||
|
|
|
@ -56,4 +56,4 @@ Item {
|
|||
}
|
||||
visible: true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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!
|
||||
|
|
|
@ -58,6 +58,10 @@
|
|||
<method name="listOfEffects">
|
||||
<arg type="as" direction="out"/>
|
||||
</method>
|
||||
<method name="supportInformationForEffect">
|
||||
<arg name="name" type="s" direction="in"/>
|
||||
<arg type="s" direction="out"/>
|
||||
</method>
|
||||
<method name="compositingActive">
|
||||
<arg type="b" direction="out"/>
|
||||
</method>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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]=К‑винова скрипта
|
||||
|
|
|
@ -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]=Үстел ауыстыруын көрсететін экран дисплейі
|
||||
|
|
|
@ -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 дегенде) көрсетпеу
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()));
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -124,7 +124,11 @@ void TabBoxHandlerPrivate::updateOutline()
|
|||
q->hideOutline();
|
||||
return;
|
||||
}
|
||||
TabBoxClient* c = static_cast< TabBoxClient* >(m_clientModel->data(index, ClientModel::ClientRole).value<void *>());
|
||||
const QVariant client = m_clientModel->data(index, ClientModel::ClientRole);
|
||||
if (!client.isValid()) {
|
||||
return;
|
||||
}
|
||||
TabBoxClient* c = static_cast< TabBoxClient* >(client.value<void *>());
|
||||
q->showOutline(QRect(c->x(), c->y(), c->width(), c->height()));
|
||||
}
|
||||
|
||||
|
|
|
@ -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} )
|
||||
|
|
55
tabbox/tests/test_tabbox_handler.cpp
Normal file
55
tabbox/tests/test_tabbox_handler.cpp
Normal file
|
@ -0,0 +1,55 @@
|
|||
/********************************************************************
|
||||
KWin - the KDE window manager
|
||||
This file is part of the KDE project.
|
||||
|
||||
Copyright (C) 2012 Martin Gräßlin <mgraesslin@kde.org>
|
||||
|
||||
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 <http://www.gnu.org/licenses/>.
|
||||
*********************************************************************/
|
||||
#include "mock_tabboxhandler.h"
|
||||
#include "clientmodel.h"
|
||||
#include <QtTest/QtTest>
|
||||
|
||||
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"
|
28
tabgroup.cpp
28
tabgroup.cpp
|
@ -104,6 +104,15 @@ bool TabGroup::add(Client* c, Client *other, bool after, bool becomeVisible)
|
|||
if (effects)
|
||||
static_cast<EffectsHandlerImpl*>(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);
|
||||
|
|
|
@ -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; i<numScreens(); ++i) {
|
||||
// TODO: retrieve the screen name?
|
||||
// assumption: there are not more than 9 screens attached.
|
||||
QAction *action = screen_popup->addAction(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<EffectsHandlerImpl*>(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
|
||||
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue