void FileManager::openFile( const QString& fileName, const QString& name, const QString& title, const QString& partName, const QVariantList& partParams ) { if( fileName.isEmpty() ) return; QString fullName = name.isEmpty() ? KUrl( fileName ).fileName() : name; QString fullTitle = title.isEmpty() ? fullName : title; if( d->parts.contains( fullName ) ) { emit newPart( fullName, fullTitle ); return; } KMimeType::Ptr mime = KMimeType::findByPath( fileName ); KParts::ReadOnlyPart* part = 0; KService::List parts; if( !partName.isEmpty() ) { KService::Ptr service = KService::serviceByDesktopName( partName ); if( !service.isNull() ) parts.append( service ); } if( parts.count() == 0 ) { parts.append( KMimeTypeTrader::self()->query( mime->name(), "KParts/ReadWritePart" ) ); parts.append( KMimeTypeTrader::self()->query( mime->name(), "KParts/ReadOnlyPart" ) ); if( mime->name().contains( "audio" ) && parts.count() == 0 ) parts.append( KService::serviceByStorageId( "dragonplayer_part.desktop" ) ); } if( parts.count() > 0 ) { part = parts.first()->createInstance<KParts::ReadWritePart>( 0, partParams ); if( !part ) part = parts.first()->createInstance<KParts::ReadOnlyPart>( 0, partParams ); } if( part ) { // Add the part if it is found KUrl url( fileName ); part->openUrl( url ); d->parts.insert( fullName, part ); d->partManager->addPart( part, true ); emit newPart( fullName, fullTitle ); return; } // There really is no part that can be used. // Instead, just open it in an external application. // KRun* runner = new KRun( KUrl( fileName ), qApp->activeWindow() ); }
static void addUnique(KService::List &lst, QDict< KService > &dict, const KService::List &newLst, bool lowPrio) { QValueListConstIterator< KService::Ptr > it = newLst.begin(); for(; it != newLst.end(); ++it) { KService *service = static_cast< KService * >(*it); if(dict.find(service->desktopEntryPath())) continue; dict.insert(service->desktopEntryPath(), service); lst.append(service); if(lowPrio) service->setInitialPreference(0); } }
int main(int argc, char *argv[]) { KCmdLineArgs::init(argc, argv, appName, "kscreensaver", ki18n("Random screen saver"), KDE_VERSION_STRING, ki18n(description)); KCmdLineOptions options; options.add("setup", ki18n("Setup screen saver")); options.add("window-id wid", ki18n("Run in the specified XWindow")); options.add("root", ki18n("Run in the root XWindow")); KCmdLineArgs::addCmdLineOptions(options); KApplication app; WId windowId = 0; KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); if (args->isSet("setup")) { KRandomSetup setup; setup.exec(); exit(0); } if (args->isSet("window-id")) { windowId = args->getOption("window-id").toInt(); } #ifdef Q_WS_X11 if (args->isSet("root")) { QX11Info info; windowId = RootWindow(QX11Info::display(), info.screen()); } #endif args->clear(); const KService::List lst = KServiceTypeTrader::self()->query( "ScreenSaver"); KService::List availableSavers; KConfig type("krandom.kssrc", KConfig::NoGlobals); const KConfigGroup configGroup = type.group("Settings"); const bool opengl = configGroup.readEntry("OpenGL", false); const bool manipulatescreen = configGroup.readEntry("ManipulateScreen", false); // TODO replace this with TryExec=fortune in the desktop files const bool fortune = !KStandardDirs::findExe("fortune").isEmpty(); foreach( const KService::Ptr& service, lst ) { //QString file = KStandardDirs::locate("services", service->entryPath()); //kDebug() << "Looking at " << file; const QString saverType = service->property("X-KDE-Type").toString(); foreach (const QString &type, saverType.split(QLatin1Char(';'))) { //kDebug() << "saverTypes is "<< type; if (type == QLatin1String("ManipulateScreen")) { if (!manipulatescreen) goto fail; } else if (type == QLatin1String("OpenGL")) { if (!opengl) goto fail; } else if (type == QLatin1String("Fortune")) { if (!fortune) goto fail; } } availableSavers.append(service); fail: ; } KRandomSequence rnd; const int indx = rnd.getLong(availableSavers.count()); const KService::Ptr service = availableSavers.at(indx); const QList<KServiceAction> actions = service->actions(); QString cmd; if (windowId) cmd = exeFromActionGroup(actions, "InWindow"); if (cmd.isEmpty() && windowId == 0) cmd = exeFromActionGroup(actions, "Root"); if (cmd.isEmpty()) cmd = service->exec(); QHash<QChar, QString> keyMap; keyMap.insert('w', QString::number(windowId)); const QStringList words = KShell::splitArgs(KMacroExpander::expandMacrosShellQuote(cmd, keyMap)); if (!words.isEmpty()) { QString exeFile = KStandardDirs::findExe(words.first()); if (!exeFile.isEmpty()) { char **sargs = new char *[words.size() + 1]; int i = 0; for (; i < words.size(); i++) sargs[i] = qstrdup(words[i].toLocal8Bit().constData()); sargs[i] = 0; execv(exeFile.toLocal8Bit(), sargs); } } // If we end up here then we couldn't start a saver. // If we have been supplied a window id or root window then blank it. #ifdef Q_WS_X11 QX11Info info; Window win = windowId ? windowId : RootWindow(QX11Info::display(), info.screen()); XSetWindowBackground(QX11Info::display(), win, BlackPixel(QX11Info::display(), info.screen())); XClearWindow(QX11Info::display(), win); #endif }