summaryrefslogtreecommitdiffstats
path: root/application.cpp
blob: fb2cc3eed47698aacccc2706815207a92d1bfc7d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*
 * Copyright 2008 Arthur Renato Mello <arthur@mandriva.com>
 * Copyright 2008-2009 Gustavo Pichorim Boiko <boiko@mandriva.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * 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 St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

#include <QX11Info>
#include <QTimerEvent>

#include "application.h"

#include <stdio.h>
#include <X11/Xlib.h>

Application::Application()
: KApplication(), m_id(-1)
{
	mCurrentState = "";

	mTestSteps.enqueue("kded");
	mTestSteps.enqueue("confupdate");
	mTestSteps.enqueue("kcminit");
	mTestSteps.enqueue("ksmserver");
	mTestSteps.enqueue("wm");
	mTestSteps.enqueue("desktop");

	mKDESplashProgressAtom = XInternAtom(QX11Info::display(),
		"_KDE_SPLASH_PROGRESS", False);
}

Application::~Application()
{
}

void Application::timerEvent(QTimerEvent *event)
{
	if (event->timerId() != m_id)
		return;

	QString state;

	if(!mTestSteps.isEmpty())
		state = mTestSteps.dequeue();
	else
		quit();

	emit gotState(state);
}

bool Application::x11EventFilter(XEvent *e)
{
	if( e->type == ClientMessage &&
		e->xclient.window == QX11Info::appRootWindow() &&
		e->xclient.message_type == mKDESplashProgressAtom)
	{
		QString state(e->xclient.data.b);

		if(state == "desktop")
			quit();

		int currentStep = mTestSteps.indexOf(mCurrentState);
		int step = mTestSteps.indexOf(state);
		if(step > currentStep)
		{
			while(currentStep != step)
			{
				currentStep++;
				emit gotState(mTestSteps.at(currentStep));
			}
			mCurrentState = state;
		}
	}

	return KApplication::x11EventFilter(e);
}

void Application::startTest()
{
	m_id = startTimer(1500);
}