I have made the following changes intended for : CE:UX:MTF / meegotouch-compositor
Please review and accept or decline. BOSS has already run some checks on this request. See the "Messages from BOSS" section below. https://build.pub.meego.com//request/show/8202 Thank You, vesuri [This message was auto-generated] --- Request # 8202: Messages from BOSS: State: review at 2013-02-26T12:15:36 by bossbot Reviews: accepted by bossbot : Prechecks succeeded. new for CE-maintainers : Please replace this text with a review and approve/reject the review (not the SR). BOSS will take care of the rest Changes: submit: home:vesuri:branches:CE:UX:MTF / meegotouch-compositor -> CE:UX:MTF / meegotouch-compositor changes files: -------------- --- meegotouch-compositor.changes +++ meegotouch-compositor.changes @@ -0,0 +1,3 @@ +* Fri Feb 22 2013 Vesa Halttunen <[email protected]> - 1.3.0 +- Fixes NEMO#577: Drop meegotouch dependency in mcompositor + old: ---- meegotouch-compositor-1.2.2.tar.bz2 new: ---- meegotouch-compositor-1.3.0.tar.bz2 spec files: ----------- --- meegotouch-compositor.spec +++ meegotouch-compositor.spec @@ -9,7 +9,7 @@ # << macros Summary: MeeGo UI Compositing Window Manager -Version: 1.2.2 +Version: 1.3.0 Release: 1 Group: System/Desktop License: LGPLv2.1 @@ -23,7 +23,6 @@ BuildRequires: pkgconfig(QtNetwork) BuildRequires: pkgconfig(QtOpenGL) BuildRequires: pkgconfig(contextprovider-1.0) -BuildRequires: pkgconfig(meegotouch) BuildRequires: pkgconfig(x11) BuildRequires: pkgconfig(x11-xcb) BuildRequires: pkgconfig(xcb) >= 1.6 @@ -118,7 +117,7 @@ %{_libdir}/libdecorator.so.* %{_libdir}/libmcompositor.so.* %{_datadir}/contextkit/providers/org.maemo.mcompositor.context -%{_datadir}/l10n/meegotouch/recovery.qm +%{_datadir}/translations/recovery.qm %{_libdir}/systemd/user/mcompositor.service # >> files # << files other changes: -------------- ++++++ meegotouch-compositor-1.2.2.tar.bz2 -> meegotouch-compositor-1.3.0.tar.bz2 --- .gitignore +++ .gitignore @@ -12,7 +12,23 @@ tests.xml decorators/mdecorator/mdecorator mcompositor/mcompositor +doc/doxygen.log +doc/html/ +tests/unit/ut_anim/ut_anim +tests/unit/ut_closeapp/ut_closeapp +tests/unit/ut_compositing/ut_compositing +tests/unit/ut_lockscreen/ut_lockscreen +tests/unit/ut_netClientList/ut_netClientList +tests/unit/ut_propcache/ut_propcache +tests/unit/ut_restackwindows/ut_restackwindows +tests/unit/ut_splashscreen/ut_splashscreen tests/windowctl/windowctl tests/windowstack/windowstack tests/GLES2/test-gles2 tests/focus-tracker/focus-tracker +tests/appinterface/appinterface +tests/manual-splash/manual-splash +tests/unit/ut_stacking/ut_stacking +translations/recovery.qm +*.pro.user +*.autosave --- decorators/libdecorator/.gitignore +++ decorators/libdecorator/.gitignore @@ -0,0 +1,2 @@ +mdecorator_dbus_* +libdecorator.so* --- decorators/libdecorator/mabstractdecorator.cpp +++ decorators/libdecorator/mabstractdecorator.cpp @@ -70,23 +70,11 @@ bool show_dialog) { Q_D(MAbstractDecorator); - M::OrientationAngle orient; d->client = window; d->clientGeometry = geo; - if (angle == 0) - orient = M::Angle0; - else if (angle == 270) - orient = M::Angle270; - else if (angle == 90) - orient = M::Angle90; - else if (angle == 180) - orient = M::Angle180; - else - orient = M::Angle0; - - manageEvent(window, wmname, orient, only_statusbar, show_dialog); + manageEvent(window, wmname, angle, only_statusbar, show_dialog); } void MAbstractDecorator::setAvailableGeometry(const QRect& rect) --- decorators/libdecorator/mabstractdecorator.h +++ decorators/libdecorator/mabstractdecorator.h @@ -20,7 +20,6 @@ #ifndef MABSTRACTDECORATOR_H #define MABSTRACTDECORATOR_H -#include <MWindow> #include <QObject> #include "mabstractappinterface.h" @@ -81,7 +80,7 @@ */ virtual void manageEvent(Qt::HANDLE window, const QString &wmname, - M::OrientationAngle orient, + int orient, bool sbonly, bool hung) = 0; /*! --- decorators/mdecorator/.gitignore +++ decorators/mdecorator/.gitignore @@ -1 +1,2 @@ -duidecorator +mdecorator +qrc_res* --- decorators/mdecorator/main.cpp +++ decorators/mdecorator/main.cpp @@ -1,13 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation ([email protected]) -** -** This file is part of duicompositor. -** -** If you have questions regarding the use of this file, please contact -** Nokia at [email protected]. +** Copyright (C) 2012 Jolla Ltd. +** Contact: Vesa Halttunen ([email protected]) ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public @@ -17,50 +12,24 @@ ** ****************************************************************************/ -#include <MApplication> -#include <mcomponentdata.h> -#include "mondisplaychangeevent.h" +#include <QApplication> +#include <QTranslator> +#include <QtDeclarative> #include "mdecoratorwindow.h" -#include <X11/Xlib.h> -#include <X11/Xatom.h> -#include <X11/Xmd.h> - -class MDecoratorApp : public MApplication +int main(int argc, char **argv) { -public: - MDecoratorApp(int argc, char **argv) : MApplication(argc, argv) - { - window.show(); - } - - virtual bool x11EventFilter(XEvent *xev) - { - if (xev->type == VisibilityNotify) { - XVisibilityEvent *xve = (XVisibilityEvent *)xev; + QApplication app(argc, argv); - foreach (MWindow *win, MComponentData::instance()->windows()) { - if (win && win->effectiveWinId() == xve->window) { - MOnDisplayChangeEvent mev( - xve->state != VisibilityFullyObscured - ? MOnDisplayChangeEvent::FullyOnDisplay - : MOnDisplayChangeEvent::FullyOffDisplay, - QRectF(QPointF(0, 0), win->visibleSceneSize())); - sendEvent(win, &mev); - } - } - } + QTranslator engineeringEnglish; + engineeringEnglish.load("recovery", "/usr/share/translations"); + app.installTranslator(&engineeringEnglish); + QTranslator translator; + translator.load(QLocale(), "recovery", "-", "/usr/share/translations"); + app.installTranslator(&translator); - return MApplication::x11EventFilter(xev); - } - -private: + qmlRegisterUncreatableType<MDecoratorWindow>("org.nemomobile.mdecorator", 0, 1, "MDecoratorWindow", "This type is initialized by main"); MDecoratorWindow window; -}; - -int main(int argc, char **argv) -{ - MDecoratorApp app(argc, argv); return app.exec(); } --- decorators/mdecorator/mdecorator.cpp +++ decorators/mdecorator/mdecorator.cpp @@ -0,0 +1,40 @@ +/*************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Jolla Ltd. +** Contact: Vesa Halttunen ([email protected]) +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file LICENSE.LGPL included in the packaging +** of this file. +** +****************************************************************************/ + +#include "mdecorator.h" +#include "mdecoratorwindow.h" + +MDecorator::MDecorator(MDecoratorWindow *p) : MAbstractDecorator(p), + decorwindow(p) +{ +} + +void MDecorator::manageEvent(Qt::HANDLE window, const QString &wmname, int orient, bool, bool hung) +{ + decorwindow->managedWindowChanged(window, wmname, orient, hung); + setAvailableGeometry(decorwindow->geometry()); +} + +void MDecorator::hideQueryDialog() +{ + decorwindow->hideQueryDialog(); +} + +void MDecorator::setOnlyStatusbar(bool) +{ +} + +void MDecorator::playFeedback(const QString &) +{ +} --- decorators/mdecorator/mdecorator.h +++ decorators/mdecorator/mdecorator.h @@ -0,0 +1,41 @@ +/*************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Jolla Ltd. +** Contact: Vesa Halttunen ([email protected]) +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file LICENSE.LGPL included in the packaging +** of this file. +** +****************************************************************************/ + +#ifndef MDECORATOR_H +#define MDECORATOR_H + +#include <mabstractdecorator.h> + +class MDecoratorWindow; + +class MDecorator : public MAbstractDecorator +{ + Q_OBJECT + +public: + MDecorator(MDecoratorWindow *p); + + virtual void manageEvent(Qt::HANDLE window, const QString &wmname, int orient, bool, bool hung); + +protected: + virtual void hideQueryDialog(); + virtual void setOnlyStatusbar(bool); + virtual void playFeedback(const QString &); + +private: + MDecoratorWindow *decorwindow; +}; + + +#endif // MDECORATOR_H --- decorators/mdecorator/mdecorator.pro +++ decorators/mdecorator/mdecorator.pro @@ -1,14 +1,27 @@ include(../../meegotouch_config.pri) + TEMPLATE = app DEPENDPATH += ../libdecorator INCLUDEPATH += ../libdecorator -CONFIG += meegotouch release -QT += opengl dbus +CONFIG += release +QT += opengl dbus declarative LIBS += ../libdecorator/libdecorator.so -lX11 -lXfixes -SOURCES += main.cpp mdecoratorwindow.cpp -HEADERS += mdecoratorwindow.h +SOURCES += main.cpp \ + mdecoratorwindow.cpp \ + mdecorator.cpp \ + mdecoratorappinterface.cpp +HEADERS += \ + mdecoratorwindow.h \ + mdecorator.h \ + mdecoratorappinterface.h + +RESOURCES += \ + res.qrc + +OTHER_FILES += \ + qml/main.qml QMAKE_EXTRA_TARGETS += check check.depends = $$TARGET --- decorators/mdecorator/mdecoratorappinterface.cpp +++ decorators/mdecorator/mdecoratorappinterface.cpp @@ -0,0 +1,30 @@ +/*************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Jolla Ltd. +** Contact: Vesa Halttunen ([email protected]) +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file LICENSE.LGPL included in the packaging +** of this file. +** +****************************************************************************/ + +#include "mdecoratorappinterface.h" +#include "mdecoratorwindow.h" + +MDecoratorAppInterface::MDecoratorAppInterface(MDecoratorWindow *p) : MAbstractAppInterface(p), + decorwindow(p) +{ +} + +void MDecoratorAppInterface::setManagedWindow(WId window) +{ + currentWindow = window; +} + +void MDecoratorAppInterface::actionsChanged(QList<MDecoratorIPCAction>, WId) +{ +} --- decorators/mdecorator/mdecoratorappinterface.h +++ decorators/mdecorator/mdecoratorappinterface.h @@ -0,0 +1,39 @@ +/*************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2012 Jolla Ltd. +** Contact: Vesa Halttunen ([email protected]) +** +** This library is free software; you can redistribute it and/or +** modify it under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation +** and appearing in the file LICENSE.LGPL included in the packaging +** of this file. +** +****************************************************************************/ + +#ifndef MDECORATORAPPINTERFACE_H +#define MDECORATORAPPINTERFACE_H + +#include <mabstractdecorator.h> + +class MDecoratorWindow; + +class MDecoratorAppInterface : public MAbstractAppInterface +{ + Q_OBJECT + +public: + MDecoratorAppInterface(MDecoratorWindow *p); + + void setManagedWindow(WId window); + +protected: + virtual void actionsChanged(QList<MDecoratorIPCAction>, WId); + +private: + MDecoratorWindow *decorwindow; + WId currentWindow; +}; + +#endif // MDECORATORAPPINTERFACE_H --- decorators/mdecorator/mdecoratorwindow.cpp +++ decorators/mdecorator/mdecoratorwindow.cpp @@ -1,13 +1,8 @@ /*************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation ([email protected]) -** -** This file is part of duicompositor. -** -** If you have questions regarding the use of this file, please contact -** Nokia at [email protected]. +** Copyright (C) 2012 Jolla Ltd. +** Contact: Vesa Halttunen ([email protected]) ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public @@ -17,548 +12,80 @@ ** ****************************************************************************/ -#include <QtDebug> - -#include <MSceneManager> -#include <MScene> -#include <MApplicationMenu> -#include <MApplicationPage> -#include <MNavigationBarView> -#include <MLabel> -#include <QGraphicsLinearLayout> -#include <mbutton.h> -#include <mwidgetaction.h> - +#include <QCloseEvent> +#include <QDeclarativeContext> #include <QApplication> #include <QDesktopWidget> -#include <QX11Info> -#include <QGLFormat> -#include <QGLWidget> -#include <QLabel> -#include <QWindowStateChangeEvent> -#include <MFeedback> - +#include "mdecorator.h" +#include "mdecoratorappinterface.h" #include "mdecoratorwindow.h" - -#include <X11/Xlib.h> -#include <X11/Xutil.h> +#include <QX11Info> #include <X11/Xatom.h> -#include <X11/Xmd.h> #include <X11/extensions/Xfixes.h> #include <X11/extensions/shape.h> -#include <mabstractdecorator.h> -#include <mabstractappinterface.h> -#include <mdesktopentry.h> -#include <mbuttonmodel.h> -#include <mdeviceprofile.h> - -class MDecorator: public MAbstractDecorator -{ - Q_OBJECT -public: - MDecorator(MDecoratorWindow *p) - : MAbstractDecorator(p), - decorwindow(p) - { - } - - void manageEvent(Qt::HANDLE window, - const QString &wmname, - M::OrientationAngle orient, - bool sbonly, bool hung) - { - decorwindow->managedWindowChanged(window, wmname, orient, hung); - if (window) - setOnlyStatusbar(sbonly); - } - -protected: - - void hideQueryDialog() { - decorwindow->hideQueryDialog(); - } - - void setOnlyStatusbar(bool mode) - { - decorwindow->setOnlyStatusbar(mode); - decorwindow->setInputRegion(); - setAvailableGeometry(decorwindow->availableClientRect()); - } - void playFeedback(const QString &name) { - feedback.setName(name); - feedback.play(); - } - -private: - - MDecoratorWindow *decorwindow; - MFeedback feedback; -}; - -class MDecoratorAppInterface : public MAbstractAppInterface -{ - Q_OBJECT - -public: - MDecoratorAppInterface(MDecoratorWindow *p) - : MAbstractAppInterface(p) - , decorwindow(p) - { - } - - void setManagedWindow(WId window) - { - currentWindow = window; - } - - virtual void actionsChanged(QList<MDecoratorIPCAction> newMenu, WId window) - { - if (window != currentWindow) - return; - - QList<MAction*> menu; - actionHash.clear(); - - foreach (MDecoratorIPCAction act, newMenu) { - MAction* mact = createMAction(act); - menu.append(mact); - } - decorwindow->addActions(menu); - } - -public slots: - void actionTriggered(bool val) - { - if (!sender() || !qobject_cast<MAction*>(sender())) - return; - - MAction* act = static_cast<MAction*>(sender()); - if (actionHash.contains(act)) - emit triggered(actionHash.value(act).id().toString(), val); - } - - void actionToggled(bool val) - { - if (!sender() || !qobject_cast<MAction*>(sender())) - return; - - MAction* act = static_cast<MAction*>(sender()); - if (actionHash.contains(act)) - emit toggled(actionHash.value(act).id().toString(), val); - } - -private: - - MAction* createMAction(const MDecoratorIPCAction& act) - { - //Normal MActions doesn't support custom QIcons, therefore we use MButtons and MWidgetAction - - MAction* mact; - if (act.type() == MDecoratorIPCAction::MenuAction) { - mact = new MAction(decorwindow); - mact->setText(act.text()); - mact->setCheckable(act.isCheckable()); - mact->setChecked(act.isChecked()); - mact->setIcon(act.icon()); - mact->setLocation(MAction::ApplicationMenuLocation); - } else { - mact = new MWidgetAction(decorwindow); - MButton* mbut = new MButton; - mbut->setMinimumSize(0, 0); - mbut->setObjectName("toolbaractioncommand"); - mbut->setIcon(act.icon()); - if (act.icon().isNull()) - mbut->setText(act.text()); - static_cast<MWidgetAction*>(mact)->setWidget(mbut); - mact->setText(act.text()); - mact->setCheckable(act.isCheckable()); - mact->setChecked(act.isChecked()); - mact->setLocation(MAction::ToolBarLocation); - - updateViewAndStyling(mbut, false); - - if (act.isCheckable()) - connect(mbut, SIGNAL(toggled(bool)), mact, SIGNAL(toggled(bool))); - else - connect(mbut, SIGNAL(clicked(bool)), mact, SIGNAL(triggered(bool))); - } - connect(mact, SIGNAL(triggered(bool)), SLOT(actionTriggered(bool))); - connect(mact, SIGNAL(toggled(bool)), SLOT(actionToggled(bool))); - - actionHash[mact] = act; - return mact; - } - - //This method is copied from libmeegotouch (MApplicationMenuView), but slightly changed - void updateViewAndStyling(MButton *button, bool buttonGroup) const - { - QString toolBarButtonDefaultViewType = buttonGroup ? "toolbartab" : "toolbar"; - - if (button && button->icon().isNull()) { - // Only label -> could use different styling - button->setTextVisible(true); //In this case we will show label (as it is all we have) - if (button->viewType() != toolBarButtonDefaultViewType) - button->setViewType(toolBarButtonDefaultViewType); - button->setStyleName("ToolBarLabelOnlyButton"); - } else { - if (button->viewType() != toolBarButtonDefaultViewType) - button->setViewType(toolBarButtonDefaultViewType); - button->setStyleName("ToolBarIconButton"); - button->setTextVisible(true); - } - } - - QHash<MAction*, MDecoratorIPCAction> actionHash; - - MDecoratorWindow *decorwindow; - WId currentWindow; -}; - MDecoratorWindow::MDecoratorWindow(QWidget *parent) - : MApplicationWindow(parent), - homeButtonPanel(0), - escapeButtonPanel(0), - navigationBar(0), - statusBar(0), - messageBox(0), - managed_window(0), - menuVisible(false) -{ - locale.installTrCatalog("recovery"); - locale.setDefault(locale); - - foreach (QGraphicsItem* item, items()) { - MHomeButtonPanel *h; - if (!homeButtonPanel && (h = dynamic_cast<MHomeButtonPanel*>(item))) { - homeButtonPanel = h; - continue; - } - MEscapeButtonPanel *e; - if (!escapeButtonPanel && - (e = dynamic_cast<MEscapeButtonPanel*>(item))) { - escapeButtonPanel = e; - continue; - } - MNavigationBar *n; - if (!navigationBar && (n = dynamic_cast<MNavigationBar*>(item))) { - navigationBar = n; - continue; - } - } - // sometimes Libmeegotouch doesn't create statusbar at this point, - // so create it ourselves and mark the window fullscreen to avoid duplicate - statusBar = new MStatusBar; - statusBar->setVisible(true); - sceneManager()->appearSceneWindowNow(statusBar); - setWindowState(windowState() | Qt::WindowFullScreen); - - // Check for presence of homeButtonPanel, navigationBar and statusBar - if (!homeButtonPanel || !navigationBar || !statusBar) - qFatal("Meego elements not found"); - - homeButtonPanel = new MHomeButtonPanel(); - connect(homeButtonPanel, SIGNAL(buttonClicked()), this, - SIGNAL(homeClicked())); - if (escapeButtonPanel) - connect(escapeButtonPanel, SIGNAL(buttonClicked()), this, - SIGNAL(escapeClicked())); - - connect(navigationBar, SIGNAL(viewmenuTriggered()), SLOT(menuAppearing())); - connect(navigationBar, SIGNAL(closeButtonClicked()), SIGNAL(escapeClicked())); - - requested_only_statusbar = false; - - d = new MDecorator(this); - app = new MDecoratorAppInterface(this); - - connect(this, SIGNAL(homeClicked()), d, SLOT(minimize())); - connect(this, SIGNAL(escapeClicked()), d, SLOT(close())); - connect(sceneManager(), - SIGNAL(orientationChanged(M::Orientation)), - this, - SLOT(screenRotated(M::Orientation))); - - setTranslucentBackground(true); // for translucent messageBox - setBackgroundBrush(QBrush(QColor(0, 0, 0, 0))); + : QDeclarativeView(parent), + managedWindow(0), + decorator(new MDecorator(this)), + appInterface(new MDecoratorAppInterface(this)), + windowVisible_(false), + orientationAngle_(0) +{ + setAttribute(Qt::WA_TranslucentBackground); setFocusPolicy(Qt::NoFocus); setSceneSize(); setMDecoratorWindowProperty(); - setMeegotouchOpaqueProperty(true); setInputRegion(); - - setProperty("animatedOrientationChange", false); - setOrientationAngle(desktopOrientationAngle()); - setOrientationAngleLocked(true); -} - -void MDecoratorWindow::managedWindowChanged(Qt::HANDLE w, - const QString &title, - M::OrientationAngle orient, - bool hung) -{ - app->setManagedWindow(w); - app->actionsChanged(QList<MDecoratorIPCAction>(), w); - - Qt::HANDLE old_window = managed_window; - managed_window = w; - if (messageBox && !hung) - hideQueryDialog(); - - if (!managed_window) { - hideEverything(); - setProperty("animatedOrientationChange", false); - setOrientationAngle(desktopOrientationAngle()); - return; - } - - navigationBar->setViewMenuDescription(title); - setProperty("animatedOrientationChange", !!old_window); - setOrientationAngle(orient); - if (hung) { - createQueryDialog(); - if (isOnDisplay()) - // We can start showing it, otherwise wait. - enterDisplayEvent(); - } else - sceneManager()->appearSceneWindowNow(statusBar); -} - -void MDecoratorWindow::createQueryDialog() -{ - QString name; - - if (messageBox) - delete messageBox; - - XClassHint cls = {0, 0}; - XGetClassHint(QX11Info::display(), managed_window, &cls); - if (cls.res_name) { - name = QString(cls.res_name); - if (name.endsWith(".launch")) - // Remove the extension in order to find the .desktop file. - name.resize(name.length()-strlen(".launch")); - MDesktopEntry de(QString("/usr/share/applications/") - + name + ".desktop"); - if (de.isValid() && !de.name().isEmpty()) { - name = de.name(); - - // "If a translated string has many length variants, they are - // separated with U+009C (STRING TERMINATOR) character, and - // according to DTD for .ts file format, they should be ordered - // by decreasing length." (quote from mapplicationwindow.cpp) - // This confuses the outlier and it decides it doesn't have space - // for the "not responding" string. Only keep the full string. - int i = name.indexOf(QChar(0x9c)); - if (i >= 0) - name.truncate(i); - } - XFree(cls.res_name); - } else - name.sprintf("window 0x%lx", managed_window); - - if (cls.res_class) - XFree(cls.res_class); - - XSetTransientForHint(QX11Info::display(), winId(), managed_window); - messageBox = new MMessageBox("", "", M::NoStandardButton); - messageBox->setCentralWidget(new QGraphicsWidget(messageBox)); - QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical, - messageBox->centralWidget()); - MLabel *title = new MLabel( - qtTrId("qtn_reco_app_not_responding").arg(name), - messageBox); - title->setStyleName("CommonQueryTitle"); - title->setWordWrap(true); - title->setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); - title->setAlignment(Qt::AlignCenter); - layout->addItem(title); - MLabel *text = new MLabel(qtTrId("qtn_reco_close_app_question"), - messageBox); - text->setStyleName("CommonQueryText"); - text->setWordWrap(true); - text->setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); - text->setAlignment(Qt::AlignCenter); - layout->addItem(text); - messageBox->centralWidget()->setLayout(layout); - MButtonModel *yes = messageBox->addButton(M::YesButton); - MButtonModel *no = messageBox->addButton(M::NoButton); - connect(yes, SIGNAL(clicked()), this, SLOT(yesButtonClicked())); - connect(no, SIGNAL(clicked()), this, SLOT(noButtonClicked())); + setResizeMode(QDeclarativeView::SizeRootObjectToView); + viewport()->setAutoFillBackground(false); + rootContext()->setContextProperty("initialSize", QApplication::desktop()->screenGeometry(this).size()); + rootContext()->setContextProperty("decoratorWindow", this); + setSource(QUrl("qrc:/qml/main.qml")); + show(); } -void MDecoratorWindow::hideQueryDialog() +void MDecoratorWindow::managedWindowChanged(Qt::HANDLE window, const QString &title, int orientation, bool hung) { - if (!messageBox) - return; - - XSetTransientForHint(QX11Info::display(), winId(), None); - // do this even though messageBox may not be in the scene - // (animation is not visible because of stacking changes) - sceneManager()->disappearSceneWindow(messageBox); - delete messageBox; - messageBox = 0; - - restoreEverything(); - setInputRegion(); -} + appInterface->setManagedWindow(window); + managedWindow = window; -void MDecoratorWindow::enterDisplayEvent() -{ // If we've created the dialog it's time to show it. - if (!messageBox - || messageBox->sceneWindowState() != MSceneWindow::Disappeared) - return; - hideEverything(); - sceneManager()->appearSceneWindow(messageBox); -} - -void MDecoratorWindow::leaveDisplayEvent() -{ // show_query_dialog was cancelled before we could do it - hideQueryDialog(); -} - -void MDecoratorWindow::yesButtonClicked() -{ - d->queryDialogAnswer(managed_window, true); - hideQueryDialog(); -} - -void MDecoratorWindow::noButtonClicked() -{ - d->queryDialogAnswer(managed_window, false); - hideQueryDialog(); -} - -void MDecoratorWindow::setOnlyStatusbar(bool mode, bool temporary) -{ - if (mode || messageBox) { - sceneManager()->disappearSceneWindowNow(navigationBar); - sceneManager()->disappearSceneWindowNow(homeButtonPanel); - if (escapeButtonPanel) - sceneManager()->disappearSceneWindowNow(escapeButtonPanel); - } else { - sceneManager()->appearSceneWindowNow(navigationBar); - sceneManager()->appearSceneWindowNow(homeButtonPanel); - if (escapeButtonPanel) - sceneManager()->appearSceneWindowNow(escapeButtonPanel); + if (windowTitle_ != title) { + windowTitle_ = title; + emit windowTitleChanged(); } - if (!temporary) - requested_only_statusbar = mode; - only_statusbar = mode; -} - -void MDecoratorWindow::hideEverything() -{ - setOnlyStatusbar(true, true); - sceneManager()->disappearSceneWindowNow(statusBar); -} - -void MDecoratorWindow::restoreEverything() -{ - setOnlyStatusbar(requested_only_statusbar); - sceneManager()->appearSceneWindowNow(statusBar); -} + if (orientationAngle_ != orientation) { + orientationAngle_ = orientation; + emit orientationAngleChanged(); + } -void MDecoratorWindow::screenRotated(const M::Orientation &orientation) -{ - Q_UNUSED(orientation); - setInputRegion(); - d->setAvailableGeometry(availableClientRect()); + setWindowVisible(hung); } void MDecoratorWindow::setInputRegion() { - static QRegion prev_region; - QRegion region; - const QRegion fs(QApplication::desktop()->screenGeometry()); - // region := decoration region - if (messageBox || menuVisible) { - // Occupy all space. - region = fs; - setMeegotouchOpaqueProperty(false); + Display *dpy = QX11Info::display(); + XRectangle rect; + rect.x = 0; + rect.y = 0; + if (windowVisible_) { + rect.width = ScreenOfDisplay(dpy, DefaultScreen(dpy))->width; + rect.height = ScreenOfDisplay(dpy, DefaultScreen(dpy))->height; } else { - // Decoration includes the status bar, and possibly other elements. - QRect sbrect = statusBar->sceneBoundingRect().toRect(); - - // work around Libmeegotouch lying about the size - if (sbrect.height() == 51) - sbrect.setHeight(36); - if (sbrect.width() == 51) - sbrect.setWidth(36); - - region = sbrect; - bool translate = true; - int angle = sceneManager()->orientationAngle(); - if (angle == 270 && sbrect.x() == 0 && sbrect.y() == 0 - && sbrect.width() < sbrect.height()) - // SB rect is already in screen coordinates (fixes NB#275508) - translate = false; - - if (!only_statusbar) { - region += navigationBar->sceneBoundingRect().toRect(); - region += homeButtonPanel->sceneBoundingRect().toRect(); - if (escapeButtonPanel) - region += escapeButtonPanel->sceneBoundingRect().toRect(); - } - - // The coordinates we receive from libmeegotouch are rotated - // by @angle. Map @retion back to screen coordinates. - if (translate && angle != 0) { - QTransform trans; - const QRect fs(QApplication::desktop()->screenGeometry()); - - trans.rotate(angle); - if (angle == 270) - trans.translate(-fs.height(), 0); - else if (angle == 180) - trans.translate(-fs.width(), -fs.height()); - else if (angle == 90) - trans.translate(0, -fs.width()); - region = trans.map(region); - } - setMeegotouchOpaqueProperty(true); + rect.width = 0; + rect.height = 0; } - - // Set our input and bounding shape to @region if changed. - if (prev_region != region) { - prev_region = region; - - // Convert @region to @xrects. - XRectangle *xrects; - const QVector<QRect> rects = region.rects(); - int nxrects = rects.count(); - xrects = new XRectangle[nxrects]; - for (int i = 0; i < nxrects; ++i) { - xrects[i].x = rects[i].x(); - xrects[i].y = rects[i].y(); - xrects[i].width = rects[i].width(); - xrects[i].height = rects[i].height(); - } - - Display *dpy = QX11Info::display(); - XserverRegion shapeRegion = XFixesCreateRegion(dpy, xrects, nxrects); - delete[] xrects; - XFixesSetWindowShapeRegion(dpy, winId(), ShapeInput, - 0, 0, shapeRegion); - XFixesSetWindowShapeRegion(dpy, winId(), ShapeBounding, - 0, 0, shapeRegion); - - XFixesDestroyRegion(dpy, shapeRegion); - } - - // The rectangle available for the application is the largest square - // on the screen not covered by decoration completely. - availableRect = (fs - region).boundingRect(); + XserverRegion shapeRegion = XFixesCreateRegion(dpy, &rect, 1); + XFixesSetWindowShapeRegion(dpy, winId(), ShapeInput, 0, 0, shapeRegion); + XFixesDestroyRegion(dpy, shapeRegion); } void MDecoratorWindow::setSceneSize() { - // always keep landscape size Display *dpy = QX11Info::display(); int xres = ScreenOfDisplay(dpy, DefaultScreen(dpy))->width; int yres = ScreenOfDisplay(dpy, DefaultScreen(dpy))->height; - scene()->setSceneRect(0, 0, xres, yres); setMinimumSize(xres, yres); setMaximumSize(xres, yres); } @@ -567,96 +94,51 @@ { long on = 1; - XChangeProperty(QX11Info::display(), winId(), - XInternAtom(QX11Info::display(), - "_MEEGOTOUCH_DECORATOR_WINDOW", False), - XA_CARDINAL, - 32, PropModeReplace, - (unsigned char *) &on, 1); -} - -void MDecoratorWindow::setMeegotouchOpaqueProperty(bool enable) -{ - static long prev = -1; - long new_value = enable ? 1 : 0; - - if (prev != new_value) { - XChangeProperty(QX11Info::display(), winId(), - XInternAtom(QX11Info::display(), - "_MEEGOTOUCH_OPAQUE_WINDOW", False), - XA_CARDINAL, - 32, PropModeReplace, - (unsigned char *) &new_value, 1); - prev = new_value; - } + XChangeProperty(QX11Info::display(), winId(), XInternAtom(QX11Info::display(), "_MEEGOTOUCH_DECORATOR_WINDOW", False), XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&on, 1); } -M::OrientationAngle MDecoratorWindow::desktopOrientationAngle() const +void MDecoratorWindow::closeEvent(QCloseEvent *event) { - const M::Orientation orientation = MDeviceProfile::instance()->orientationFromAngle(M::Angle270); - return (orientation == M::Portrait) ? M::Angle270 : M::Angle0; + return event->ignore(); } -const QRect MDecoratorWindow::availableClientRect() const +bool MDecoratorWindow::windowVisible() const { - return availableRect; + return windowVisible_; } -void MDecoratorWindow::closeEvent(QCloseEvent * event ) +void MDecoratorWindow::setWindowVisible(bool visible) { - // never close the decorator! - return event->ignore(); + if (windowVisible_ != visible) { + windowVisible_ = visible; + setInputRegion(); + emit windowVisibleChanged(); + } } -void MDecoratorWindow::addActions(QList<MAction*> new_actions) +QString MDecoratorWindow::windowTitle() const { - setUpdatesEnabled(false); - - navigationBar->setArrowIconVisible(false); - - QList<QAction*> oldactions = actions(); - - foreach (QAction* act, oldactions) - removeAction(act); - - foreach (MAction* act, new_actions) { - //the signals have to be disabled because LMT using setChecked on the action and that would lead to an trigger/toggle signal - act->blockSignals(true); - if (act->location() == MAction::ApplicationMenuLocation) - navigationBar->setArrowIconVisible(true); - this->addAction(act); - act->blockSignals(false); - } - - setUpdatesEnabled(true); + return windowTitle_; } -void MDecoratorWindow::menuAppearing() +int MDecoratorWindow::orientationAngle() const { - if (menuVisible) - return; - menuVisible=true; - foreach (QGraphicsItem* item, items()) { - MApplicationMenu *menu = dynamic_cast<MApplicationMenu*>(item); - if (menu) { - connect(menu, SIGNAL(disappeared()), SLOT(menuDisappeared())); - connect(this, SIGNAL(displayExited()), menu, SLOT(disappear())); - } - } - - QPixmap pix = QPixmap::grabWindow(winId()); - setBackgroundBrush(pix); + return orientationAngle_; +} - setInputRegion(); +void MDecoratorWindow::closeApplication() +{ + decorator->queryDialogAnswer(managedWindow, true); + hideQueryDialog(); } -void MDecoratorWindow::menuDisappeared() +void MDecoratorWindow::doNotCloseApplication() { - if (!menuVisible) - return; - menuVisible=false; - setInputRegion(); - setBackgroundBrush(QBrush(Qt::NoBrush)); + decorator->queryDialogAnswer(managedWindow, false); + hideQueryDialog(); } -#include "mdecoratorwindow.moc" +void MDecoratorWindow::hideQueryDialog() +{ + setWindowVisible(false); +} --- decorators/mdecorator/mdecoratorwindow.h +++ decorators/mdecorator/mdecoratorwindow.h @@ -1,13 +1,10 @@ /*************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation ([email protected]) +** Copyright (C) 2012 Jolla Ltd. +** Contact: Vesa Halttunen ([email protected]) ** -** This file is part of duicompositor. -** -** If you have questions regarding the use of this file, please contact -** Nokia at [email protected]. +** This file is part of mcompositor. ** ** This library is free software; you can redistribute it and/or ** modify it under the terms of the GNU Lesser General Public @@ -19,89 +16,51 @@ #ifndef MDECORATORWINDOW_H #define MDECORATORWINDOW_H -#include <MApplicationWindow> -#include <MHomeButtonPanel> -#include <MEscapeButtonPanel> -#include <MNavigationBar> -#include <MMessageBox> -#include <mstatusbar.h> -#include <mlocale.h> - +#include <QDeclarativeView> #include <X11/Xlib.h> -#ifdef HAVE_SHAPECONST -#include <X11/extensions/shapeconst.h> -#else -#include <X11/extensions/shape.h> -#endif -#include <QObject> - -class MSceneManager; class MDecorator; -class MAction; -class MApplicationMenu; class MDecoratorAppInterface; -class MDecoratorWindow : public MApplicationWindow +class MDecoratorWindow : public QDeclarativeView { Q_OBJECT + Q_PROPERTY(bool windowVisible READ windowVisible WRITE setWindowVisible NOTIFY windowVisibleChanged) + Q_PROPERTY(QString windowTitle READ windowTitle NOTIFY windowTitleChanged) + Q_PROPERTY(int orientationAngle READ orientationAngle NOTIFY orientationAngleChanged) public: explicit MDecoratorWindow(QWidget *parent = 0); - const QRect availableClientRect() const; - void setOnlyStatusbar(bool mode, bool temporary = false); - void hideEverything(); - void restoreEverything(); - /*! - * \brief Sets the region of the window that can receive input events. - * - * Input events landing on the area outside this region will fall directly - * to the windows below. - */ - void setInputRegion(); - void managedWindowChanged(Qt::HANDLE w, const QString &title, - M::OrientationAngle orient, - bool hung); - void createQueryDialog(); + void managedWindowChanged(Qt::HANDLE window, const QString &title, int orientation, bool hung); + bool windowVisible() const; + QString windowTitle() const; + int orientationAngle() const; + void setWindowVisible(bool visible); void hideQueryDialog(); - void addActions(QList<MAction*> actions); + + Q_INVOKABLE void closeApplication(); + Q_INVOKABLE void doNotCloseApplication(); protected: - virtual void closeEvent(QCloseEvent * event ); - virtual void enterDisplayEvent(); - virtual void leaveDisplayEvent(); - -private slots: - void screenRotated(const M::Orientation &orientation); - void yesButtonClicked(); - void noButtonClicked(); - void menuAppearing(); - void menuDisappeared(); + virtual void closeEvent(QCloseEvent *event); signals: - - void homeClicked(); - void escapeClicked(); + void windowVisibleChanged(); + void windowTitleChanged(); + void orientationAngleChanged(); private: + void setInputRegion(); void setSceneSize(); void setMDecoratorWindowProperty(); - void setMeegotouchOpaqueProperty(bool enable); - M::OrientationAngle desktopOrientationAngle() const; - MHomeButtonPanel *homeButtonPanel; - MEscapeButtonPanel *escapeButtonPanel; - MNavigationBar *navigationBar; - MStatusBar *statusBar; - MMessageBox *messageBox; - Window managed_window; - QRect availableRect; // available area for the managed window - bool only_statusbar, requested_only_statusbar; - MDecorator *d; - MDecoratorAppInterface *app; - MLocale locale; - bool menuVisible; + Window managedWindow; + MDecorator *decorator; + MDecoratorAppInterface *appInterface; + bool windowVisible_; + QString windowTitle_; + int orientationAngle_; Q_DISABLE_COPY(MDecoratorWindow); }; --- decorators/mdecorator/qml +++ decorators/mdecorator/qml +(directory) --- decorators/mdecorator/qml/main.qml +++ decorators/mdecorator/qml/main.qml @@ -0,0 +1,111 @@ +import QtQuick 1.2 +import org.nemomobile.mdecorator 0.1 + +Item { + width: initialSize.width + height: initialSize.height + opacity: decoratorWindow.windowVisible ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 250 } } + + Rectangle { + anchors.fill: parent + color: "black" + opacity: 0.6 + } + + Item { + width: (decoratorWindow.orientationAngle % 180 == 90) ? initialSize.height : initialSize.width + height: (decoratorWindow.orientationAngle % 180 == 90) ? initialSize.width : initialSize.height + transform: Rotation { + origin.x: { switch(decoratorWindow.orientationAngle) { + case 270: + return initialSize.height / 2 + case 180: + case 90: + return initialSize.width / 2 + default: + return 0 + } } + origin.y: { switch(decoratorWindow.orientationAngle) { + case 270: + case 180: + return initialSize.height / 2 + case 90: + return initialSize.width / 2 + default: + return 0 + } } + angle: decoratorWindow.orientationAngle == 0 ? 0 : -360 + decoratorWindow.orientationAngle + } + + Text { + anchors.horizontalCenter: parent.horizontalCenter + y: parent.height / 10 + width: parent.width / 10 * 9 + height: parent.height / 5 + font.pixelSize: 36 + color: "white" + //% "%1 is not responding." + text: qsTrId("qtn_reco_app_not_responding").arg(decoratorWindow.windowTitle) + " " + + //% "Do you want to close it?" + qsTrId("qtn_reco_close_app_question") + wrapMode: Text.Wrap + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + + MouseArea { + anchors.horizontalCenter: parent.horizontalCenter + y: parent.height / 10 * 4 + width: parent.width / 2 + height: parent.height / 5 + onClicked: decoratorWindow.closeApplication() + Rectangle { + anchors.fill: parent + border { + color: "white" + width: 2 + } + color: "black" + radius: 5 + + Text { + anchors.fill: parent + font.pixelSize: 36 + color: "white" + //% "Yes" + text: qsTrId("qtn_comm_command_yes") + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + } + } + + MouseArea { + anchors.horizontalCenter: parent.horizontalCenter + y: parent.height / 10 * 7 + width: parent.width / 2 + height: parent.height / 5 + onClicked: decoratorWindow.doNotCloseApplication() + Rectangle { + anchors.fill: parent + border { + color: "white" + width: 2 + } + color: "black" + radius: 5 + + Text { + anchors.fill: parent + font.pixelSize: 36 + color: "white" + //% "No" + text: qsTrId("qtn_comm_command_no") + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + } + } + } +} --- decorators/mdecorator/res.qrc +++ decorators/mdecorator/res.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>qml/main.qml</file> + </qresource> +</RCC> --- meegotouch_config.pri +++ meegotouch_config.pri @@ -1,8 +1,5 @@ -# Load more defines from the dui_defines. -load(meegotouch_defines) - -# Add global libdui includes -INCLUDEPATH += $$M_INSTALL_HEADERS +M_INSTALL_BIN=/usr/bin +M_INSTALL_HEADERS=/usr/include/meegotouch # Check for testability features, should they be compiled in or not? !isEqual(TESTABILITY,"off") { @@ -15,4 +12,4 @@ } # Compositor components only -VERSION = 1.2.2 +VERSION = 1.3.0 --- src/.gitignore +++ src/.gitignore @@ -1,2 +1,3 @@ duicompositor qrc_tools.cpp +libmcompositor.so* --- src/mcompositewindow.cpp +++ src/mcompositewindow.cpp @@ -539,7 +539,9 @@ bool old_value = isVisible(); QGraphicsItem::setVisible(visible); MCompositeManager *p = (MCompositeManager *) qApp; +#ifdef WINDOW_DEBUG p->d->setWindowDebugProperties(window()); +#endif QGraphicsScene* sc = scene(); if (sc && !visible && sc->items().count() == 1) @@ -715,9 +717,11 @@ QVariant MCompositeWindow::itemChange(GraphicsItemChange change, const QVariant &value) { MCompositeManager *p = (MCompositeManager *) qApp; +#ifdef WINDOW_DEBUG if (change == ItemZValueHasChanged) { p->d->setWindowDebugProperties(window()); } +#endif if (change == ItemVisibleHasChanged) { // Be careful not to update if this item whose visibility is about --- tests/unit/ut_propcache/ut_propcache.pro +++ tests/unit/ut_propcache/ut_propcache.pro @@ -16,4 +16,6 @@ SOURCES += ut_propcache.cpp QT += testlib core gui opengl dbus -CONFIG += debug +CONFIG += debug link_pkgconfig +PKGCONFIG += x11 + --- translations/recovery.ts +++ translations/recovery.ts @@ -4,22 +4,24 @@ <context> <name></name> <message id="qtn_reco_app_not_responding"> - <location filename="../decorators/mdecorator/mdecoratorwindow.cpp" line="369"/> - <source></source> - <translation>%1 sucks</translation> + <location filename="../decorators/mdecorator/qml/main.qml" line="49"/> + <source>%1 is not responding.</source> + <translation type="unfinished"></translation> </message> <message id="qtn_reco_close_app_question"> - <location filename="../decorators/mdecorator/mdecoratorwindow.cpp" line="376"/> - <source></source> - <translation>Do you want to close it?</translation> + <location filename="../decorators/mdecorator/qml/main.qml" line="51"/> + <source>Do you want to close it?</source> + <translation type="unfinished"></translation> </message> <message id="qtn_comm_command_yes"> - <source></source> - <translation type="obsolete">Aje</translation> + <location filename="../decorators/mdecorator/qml/main.qml" line="77"/> + <source>Yes</source> + <translation type="unfinished"></translation> </message> <message id="qtn_comm_command_no"> - <source></source> - <translation type="obsolete">Oh, no!</translation> + <location filename="../decorators/mdecorator/qml/main.qml" line="104"/> + <source>No</source> + <translation type="unfinished"></translation> </message> </context> </TS> --- translations/translations.pro +++ translations/translations.pro @@ -1,17 +1,26 @@ -LANGUAGES = # empty, means to build only engineering English -SOURCEDIR = $$PWD/.. -CATALOGNAME = recovery -TRANSLATIONDIR = $$PWD -TRANSLATION_INSTALLDIR = $$M_TRANSLATION_DIR -include($$[QT_INSTALL_DATA]/mkspecs/features/meegotouch_defines.prf) -include($$[QT_INSTALL_DATA]/mkspecs/features/meegotouch_translations.prf) +# translations +QMAKE_LINK = @: IGNORE THIS LINE +INSTALLS = ts_install engineering_english_install -# Only depend on $$FILES, and do not regenerate recovery.ts all the times. -FILES = $$SOURCEDIR/decorators/mdecorator/mdecoratorwindow.cpp -updateeets.input = FILES -updateeets.clean = nothing -QMAKE_EXTRA_COMPILERS -= dummy +TS_FILE = $$PWD/recovery.ts +EE_QM = $$PWD/recovery.qm +ts.commands += lupdate $$PWD/../decorators/mdecorator/qml -ts $$TS_FILE +ts.CONFIG += no_check_exist +ts.output = $$TS_FILE +ts.input = . +ts_install.files = $$TS_FILE +ts_install.path = /usr/share/doc/mcompositor-l10n-engineering-english +ts_install.CONFIG += no_check_exist -updateeets.files = $$ENGINEERING_ENGLISH -updateeets.path = /usr/share/doc/mcompositor-l10n-engineering-english -INSTALLS += updateeets +# should add -markuntranslated "-" when proper translations are in place (or for testing) +engineering_english.commands += lrelease -idbased $$TS_FILE -qm $$EE_QM +engineering_english.CONFIG += no_check_exist +engineering_english.depends = ts +engineering_english.input = $$TS_FILE +engineering_english.output = $$EE_QM +engineering_english_install.path = /usr/share/translations +engineering_english_install.files = $$EE_QM +engineering_english_install.CONFIG += no_check_exist + +QMAKE_EXTRA_TARGETS += ts engineering_english +PRE_TARGETDEPS += ts engineering_english ++++++ meegotouch-compositor.yaml --- meegotouch-compositor.yaml +++ meegotouch-compositor.yaml @@ -1,6 +1,6 @@ Name: meegotouch-compositor Summary: MeeGo UI Compositing Window Manager -Version: 1.2.2 +Version: 1.3.0 Release: 1 Group: System/Desktop License: LGPLv2.1 @@ -16,7 +16,6 @@ - QtNetwork - QtOpenGL - contextprovider-1.0 - - meegotouch - x11 - x11-xcb - xcb >= 1.6 @@ -46,7 +45,7 @@ - "%{_libdir}/libdecorator.so.*" - "%{_libdir}/libmcompositor.so.*" - "%{_datadir}/contextkit/providers/org.maemo.mcompositor.context" - - "%{_datadir}/l10n/meegotouch/recovery.qm" + - "%{_datadir}/translations/recovery.qm" - "%{_libdir}/systemd/user/mcompositor.service" SubPackages:
