forked from derlaft/skype1ico
-
Notifications
You must be signed in to change notification settings - Fork 0
/
skype1ico.cpp
96 lines (75 loc) · 2.32 KB
/
skype1ico.cpp
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
#include "skype1ico.h"
setIconProto realSetIcon;
QHash<qint32, QIcon> replace;
QString theme_dir, unknown_dir;
void initMyself() {
realSetIcon = &QSystemTrayIcon::setIcon;
void *ptr;
memcpy(&ptr, &realSetIcon, sizeof(ptr));
Dl_info nfo;
dladdr(ptr, &nfo);
ptr=dlsym(RTLD_NEXT, nfo.dli_sname);
memcpy(&realSetIcon, &ptr, sizeof(ptr));
}
QString emptyDefault (QString query, QString def) {
if (query.isEmpty()) {
return def;
}
return query;
}
QString findThemeDir() {
QStringList themes, list;
themes << emptyDefault(qgetenv("SKYPE1ICO_THEME"), QIcon::themeName())
<< DEFAULT_THEME;
list << qgetenv("HOME") + "/.local/share/skype1ico/"
<< THEMES_DIR;
foreach (QString data_dir, QString(qgetenv("XDG_DATA_DIRS")).split(":")) {
list << data_dir + "/skype1ico/";
}
foreach(QString theme, themes) {
foreach (QString ico_root, list) {
QString path = QString("%1/%2/").arg(ico_root, theme);
if (QFile::exists( path + "themerc" )) {
return path;
}
}
}
return "";
}
void readConfig(QString theme_dir) {
QFile input_file(theme_dir + "themerc");
if (input_file.open(QIODevice::ReadOnly))
{
QTextStream in(&input_file);
QIcon value;
while ( !in.atEnd() ) {
QString line = in.readLine();
if (line.endsWith(':')) {
line.chop(1);
value = QIcon(theme_dir + line);
}
else if (line.endsWith('!')) {
line.chop(1);
value = QIcon::fromTheme(line);
}
else if (!line.startsWith('#') && !value.isNull()) {
qint32 key = line.trimmed().toInt();
replace.insert(key, value);
}
}
input_file.close();
}
}
extern void QSystemTrayIcon::setIcon(const QIcon &icon) {
if (realSetIcon == NULL) {
initMyself();
theme_dir = findThemeDir();
readConfig(theme_dir);
}
QPixmap pixmap = icon.pixmap(QSize(24, 24));
qint32 key = Hashing::hashPixmap(pixmap);
if (!replace.contains(key)) {
pixmap.save(QString(qgetenv("HOME")) + "/.skype1ico/" + QString::number(key) + ".png");
}
(this->*realSetIcon) (replace.value(key, icon));
}