diff --git a/main.cpp b/main.cpp index 4869155142..d69019ad66 100644 --- a/main.cpp +++ b/main.cpp @@ -34,15 +34,17 @@ along with this program. If not, see . // KDE #include #include -#include -#include +#include #include #include #include #include #include +#include // Qt +#include #include +#include #include #include #include @@ -182,15 +184,31 @@ private: int Application::crashes = 0; -Application::Application() - : KApplication() +Application::Application(int &argc, char **argv) + : QApplication(argc, argv) , owner(screen_number) , m_eventFilter(new XcbEventFilter()) + , m_replace(false) + , m_configLock(false) +{ +} + +void Application::setConfigLock(bool lock) +{ + m_configLock = lock; +} + +void Application::setReplace(bool replace) +{ + m_replace = replace; +} + +void Application::start() { setQuitOnLastWindowClosed(false); - KCmdLineArgs* args = KCmdLineArgs::parsedArgs(); + KSharedConfig::Ptr config = KGlobal::config(); - if (!config->isImmutable() && args->isSet("lock")) { + if (!config->isImmutable() && m_configLock) { // TODO: This shouldn't be necessary //config->setReadOnly( true ); config->reparseConfiguration(); @@ -204,9 +222,8 @@ Application::Application() ::exit(1); }); connect(&owner, SIGNAL(lostOwnership()), SLOT(lostSelection())); - connect(&owner, &KSelectionOwner::claimedOwnership, [this, args, config]{ + connect(&owner, &KSelectionOwner::claimedOwnership, [this, config]{ KCrash::setEmergencySaveFunction(Application::crashHandler); - crashes = args->getOption("crashes").toInt(); if (crashes >= 4) { // Something has gone seriously wrong AlternativeWMDialog dialog; @@ -277,7 +294,7 @@ Application::Application() }); // we need to do an XSync here, otherwise the QPA might crash us later on Xcb::sync(); - owner.claim(args->isSet("replace"), true); + owner.claim(m_replace, true); } Application::~Application() @@ -302,7 +319,7 @@ bool Application::notify(QObject* o, QEvent* e) { if (Workspace::self()->workspaceEvent(e)) return true; - return KApplication::notify(o, e); + return QApplication::notify(o, e); } static void sighandler(int) @@ -328,6 +345,16 @@ void Application::resetCrashesCount() crashes = 0; } +void Application::setCrashCount(int count) +{ + crashes = count; +} + +bool Application::wasCrash() +{ + return crashes > 0; +} + bool XcbEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long int *result) { Q_UNUSED(result) @@ -406,28 +433,6 @@ KDE_EXPORT int kdemain(int argc, char * argv[]) } } - K4AboutData aboutData( - QByteArray(KWIN_NAME), // The program name used internally - QByteArray(), // The message catalog name. If null, program name is used instead - ki18n("KWin"), // A displayable program name string - QByteArray(version), // The program version string - ki18n(description), // Short description of what the app does - K4AboutData::License_GPL, // The license this code is released under - ki18n("(c) 1999-2008, The KDE Developers")); // Copyright Statement - aboutData.addAuthor(ki18n("Matthias Ettrich"), KLocalizedString(), "ettrich@kde.org"); - aboutData.addAuthor(ki18n("Cristian Tibirna"), KLocalizedString(), "tibirna@kde.org"); - aboutData.addAuthor(ki18n("Daniel M. Duley"), KLocalizedString(), "mosfet@kde.org"); - aboutData.addAuthor(ki18n("Luboš Luňák"), KLocalizedString(), "l.lunak@kde.org"); - aboutData.addAuthor(ki18n("Martin Gräßlin"), ki18n("Maintainer"), "mgraesslin@kde.org"); - - KCmdLineArgs::init(argc, argv, &aboutData); - - KCmdLineOptions args; - args.add("lock", ki18n("Disable configuration options")); - args.add("replace", ki18n("Replace already-running ICCCM2.0-compliant window manager")); - args.add("crashes ", ki18n("Indicate that KWin has recently crashed n times")); - KCmdLineArgs::addCmdLineOptions(args); - if (KDE_signal(SIGTERM, KWin::sighandler) == SIG_IGN) KDE_signal(SIGTERM, SIG_IGN); if (KDE_signal(SIGINT, KWin::sighandler) == SIG_IGN) @@ -441,7 +446,45 @@ KDE_EXPORT int kdemain(int argc, char * argv[]) org::kde::KSMServerInterface ksmserver(QStringLiteral("org.kde.ksmserver"), QStringLiteral("/KSMServer"), QDBusConnection::sessionBus()); ksmserver.suspendStartup(QStringLiteral(KWIN_NAME)); - KWin::Application a; + KWin::Application a(argc, argv); + + a.setApplicationName(QStringLiteral(KWIN_NAME)); + a.setApplicationVersion(QStringLiteral(KDE_VERSION_STRING)); + a.setApplicationDisplayName(i18n("KWin")); + + KAboutData aboutData(QStringLiteral(KWIN_NAME), // The program name used internally + QString(), // The message catalog name. If null, program name is used instead + i18n("KWin"), // A displayable program name string + QStringLiteral(KDE_VERSION_STRING), // The program version string + i18n(description), // Short description of what the app does + KAboutData::License_GPL, // The license this code is released under + i18n("(c) 1999-2013, The KDE Developers")); // Copyright Statement + + aboutData.addAuthor(i18n("Matthias Ettrich"), QString(), QStringLiteral("ettrich@kde.org")); + aboutData.addAuthor(i18n("Cristian Tibirna"), QString(), QStringLiteral("tibirna@kde.org")); + aboutData.addAuthor(i18n("Daniel M. Duley"), QString(), QStringLiteral("mosfet@kde.org")); + aboutData.addAuthor(i18n("Luboš Luňák"), QString(), QStringLiteral("l.lunak@kde.org")); + aboutData.addAuthor(i18n("Martin Gräßlin"), i18n("Maintainer"), QStringLiteral("mgraesslin@kde.org")); + + QCommandLineOption lockOption(QStringLiteral("lock"), i18n("Disable configuration options")); + QCommandLineOption replaceOption(QStringLiteral("replace"), i18n("Replace already-running ICCCM2.0-compliant window manager")); + QCommandLineOption crashesOption(QStringLiteral("crashes"), i18n("Indicate that KWin has recently crashed n times"), QStringLiteral("n")); + + QCommandLineParser parser; + parser.setApplicationDescription(i18n("KDE window manager")); + parser.addVersionOption(); + parser.addHelpOption(); + parser.addOption(lockOption); + parser.addOption(replaceOption); + parser.addOption(crashesOption); + + parser.process(a); + + KWin::Application::setCrashCount(parser.value(crashesOption).toInt()); + a.setConfigLock(parser.isSet(lockOption)); + a.setReplace(parser.isSet(replaceOption)); + + a.start(); ksmserver.resumeStartup(QStringLiteral(KWIN_NAME)); KWin::SessionManager weAreIndeed; diff --git a/main.h b/main.h index 2a5604d468..4f9c8dbcdb 100644 --- a/main.h +++ b/main.h @@ -22,9 +22,9 @@ along with this program. If not, see . #ifndef MAIN_H #define MAIN_H -#include #include // Qt +#include #include namespace KWin @@ -51,13 +51,21 @@ private: static xcb_atom_t xa_version; }; -class Application : public KApplication +class Application : public QApplication { Q_OBJECT public: - Application(); + Application(int &argc, char **argv); ~Application(); + void setReplace(bool replace); + void setConfigLock(bool lock); + + void start(); + + static void setCrashCount(int count); + static bool wasCrash(); + protected: bool notify(QObject* o, QEvent* e); static void crashHandler(int signal); @@ -69,6 +77,8 @@ private Q_SLOTS: private: KWinSelectionOwner owner; QScopedPointer m_eventFilter; + bool m_replace; + bool m_configLock; static int crashes; }; diff --git a/workspace.cpp b/workspace.cpp index eddcd4de71..e3718fbd5e 100644 --- a/workspace.cpp +++ b/workspace.cpp @@ -59,15 +59,15 @@ along with this program. If not, see . #include "useractions.h" #include "virtualdesktops.h" #include "xcbutils.h" +#include "main.h" // KDE #include -#include #include -#include #include #include #include #include +#include #include #include #include @@ -348,8 +348,6 @@ void Workspace::init() // Begin updates blocker block StackingUpdatesBlocker blocker(this); - bool fixoffset = KCmdLineArgs::parsedArgs()->getOption("crashes").toInt() > 0; - Xcb::Tree tree(rootWindow()); xcb_window_t *wins = xcb_query_tree_children(tree.data()); @@ -376,7 +374,7 @@ void Workspace::init() // ### This will request the attributes again createUnmanaged(wins[i]); } else if (attr->map_state != XCB_MAP_STATE_UNMAPPED) { - if (fixoffset) { + if (Application::wasCrash()) { fixPositionAfterCrash(wins[i], windowGeometries[i].data()); }