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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
/*****************************************************************
Copyright (c) 2001 Charles Samuels <charles@kde.org>
2000 Rik Hemsley <rik@kde.org>
This code is released under the GNU General Public License 2.0, or any
later version, at your option. I mean, you know the drill, just read
RMS's novel that I'm supposed to put at the top of every story. He's insane.
******************************************************************/
#include "madness.h"
#include <kwin.h>
#include <kwinmodule.h>
#include <kiconloader.h>
#include <math.h>
#include <iostream>
#include <X11/Xlib.h>
extern "C"
{
Plugin *create_plugin()
{
return new Madness();
}
}
Madness::Madness()
: MonoFFTScope(100), Plugin(), mWm(this)
{
connect(&mWm, TQT_SIGNAL(currentDesktopChanged(int)), TQT_SLOT(update()));
connect(&mWm, TQT_SIGNAL(windowAdded(WId)), TQT_SLOT(update()));
connect(&mWm, TQT_SIGNAL(windowRemoved(WId)), TQT_SLOT(update()));
connect(&mWm, TQT_SIGNAL(strutChanged()), TQT_SLOT(update()));
}
Madness::~Madness()
{
TQMap<WId, TQPoint>::ConstIterator it(mOriginalPositions.begin());
for (; it != mOriginalPositions.end(); ++it)
XMoveWindow(qt_xdisplay(), it.key(), (*it).x(), (*it).y());
}
void Madness::update()
{
mWindowList = mWm.windows();
mWorkArea = mWm.workArea();
TQValueList<WId>::ConstIterator it(mWindowList.begin());
for (; it != mWindowList.end(); ++it)
{
TQRect area=KWin::info(*it).frameGeometry;
if (!mOriginalPositions.tqcontains(*it))
mOriginalPositions.insert(*it, area.topLeft());
}
}
void Madness::init()
{
update();
MonoFFTScope::start();
}
void Madness::scopeEvent(float *d, int size)
{
int delta=0; // in pixels
for (int count=0; count<size; count++)
{
delta+=(int)((log10(d[count]+1)/log(2))*(size-count))/2;
}
// cout << "delta: " << delta << endl;
TQValueList<WId>::ConstIterator it(mWindowList.begin());
for (; it != mWindowList.end(); ++it)
{
KWin::Info i(KWin::info(*it));
if ((NET::Visible != i.mappingState) ||
((NET::Unknown != i.windowType) &&
(NET::Normal != i.windowType) &&
(NET::Tool != i.windowType) &&
(NET::Menu != i.windowType) &&
(NET::Dialog != i.windowType)) || (NET::Max & i.state)
|| (NET::Shaded & i.state)
|| (mWm.currentDesktop() != i.desktop))
continue;
TQRect area=i.frameGeometry;
float lightness=100000.0/(area.width()*area.height());
int x=area.x();
int y=area.y();
int dx=(int)((delta*lightness*(area.height()/10)/100))*(KApplication::random()%2 ? -1 : 1);
int dy=(int)((delta*lightness*(area.width()/10)/100))*(KApplication::random()%2 ? -1 : 1);
if (dx < 0 && (x - dx < mWorkArea.left()))
dx = -dx;
else if (dx > 0 && (x + dx + area.width() > mWorkArea.right()))
dx = -dx;
if (dy < 0 && (y - dy < mWorkArea.top()))
dy = -dy;
else if (dy > 0 && (y + dy + area.height() > mWorkArea.bottom()))
dy = -dy;
XMoveWindow(qt_xdisplay(), i.win, x + dx, y + dy);
}
}
#include "madness.moc"
|