1
//-----------------------------------------------------------------------------
3
// Screen savers for KDE
5
// Copyright (c) Martin R. Jones 1999
7
// This is an extremely simple program that starts a random screensaver.
10
#include <config-workspace.h>
21
#include <QGridLayout>
23
#include <kapplication.h>
24
#include <kstandarddirs.h>
27
#include <kdesktopfile.h>
28
#include <krandomsequence.h>
30
#include <kcmdlineargs.h>
34
#include <kdeversion.h>
35
#include <kmacroexpander.h>
37
#include "kscreensaver_vroot.h"
41
#include <kservicetypetrader.h>
43
void usage(char *name)
45
puts(i18n("Usage: %1 [-setup] [args]\n"
46
"Starts a random screen saver.\n"
47
"Any arguments (except -setup) are passed on to the screen saver.", name ).toLocal8Bit().data());
50
static const char appName[] = "random";
52
static const char description[] = I18N_NOOP("Start a random KDE screen saver");
54
static QString exeFromActionGroup(const QList<KServiceAction>& actions, const char* name)
56
foreach(const KServiceAction& action, actions) {
57
if (action.name() == name)
63
//----------------------------------------------------------------------------
65
int main(int argc, char *argv[])
67
KCmdLineArgs::init(argc, argv, appName, "kscreensaver", ki18n("Random screen saver"),
68
KDE_VERSION_STRING, ki18n(description));
71
KCmdLineOptions options;
73
options.add("setup", ki18n("Setup screen saver"));
75
options.add("window-id wid", ki18n("Run in the specified XWindow"));
77
options.add("root", ki18n("Run in the root XWindow"));
79
KCmdLineArgs::addCmdLineOptions(options);
85
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
87
if (args->isSet("setup"))
94
if (args->isSet("window-id"))
96
windowId = args->getOption("window-id").toInt();
99
if (args->isSet("root"))
102
windowId = RootWindow(QX11Info::display(), info.screen());
105
const KService::List lst = KServiceTypeTrader::self()->query( "ScreenSaver");
106
KService::List availableSavers;
108
KConfig type("krandom.kssrc", KConfig::NoGlobals);
109
const KConfigGroup configGroup = type.group("Settings");
110
const bool opengl = configGroup.readEntry("OpenGL", false);
111
const bool manipulatescreen = configGroup.readEntry("ManipulateScreen", false);
112
// TODO replace this with TryExec=fortune in the desktop files
113
const bool fortune = !KStandardDirs::findExe("fortune").isEmpty();
114
foreach( const KService::Ptr& service, lst ) {
115
//QString file = KStandardDirs::locate("services", service->entryPath());
116
//kDebug() << "Looking at " << file;
117
const QString saverType = service->property("X-KDE-Type").toString();
118
foreach (const QString &type, saverType.split(QLatin1Char(';'))) {
119
//kDebug() << "saverTypes is "<< type;
120
if (type == QLatin1String("ManipulateScreen")) {
121
if (!manipulatescreen)
123
} else if (type == QLatin1String("OpenGL")) {
126
} else if (type == QLatin1String("Fortune")) {
131
availableSavers.append(service);
136
const int indx = rnd.getLong(availableSavers.count());
137
const KService::Ptr service = availableSavers.at(indx);
138
const QList<KServiceAction> actions = service->actions();
142
cmd = exeFromActionGroup(actions, "InWindow");
143
if (cmd.isEmpty() && windowId == 0)
144
cmd = exeFromActionGroup(actions, "Root");
146
cmd = service->exec();
148
QHash<QChar, QString> keyMap;
149
keyMap.insert('w', QString::number(windowId));
150
const QStringList words = KShell::splitArgs(KMacroExpander::expandMacrosShellQuote(cmd, keyMap));
151
if (!words.isEmpty()) {
152
QString exeFile = KStandardDirs::findExe(words.first());
153
if (!exeFile.isEmpty()) {
154
char **sargs = new char *[words.size() + 1];
156
for (; i < words.size(); i++)
157
sargs[i] = qstrdup(words[i].toLocal8Bit().constData());
160
execv(exeFile.toLocal8Bit(), sargs);
164
// If we end up here then we couldn't start a saver.
165
// If we have been supplied a window id or root window then blank it.
167
Window win = windowId ? windowId : RootWindow(QX11Info::display(), info.screen());
168
XSetWindowBackground(QX11Info::display(), win,
169
BlackPixel(QX11Info::display(), info.screen()));
170
XClearWindow(QX11Info::display(), win);
174
KRandomSetup::KRandomSetup( QWidget *parent, const char *name )
177
setObjectName( name );
179
setCaption( i18n( "Setup Random Screen Saver" ) );
180
setButtons( Ok | Cancel );
182
QFrame *main = new QFrame( this );
183
setMainWidget( main );
184
QGridLayout *grid = new QGridLayout(main );
185
grid->setSpacing( spacingHint() );
187
openGL = new QCheckBox( i18n("Use OpenGL screen savers"), main );
188
grid->addWidget(openGL, 0, 0);
190
manipulateScreen = new QCheckBox(i18n("Use screen savers that manipulate the screen"), main);
191
grid->addWidget(manipulateScreen, 1, 0);
193
setMinimumSize( sizeHint() );
195
KConfig config("krandom.kssrc", KConfig::NoGlobals);
196
const KConfigGroup configGroup = config.group("Settings");
197
openGL->setChecked(configGroup.readEntry("OpenGL", true));
198
manipulateScreen->setChecked(configGroup.readEntry("ManipulateScreen", true));
200
connect( this, SIGNAL( okClicked() ), SLOT( slotOk() ) );
203
void KRandomSetup::slotOk()
205
KConfig config("krandom.kssrc");
206
KConfigGroup configGroup = config.group("Settings");
207
configGroup.writeEntry("OpenGL", openGL->isChecked());
208
configGroup.writeEntry("ManipulateScreen", manipulateScreen->isChecked());
213
#include "random.moc"