diff --git a/ksplash/CMakeLists.txt b/ksplash/CMakeLists.txt
index 765a90c..0d0934b 100644
--- a/ksplash/CMakeLists.txt
+++ b/ksplash/CMakeLists.txt
@@ -2,3 +2,4 @@ add_subdirectory( ksplashx )
add_subdirectory( simple )
add_subdirectory( none )
add_subdirectory( kcm )
+add_subdirectory( ksplashqml )
diff --git a/ksplash/kcm/installer.cpp b/ksplash/kcm/installer.cpp
index cada800..db2450b 100644
--- a/ksplash/kcm/installer.cpp
+++ b/ksplash/kcm/installer.cpp
@@ -184,7 +184,7 @@ SplashInstaller::~SplashInstaller()
int SplashInstaller::addTheme(const QString &path, const QString &name)
{
- //kDebug() << "SplashInstaller::addTheme: " << path << " " << name;
+ qDebug() << "SplashInstaller::addTheme: " << path << " " << name;
QString tmp(i18n( name.toUtf8() ));
int i = mThemesList->count();
while((i > 0) && (mThemesList->item(i-1)->text() > tmp))
@@ -434,7 +434,11 @@ void SplashInstaller::slotSetTheme(int id)
infoTxt += "</qt>";
QString pluginName( cnf.readEntry( "Engine", "KSplashX" ).trimmed() );
- if( pluginName == "Simple" || pluginName == "None" || pluginName == "KSplashX" )
+ if( pluginName == "Simple"
+ || pluginName == "None"
+ || pluginName == "KSplashX"
+ || pluginName == "KSplashQML"
+ )
enabled = true; // these are not plugins
else if ((KServiceTypeTrader::self()->query("KSplash/Plugin", QString("[X-KSplash-PluginName] == '%1'").arg(pluginName))).isEmpty())
{
@@ -536,6 +540,7 @@ void SplashInstaller::slotTest()
themeName = themeName.mid(r+1);
// special handling for none and simple splashscreens
+ qDebug() << "the engine is " << mEngineOfSelected << "for" << themeName;
if( mEngineOfSelected == "None" )
return;
else if( mEngineOfSelected == "Simple" )
@@ -554,6 +559,14 @@ void SplashInstaller::slotTest()
KMessageBox::error(this,i18n("Failed to successfully test the splash screen."));
return;
}
+ else if( mEngineOfSelected == "KSplashQML" )
+ {
+ KProcess proc;
+ proc << "ksplashqml" << themeName << "--test";
+ if (proc.execute())
+ KMessageBox::error(this,i18n("Failed to successfully test the splash screen."));
+ return;
+ }
else // KSplashML engines
{
KProcess proc;
diff --git a/ksplash/ksplashqml/CMakeLists.txt b/ksplash/ksplashqml/CMakeLists.txt
new file mode 100644
index 0000000..a9a3866
--- /dev/null
+++ b/ksplash/ksplashqml/CMakeLists.txt
@@ -0,0 +1,17 @@
+project(ksplashqml)
+
+set(ksplashqml_SRCS
+ main.cpp
+ SplashApp.cpp
+ SplashWindow.cpp
+ )
+
+add_executable(ksplashqml ${ksplashqml_SRCS})
+
+target_link_libraries(ksplashqml
+ ${X11_LIBRARIES}
+ ${QT_QTDECLARATIVE_LIBRARY}
+ ${QT_QTUI_LIBRARY}
+ )
+
+install(TARGETS ksplashqml ${INSTALL_TARGETS_DEFAULT_ARGS})
diff --git a/ksplash/ksplashqml/SplashApp.cpp b/ksplash/ksplashqml/SplashApp.cpp
new file mode 100644
index 0000000..84a36ab
--- /dev/null
+++ b/ksplash/ksplashqml/SplashApp.cpp
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2010 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * or (at your option) any later version, as published by the Free
+ * Software Foundation
+ *
+ * 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, write to the
+ * Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "SplashWindow.h"
+#include "SplashApp.h"
+
+#define TEST_STEP_INTERVAL 2000
+
+SplashApp::SplashApp(Display * display, int argc, char ** argv)
+ : QApplication(display, argc, argv),
+ m_display(display), m_stage(0), m_window(0),
+ m_testing(false)
+{
+ m_kde_splash_progress = XInternAtom(m_display, "_KDE_SPLASH_PROGRESS", False);
+ m_testing = arguments().contains("--test");
+ m_window = new SplashWindow(m_testing);
+
+ setStage(1);
+
+ int sw = WidthOfScreen(ScreenOfDisplay(display, DefaultScreen(display)));
+ int sh = HeightOfScreen(ScreenOfDisplay(display, DefaultScreen(display)));
+
+ m_window->setGeometry(0, 0, sw, sh);
+ m_window->show();
+
+ XSelectInput(display, DefaultRootWindow(display), SubstructureNotifyMask);
+
+ if (m_testing) {
+ m_timer.start(TEST_STEP_INTERVAL, this);
+ }
+}
+
+SplashApp::~SplashApp() {
+ delete m_window;
+}
+
+Display * SplashApp::display() const
+{
+ return m_display;
+}
+
+void SplashApp::timerEvent(QTimerEvent * event)
+{
+ if (event->timerId() == m_timer.timerId()) {
+ m_timer.stop();
+
+ setStage(m_stage + 1);
+
+ m_timer.start(TEST_STEP_INTERVAL, this);
+ }
+}
+
+bool SplashApp::x11EventFilter(XEvent * xe)
+{
+ char * message;
+ switch (xe->type) {
+ case ClientMessage:
+ if (xe->xclient.message_type == m_kde_splash_progress) {
+ message = xe->xclient.data.b;
+
+ int stage = -1;
+
+ if (strcmp(message, "initial") == 0 && m_stage < 0)
+ stage = 0; // not actually used
+ else if (strcmp(message, "kded") == 0 && m_stage < 1)
+ stage = 1;
+ else if (strcmp(message, "confupdate") == 0 && m_stage < 2)
+ stage = 2;
+ else if (strcmp(message, "kcminit") == 0 && m_stage < 3)
+ stage = 3;
+ else if (strcmp(message, "ksmserver") == 0 && m_stage < 4)
+ stage = 4;
+ else if (strcmp(message, "wm") == 0 && m_stage < 5)
+ stage = 5;
+ else if (strcmp(message, "desktop") == 0 && m_stage < 6)
+ stage = 6;
+
+ setStage(stage);
+ }
+ }
+ return false;
+
+}
+
+int SplashApp::x11ProcessEvent(XEvent * xe)
+{
+ Q_UNUSED(xe)
+ return 0;
+}
+
+void SplashApp::setStage(int stage)
+{
+ if (m_stage == 6) {
+ QApplication::exit(EXIT_SUCCESS);
+ }
+
+ m_stage = stage;
+ m_window->setStage(stage);
+}
+
diff --git a/ksplash/ksplashqml/SplashApp.h b/ksplash/ksplashqml/SplashApp.h
new file mode 100644
index 0000000..bc3fbdf
--- /dev/null
+++ b/ksplash/ksplashqml/SplashApp.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2010 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * or (at your option) any later version, as published by the Free
+ * Software Foundation
+ *
+ * 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, write to the
+ * Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef SPLASH_APP_H_
+#define SPLASH_APP_H_
+
+#include <QObject>
+#include <QApplication>
+#include <QBasicTimer>
+
+#include <X11/Xlib.h>
+
+class SplashWindow;
+
+class SplashApp: public QApplication {
+
+public:
+ SplashApp(Display * display, int argc, char ** argv);
+ ~SplashApp();
+
+ Display * display() const;
+
+ bool x11EventFilter(XEvent * xe);
+ int x11ProcessEvent(XEvent * xe);
+
+protected:
+ void timerEvent(QTimerEvent * event);
+ void setStage(int stage);
+
+private:
+ Display * m_display;
+ int m_stage;
+ Atom m_kde_splash_progress;
+ SplashWindow * m_window;
+ bool m_testing;
+ QBasicTimer m_timer;
+};
+
+#endif // SPLASH_APP_H_
diff --git a/ksplash/ksplashqml/SplashWindow.cpp b/ksplash/ksplashqml/SplashWindow.cpp
new file mode 100644
index 0000000..94e6ded
--- /dev/null
+++ b/ksplash/ksplashqml/SplashWindow.cpp
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2010 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * or (at your option) any later version, as published by the Free
+ * Software Foundation
+ *
+ * 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, write to the
+ * Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "SplashWindow.h"
+
+#include <QApplication>
+#include <QDeclarativeContext>
+#include <QGraphicsObject>
+#include <QKeyEvent>
+#include <QMouseEvent>
+#include <QTimer>
+
+#include "SystemInfo.h"
+
+SplashWindow::SplashWindow(bool testing)
+ : QDeclarativeView(),
+ m_stage(0),
+ m_testing(testing)
+{
+ setWindowFlags(
+ Qt::FramelessWindowHint |
+ Qt::WindowStaysOnTopHint
+ );
+
+ if (m_testing) {
+ setWindowState(Qt::WindowFullScreen);
+ } else {
+ setWindowFlags(Qt::X11BypassWindowManagerHint);
+ }
+
+ rootContext()->setContextProperty("screenSize", size());
+ setSource(QUrl(themeDir(QApplication::arguments().at(1)) + "/main.qml"));
+ setStyleSheet("background: #000000; border: none");
+ //be sure it will be eventually closed
+ //FIXME: should never be stuck
+ QTimer::singleShot(120000, this, SLOT(close()));
+}
+
+void SplashWindow::setStage(int stage)
+{
+ m_stage = stage;
+
+ rootObject()->setProperty("stage", stage);
+}
+
+void SplashWindow::resizeEvent(QResizeEvent *event)
+{
+ Q_UNUSED(event)
+ rootContext()->setContextProperty("screenSize", size());
+ centerOn(rootObject());
+}
+
+void SplashWindow::keyPressEvent(QKeyEvent *event)
+{
+ QDeclarativeView::keyPressEvent(event);
+ if (m_testing && !event->isAccepted() && event->key() == Qt::Key_Escape) {
+ close();
+ }
+}
+
+void SplashWindow::mousePressEvent(QMouseEvent *event)
+{
+ QDeclarativeView::mousePressEvent(event);
+ if (m_testing && !event->isAccepted()) {
+ close();
+ }
+}
diff --git a/ksplash/ksplashqml/SplashWindow.h b/ksplash/ksplashqml/SplashWindow.h
new file mode 100644
index 0000000..9680c1e
--- /dev/null
+++ b/ksplash/ksplashqml/SplashWindow.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2010 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * or (at your option) any later version, as published by the Free
+ * Software Foundation
+ *
+ * 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, write to the
+ * Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef SPLASH_WINDOW_H_
+#define SPLASH_WINDOW_H_
+
+#include <QDeclarativeView>
+
+class QResizeEvent;
+class QMouseEvent;
+class QKeyEvent;
+
+class SplashWindow: public QDeclarativeView
+{
+public:
+ SplashWindow(bool testing);
+
+ void setStage(int stage);
+
+protected:
+ virtual void resizeEvent (QResizeEvent *event);
+ virtual void keyPressEvent(QKeyEvent *event);
+ virtual void mousePressEvent(QMouseEvent *event);
+
+private:
+ int m_stage;
+ bool m_testing;
+};
+
+#endif // SPLASH_WINDOW_H_
diff --git a/ksplash/ksplashqml/SystemInfo.h b/ksplash/ksplashqml/SystemInfo.h
new file mode 100644
index 0000000..b2d5fda
--- /dev/null
+++ b/ksplash/ksplashqml/SystemInfo.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2010 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * or (at your option) any later version, as published by the Free
+ * Software Foundation
+ *
+ * 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, write to the
+ * Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef SYSTEM_INFO_H_
+#define SYSTEM_INFO_H_
+
+#include <stdlib.h>
+#include <config-workspace.h>
+
+#include <QDir>
+#include <QString>
+
+QString homeDir()
+{
+ const char * kdehome = getenv("KDEHOME");
+ const char * home = getenv("HOME");
+ if (kdehome && kdehome[0]) {
+ return QString() + home + "/" + KDE_DEFAULT_HOME;
+ }
+
+ return kdehome;
+}
+
+QString systemDir()
+{
+ return KDE_DATADIR;
+}
+
+QString themeDir(QString theme)
+{
+ QString path;
+
+ path = homeDir() + "/share/apps/ksplash/Themes/" + theme;
+
+ if (!QDir(path).exists()) {
+ path = systemDir() + "/ksplash/Themes/" + theme;
+ }
+
+ return path;
+}
+
+#endif // SYSTEM_INFO_H_
+
+
diff --git a/ksplash/ksplashqml/main.cpp b/ksplash/ksplashqml/main.cpp
new file mode 100644
index 0000000..ed409e2
--- /dev/null
+++ b/ksplash/ksplashqml/main.cpp
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2011 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * or (at your option) any later version, as published by the Free
+ * Software Foundation
+ *
+ * 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, write to the
+ * Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "SplashApp.h"
+
+#include <iostream>
+#include <X11/Xlib.h>
+
+int main(int argc, char **argv)
+{
+ bool test = false;
+ bool printPid = false;
+
+ for (int i = 1; i < argc; i++) {
+ if (strcmp("--test", argv[i]) == 0)
+ test = true;
+ else if (strcmp("--pid", argv[i]) == 0)
+ printPid = true;
+ }
+
+ // lets fork and all that...
+
+ if (!test) {
+ pid_t pid = fork();
+ if (pid < -1) {
+ return -1;
+ }
+
+ if (pid != 0) {
+ // this is the parent process, returning pid of the fork
+ if (printPid) {
+ std::cout << pid << std::endl;
+ }
+
+ return 0;
+ }
+
+ // close stdin,stdout,stderr, otherwise startkde will block
+ close(0);
+ close(1);
+ close(2);
+ }
+
+ Display * display = XOpenDisplay(NULL);
+
+ SplashApp app(display, argc, argv);
+
+ return app.exec();
+}
+
diff --git a/ksplash/ksplashqml/themes/CMakeLists.txt b/ksplash/ksplashqml/themes/CMakeLists.txt
new file mode 100644
index 0000000..818070c
--- /dev/null
+++ b/ksplash/ksplashqml/themes/CMakeLists.txt
@@ -0,0 +1,2 @@
+add_subdirectory(qmltest)
+add_subdirectory(qmldefault)
diff --git a/ksplash/ksplashqml/themes/qmldefault/CMakeLists.txt b/ksplash/ksplashqml/themes/qmldefault/CMakeLists.txt
new file mode 100644
index 0000000..6f28f3b
--- /dev/null
+++ b/ksplash/ksplashqml/themes/qmldefault/CMakeLists.txt
@@ -0,0 +1,7 @@
+install(FILES Preview.png Theme.rc main.qml DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmldefault)
+
+install(FILES images/kdegear.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmldefault/images)
+install(FILES images/kdeletter.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmldefault/images)
+install(FILES images/kdemask.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmldefault/images)
+install(FILES images/kdelogo.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmldefault/images)
+install(FILES images/kdelogo-contrast.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmldefault/images)
diff --git a/ksplash/ksplashqml/themes/qmldefault/Preview.png b/ksplash/ksplashqml/themes/qmldefault/Preview.png
new file mode 100644
index 0000000..532adf7
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmldefault/Preview.png differ
diff --git a/ksplash/ksplashqml/themes/qmldefault/Theme.rc b/ksplash/ksplashqml/themes/qmldefault/Theme.rc
new file mode 100644
index 0000000..4dc90f8
--- /dev/null
+++ b/ksplash/ksplashqml/themes/qmldefault/Theme.rc
@@ -0,0 +1,9 @@
+[KSplash Theme: qmldefault]
+Name = Minimalistic splash screen
+Description = Animated KDE logo on a black background
+Version = 1.0
+Author = Ivan Cukic <ivan.cukic at kde.org>
+Homepage =
http://www.kde.org
+
+# Theme behaviour settings.
+Engine = KSplashQML
diff --git a/ksplash/ksplashqml/themes/qmldefault/images/kdegear.png b/ksplash/ksplashqml/themes/qmldefault/images/kdegear.png
new file mode 100644
index 0000000..66a50c2
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmldefault/images/kdegear.png differ
diff --git a/ksplash/ksplashqml/themes/qmldefault/images/kdeletter.png b/ksplash/ksplashqml/themes/qmldefault/images/kdeletter.png
new file mode 100644
index 0000000..cabe17c
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmldefault/images/kdeletter.png differ
diff --git a/ksplash/ksplashqml/themes/qmldefault/images/kdelogo-contrast.png b/ksplash/ksplashqml/themes/qmldefault/images/kdelogo-contrast.png
new file mode 100644
index 0000000..fe60715
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmldefault/images/kdelogo-contrast.png differ
diff --git a/ksplash/ksplashqml/themes/qmldefault/images/kdelogo.png b/ksplash/ksplashqml/themes/qmldefault/images/kdelogo.png
new file mode 100644
index 0000000..d637b37
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmldefault/images/kdelogo.png differ
diff --git a/ksplash/ksplashqml/themes/qmldefault/images/kdemask.png b/ksplash/ksplashqml/themes/qmldefault/images/kdemask.png
new file mode 100644
index 0000000..50319fc
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmldefault/images/kdemask.png differ
diff --git a/ksplash/ksplashqml/themes/qmldefault/main.qml b/ksplash/ksplashqml/themes/qmldefault/main.qml
new file mode 100644
index 0000000..90a5494
--- /dev/null
+++ b/ksplash/ksplashqml/themes/qmldefault/main.qml
@@ -0,0 +1,189 @@
+/* vim:set foldenable foldmethod=marker:
+ *
+ * Copyright (C) 2011 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * or (at your option) any later version, as published by the Free
+ * Software Foundation
+ *
+ * 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, write to the
+ * Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+import Qt 4.7
+
+Item {
+ id: main
+
+ width: screenSize.width
+ height: screenSize.height
+ // width: 300
+ // height: 300
+
+ /* property declarations --------------------------{{{ */
+ property int stage
+ property int iconSize: (screenSize.width <= 1024) ? 64 : 128
+ /* }}} */
+
+ /* signal declarations ----------------------------{{{ */
+
+ /* }}} */
+
+ /* JavaScript functions ---------------------------{{{ */
+ onStageChanged: {
+ if (stage == 1) {
+ background.opacity = 1
+ gear.opacity = 0.5
+ }
+ if (stage == 2) {
+ gear.opacity = 1
+ mask.opacity = 1
+ letter.opacity = 1
+ }
+ if (stage == 3) {
+ }
+ if (stage == 4) {
+ }
+ if (stage == 5) {
+ logo.opacity = 1
+ }
+ if (stage == 6) {
+ }
+ }
+ /* }}} */
+
+ /* object properties ------------------------------{{{ */
+
+ /* }}} */
+
+ /* child objects ----------------------------------{{{ */
+
+ Rectangle {
+ color: "black"
+ anchors.fill: parent
+ }
+
+ Rectangle {
+ id: background
+
+ gradient: Gradient {
+ GradientStop { position: 0.0; color: "#55555f" }
+ GradientStop { position: 1.0; color: "#000000" }
+ }
+
+ anchors {
+ top: parent.top
+ left: parent.left
+ right: parent.right
+ }
+
+ height: gear.y - 32
+
+ opacity: 0
+ Behavior on opacity { NumberAnimation { duration: 1000; easing { type: Easing.InOutQuad } } }
+ }
+
+ Image {
+ id: gear
+
+ height: iconSize
+ width: iconSize
+ smooth: true
+
+ x: (parent.width - width) / 2
+ y: (parent.height - height) / 2
+
+ source: "images/kdegear.png"
+
+ opacity: 0
+ Behavior on opacity { NumberAnimation { duration: 1000; easing { type: Easing.InOutQuad } } }
+
+ NumberAnimation {
+ id: animateRotation
+ target: gear
+ properties: "rotation"
+ from: 0
+ to: 360
+ duration: 5000
+
+ loops: Animation.Infinite
+ running: true
+ }
+
+ }
+
+ Image {
+ id: mask
+
+ height: iconSize
+ width: iconSize
+ smooth: true
+
+ x: (parent.width - width) / 2
+ y: (parent.height - height) / 2
+
+ source: "images/kdemask.png"
+
+ opacity: 0
+ Behavior on opacity { NumberAnimation { duration: 1000; easing { type: Easing.InOutQuad } } }
+ }
+
+ Image {
+ id: letter
+
+ height: iconSize
+ width: iconSize
+ smooth: true
+
+ x: (parent.width - width) / 2
+ y: (parent.height - height) / 2
+
+ source: "images/kdeletter.png"
+
+ opacity: 0
+ Behavior on opacity { NumberAnimation { duration: 1000; easing { type: Easing.InOutQuad } } }
+ }
+
+ Image {
+ id: logo
+
+ height: iconSize
+ width: iconSize
+ smooth: true
+
+ x: (parent.width - width) / 2
+ y: (parent.height - height) / 2 - 1
+
+ source: "images/kdelogo-contrast.png"
+
+ opacity: 0
+ Behavior on opacity { NumberAnimation { duration: 1000; easing { type: Easing.InOutQuad } } }
+
+ Text {
+ text: "KDE Workspaces 4.7 'Friday'"
+ color: "white"
+
+ x: logo.width + 8
+ y: (logo.height - height) / 2
+ }
+ }
+
+ /* }}} */
+
+ /* stages -----------------------------------------{{{ */
+
+ /* }}} */
+
+ /* transitions ------------------------------------{{{ */
+
+ /* }}} */
+}
+
diff --git a/ksplash/ksplashqml/themes/qmltest/CMakeLists.txt b/ksplash/ksplashqml/themes/qmltest/CMakeLists.txt
new file mode 100644
index 0000000..9b2e59d
--- /dev/null
+++ b/ksplash/ksplashqml/themes/qmltest/CMakeLists.txt
@@ -0,0 +1,9 @@
+install(FILES Preview.png Theme.rc main.qml DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest)
+
+install(FILES images/background.jpg DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest/images)
+install(FILES images/configuring.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest/images)
+install(FILES images/desktop.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest/images)
+install(FILES images/globe.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest/images)
+install(FILES images/hardware.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest/images)
+install(FILES images/kde.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest/images)
+install(FILES images/plasma.png DESTINATION ${DATA_INSTALL_DIR}/ksplash/Themes/qmltest/images)
diff --git a/ksplash/ksplashqml/themes/qmltest/Preview.png b/ksplash/ksplashqml/themes/qmltest/Preview.png
new file mode 100644
index 0000000..398c037
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/Preview.png differ
diff --git a/ksplash/ksplashqml/themes/qmltest/Theme.rc b/ksplash/ksplashqml/themes/qmltest/Theme.rc
new file mode 100644
index 0000000..8088c20
--- /dev/null
+++ b/ksplash/ksplashqml/themes/qmltest/Theme.rc
@@ -0,0 +1,9 @@
+[KSplash Theme: QMLtest]
+Name = Default Splash Screen
+Description = Air and Horos Splash Screen
+Version = 1.0
+Author = Nuno Pinheiro <
[email protected]>, Riccardo Iaconelli <
[email protected]> and Marco Martin <
[email protected]>
+Homepage =
http://www.kde.org
+
+# Theme behaviour settings.
+Engine = KSplashQML
diff --git a/ksplash/ksplashqml/themes/qmltest/images/background.jpg b/ksplash/ksplashqml/themes/qmltest/images/background.jpg
new file mode 100644
index 0000000..8d3027c
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/images/background.jpg differ
diff --git a/ksplash/ksplashqml/themes/qmltest/images/configuring.png b/ksplash/ksplashqml/themes/qmltest/images/configuring.png
new file mode 100644
index 0000000..9ea5cec
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/images/configuring.png differ
diff --git a/ksplash/ksplashqml/themes/qmltest/images/desktop.png b/ksplash/ksplashqml/themes/qmltest/images/desktop.png
new file mode 100644
index 0000000..98153f2
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/images/desktop.png differ
diff --git a/ksplash/ksplashqml/themes/qmltest/images/globe.png b/ksplash/ksplashqml/themes/qmltest/images/globe.png
new file mode 100644
index 0000000..193c46f
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/images/globe.png differ
diff --git a/ksplash/ksplashqml/themes/qmltest/images/hardware.png b/ksplash/ksplashqml/themes/qmltest/images/hardware.png
new file mode 100644
index 0000000..68351d1
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/images/hardware.png differ
diff --git a/ksplash/ksplashqml/themes/qmltest/images/kde.png b/ksplash/ksplashqml/themes/qmltest/images/kde.png
new file mode 100644
index 0000000..3efaaf8
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/images/kde.png differ
diff --git a/ksplash/ksplashqml/themes/qmltest/images/plasma.png b/ksplash/ksplashqml/themes/qmltest/images/plasma.png
new file mode 100644
index 0000000..facbd77
Binary files /dev/null and b/ksplash/ksplashqml/themes/qmltest/images/plasma.png differ
diff --git a/ksplash/ksplashqml/themes/qmltest/main.qml b/ksplash/ksplashqml/themes/qmltest/main.qml
new file mode 100644
index 0000000..e0b8a1b
--- /dev/null
+++ b/ksplash/ksplashqml/themes/qmltest/main.qml
@@ -0,0 +1,164 @@
+/* vim:set foldenable foldmethod=marker:
+ *
+ * Copyright (C) 2011 Ivan Cukic <ivan.cukic(at)kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2,
+ * or (at your option) any later version, as published by the Free
+ * Software Foundation
+ *
+ * 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, write to the
+ * Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+import Qt 4.7 as QML
+
+QML.Item {
+ id: main
+
+ width: screenSize.width
+ height: screenSize.height
+
+ /* property declarations --------------------------{{{ */
+ property int stage
+ /* }}} */
+
+ /* signal declarations ----------------------------{{{ */
+
+ /* }}} */
+
+ /* JavaScript functions ---------------------------{{{ */
+ onStageChanged: {
+ if (stage == 2) {
+ stage1.x = (main.width - stage1.width) / 2
+ stage1.opacity = 1
+ }
+ if (stage == 3) {
+ stage1.x = - stage1.width
+ stage2.x = (main.width - stage2.width) / 2
+ stage1.opacity = 0
+ stage2.opacity = 1
+ }
+ if (stage == 4) {
+ stage2.x = - stage2.width
+ stage3.x = (main.width - stage3.width) / 2
+ stage2.opacity = 0
+ stage3.opacity = 1
+ }
+ if (stage == 5) {
+ stage3.x = - stage3.width
+ stage4.x = (main.width - stage4.width) / 2
+ stage3.opacity = 0
+ stage4.opacity = 1
+ }
+ if (stage == 6) {
+ stage4.x = - stage4.width
+ stage5.x = (main.width - stage5.width) / 2
+ stage4.opacity = 0
+ stage5.opacity = 1
+ stage5.width = 128
+ stage5.height = 128
+ }
+ }
+ /* }}} */
+
+ /* object properties ------------------------------{{{ */
+
+ /* }}} */
+
+ /* child objects ----------------------------------{{{ */
+ QML.Image {
+ anchors.fill: parent
+
+ source: "images/background.jpg"
+ }
+
+ QML.Rectangle {
+ width: parent.width
+ height: 100
+ x: 0
+ y: (parent.height - height) / 2
+ color: "#ffffff"
+ opacity: 0.2
+ }
+
+ QML.Image {
+ id: stage1
+ x: main.width + width
+ y: (main.height - height) / 2
+ source: "images/hardware.png"
+ QML.Behavior on x { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+ opacity: 0
+ QML.Behavior on opacity { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+
+ QML.Image { y: 128; x: parent.x - main.width / 2; height: 128; width: 128; opacity: 0.2 * parent.opacity; source: parent.source }
+ }
+
+ QML.Image {
+ id: stage2
+ x: main.width + width
+ y: (main.height - height) / 2
+ source: "images/configuring.png"
+ QML.Behavior on x { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+ opacity: 0
+ QML.Behavior on opacity { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+
+ QML.Image { y: 128; x: parent.x - main.width / 2; height: 128; width: 128; opacity: 0.2 * parent.opacity; source: parent.source }
+ }
+
+ QML.Image {
+ id: stage3
+ x: main.width + width
+ y: (main.height - height) / 2
+ source: "images/globe.png"
+ QML.Behavior on x { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+ opacity: 0
+ QML.Behavior on opacity { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+
+ QML.Image { y: 128; x: parent.x - main.width / 2; height: 128; width: 128; opacity: 0.2 * parent.opacity; source: parent.source }
+ }
+
+ QML.Image {
+ id: stage4
+ x: main.width + width
+ y: (main.height - height) / 2
+ source: "images/desktop.png"
+ QML.Behavior on x { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+ opacity: 0
+ QML.Behavior on opacity { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+
+ QML.Image { y: 128; x: parent.x - main.width / 2; height: 128; width: 128; opacity: 0.2 * parent.opacity; source: parent.source }
+ }
+
+ QML.Image {
+ id: stage5
+ x: main.width + width
+ y: (main.height - height) / 2
+ source: "images/kde.png"
+ QML.Behavior on x { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+ QML.Behavior on width { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+ QML.Behavior on height { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+ opacity: 0
+ QML.Behavior on opacity { QML.NumberAnimation { duration: 1000; easing { type: QML.Easing.InOutQuad } } }
+
+ // QML.Image { y: 128; x: parent.x - main.width / 2; height: 128; width: 128; opacity: 0.2 * parent.opacity; source: parent.source }
+ }
+
+ /* }}} */
+
+ /* stages -----------------------------------------{{{ */
+
+ /* }}} */
+
+ /* transitions ------------------------------------{{{ */
+
+ /* }}} */
+}
+
diff --git a/kwin/composite.cpp b/kwin/composite.cpp
index a8bb42e..323d589 100644
--- a/kwin/composite.cpp
+++ b/kwin/composite.cpp
@@ -836,7 +836,10 @@ bool Unmanaged::shouldUnredirect() const
{
// the pixmap is needed for the login effect, a nicer solution would be the login effect increasing
// refcount for the window pixmap (which would prevent unredirect), avoiding this hack
- if (resourceClass() == "ksplashx" || resourceClass() == "ksplashsimple")
+ if (resourceClass() == "ksplashx"
+ || resourceClass() == "ksplashsimple"
+ || resourceClass() == "ksplashqml"
+ )
return false;
// it must cover whole display or one xinerama screen, and be the topmost there
if (geometry() == workspace()->clientArea(FullArea, geometry().center(), workspace()->currentDesktop())
diff --git a/kwin/effects/fade/fade.cpp b/kwin/effects/fade/fade.cpp
index 17f39a8..1a54eb0 100644
--- a/kwin/effects/fade/fade.cpp
+++ b/kwin/effects/fade/fade.cpp
@@ -194,6 +194,7 @@ bool FadeEffect::isFadeWindow(EffectWindow* w)
e = w->data(WindowAddedGrabRole).value<void*>();
if (w->windowClass() == "ksplashx ksplashx"
|| w->windowClass() == "ksplashsimple ksplashsimple"
+ || w->windowClass() == "qt-subapplication ksplashqml"
|| (e && e != this)) {
// see login effect
return false;
diff --git a/kwin/effects/login/login.cpp b/kwin/effects/login/login.cpp
index 63d8479..a9da287 100644
--- a/kwin/effects/login/login.cpp
+++ b/kwin/effects/login/login.cpp
@@ -111,7 +111,8 @@ bool LoginEffect::isLoginSplash(EffectWindow* w)
// TODO there should be probably a better way (window type?)
// see also fade effect and composite.cpp
if (w->windowClass() == "ksplashx ksplashx"
- || w->windowClass() == "ksplashsimple ksplashsimple") {
+ || w->windowClass() == "ksplashsimple ksplashsimple"
+ || w->windowClass() == "qt-subapplication ksplashqml") {
return true;
}
return false;
diff --git a/startkde.cmake b/startkde.cmake
index 627dadb..1070785 100644
--- a/startkde.cmake
+++ b/startkde.cmake
@@ -151,6 +151,9 @@ if test -z "$dl"; then
KSplashX)
ksplash_pid=`ksplashx "${ksplashrc_ksplash_theme}" --pid`
;;
+ KSplashQML)
+ ksplash_pid=`ksplashqml "${ksplashrc_ksplash_theme}" --pid`
+ ;;
None)
;;
Simple)
@@ -356,11 +359,11 @@ fi
# if KDEWM is not set, ksmserver will ensure kwin is started.
# kwrapper4 is used to reduce startup time and memory usage
# kwrapper4 does not return useful error codes such as the exit code of ksmserver.
-# We only check for 255 which means that the ksmserver process could not be
-# started, any problems thereafter, e.g. ksmserver failing to initialize,
+# We only check for 255 which means that the ksmserver process could not be
+# started, any problems thereafter, e.g. ksmserver failing to initialize,
# will remain undetected.
test -n "$KDEWM" && KDEWM="--windowmanager $KDEWM"
-kwrapper4 ksmserver $KDEWM
+kwrapper4 ksmserver $KDEWM
if test $? -eq 255; then
# Startup error
echo 'startkde: Could not start ksmserver. Check your installation.' 1>&2