Compare commits

...

24 commits

Author SHA1 Message Date
50be6a3db4 Added interval argument (-i/--interval) 2026-08-09 03:32:52 +02:00
68eb540e41 README.md update. 2026-07-17 23:05:12 +02:00
ca5eadb448 Added second shot and README.md update. 2026-07-17 18:33:27 +02:00
1f5f674ece README.md update. 2026-07-17 14:10:23 +02:00
e4457b5bb6 Added screenshot. 2026-07-17 14:03:06 +02:00
f23b8cf585 README typo fixes. 2026-07-16 01:50:15 +02:00
966314dae7 Converted project to CPP and use Qt instead of Gtk. 2026-07-16 00:44:52 +02:00
22c991cd26 Lot of fixes... 2026-07-16 00:03:03 +02:00
5f4ce7f655 A lot of modernizing. 2026-07-15 23:18:48 +02:00
7e1753c1a1 Cosmetic changes. (0.0.3) 2023-11-02 04:32:11 +01:00
db0ad96e7e Playing around and added setup.py. (0.0.2) 2023-11-02 02:50:06 +01:00
4e8ccc0b43 Added back spacetray.iml. 2023-11-02 02:39:01 +01:00
8a6cdbd267 First steps to move from Make to CMake. 2023-11-02 02:05:55 +01:00
2875fc6187 requirements.txt update and added __VERSION__. (0.0.1) 2023-11-01 22:07:15 +01:00
8758aa2385 Started migration to Python... Maybe not a good idea. 2023-11-01 21:33:35 +01:00
dee30e9c93 README update. 2023-03-09 04:24:03 +01:00
20775b82e0 .gitignore and Makefile update. 2023-03-09 04:21:16 +01:00
9a49f50bc0 Added LICENSE 2023-03-09 04:02:16 +01:00
b06d8fd7eb Added themes and made struct names more generic. 2023-03-09 04:00:37 +01:00
5d44839dc1 README update. 2023-03-09 03:59:40 +01:00
7154b7c29e Added themes and made struct names more generic. 2023-03-09 03:58:04 +01:00
6fae1665b3 disabled notification at program start. 2023-02-25 02:25:19 +01:00
55a2f23594 Renamed the project and some refactoring... 2023-02-12 09:29:27 +01:00
f2a39fd327 readme update 2019-03-15 04:38:05 +01:00
13 changed files with 2021 additions and 861 deletions

21
.gitignore vendored
View file

@ -1,6 +1,16 @@
spaceapi-gtk
# General
build/
local/
*~
# CLion
.idea/
.junie/
spacetray.iml
# CMake
cmake-build-debug/
# Prerequisites
*.d
@ -44,12 +54,3 @@ spaceapi-gtk
*.su
*.idb
*.pdb
# Kernel Module Compile Results
*.mod*
*.cmd
.tmp_versions/
modules.order
Module.symvers
Mkfile.old
dkms.conf

19
CMakeLists.txt Normal file
View file

@ -0,0 +1,19 @@
cmake_minimum_required(VERSION 3.10)
project(spacetray)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
find_package(Qt5 REQUIRED COMPONENTS Widgets Network)
add_executable(spacetray
main.cpp
spacetray.cpp
spacetray.h
)
target_link_libraries(spacetray Qt5::Widgets Qt5::Network)

19
LICENSE Normal file
View file

@ -0,0 +1,19 @@
Copyright (c) 2023 Johannes Findeisen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice (including the next
paragraph) shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View file

@ -1,11 +0,0 @@
all: spaceapi-gtk
spaceapi-gtk: spaceapi-gtk.c
$(CC) -Wall -g `pkg-config --cflags --libs gtk+-2.0 --libs libcurl --libs json-c --libs libnotify` -DLIBNOTIFY -o spaceapi-gtk spaceapi-gtk.c
nonotify: spaceapi-gtk.c
$(CC) -Wall -g `pkg-config --cflags --libs gtk+-2.0 --libs libcurl --libs json-c` -o spaceapi-gtk spaceapi-gtk.c
clean:
rm -f spaceapi-gtk

107
README.md
View file

@ -1,68 +1,113 @@
SpaceAPI-GTK
============
spacetray
=========
A panel Applet using GTK2 for showing the Status of a Hackerspace. Compatible with the SpaceAPI version 0.13.
A panel Applet using Qt5 for showing the Status of a Hackerspace. Compatible with the SpaceAPI version >= 0.13.
Original source: [https://github.com/ccchh/dooris-gtk](https://github.com/ccchh/dooris-gtk) (I moved to $HOME from $CCCHH... ;))
Red = Door/Lock open:
![spacetray](shot-open.png)
Green = Door/Lock closed:
![spacetray](shot-closed.png)
Additionally, a notification is displayed as soon as the status changes.
Installation:
-------------
Requirements:
- Standard tools like gcc, pkg-config etc.
- curl
- gtk+-2.0
- json-c
- libnotify - Only needed when compiling with libnotify support.
- Standard tools like g++, cmake, etc.
- Qt5 (Widgets and Network modules)
Use the following command for getting the sources:
git clone https://github.com/hanez/SpaceAPI-GTK.git
git clone https://github.com/hanez/spacetray.git
Change into the new directory:
cd SpaceAPI-GTK
cd spacetray
To compile the sources just run:
To configure and compile the sources, run:
make
cmake -S . -B build
cmake --build build
This will compile dooris with libnotify support.
This will compile spacetray with status icon and notification support.
If you don't want notifications run the following command:
Just copy "build/spacetray" to a folder in your $PATH. I do:
make nonotify
Installation
------------
Just copy "spaceapi-gtk" to a folder in your $PATH. I do:
cp ./spaceapi-gtk ~/bin/
cp ./build/spacetray ~/bin/
You can copy the file to /usr/bin to make it available to all users but I don't. If you want that just run:
sudo cp ./spaceapi-gtk /usr/bin/
sudo cp ./build/spacetray /usr/bin/
Configuration:
--------------
Configuration needs to be done before compiling. There are some parameters you can set in the head of the spaceapi-gtk.c file where variables are declared. A configuration file will at this point make no sense.
Configuration is done via command line arguments.
Usage:
------
Run spaceapi-gtk with:
Run spacetray with:
./spaceapi-gtk &
./build/spacetray <statusurl> &
Or if in your $PATH:
spaceapi-gtk
spacetray <statusurl>
Status Icon "Pesthörnchen" colors:
The polling interval defaults to 300 seconds (5 minutes). It can be changed with the `-i` or `--interval` option, given either before or after the status URL:
- Red = Door closed
- Yellow = Door open
./build/spacetray <statusurl> -i 60 &
./build/spacetray -i 60 <statusurl>
The interval is specified in seconds and must be a positive number.
Themes:
-------
You can create your own icon theme by generating a C++ header file containing the icons as raw RGBA8888 pixel data in a `static const quint8` array.
The format should look like this:
static const quint8 icon_open_data[] = {
0xRR, 0xGG, 0xBB, 0xAA, ...
};
static const quint8 icon_closed_data[] = {
0xRR, 0xGG, 0xBB, 0xAA, ...
};
The image size used in the default theme is 52x48 pixels with four channels (RGBA).
To create these arrays from a PNG image, you can use `ImageMagick` to convert the image to raw RGBA data and then format it into a C++ header.
Example using `magick` (ImageMagick 7):
magick icon_open.png -size 52x48 -depth 8 RGBA:icon_open.raw
hexdump -v -e '12/1 "0x%02x, " "\n"' icon_open.raw
Or using a simple one-liner to generate the header content:
echo "static const quint8 icon_open_data[] = {" > themes/my_theme.h
magick icon_open.png -size 52x48 -depth 8 RGBA:- | hexdump -v -e '12/1 "0x%02x, " "\n"' >> themes/my_theme.h
echo "};" >> themes/my_theme.h
Repeat the process for `icon_closed_data` and append it to the same header file.
You can then use your custom icon theme by changing the line:
#include "themes/lock.h"
to:
#include "themes/THEME_NAME.h"
in:
./spacetray.cpp

44
main.cpp Normal file
View file

@ -0,0 +1,44 @@
#include <QApplication>
#include <QString>
#include <iostream>
#include <limits>
#include "spacetray.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
if (argc != 2 && argc != 4) {
std::cerr << "Usage: " << argv[0]
<< " <statusurl> [-i|--interval <seconds>]\n " << argv[0]
<< " [-i|--interval <seconds>] <statusurl>" << std::endl;
return 1;
}
QString statusUrl;
int intervalSeconds = 300;
if (argc == 4) {
const QString firstArgument = QString::fromLocal8Bit(argv[1]);
const bool intervalFirst = firstArgument == "-i" || firstArgument == "--interval";
const QString option = intervalFirst ? firstArgument : QString::fromLocal8Bit(argv[2]);
const QString intervalArgument = QString::fromLocal8Bit(argv[intervalFirst ? 2 : 3]);
bool validInterval = false;
const qlonglong parsedInterval = intervalArgument.toLongLong(&validInterval);
const qlonglong maximumSeconds = std::numeric_limits<int>::max() / 1000;
if ((option != "-i" && option != "--interval") ||
!validInterval || parsedInterval <= 0 || parsedInterval > maximumSeconds) {
std::cerr << "Invalid interval. Use -i or --interval followed by a positive number of seconds."
<< std::endl;
return 1;
}
intervalSeconds = static_cast<int>(parsedInterval);
statusUrl = QString::fromLocal8Bit(argv[intervalFirst ? 3 : 1]);
} else {
statusUrl = QString::fromLocal8Bit(argv[1]);
}
SpaceTray tray(statusUrl, intervalSeconds);
return app.exec();
}

View file

@ -1,575 +0,0 @@
/*
* This file contais the pixbuf data for the panel icon.
*/
static const GdkPixdata icon_black_pixbuf = {
0x47646b50, /* Pixbuf magic: 'GdkP' */
24 + 3417, /* header length + pixel_data length */
0x2010002, /* pixdata_type */
192, /* rowstride */
48, /* width */
48, /* height */
/* pixel_data: */
(guint8 *)
"\377\0\0\0\0\243\0\0\0\0\7\0\0\0\12\0\0\0""9\0\0\0W\0\0\0o\0\0\0f\0\0"
"\0V\0\0\0$\247\0\0\0\0\3\0\0\0;\0\0\0\254\0\0\0\365\206\0\0\0\377\3\0"
"\0\0\327\0\0\0d\0\0\0\4\226\0\0\0\0\1\0\0\0""7\204\0\0\0U\1\0\0\0B\206"
"\0\0\0\0\2\0\0\0\34\0\0\0\261\213\0\0\0\377\2\0\0\0\325\0\0\0""8\206"
"\0\0\0\0\1\0\0\0D\202\0\0\0\210\1\0\0\0\217\204\0\0\0\231\4\0\0\0\241"
"\0\0\0\252\0\0\0\235\0\0\0\20\203\0\0\0\0\1\0\0\0\240\204\0\0\0\377\1"
"\0\0\0\267\205\0\0\0\0\2\0\0\0""9\0\0\0\352\215\0\0\0\377\2\0\0\0\373"
"\0\0\0v\205\0\0\0\0\1\0\0\0b\212\0\0\0\377\1\0\0\0\23\203\0\0\0\0\1\0"
"\0\0\226\204\0\0\0\377\1\0\0\0\264\204\0\0\0\0\2\0\0\0""7\0\0\0\365\220"
"\0\0\0\377\2\0\0\0\224\0\0\0\2\203\0\0\0\0\1\0\0\0Q\211\0\0\0\377\2\0"
"\0\0\375\0\0\0\1\203\0\0\0\0\1\0\0\0\207\204\0\0\0\377\1\0\0\0\300\203"
"\0\0\0\0\2\0\0\0\24\0\0\0\350\222\0\0\0\377\1\0\0\0\207\203\0\0\0\0\1"
"\0\0\0@\211\0\0\0\377\1\0\0\0\353\204\0\0\0\0\1\0\0\0n\204\0\0\0\377"
"\1\0\0\0\347\203\0\0\0\0\1\0\0\0\246\224\0\0\0\377\1\0\0\0W\202\0\0\0"
"\0\1\0\0\0<\211\0\0\0\377\1\0\0\0\327\204\0\0\0\0\1\0\0\0Q\205\0\0\0"
"\377\4\0\0\0\17\0\0\0\0\0\0\0,\0\0\0\375\224\0\0\0\377\4\0\0\0\352\0"
"\0\0\24\0\0\0\0\0\0\0D\211\0\0\0\377\1\0\0\0\256\204\0\0\0\0\1\0\0\0"
"3\205\0\0\0\377\3\0\0\0K\0\0\0\0\0\0\0\223\226\0\0\0\377\3\0\0\0\217"
"\0\0\0\0\0\0\0R\211\0\0\0\377\1\0\0\0\201\204\0\0\0\0\2\0\0\0\14\0\0"
"\0\375\204\0\0\0\377\3\0\0\0\221\0\0\0\0\0\0\0\345\206\0\0\0\377\4\0"
"\0\0\320\0\0\0\233\0\0\0\226\0\0\0\376\204\0\0\0\377\13\0\0\0\371\0\0"
"\0\221\0\0\0H\0\0\0=\0\0\0S\0\0\0\234\0\0\0\372\0\0\0\377\0\0\0\363\0"
"\0\0\23\0\0\0{\211\0\0\0\377\1\0\0\0Q\205\0\0\0\0\1\0\0\0\325\204\0\0"
"\0\377\2\0\0\0\331\0\0\0\"\204\0\0\0\377\3\0\0\0\345\0\0\0\203\0\0\0"
"#\203\0\0\0\0\1\0\0\0\241\203\0\0\0\377\2\0\0\0\373\0\0\0B\205\0\0\0"
"\0\5\0\0\0I\0\0\0\375\0\0\0\377\0\0\0g\0\0\0\253\210\0\0\0\377\2\0\0"
"\0\372\0\0\0\17\205\0\0\0\0\1\0\0\0\226\205\0\0\0\377\1\0\0\0\207\202"
"\0\0\0\377\3\0\0\0\376\0\0\0i\0\0\0\5\205\0\0\0\0\1\0\0\0*\202\0\0\0"
"\377\2\0\0\0\360\0\0\0\237\207\0\0\0\0\4\0\0\0\231\0\0\0\377\0\0\0\273"
"\0\0\0\327\210\0\0\0\377\1\0\0\0\276\206\0\0\0\0\1\0\0\0K\205\0\0\0\377"
"\1\0\0\0\371\202\0\0\0\377\1\0\0\0\276\210\0\0\0\0\4\0\0\0\366\0\0\0"
"\363\0\0\0\210\0\0\0i\207\0\0\0\0\3\0\0\0""6\0\0\0\377\0\0\0\374\211"
"\0\0\0\377\1\0\0\0l\206\0\0\0\0\2\0\0\0\11\0\0\0\357\204\0\0\0\377\4"
"\0\0\0\354\0\0\0\362\0\0\0\377\0\0\0\245\207\0\0\0\0\5\0\0\0\5\0\0\0"
"\314\0\0\0\255\0\0\0Y\0\0\0\223\207\0\0\0\0\3\0\0\0<\0\0\0\324\0\0\0"
"\240\210\0\0\0\377\2\0\0\0\364\0\0\0\20\207\0\0\0\0\1\0\0\0\224\204\0"
"\0\0\377\4\0\0\0\363\0\0\0}\0\0\0\377\0\0\0\257\207\0\0\0\0\6\0\0\0\""
"\0\0\0\262\0\0\0\223\0\0\0""3\0\0\0\334\0\0\0\1\206\0\0\0\0\3\0\0\0l"
"\0\0\0\235\0\0\0\330\210\0\0\0\377\1\0\0\0\233\210\0\0\0\0\1\0\0\0-\205"
"\0\0\0\377\4\0\0\0o\0\0\0\377\0\0\0\333\0\0\0\6\206\0\0\0\0\6\0\0\0D"
"\0\0\0\220\0\0\0\177\0\0\0\16\0\0\0\377\0\0\0<\205\0\0\0\0\4\0\0\0""8"
"\0\0\0\344\0\0\0\226\0\0\0\315\207\0\0\0\377\2\0\0\0\376\0\0\0""0\211"
"\0\0\0\0\1\0\0\0\271\204\0\0\0\377\1\0\0\0i\202\0\0\0\377\2\0\0\0\301"
"\0\0\0""7\205\0\0\0\0\6\0\0\0q\0\0\0l\0\0\0)\0\0\0\0\0\0\0\347\0\0\0"
"\237\203\0\0\0\0\6\0\0\0A\0\0\0\274\0\0\0\375\0\0\0\377\0\0\0\243\0\0"
"\0\272\207\0\0\0\377\1\0\0\0\244\212\0\0\0\0\2\0\0\0""2\0\0\0\376\203"
"\0\0\0\377\1\0\0\0^\204\0\0\0\377\7\0\0\0\343\0\0\0\201\0\0\0\23\0\0"
"\0\0\0\0\0\1\0\0\0\300\0\0\0D\202\0\0\0\0\5\0\0\0\302\0\0\0\366\0\0\0"
"B\0\0\0Y\0\0\0\276\204\0\0\0\377\2\0\0\0\300\0\0\0\241\206\0\0\0\377"
"\2\0\0\0\367\0\0\0\37\213\0\0\0\0\1\0\0\0\243\203\0\0\0\377\1\0\0\0i"
"\206\0\0\0\377\5\0\0\0\364\0\0\0\264\0\0\0\310\0\0\0\377\0\0\0-\202\0"
"\0\0\0\1\0\0\0\236\210\0\0\0\377\2\0\0\0\336\0\0\0~\206\0\0\0\377\1\0"
"\0\0\211\214\0\0\0\0\2\0\0\0\21\0\0\0\341\202\0\0\0\377\2\0\0\0w\0\0"
"\0\374\211\0\0\0\377\1\0\0\0""4\202\0\0\0\0\1\0\0\0\244\210\0\0\0\377"
"\2\0\0\0\345\0\0\0\201\205\0\0\0\377\2\0\0\0\324\0\0\0\11\215\0\0\0\0"
"\5\0\0\0>\0\0\0\372\0\0\0\377\0\0\0\213\0\0\0\327\211\0\0\0\377\1\0\0"
"\0a\202\0\0\0\0\1\0\0\0\337\210\0\0\0\377\2\0\0\0\311\0\0\0\251\204\0"
"\0\0\377\2\0\0\0\370\0\0\0.\217\0\0\0\0\4\0\0\0Z\0\0\0\374\0\0\0\331"
"\0\0\0\224\211\0\0\0\377\3\0\0\0\253\0\0\0\30\0\0\0*\211\0\0\0\377\2"
"\0\0\0~\0\0\0\365\204\0\0\0\377\1\0\0\0n\221\0\0\0\0\3\0\0\0f\0\0\0\376"
"\0\0\0\313\211\0\0\0\377\3\0\0\0\367\0\0\0z\0\0\0\307\210\0\0\0\377\2"
"\0\0\0\361\0\0\0\305\204\0\0\0\377\1\0\0\0\207\223\0\0\0\0\2\0\0\0X\0"
"\0\0\371\212\0\0\0\377\1\0\0\0\375\216\0\0\0\377\2\0\0\0\224\0\0\0\1"
"\224\0\0\0\0\2\0\0\0>\0\0\0\345\226\0\0\0\377\2\0\0\0\366\0\0\0h\227"
"\0\0\0\0\22\0\0\0\25\0\0\0\262\0\0\0\373\0\0\0\335\0\0\0\372\0\0\0\343"
"\0\0\0\341\0\0\0\377\0\0\0\235\0\0\0""4\0\0\0\342\0\0\0,\0\0\0d\0\0\0"
"\375\0\0\0\246\0\0\0\351\0\0\0\377\0\0\0\335\204\0\0\0\377\2\0\0\0\321"
"\0\0\0,\205\0\0\0\0\4\0\0\0&\0\0\0V\0\0\0C\0\0\0\6\211\0\0\0\0\5\0\0"
"\0\26\0\0\0q\0\0\0\231\0\0\0q\0\0\0\11\203\0\0\0\0\6\0\0\0\221\0\0\0"
"\0\0\0\0\205\0\0\0""1\0\0\0\7\0\0\0\327\202\0\0\0\0\1\0\0\0\263\202\0"
"\0\0\0\12\0\0\0\301\0\0\0\0\0\0\0i\0\0\0p\0\0\0\0\0\0\0\332\0\0\0\377"
"\0\0\0\335\0\0\0c\0\0\0\4\205\0\0\0\0\2\0\0\0\202\0\0\0\376\202\0\0\0"
"\377\2\0\0\0\333\0\0\0$\207\0\0\0\0\2\0\0\0S\0\0\0\363\203\0\0\0\377"
"\2\0\0\0\304\0\0\0\2\202\0\0\0\0\6\0\0\0\205\0\0\0'\0\0\0\227\0\0\0!"
"\0\0\0\4\0\0\0\256\202\0\0\0\0\1\0\0\0\257\202\0\0\0\0\10\0\0\0\263\0"
"\0\0\0\0\0\0]\0\0\0Z\0\0\0\0\0\0\0\264\0\0\0N\0\0\0\3\206\0\0\0\0\1\0"
"\0\0U\205\0\0\0\377\1\0\0\0\314\206\0\0\0\0\2\0\0\0\27\0\0\0\365\205"
"\0\0\0\377\1\0\0\0A\202\0\0\0\0\21\0\0\0\3\0\0\0r\0\0\0\226\0\0\0\256"
"\0\0\0\262\0\0\0\327\0\0\0\237\0\0\0\214\0\0\0\350\0\0\0w\0\0\0~\0\0"
"\0\361\0\0\0\225\0\0\0\305\0\0\0\271\0\0\0\251\0\0\0y\210\0\0\0\0\1\0"
"\0\0\274\206\0\0\0\377\1\0\0\0\"\205\0\0\0\0\1\0\0\0O\206\0\0\0\377\1"
"\0\0\0S\205\0\0\0\0\21\0\0\0\1\0\0\0\16\0\0\0\0\0\0\0\27\0\0\0\"\0\0"
"\0#\0\0\0@\0\0\0G\0\0\0\15\0\0\0""6\0\0\0.\0\0\0\"\0\0\0-\0\0\0\3\0\0"
"\0\0\0\0\0\21\0\0\0""0\203\0\0\0""3\3\0\0\0\77\0\0\0E\0\0\0\354\206\0"
"\0\0\377\1\0\0\0\30\205\0\0\0\0\1\0\0\0""6\206\0\0\0\377\1\0\0\0\344"
"\202\0\0\0\335\1\0\0\0\351\202\0\0\0\356\5\0\0\0\243\0\0\0\0\0\0\0\13"
"\0\0\0\324\0\0\0\367\202\0\0\0\377\2\0\0\0c\0\0\0\204\204\0\0\0\377\4"
"\0\0\0v\0\0\0\0\0\0\0%\0\0\0\364\213\0\0\0\377\1\0\0\0\270\207\0\0\0"
"\0\2\0\0\0\206\0\0\0\337\211\0\0\0\377\4\0\0\0\366\0\0\0\"\0\0\0\0\0"
"\0\0\217\203\0\0\0\377\4\0\0\0\305\0\0\0\1\0\0\0\14\0\0\0\344\203\0\0"
"\0\377\4\0\0\0\367\0\0\0)\0\0\0\0\0\0\0m\212\0\0\0\377\2\0\0\0\376\0"
"\0\0""4\206\0\0\0\0\2\0\0\0\6\0\0\0\251\212\0\0\0\377\4\0\0\0v\0\0\0"
"\0\0\0\0""6\0\0\0\374\202\0\0\0\377\2\0\0\0\373\0\0\0/\202\0\0\0\0\1"
"\0\0\0Z\204\0\0\0\377\4\0\0\0\316\0\0\0\6\0\0\0\1\0\0\0\300\211\0\0\0"
"\377\3\0\0\0\351\0\0\0\321\0\0\0\23\205\0\0\0\0\1\0\0\0\207\212\0\0\0"
"\377\4\0\0\0\320\0\0\0\4\0\0\0\2\0\0\0\320\203\0\0\0\377\1\0\0\0\216"
"\203\0\0\0\0\2\0\0\0\1\0\0\0\305\204\0\0\0\377\4\0\0\0\225\0\0\0\7\0"
"\0\0#\0\0\0\363\202\0\0\0\377\2\0\0\0\376\0\0\0\361\206\0\0\0\377\1\0"
"\0\0v\205\0\0\0\0\1\0\0\0\330\205\0\0\0\377\2\0\0\0\220\0\0\0\330\203"
"\0\0\0\335\4\0\0\0""9\0\0\0""8\0\0\0\211\0\0\0\334\202\0\0\0\377\2\0"
"\0\0\355\0\0\0\16\204\0\0\0\0\2\0\0\0(\0\0\0\327\204\0\0\0\377\3\0\0"
"\0\344\0\0\0=\0\0\0\\\202\0\0\0\252\2\0\0\0\216\0\0\0\277\206\0\0\0\377"
"\1\0\0\0\217\205\0\0\0\0\1\0\0\0\275\205\0\0\0\377\1\0\0\0\213\204\0"
"\0\0\0\2\0\0\0U\0\0\0\375\205\0\0\0\377\1\0\0\0\256\204\0\0\0\0\1\0\0"
"\0K\206\0\0\0\377\2\0\0\0\357\0\0\0\31\203\0\0\0\0\1\0\0\0\256\206\0"
"\0\0\377\1\0\0\0H\205\0\0\0\0\1\0\0\0S\205\0\0\0\377\1\0\0\0\215\204"
"\0\0\0\0\1\0\0\0\306\206\0\0\0\377\1\0\0\0\321\204\0\0\0\0\1\0\0\0\247"
"\207\0\0\0\377\1\0\0\0y\203\0\0\0\0\2\0\0\0I\0\0\0\374\204\0\0\0\377"
"\1\0\0\0\230\207\0\0\0\0\1\0\0\0\212\203\0\0\0\377\2\0\0\0\365\0\0\0"
"'\204\0\0\0\0\1\0\0\0\304\202\0\0\0\377\2\0\0\0\334\0\0\0\326\202\0\0"
"\0\377\1\0\0\0p\204\0\0\0\0\1\0\0\0f\203\0\0\0\377\2\0\0\0\344\0\0\0"
"\317\202\0\0\0\377\1\0\0\0i\204\0\0\0\0\5\0\0\0""3\0\0\0\245\0\0\0\271"
"\0\0\0\225\0\0\0A\211\0\0\0\0\4\0\0\0Z\0\0\0\305\0\0\0\277\0\0\0<\205"
"\0\0\0\0\7\0\0\0P\0\0\0\374\0\0\0\363\0\0\0M\0\0\0f\0\0\0\242\0\0\0G"
"\206\0\0\0\0\10\0\0\0O\0\0\0\226\0\0\0o\0\0\0\25\0\0\0\255\0\0\0\377"
"\0\0\0\310\0\0\0\17\234\0\0\0\0\2\0\0\0\"\0\0\0\16\217\0\0\0\0\2\0\0"
"\0\36\0\0\0\1\377\0\0\0\0\376\0\0\0\0",
};
static const GdkPixdata icon_orange_pixbuf = {
0x47646b50, /* Pixbuf magic: 'GdkP' */
24 + 3515, /* header length + pixel_data length */
0x2010002, /* pixdata_type */
192, /* rowstride */
48, /* width */
48, /* height */
/* pixel_data: */
(guint8 *)
"\377\0\0\0\0\243\0\0\0\0\7;\24\0\15}2\0\\\2158\0\210\2107\0\237\2169"
"\0\231\2117\0\206y2\0=\247\0\0\0\0\3w/\0\\\262G\0\336\356_\0\376\206"
"\377f\0\377\3\310P\0\365\2179\0\2303\0\0\5\226\0\0\0\0\1}3\0Z\204\205"
"5\0\202\1x0\0f\206\0\0\0\0\3]%\0)\261F\0\341\375e\0\377\212\377f\0\377"
"\2\312Q\0\365u/\0W\206\0\0\0\0\1x1\0h\202\236@\0\300\1\243A\0\307\204"
"\250C\0\317\4\256F\0\327\261F\0\335\265H\0\330\2078\0\40\203\0\0\0\0"
"\1\270I\0\333\204\377f\0\377\1\275K\0\347\205\0\0\0\0\2t.\0X\336Y\0\374"
"\215\377f\0\377\2\367c\0\377\2106\0\245\205\0\0\0\0\1\217:\0\226\212"
"\377f\0\377\1[$\0\34\203\0\0\0\0\1\252D\0\316\204\377f\0\377\1\270I\0"
"\345\204\0\0\0\0\2p.\0T\352]\0\376\217\377f\0\377\3\376f\0\377\233>\0"
"\307\0\0\0\2\203\0\0\0\0\1\2055\0}\211\377f\0\377\2\366b\0\377\0\0\0"
"\1\203\0\0\0\0\1\232>\0\275\204\377f\0\377\1\306P\0\355\203\0\0\0\0\2"
"h(\0\40\332W\0\373\222\377f\0\377\1\222:\0\270\203\0\0\0\0\1x/\0b\211"
"\377f\0\377\1\342Z\0\374\204\0\0\0\0\1\223;\0\243\204\377f\0\377\1\333"
"W\0\373\203\0\0\0\0\1\252D\0\330\223\377f\0\377\2\374e\0\377\2013\0\202"
"\202\0\0\0\0\1z1\0^\211\377f\0\377\1\317S\0\366\204\0\0\0\0\1\2127\0"
"\201\204\377f\0\377\5\376f\0\377\223>\0!\0\0\0\0h+\0B\372d\0\377\224"
"\377f\0\377\4\333W\0\374E\35\0\32\0\0\0\0\2148\0q\211\377f\0\377\1\266"
"I\0\341\204\0\0\0\0\1t/\0Q\205\377f\0\377\3\232>\0\203\0\0\0\0\233>\0"
"\306\226\377f\0\377\3\234>\0\304\0\0\0\0\226<\0\210\211\377f\0\377\1"
"\241A\0\274\204\0\0\0\0\2""3\21\0\17\367c\0\377\204\377f\0\377\3\256"
"F\0\315\0\0\0\0\325V\0\372\205\377f\0\377\5\376f\0\377\322T\0\365\262"
"H\0\325\264H\0\324\376f\0\377\204\377f\0\377\13\365b\0\377\245B\0\312"
"\223:\0{\2106\0g\230=\0\212\260G\0\325\370c\0\377\377f\0\377\351]\0\376"
"5\25\0\30\236\77\0\265\211\377f\0\377\1\2014\0{\205\0\0\0\0\1\313Q\0"
"\365\204\377f\0\377\3\325U\0\370F\35\0,\374e\0\377\203\377f\0\377\3\344"
"[\0\374\242@\0\276\2025\0\77\203\0\0\0\0\1\256F\0\327\203\377f\0\377"
"\2\370c\0\377\2034\0k\205\0\0\0\0\5\2118\0w\372d\0\377\377f\0\377\207"
"6\0\227\257F\0\335\210\377f\0\377\2\366b\0\377Y!\0\27\205\0\0\0\0\1\245"
"B\0\315\205\377f\0\377\1\222:\0\270\202\377f\0\377\3\373d\0\377\224;"
"\0\237`\40\0\10\205\0\0\0\0\5c)\0>\375e\0\377\377f\0\377\361`\0\376\254"
"E\0\325\207\0\0\0\0\4\254D\0\321\377f\0\377\303N\0\353\326V\0\367\210"
"\377f\0\377\1\276L\0\353\206\0\0\0\0\1\2003\0t\205\377f\0\377\1\371d"
"\0\377\202\377f\0\377\1\304N\0\354\210\0\0\0\0\4\353^\0\376\352]\0\376"
"\236\77\0\277\231=\0\242\207\0\0\0\0\3w/\0V\377f\0\377\374e\0\377\211"
"\377f\0\377\1\2179\0\240\206\0\0\0\0\2.\27\0\13\350]\0\375\204\377f\0"
"\377\4\354^\0\376\357_\0\376\377f\0\377\263H\0\333\207\0\0\0\0\5\0\0"
"\0\5\317S\0\364\301M\0\345\2137\0\212\257F\0\317\207\0\0\0\0\3\2148\0"
"h\332W\0\370\262G\0\330\210\377f\0\377\2\347\\\0\376F\27\0\26\207\0\0"
"\0\0\1\251C\0\315\204\377f\0\377\4\361`\0\376\235\77\0\266\377f\0\377"
"\276L\0\344\207\0\0\0\0\6y1\0""9\267I\0\343\244B\0\312q-\0O\332W\0\371"
"\0\0\0\1\206\0\0\0\0\3\236@\0\250\263G\0\327\271I\0\363\210\377f\0\377"
"\1\234\77\0\314\210\0\0\0\0\2w1\0I\375e\0\377\204\377f\0\377\4~2\0\232"
"\377f\0\377\332W\0\371U\34\0\11\206\0\0\0\0\6\216:\0s\243A\0\310\202"
"4\0\253-\17\0\21\372d\0\377\2056\0d\205\0\0\0\0\4\2117\0a\351]\0\374"
"\245B\0\314\303N\0\361\207\377f\0\377\2\371d\0\377^&\0D\211\0\0\0\0\1"
"\273K\0\347\204\377f\0\377\1\2003\0\225\202\377f\0\377\2\305O\0\355{"
"1\0Y\205\0\0\0\0\6\240@\0\256\222:\0\242C\35\0""5\0\0\0\0\340Y\0\374"
"\262G\0\330\203\0\0\0\0\6\2107\0k\300L\0\352\375e\0\377\377f\0\377\263"
"H\0\333\267I\0\347\207\377f\0\377\1\256E\0\331\212\0\0\0\0\2\2013\0U"
"\374e\0\377\203\377f\0\377\2\221:\0\222\372d\0\377\203\377f\0\377\7\321"
"T\0\371\226<\0\266k)\0\37\0\0\0\0\0\0\0\1\306P\0\355\2055\0o\202\0\0"
"\0\0\5\312Q\0\357\366b\0\377\2147\0o\2219\0\216\301M\0\353\204\377f\0"
"\377\2\277L\0\353\255E\0\327\206\377f\0\377\2\353^\0\376[\"\0-\213\0"
"\0\0\0\1\250C\0\326\203\377f\0\377\2\226<\0\241\360`\0\377\205\377f\0"
"\377\5\362`\0\376\301M\0\347\322T\0\363\377f\0\377\2148\0R\202\0\0\0"
"\0\1\265I\0\331\210\377f\0\377\2\307O\0\367\252D\0\276\206\377f\0\377"
"\1\2138\0\267\214\0\0\0\0\2m.\0\34\334X\0\372\202\377f\0\377\2\233>\0"
"\260\346\\\0\377\211\377f\0\377\1\2137\0\\\202\0\0\0\0\1\303N\0\342\210"
"\377f\0\377\2\323U\0\372\251D\0\300\205\377f\0\377\2\320S\0\366.\27\0"
"\13\215\0\0\0\0\5r.\0^\364b\0\377\377f\0\377\253E\0\310\312Q\0\366\211"
"\377f\0\377\1\220:\0\225\202\0\0\0\0\1\353^\0\374\210\377f\0\377\2\274"
"K\0\356\276L\0\342\204\377f\0\377\2\355_\0\377s-\0I\217\0\0\0\0\4\202"
"5\0\207\371d\0\377\331V\0\370\237@\0\310\211\377f\0\377\3\266I\0\340"
"W$\0#\2014\0I\211\377f\0\377\2\217:\0\260\354^\0\376\203\377f\0\377\2"
"\374e\0\377z1\0\227\221\0\0\0\0\3\2055\0\225\370c\0\377\311P\0\362\211"
"\377f\0\377\3\363a\0\377\227=\0\260\302N\0\357\210\377f\0\377\2\361`"
"\0\376\320S\0\362\204\377f\0\377\1\243A\0\301\223\0\0\0\0\2\1773\0\203"
"\361`\0\377\212\377f\0\377\1\371d\0\377\216\377f\0\377\2\243A\0\313\0"
"\0\0\1\224\0\0\0\0\2s.\0_\332W\0\373\226\377f\0\377\2\362a\0\377\223"
":\0\236\227\0\0\0\0\23`(\0\40\263H\0\342\366b\0\377\331W\0\371\367c\0"
"\377\340Y\0\373\336Y\0\373\377f\0\377\256E\0\325\2044\0Y\336Y\0\373\201"
"3\0K\231>\0\235\373d\0\377\271J\0\337\353^\0\375\376f\0\377\322T\0\370"
"\376f\0\377\203\377f\0\377\2\302N\0\362z1\0I\205\0\0\0\0\4b(\0""9\200"
"4\0\200m,\0b@\40\0\10\211\0\0\0\0\5]'\0!\2158\0\243\245B\0\316\224<\0"
"\247.\27\0\13\203\0\0\0\0\6\241@\0\307\0\0\0\0\245B\0\301\2034\0T].\0"
"\13\314R\0\366\202\0\0\0\0\1\277L\0\347\202\0\0\0\0\12\305O\0\355\0\0"
"\0\0\233>\0\244\243B\0\257\0\0\0\0\342[\0\372\377f\0\377\317R\0\370\207"
"6\0\223\0\0\0\4\205\0\0\0\0\2\230=\0\270\367c\0\377\202\377f\0\377\2"
"\322T\0\370r,\0:\207\0\0\0\0\2\2013\0}\343Z\0\376\203\377f\0\377\2\264"
"H\0\352\0\0\0\2\202\0\0\0\0\6\2128\0\263z/\0A\262G\0\323\2005\0:3\0\0"
"\5\262G\0\340\202\0\0\0\0\1\301N\0\346\202\0\0\0\0\10\271J\0\344\0\0"
"\0\0\231=\0\226\2127\0\213\0\0\0\0\304O\0\351\2023\0x\0\0\0\3\206\0\0"
"\0\0\2\2004\0\200\376f\0\377\204\377f\0\377\1\306O\0\362\206\0\0\0\0"
"\2c+\0$\355^\0\376\205\377f\0\377\1r/\0b\202\0\0\0\0\21@\0\0\4\221:\0"
"\247\245B\0\315\250C\0\334\266I\0\343\315R\0\366\253D\0\325\245B\0\306"
"\336Y\0\374\221:\0\253\226<\0\263\353^\0\376\245A\0\313\311Q\0\360\270"
"J\0\347\262H\0\335\220:\0\254\210\0\0\0\0\1\274L\0\351\206\377f\0\377"
"\1g'\0""4\205\0\0\0\0\1\2158\0\177\206\377f\0\377\1\2013\0}\205\0\0\0"
"\0\27\0\0\0\1\40\20\0\20\0\0\0\0\13\0\0\30m+\0""6\225:\0F\2014\0go-\0"
"g0\20\0\20:\27\0B/\23\0""6\25\7\0%I\36\0;\0\0\0\3\0\0\0\0\\)\0\31r/\0"
"Lo.\0N\2025\0V\2157\0\\\2012\0e\2076\0q\347]\0\375\205\377f\0\377\2\371"
"d\0\377H\40\0\40\205\0\0\0\0\1u0\0U\206\377f\0\377\4\333W\0\373\322T"
"\0\370\333X\0\372\340Y\0\374\202\337Y\0\375\12\233>\0\321\0\0\0\0c+\0"
"\22\306O\0\364\354^\0\376\357`\0\377\377f\0\377\226;\0\233\2128\0\263"
"\356_\0\377\203\377f\0\377\4\224<\0\253\0\0\0\0p+\0;\357_\0\376\213\377"
"f\0\377\1\261F\0\344\207\0\0\0\0\2\227<\0\272\334X\0\372\211\377f\0\377"
"\4\355^\0\376g'\0""4\0\0\0\0\242@\0\306\203\377f\0\377\4\312Q\0\360\200"
"\0\0\2@\40\0\20\332W\0\373\203\377f\0\377\4\362a\0\377z0\0E\0\0\0\0\225"
";\0\244\212\377f\0\377\2\374e\0\377y1\0T\206\0\0\0\0\2$\0\0\7\242A\0"
"\327\212\377f\0\377\4\230<\0\255\0\0\0\0u0\0U\370c\0\377\202\377f\0\377"
"\2\371d\0\377\2003\0P\202\0\0\0\0\2\2025\0\207\376f\0\377\203\377f\0"
"\377\4\315R\0\363U\34\0\11\0\0\0\1\304O\0\355\211\377f\0\377\3\346\\"
"\0\375\305O\0\363a#\0\35\205\0\0\0\0\1\230=\0\274\212\377f\0\377\4\317"
"S\0\364U+\0\6\0\0\0\2\304N\0\362\203\377f\0\377\1\251C\0\311\203\0\0"
"\0\0\2\0\0\0\1\255E\0\351\204\377f\0\377\4\255E\0\320].\0\13y0\0;\361"
"`\0\376\203\377f\0\377\1\367c\0\377\206\377f\0\377\1\234>\0\260\205\0"
"\0\0\0\1\315R\0\366\205\377f\0\377\2\233>\0\304\333X\0\371\202\322T\0"
"\370\5\310Q\0\367\2014\0]t/\0V\240\77\0\301\327V\0\371\202\377f\0\377"
"\2\345\\\0\375d,\0\27\204\0\0\0\0\2M\35\0""5\320S\0\367\204\377f\0\377"
"\3\324U\0\372p-\0[\2179\0\217\202\261F\0\335\2\242A\0\305\307O\0\356"
"\206\377f\0\377\1\237\77\0\305\205\0\0\0\0\1\275K\0\352\205\377f\0\377"
"\1\236\77\0\302\204\0\0\0\0\2\2116\0\204\367c\0\377\205\377f\0\377\1"
"\250C\0\334\204\0\0\0\0\2\2003\0t\375e\0\377\205\377f\0\377\2\344[\0"
"\375Z\"\0%\203\0\0\0\0\1\264I\0\341\205\377f\0\377\2\376f\0\377q.\0j"
"\205\0\0\0\0\2\2025\0~\376f\0\377\204\377f\0\377\1\234\77\0\302\204\0"
"\0\0\0\1\301M\0\356\206\377f\0\377\1\305O\0\363\204\0\0\0\0\1\252D\0"
"\331\207\377f\0\377\1\2169\0\253\203\0\0\0\0\2t/\0l\360`\0\377\203\377"
"f\0\377\2\376f\0\377\233>\0\311\207\0\0\0\0\2\230<\0\276\376f\0\377\202"
"\377f\0\377\2\355^\0\376h+\0;\204\0\0\0\0\1\275K\0\355\202\377f\0\377"
"\5\325U\0\371\327V\0\367\377f\0\377\374e\0\377\2116\0\240\204\0\0\0\0"
"\2\2055\0\224\376f\0\377\202\377f\0\377\2\333W\0\373\323T\0\365\202\377"
"f\0\377\1\221:\0\236\204\0\0\0\0\5s-\0P\254D\0\331\263G\0\345\235\77"
"\0\311q-\0a\211\0\0\0\0\4\2004\0\205\301M\0\356\275L\0\353w1\0^\205\0"
"\0\0\0\7z1\0w\366b\0\377\354^\0\376\2066\0z\2055\0\224\252D\0\326x/\0"
"l\206\0\0\0\0\10\2013\0y\247C\0\316\224;\0\245Z!\0\37\245B\0\333\376"
"f\0\377\302N\0\357d,\0\27\234\0\0\0\0\2Q!\0/9\34\0\22\217\0\0\0\0\2""7"
"\25\0%\0\0\0\1\377\0\0\0\0\376\0\0\0\0",
};
static const GdkPixdata icon_red_pixbuf = {
0x47646b50, /* Pixbuf magic: 'GdkP' */
24 + 3515, /* header length + pixel_data length */
0x2010002, /* pixdata_type */
192, /* rowstride */
48, /* width */
48, /* height */
/* pixel_data: */
(guint8 *)
"\377\0\0\0\0\243\0\0\0\0\7;\0\0\15}\0\0\\\215\0\0\210\210\0\0\237\216"
"\0\0\231\211\0\0\206y\0\0=\247\0\0\0\0\3w\0\0\\\262\0\0\336\356\0\0\376"
"\206\377\0\0\377\3\310\0\0\365\217\0\0\2303\0\0\5\226\0\0\0\0\1}\0\0"
"Z\204\205\0\0\202\1x\0\0f\206\0\0\0\0\3]\0\0)\261\0\0\341\375\0\0\377"
"\212\377\0\0\377\2\312\0\0\365u\0\0W\206\0\0\0\0\1x\0\0h\202\236\0\0"
"\300\1\243\0\0\307\204\250\0\0\317\4\256\0\0\327\261\0\0\335\265\0\0"
"\330\207\0\0\40\203\0\0\0\0\1\270\0\0\333\204\377\0\0\377\1\275\0\0\347"
"\205\0\0\0\0\2t\0\0X\336\0\0\374\215\377\0\0\377\2\367\0\0\377\210\0"
"\0\245\205\0\0\0\0\1\217\0\0\226\212\377\0\0\377\1[\0\0\34\203\0\0\0"
"\0\1\252\0\0\316\204\377\0\0\377\1\270\0\0\345\204\0\0\0\0\2p\0\0T\352"
"\0\0\376\217\377\0\0\377\3\376\0\0\377\233\0\0\307\0\0\0\2\203\0\0\0"
"\0\1\205\0\0}\211\377\0\0\377\2\366\0\0\377\0\0\0\1\203\0\0\0\0\1\232"
"\0\0\275\204\377\0\0\377\1\306\0\0\355\203\0\0\0\0\2h\0\0\40\332\0\0"
"\373\222\377\0\0\377\1\222\0\0\270\203\0\0\0\0\1x\0\0b\211\377\0\0\377"
"\1\342\0\0\374\204\0\0\0\0\1\223\0\0\243\204\377\0\0\377\1\333\0\0\373"
"\203\0\0\0\0\1\252\0\0\330\223\377\0\0\377\2\374\0\0\377\201\0\0\202"
"\202\0\0\0\0\1z\0\0^\211\377\0\0\377\1\317\0\0\366\204\0\0\0\0\1\212"
"\0\0\201\204\377\0\0\377\5\376\0\0\377\223\0\0!\0\0\0\0h\0\0B\372\0\0"
"\377\224\377\0\0\377\4\333\0\0\374E\0\0\32\0\0\0\0\214\0\0q\211\377\0"
"\0\377\1\266\0\0\341\204\0\0\0\0\1t\0\0Q\205\377\0\0\377\3\232\0\0\203"
"\0\0\0\0\233\0\0\306\226\377\0\0\377\3\234\0\0\304\0\0\0\0\226\0\0\210"
"\211\377\0\0\377\1\241\0\0\274\204\0\0\0\0\2""3\0\0\17\367\0\0\377\204"
"\377\0\0\377\3\256\0\0\315\0\0\0\0\325\0\0\372\205\377\0\0\377\5\376"
"\0\0\377\322\0\0\365\262\0\0\325\264\0\0\324\376\0\0\377\204\377\0\0"
"\377\13\365\0\0\377\245\0\0\312\223\0\0{\210\0\0g\230\0\0\212\260\0\0"
"\325\370\0\0\377\377\0\0\377\351\0\0\3765\0\0\30\236\0\0\265\211\377"
"\0\0\377\1\201\0\0{\205\0\0\0\0\1\313\0\0\365\204\377\0\0\377\3\325\0"
"\0\370F\0\0,\374\0\0\377\203\377\0\0\377\3\344\0\0\374\242\0\0\276\202"
"\0\0\77\203\0\0\0\0\1\256\0\0\327\203\377\0\0\377\2\370\0\0\377\203\0"
"\0k\205\0\0\0\0\5\211\0\0w\372\0\0\377\377\0\0\377\207\0\0\227\257\0"
"\0\335\210\377\0\0\377\2\366\0\0\377Y\0\0\27\205\0\0\0\0\1\245\0\0\315"
"\205\377\0\0\377\1\222\0\0\270\202\377\0\0\377\3\373\0\0\377\224\0\0"
"\237`\0\0\10\205\0\0\0\0\5c\0\0>\375\0\0\377\377\0\0\377\361\0\0\376"
"\254\0\0\325\207\0\0\0\0\4\254\0\0\321\377\0\0\377\303\0\0\353\326\0"
"\0\367\210\377\0\0\377\1\276\0\0\353\206\0\0\0\0\1\200\0\0t\205\377\0"
"\0\377\1\371\0\0\377\202\377\0\0\377\1\304\0\0\354\210\0\0\0\0\4\353"
"\0\0\376\352\0\0\376\236\0\0\277\231\0\0\242\207\0\0\0\0\3w\0\0V\377"
"\0\0\377\374\0\0\377\211\377\0\0\377\1\217\0\0\240\206\0\0\0\0\2.\0\0"
"\13\350\0\0\375\204\377\0\0\377\4\354\0\0\376\357\0\0\376\377\0\0\377"
"\263\0\0\333\207\0\0\0\0\5\0\0\0\5\317\0\0\364\301\0\0\345\213\0\0\212"
"\257\0\0\317\207\0\0\0\0\3\214\0\0h\332\0\0\370\262\0\0\330\210\377\0"
"\0\377\2\347\0\0\376F\0\0\26\207\0\0\0\0\1\251\0\0\315\204\377\0\0\377"
"\4\361\0\0\376\235\0\0\266\377\0\0\377\276\0\0\344\207\0\0\0\0\6y\0\0"
"9\267\0\0\343\244\0\0\312q\0\0O\332\0\0\371\0\0\0\1\206\0\0\0\0\3\236"
"\0\0\250\263\0\0\327\271\0\0\363\210\377\0\0\377\1\234\0\0\314\210\0"
"\0\0\0\2w\0\0I\375\0\0\377\204\377\0\0\377\4~\0\0\232\377\0\0\377\332"
"\0\0\371U\0\0\11\206\0\0\0\0\6\216\0\0s\243\0\0\310\202\0\0\253-\0\0"
"\21\372\0\0\377\205\0\0d\205\0\0\0\0\4\211\0\0a\351\0\0\374\245\0\0\314"
"\303\0\0\361\207\377\0\0\377\2\371\0\0\377^\0\0D\211\0\0\0\0\1\273\0"
"\0\347\204\377\0\0\377\1\200\0\0\225\202\377\0\0\377\2\305\0\0\355{\0"
"\0Y\205\0\0\0\0\6\240\0\0\256\222\0\0\242C\0\0""5\0\0\0\0\340\0\0\374"
"\262\0\0\330\203\0\0\0\0\6\210\0\0k\300\0\0\352\375\0\0\377\377\0\0\377"
"\263\0\0\333\267\0\0\347\207\377\0\0\377\1\256\0\0\331\212\0\0\0\0\2"
"\201\0\0U\374\0\0\377\203\377\0\0\377\2\221\0\0\222\372\0\0\377\203\377"
"\0\0\377\7\321\0\0\371\226\0\0\266k\0\0\37\0\0\0\0\0\0\0\1\306\0\0\355"
"\205\0\0o\202\0\0\0\0\5\312\0\0\357\366\0\0\377\214\0\0o\221\0\0\216"
"\301\0\0\353\204\377\0\0\377\2\277\0\0\353\255\0\0\327\206\377\0\0\377"
"\2\353\0\0\376[\0\0-\213\0\0\0\0\1\250\0\0\326\203\377\0\0\377\2\226"
"\0\0\241\360\0\0\377\205\377\0\0\377\5\362\0\0\376\301\0\0\347\322\0"
"\0\363\377\0\0\377\214\0\0R\202\0\0\0\0\1\265\0\0\331\210\377\0\0\377"
"\2\307\0\0\367\252\0\0\276\206\377\0\0\377\1\213\0\0\267\214\0\0\0\0"
"\2m\0\0\34\334\0\0\372\202\377\0\0\377\2\233\0\0\260\346\0\0\377\211"
"\377\0\0\377\1\213\0\0\\\202\0\0\0\0\1\303\0\0\342\210\377\0\0\377\2"
"\323\0\0\372\251\0\0\300\205\377\0\0\377\2\320\0\0\366.\0\0\13\215\0"
"\0\0\0\5r\0\0^\364\0\0\377\377\0\0\377\253\0\0\310\312\0\0\366\211\377"
"\0\0\377\1\220\0\0\225\202\0\0\0\0\1\353\0\0\374\210\377\0\0\377\2\274"
"\0\0\356\276\0\0\342\204\377\0\0\377\2\355\0\0\377s\0\0I\217\0\0\0\0"
"\4\202\0\0\207\371\0\0\377\331\0\0\370\237\0\0\310\211\377\0\0\377\3"
"\266\0\0\340W\0\0#\201\0\0I\211\377\0\0\377\2\217\0\0\260\354\0\0\376"
"\203\377\0\0\377\2\374\0\0\377z\0\0\227\221\0\0\0\0\3\205\0\0\225\370"
"\0\0\377\311\0\0\362\211\377\0\0\377\3\363\0\0\377\227\0\0\260\302\0"
"\0\357\210\377\0\0\377\2\361\0\0\376\320\0\0\362\204\377\0\0\377\1\243"
"\0\0\301\223\0\0\0\0\2\177\0\0\203\361\0\0\377\212\377\0\0\377\1\371"
"\0\0\377\216\377\0\0\377\2\243\0\0\313\0\0\0\1\224\0\0\0\0\2s\0\0_\332"
"\0\0\373\226\377\0\0\377\2\362\0\0\377\223\0\0\236\227\0\0\0\0\23`\0"
"\0\40\263\0\0\342\366\0\0\377\331\0\0\371\367\0\0\377\340\0\0\373\336"
"\0\0\373\377\0\0\377\256\0\0\325\204\0\0Y\336\0\0\373\201\0\0K\231\0"
"\0\235\373\0\0\377\271\0\0\337\353\0\0\375\376\0\0\377\322\0\0\370\376"
"\0\0\377\203\377\0\0\377\2\302\0\0\362z\0\0I\205\0\0\0\0\4b\0\0""9\200"
"\0\0\200m\0\0b@\0\0\10\211\0\0\0\0\5]\0\0!\215\0\0\243\245\0\0\316\224"
"\0\0\247.\0\0\13\203\0\0\0\0\6\241\0\0\307\0\0\0\0\245\0\0\301\203\0"
"\0T]\0\0\13\314\0\0\366\202\0\0\0\0\1\277\0\0\347\202\0\0\0\0\12\305"
"\0\0\355\0\0\0\0\233\0\0\244\243\0\0\257\0\0\0\0\342\0\0\372\377\0\0"
"\377\317\0\0\370\207\0\0\223\0\0\0\4\205\0\0\0\0\2\230\0\0\270\367\0"
"\0\377\202\377\0\0\377\2\322\0\0\370r\0\0:\207\0\0\0\0\2\201\0\0}\343"
"\0\0\376\203\377\0\0\377\2\264\0\0\352\0\0\0\2\202\0\0\0\0\6\212\0\0"
"\263z\0\0A\262\0\0\323\200\0\0:3\0\0\5\262\0\0\340\202\0\0\0\0\1\301"
"\0\0\346\202\0\0\0\0\10\271\0\0\344\0\0\0\0\231\0\0\226\212\0\0\213\0"
"\0\0\0\304\0\0\351\202\0\0x\0\0\0\3\206\0\0\0\0\2\200\0\0\200\376\0\0"
"\377\204\377\0\0\377\1\306\0\0\362\206\0\0\0\0\2c\0\0$\355\0\0\376\205"
"\377\0\0\377\1r\0\0b\202\0\0\0\0\21@\0\0\4\221\0\0\247\245\0\0\315\250"
"\0\0\334\266\0\0\343\315\0\0\366\253\0\0\325\245\0\0\306\336\0\0\374"
"\221\0\0\253\226\0\0\263\353\0\0\376\245\0\0\313\311\0\0\360\270\0\0"
"\347\262\0\0\335\220\0\0\254\210\0\0\0\0\1\274\0\0\351\206\377\0\0\377"
"\1g\0\0""4\205\0\0\0\0\1\215\0\0\177\206\377\0\0\377\1\201\0\0}\205\0"
"\0\0\0\27\0\0\0\1\40\0\0\20\0\0\0\0\13\0\0\30m\0\0""6\225\0\0F\201\0"
"\0go\0\0g0\0\0\20:\0\0B/\0\0""6\25\0\0%I\0\0;\0\0\0\3\0\0\0\0\\\0\0\31"
"r\0\0Lo\0\0N\202\0\0V\215\0\0\\\201\0\0e\207\0\0q\347\0\0\375\205\377"
"\0\0\377\2\371\0\0\377H\0\0\40\205\0\0\0\0\1u\0\0U\206\377\0\0\377\4"
"\333\0\0\373\322\0\0\370\333\0\0\372\340\0\0\374\202\337\0\0\375\12\233"
"\0\0\321\0\0\0\0c\0\0\22\306\0\0\364\354\0\0\376\357\0\0\377\377\0\0"
"\377\226\0\0\233\212\0\0\263\356\0\0\377\203\377\0\0\377\4\224\0\0\253"
"\0\0\0\0p\0\0;\357\0\0\376\213\377\0\0\377\1\261\0\0\344\207\0\0\0\0"
"\2\227\0\0\272\334\0\0\372\211\377\0\0\377\4\355\0\0\376g\0\0""4\0\0"
"\0\0\242\0\0\306\203\377\0\0\377\4\312\0\0\360\200\0\0\2@\0\0\20\332"
"\0\0\373\203\377\0\0\377\4\362\0\0\377z\0\0E\0\0\0\0\225\0\0\244\212"
"\377\0\0\377\2\374\0\0\377y\0\0T\206\0\0\0\0\2$\0\0\7\242\0\0\327\212"
"\377\0\0\377\4\230\0\0\255\0\0\0\0u\0\0U\370\0\0\377\202\377\0\0\377"
"\2\371\0\0\377\200\0\0P\202\0\0\0\0\2\202\0\0\207\376\0\0\377\203\377"
"\0\0\377\4\315\0\0\363U\0\0\11\0\0\0\1\304\0\0\355\211\377\0\0\377\3"
"\346\0\0\375\305\0\0\363a\0\0\35\205\0\0\0\0\1\230\0\0\274\212\377\0"
"\0\377\4\317\0\0\364U\0\0\6\0\0\0\2\304\0\0\362\203\377\0\0\377\1\251"
"\0\0\311\203\0\0\0\0\2\0\0\0\1\255\0\0\351\204\377\0\0\377\4\255\0\0"
"\320]\0\0\13y\0\0;\361\0\0\376\203\377\0\0\377\1\367\0\0\377\206\377"
"\0\0\377\1\234\0\0\260\205\0\0\0\0\1\315\0\0\366\205\377\0\0\377\2\233"
"\0\0\304\333\0\0\371\202\322\0\0\370\5\310\0\0\367\201\0\0]t\0\0V\240"
"\0\0\301\327\0\0\371\202\377\0\0\377\2\345\0\0\375d\0\0\27\204\0\0\0"
"\0\2M\0\0""5\320\0\0\367\204\377\0\0\377\3\324\0\0\372p\0\0[\217\0\0"
"\217\202\261\0\0\335\2\242\0\0\305\307\0\0\356\206\377\0\0\377\1\237"
"\0\0\305\205\0\0\0\0\1\275\0\0\352\205\377\0\0\377\1\236\0\0\302\204"
"\0\0\0\0\2\211\0\0\204\367\0\0\377\205\377\0\0\377\1\250\0\0\334\204"
"\0\0\0\0\2\200\0\0t\375\0\0\377\205\377\0\0\377\2\344\0\0\375Z\0\0%\203"
"\0\0\0\0\1\264\0\0\341\205\377\0\0\377\2\376\0\0\377q\0\0j\205\0\0\0"
"\0\2\202\0\0~\376\0\0\377\204\377\0\0\377\1\234\0\0\302\204\0\0\0\0\1"
"\301\0\0\356\206\377\0\0\377\1\305\0\0\363\204\0\0\0\0\1\252\0\0\331"
"\207\377\0\0\377\1\216\0\0\253\203\0\0\0\0\2t\0\0l\360\0\0\377\203\377"
"\0\0\377\2\376\0\0\377\233\0\0\311\207\0\0\0\0\2\230\0\0\276\376\0\0"
"\377\202\377\0\0\377\2\355\0\0\376h\0\0;\204\0\0\0\0\1\275\0\0\355\202"
"\377\0\0\377\5\325\0\0\371\327\0\0\367\377\0\0\377\374\0\0\377\211\0"
"\0\240\204\0\0\0\0\2\205\0\0\224\376\0\0\377\202\377\0\0\377\2\333\0"
"\0\373\323\0\0\365\202\377\0\0\377\1\221\0\0\236\204\0\0\0\0\5s\0\0P"
"\254\0\0\331\263\0\0\345\235\0\0\311q\0\0a\211\0\0\0\0\4\200\0\0\205"
"\301\0\0\356\275\0\0\353w\0\0^\205\0\0\0\0\7z\0\0w\366\0\0\377\354\0"
"\0\376\206\0\0z\205\0\0\224\252\0\0\326x\0\0l\206\0\0\0\0\10\201\0\0"
"y\247\0\0\316\224\0\0\245Z\0\0\37\245\0\0\333\376\0\0\377\302\0\0\357"
"d\0\0\27\234\0\0\0\0\2Q\0\0/9\0\0\22\217\0\0\0\0\2""7\0\0%\0\0\0\1\377"
"\0\0\0\0\376\0\0\0\0",
};
static const GdkPixdata icon_yellow_pixbuf = {
0x47646b50, /* Pixbuf magic: 'GdkP' */
24 + 3515, /* header length + pixel_data length */
0x2010002, /* pixdata_type */
192, /* rowstride */
48, /* width */
48, /* height */
/* pixel_data: */
(guint8 *)
"\377\0\0\0\0\243\0\0\0\0\7;'\0\15}d\0\\\215q\0\210\210m\0\237\216q\0"
"\231\211n\0\206y`\0=\247\0\0\0\0\3w^\0\\\262\216\0\336\356\277\0\376"
"\206\377\314\0\377\3\310\240\0\365\217r\0\23033\0\5\226\0\0\0\0\1}c\0"
"Z\204\205j\0\202\1x_\0f\206\0\0\0\0\3]K\0)\261\216\0\341\375\312\0\377"
"\212\377\314\0\377\2\312\241\0\365u^\0W\206\0\0\0\0\1x`\0h\202\236~\0"
"\300\1\243\203\0\307\204\250\206\0\317\4\256\214\0\327\261\215\0\335"
"\265\220\0\330\207p\0\40\203\0\0\0\0\1\270\223\0\333\204\377\314\0\377"
"\1\275\227\0\347\205\0\0\0\0\2t]\0X\336\261\0\374\215\377\314\0\377\2"
"\367\306\0\377\210l\0\245\205\0\0\0\0\1\217r\0\226\212\377\314\0\377"
"\1[I\0\34\203\0\0\0\0\1\252\210\0\316\204\377\314\0\377\1\270\223\0\345"
"\204\0\0\0\0\2p[\0T\352\273\0\376\217\377\314\0\377\3\376\313\0\377\233"
"|\0\307\0\0\0\2\203\0\0\0\0\1\205j\0}\211\377\314\0\377\2\366\305\0\377"
"\0\0\0\1\203\0\0\0\0\1\232{\0\275\204\377\314\0\377\1\306\236\0\355\203"
"\0\0\0\0\2hP\0\40\332\257\0\373\222\377\314\0\377\1\222t\0\270\203\0"
"\0\0\0\1x`\0b\211\377\314\0\377\1\342\264\0\374\204\0\0\0\0\1\223u\0"
"\243\204\377\314\0\377\1\333\260\0\373\203\0\0\0\0\1\252\210\0\330\223"
"\377\314\0\377\2\374\312\0\377\201h\0\202\202\0\0\0\0\1zb\0^\211\377"
"\314\0\377\1\317\246\0\366\204\0\0\0\0\1\212o\0\201\204\377\314\0\377"
"\5\376\313\0\377\223t\0!\0\0\0\0hU\0B\372\310\0\377\224\377\314\0\377"
"\4\333\257\0\374E;\0\32\0\0\0\0\214q\0q\211\377\314\0\377\1\266\222\0"
"\341\204\0\0\0\0\1t^\0Q\205\377\314\0\377\3\232{\0\203\0\0\0\0\233|\0"
"\306\226\377\314\0\377\3\234}\0\304\0\0\0\0\226x\0\210\211\377\314\0"
"\377\1\241\201\0\274\204\0\0\0\0\2""3\"\0\17\367\306\0\377\204\377\314"
"\0\377\3\256\213\0\315\0\0\0\0\325\252\0\372\205\377\314\0\377\5\376"
"\313\0\377\322\251\0\365\262\216\0\325\264\220\0\324\376\313\0\377\204"
"\377\314\0\377\13\365\304\0\377\245\205\0\312\223v\0{\210m\0g\230z\0"
"\212\260\215\0\325\370\306\0\377\377\314\0\377\351\273\0\3765+\0\30\236"
"\177\0\265\211\377\314\0\377\1\201h\0{\205\0\0\0\0\1\313\242\0\365\204"
"\377\314\0\377\3\325\253\0\370F:\0,\374\312\0\377\203\377\314\0\377\3"
"\344\266\0\374\242\202\0\276\202i\0\77\203\0\0\0\0\1\256\214\0\327\203"
"\377\314\0\377\2\370\306\0\377\203i\0k\205\0\0\0\0\5\211m\0w\372\310"
"\0\377\377\314\0\377\207l\0\227\257\215\0\335\210\377\314\0\377\2\366"
"\305\0\377YC\0\27\205\0\0\0\0\1\245\204\0\315\205\377\314\0\377\1\222"
"t\0\270\202\377\314\0\377\3\373\311\0\377\224w\0\237`@\0\10\205\0\0\0"
"\0\5cN\0>\375\312\0\377\377\314\0\377\361\301\0\376\254\212\0\325\207"
"\0\0\0\0\4\254\212\0\321\377\314\0\377\303\234\0\353\326\253\0\367\210"
"\377\314\0\377\1\276\230\0\353\206\0\0\0\0\1\200e\0t\205\377\314\0\377"
"\1\371\307\0\377\202\377\314\0\377\1\304\235\0\354\210\0\0\0\0\4\353"
"\274\0\376\352\273\0\376\236}\0\277\231{\0\242\207\0\0\0\0\3w_\0V\377"
"\314\0\377\374\312\0\377\211\377\314\0\377\1\217s\0\240\206\0\0\0\0\2"
"..\0\13\350\271\0\375\204\377\314\0\377\4\354\275\0\376\357\277\0\376"
"\377\314\0\377\263\217\0\333\207\0\0\0\0\5\0\0\0\5\317\245\0\364\301"
"\232\0\345\213o\0\212\257\214\0\317\207\0\0\0\0\3\214q\0h\332\257\0\370"
"\262\217\0\330\210\377\314\0\377\2\347\271\0\376F:\0\26\207\0\0\0\0\1"
"\251\210\0\315\204\377\314\0\377\4\361\301\0\376\235~\0\266\377\314\0"
"\377\276\230\0\344\207\0\0\0\0\6yb\0""9\267\222\0\343\244\203\0\312q"
"Z\0O\332\256\0\371\0\0\0\1\206\0\0\0\0\3\236~\0\250\263\220\0\327\271"
"\224\0\363\210\377\314\0\377\1\234}\0\314\210\0\0\0\0\2w^\0I\375\312"
"\0\377\204\377\314\0\377\4~e\0\232\377\314\0\377\332\256\0\371U9\0\11"
"\206\0\0\0\0\6\216q\0s\243\202\0\310\202h\0\253-\36\0\21\372\310\0\377"
"\205k\0d\205\0\0\0\0\4\211n\0a\351\272\0\374\245\205\0\314\303\234\0"
"\361\207\377\314\0\377\2\371\307\0\377^K\0D\211\0\0\0\0\1\273\225\0\347"
"\204\377\314\0\377\1\200g\0\225\202\377\314\0\377\2\305\235\0\355{a\0"
"Y\205\0\0\0\0\6\240\200\0\256\222t\0\242C5\0""5\0\0\0\0\340\263\0\374"
"\262\217\0\330\203\0\0\0\0\6\210n\0k\300\232\0\352\375\312\0\377\377"
"\314\0\377\263\217\0\333\267\223\0\347\207\377\314\0\377\1\256\213\0"
"\331\212\0\0\0\0\2\201f\0U\374\312\0\377\203\377\314\0\377\2\221s\0\222"
"\372\310\0\377\203\377\314\0\377\7\321\247\0\371\226x\0\266kR\0\37\0"
"\0\0\0\0\0\0\1\306\236\0\355\205j\0o\202\0\0\0\0\5\312\241\0\357\366"
"\305\0\377\214q\0o\221u\0\216\301\232\0\353\204\377\314\0\377\2\277\231"
"\0\353\255\213\0\327\206\377\314\0\377\2\353\274\0\376[J\0-\213\0\0\0"
"\0\1\250\207\0\326\203\377\314\0\377\2\226x\0\241\360\300\0\377\205\377"
"\314\0\377\5\362\302\0\376\301\233\0\347\322\250\0\363\377\314\0\377"
"\214p\0R\202\0\0\0\0\1\265\221\0\331\210\377\314\0\377\2\307\237\0\367"
"\252\211\0\276\206\377\314\0\377\1\213o\0\267\214\0\0\0\0\2m[\0\34\334"
"\260\0\372\202\377\314\0\377\2\233}\0\260\346\270\0\377\211\377\314\0"
"\377\1\213o\0\\\202\0\0\0\0\1\303\234\0\342\210\377\314\0\377\2\323\251"
"\0\372\251\207\0\300\205\377\314\0\377\2\320\247\0\366..\0\13\215\0\0"
"\0\0\5r\\\0^\364\303\0\377\377\314\0\377\253\210\0\310\312\242\0\366"
"\211\377\314\0\377\1\220s\0\225\202\0\0\0\0\1\353\274\0\374\210\377\314"
"\0\377\2\274\226\0\356\276\227\0\342\204\377\314\0\377\2\355\276\0\377"
"s[\0I\217\0\0\0\0\4\202h\0\207\371\307\0\377\331\256\0\370\237\200\0"
"\310\211\377\314\0\377\3\266\222\0\340WI\0#\201i\0I\211\377\314\0\377"
"\2\217r\0\260\354\275\0\376\203\377\314\0\377\2\374\312\0\377zb\0\227"
"\221\0\0\0\0\3\205j\0\225\370\306\0\377\311\241\0\362\211\377\314\0\377"
"\3\363\302\0\377\227x\0\260\302\234\0\357\210\377\314\0\377\2\361\301"
"\0\376\320\246\0\362\204\377\314\0\377\1\243\201\0\301\223\0\0\0\0\2"
"\177e\0\203\361\301\0\377\212\377\314\0\377\1\371\307\0\377\216\377\314"
"\0\377\2\243\203\0\313\0\0\0\1\224\0\0\0\0\2s[\0_\332\257\0\373\226\377"
"\314\0\377\2\362\302\0\377\223v\0\236\227\0\0\0\0\23`P\0\40\263\217\0"
"\342\366\305\0\377\331\256\0\371\367\306\0\377\340\263\0\373\336\262"
"\0\373\377\314\0\377\256\213\0\325\204j\0Y\336\262\0\373\201f\0K\231"
"z\0\235\373\311\0\377\271\225\0\337\353\273\0\375\376\313\0\377\322\250"
"\0\370\376\313\0\377\203\377\314\0\377\2\302\233\0\362zb\0I\205\0\0\0"
"\0\4bQ\0""9\200f\0\200mX\0b@@\0\10\211\0\0\0\0\5]M\0!\215q\0\243\245"
"\203\0\316\224w\0\247..\0\13\203\0\0\0\0\6\241\201\0\307\0\0\0\0\245"
"\204\0\301\203g\0T]F\0\13\314\244\0\366\202\0\0\0\0\1\277\230\0\347\202"
"\0\0\0\0\12\305\235\0\355\0\0\0\0\233|\0\244\243\203\0\257\0\0\0\0\342"
"\266\0\372\377\314\0\377\317\246\0\370\207l\0\223\0\0\0\4\205\0\0\0\0"
"\2\230z\0\270\367\306\0\377\202\377\314\0\377\2\322\250\0\370r\\\0:\207"
"\0\0\0\0\2\201f\0}\343\266\0\376\203\377\314\0\377\2\264\220\0\352\0"
"\0\0\2\202\0\0\0\0\6\212o\0\263zb\0A\262\217\0\323\200e\0:33\0\5\262"
"\216\0\340\202\0\0\0\0\1\301\232\0\346\202\0\0\0\0\10\271\224\0\344\0"
"\0\0\0\231z\0\226\212n\0\213\0\0\0\0\304\235\0\351\202h\0x\0\0\0\3\206"
"\0\0\0\0\2\200f\0\200\376\313\0\377\204\377\314\0\377\1\306\236\0\362"
"\206\0\0\0\0\2cN\0$\355\276\0\376\205\377\314\0\377\1r[\0b\202\0\0\0"
"\0\21@@\0\4\221t\0\247\245\204\0\315\250\206\0\334\266\222\0\343\315"
"\244\0\366\253\210\0\325\245\203\0\306\336\261\0\374\221t\0\253\226x"
"\0\263\353\274\0\376\245\204\0\313\311\240\0\360\270\224\0\347\262\216"
"\0\335\220t\0\254\210\0\0\0\0\1\274\227\0\351\206\377\314\0\377\1gS\0"
"4\205\0\0\0\0\1\215p\0\177\206\377\314\0\377\1\201f\0}\205\0\0\0\0\27"
"\0\0\0\1\40\40\0\20\0\0\0\0\13\13\0\30mU\0""6\225x\0F\201h\0goY\0g0\40"
"\0\20:.\0B/&\0""6\25\16\0%I=\0;\0\0\0\3\0\0\0\0\\G\0\31r[\0LoX\0N\202"
"h\0V\215r\0\\\201h\0e\207l\0q\347\270\0\375\205\377\314\0\377\2\371\307"
"\0\377H8\0\40\205\0\0\0\0\1u]\0U\206\377\314\0\377\4\333\260\0\373\322"
"\250\0\370\333\257\0\372\340\263\0\374\202\337\262\0\375\12\233|\0\321"
"\0\0\0\0cU\0\22\306\236\0\364\354\275\0\376\357\277\0\377\377\314\0\377"
"\226x\0\233\212o\0\263\356\276\0\377\203\377\314\0\377\4\224v\0\253\0"
"\0\0\0p[\0;\357\277\0\376\213\377\314\0\377\1\261\215\0\344\207\0\0\0"
"\0\2\227y\0\272\334\260\0\372\211\377\314\0\377\4\355\276\0\376gS\0""4"
"\0\0\0\0\242\202\0\306\203\377\314\0\377\4\312\242\0\360\200\200\0\2"
"@0\0\20\332\257\0\373\203\377\314\0\377\4\362\302\0\377z`\0E\0\0\0\0"
"\225x\0\244\212\377\314\0\377\2\374\312\0\377ya\0T\206\0\0\0\0\2$$\0"
"\7\242\202\0\327\212\377\314\0\377\4\230y\0\255\0\0\0\0u]\0U\370\306"
"\0\377\202\377\314\0\377\2\371\307\0\377\200f\0P\202\0\0\0\0\2\202h\0"
"\207\376\313\0\377\203\377\314\0\377\4\315\244\0\363U9\0\11\0\0\0\1\304"
"\235\0\355\211\377\314\0\377\3\346\267\0\375\305\235\0\363aO\0\35\205"
"\0\0\0\0\1\230z\0\274\212\377\314\0\377\4\317\245\0\364UU\0\6\0\0\0\2"
"\304\235\0\362\203\377\314\0\377\1\251\206\0\311\203\0\0\0\0\2\0\0\0"
"\1\255\212\0\351\204\377\314\0\377\4\255\213\0\320]F\0\13y_\0;\361\301"
"\0\376\203\377\314\0\377\1\367\306\0\377\206\377\314\0\377\1\234}\0\260"
"\205\0\0\0\0\1\315\244\0\366\205\377\314\0\377\2\233|\0\304\333\257\0"
"\371\202\322\250\0\370\5\310\240\0\367\201h\0]t\\\0V\240\200\0\301\327"
"\254\0\371\202\377\314\0\377\2\345\267\0\375dN\0\27\204\0\0\0\0\2M\77"
"\0""5\320\246\0\367\204\377\314\0\377\3\324\251\0\372pZ\0[\217r\0\217"
"\202\261\215\0\335\2\242\201\0\305\307\240\0\356\206\377\314\0\377\1"
"\237\177\0\305\205\0\0\0\0\1\275\226\0\352\205\377\314\0\377\1\236~\0"
"\302\204\0\0\0\0\2\211n\0\204\367\306\0\377\205\377\314\0\377\1\250\206"
"\0\334\204\0\0\0\0\2\200e\0t\375\312\0\377\205\377\314\0\377\2\344\266"
"\0\375ZE\0%\203\0\0\0\0\1\264\220\0\341\205\377\314\0\377\2\376\313\0"
"\377q[\0j\205\0\0\0\0\2\202g\0~\376\313\0\377\204\377\314\0\377\1\234"
"}\0\302\204\0\0\0\0\1\301\232\0\356\206\377\314\0\377\1\305\235\0\363"
"\204\0\0\0\0\1\252\210\0\331\207\377\314\0\377\1\216q\0\253\203\0\0\0"
"\0\2t\\\0l\360\300\0\377\203\377\314\0\377\2\376\313\0\377\233|\0\311"
"\207\0\0\0\0\2\230y\0\276\376\313\0\377\202\377\314\0\377\2\355\276\0"
"\376hR\0;\204\0\0\0\0\1\275\230\0\355\202\377\314\0\377\5\325\252\0\371"
"\327\253\0\367\377\314\0\377\374\312\0\377\211n\0\240\204\0\0\0\0\2\205"
"k\0\224\376\313\0\377\202\377\314\0\377\2\333\260\0\373\323\251\0\365"
"\202\377\314\0\377\1\221t\0\236\204\0\0\0\0\5s\\\0P\254\211\0\331\263"
"\220\0\345\235~\0\311qY\0a\211\0\0\0\0\4\200h\0\205\301\232\0\356\275"
"\227\0\353w_\0^\205\0\0\0\0\7zc\0w\366\305\0\377\354\275\0\376\206k\0"
"z\205k\0\224\252\210\0\326xa\0l\206\0\0\0\0\10\201g\0y\247\206\0\316"
"\224w\0\245ZJ\0\37\245\205\0\333\376\313\0\377\302\234\0\357dN\0\27\234"
"\0\0\0\0\2QA\0/9+\0\22\217\0\0\0\0\2""7)\0%\0\0\0\1\377\0\0\0\0\376\0"
"\0\0\0",
};

BIN
shot-closed.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
shot-open.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View file

@ -1,234 +0,0 @@
/*
* SpaceAPI based panel applet for UNIX using GTK2
*
* Author: hanez <you@hanez.org>
* Contributors: Haeger, atari, beh and eisbaer
*
* License (Beerware License):
* As long as you retain this notice you can do whatever you want with this
* stuff. If we meet some day, and you think this stuff is worth it, you can buy
* me a beer in return hanez and all other contributers
*
* TODO:
* - Add door open/close date to notification and status
* - Fix: not show notification twice at start when status "open"
*/
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <time.h>
#include <curl/curl.h>
#include <gtk/gtk.h>
#include <gdk-pixbuf/gdk-pixdata.h>
#include <json.h>
#if LIBNOTIFY
#include <libnotify/notify.h>
#endif
#include "pesthoernchen.h"
struct string {
char *ptr;
size_t len;
};
static char *name = "Dooris for UNIX";
static char *statusurl = "https://www.hamburg.ccc.de/dooris/status.json";
static char *agent = "Dooris-for-UNIX/0.42";
// The delay for polling the dooris service. Adjust this before compiling
int delay = 900000; // ms. aka 15 minutes
bool door_open = false;
bool old_door_open = false;
GtkStatusIcon *tray_icon;
bool do_it();
void invoke_notification();
void init_string(struct string *s) {
s->len = 0;
s->ptr = malloc(s->len+1);
if (s->ptr == NULL) {
fprintf(stderr, "malloc() failed\n");
exit(EXIT_FAILURE);
}
s->ptr[0] = '\0';
}
size_t writefunc(void *ptr, size_t size, size_t nmemb, struct string *s) {
size_t new_len = s->len + size*nmemb;
s->ptr = realloc(s->ptr, new_len+1);
if (s->ptr == NULL) {
fprintf(stderr, "realloc() failed\n");
exit(EXIT_FAILURE);
}
memcpy(s->ptr+s->len, ptr, size*nmemb);
s->ptr[new_len] = '\0';
s->len = new_len;
return size*nmemb;
}
void tray_icon_on_click(GtkStatusIcon *status_icon, gpointer user_data) {
do_it();
}
void get_bouncer_data() {
CURL *curl;
CURLcode res;
struct json_object *response_json_object;
struct json_object *door_json_object;
struct json_object *leaf_json_object;
bool door_status;
int door_last_change;
struct string s;
printf("Called get_bouncer_data()\n");
old_door_open = door_open;
init_string(&s);
curl = curl_easy_init();
if(!curl) {
fprintf(stderr, "curl_easy_init() failed.\n");
return;
}
curl_easy_setopt(curl, CURLOPT_URL, statusurl);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s);
curl_easy_setopt(curl, CURLOPT_USERAGENT, agent);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
return;
}
response_json_object = json_tokener_parse(s.ptr);
free(s.ptr);
// door objects
door_json_object = json_object_object_get(response_json_object, "state");
leaf_json_object = json_object_object_get(door_json_object, "open");
door_status = json_object_get_int(leaf_json_object);
//door_status = true;
leaf_json_object = json_object_object_get(door_json_object, "lastchange");
door_last_change = json_object_get_int(leaf_json_object);
// free door object
json_object_put(door_json_object);
// free leaf object
//json_object_put(leaf_json_object);
// free response object
// json_object_put(response_json_object);
printf("Door status: = %d\n", door_status);
printf("Door last change: = %d\n", door_last_change);
if (door_status == true) {
door_open = true;
} else {
door_open = false;
}
}
void invoke_notification() {
char door[20];
if (door_open == true) {
snprintf(door, 20, "Door open...");
} else {
snprintf(door, 20, "Door closed...");
}
gtk_status_icon_set_tooltip(tray_icon, door);
#if LIBNOTIFY
NotifyNotification *n;
notify_init(name);
n = notify_notification_new(name, door, NULL);
//notify_notification_set_timeout(n, 10000);
if (door_open == true) {
notify_notification_set_icon_from_pixbuf(n, gdk_pixbuf_from_pixdata(
&icon_yellow_pixbuf,
true,
NULL));
} else {
notify_notification_set_icon_from_pixbuf(n, gdk_pixbuf_from_pixdata(
&icon_red_pixbuf,
true,
NULL));
}
notify_notification_show(n, NULL);
g_object_unref(G_OBJECT(n));
#endif
}
void set_status() {
if (door_open == true) {
printf("Set to status: open\n");
gtk_status_icon_set_from_pixbuf(tray_icon,
gdk_pixbuf_from_pixdata(&icon_yellow_pixbuf,
true,
NULL));
} else {
printf("Set to status: closed\n");
gtk_status_icon_set_from_pixbuf(tray_icon,
gdk_pixbuf_from_pixdata(&icon_red_pixbuf,
true,
NULL));
}
}
bool do_it() {
get_bouncer_data();
set_status();
if (door_open != old_door_open) {
invoke_notification();
}
return true;
}
int main(int argc, char **argv) {
gtk_init(&argc, &argv);
tray_icon = gtk_status_icon_new();
g_signal_connect(G_OBJECT(tray_icon), "activate",
G_CALLBACK(tray_icon_on_click), NULL);
gtk_status_icon_set_visible(tray_icon, true);
do_it();
// DEBUG STUFF
//door_open = true;
//set_status();
// END DEBUG STUFF
invoke_notification();
gtk_timeout_add(delay, (GtkFunction)do_it, (gpointer)NULL);
gtk_main();
return 0;
}

131
spacetray.cpp Normal file
View file

@ -0,0 +1,131 @@
#include "spacetray.h"
#include "themes/lock.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QNetworkRequest>
#include <QAction>
#include <QCoreApplication>
#include <QImage>
#include <QPixmap>
#include <QDebug>
SpaceTray::SpaceTray(const QString &url, int intervalSeconds, QObject *parent)
: QObject(parent),
m_statusUrl(url),
m_doorOpen(false),
m_oldDoorOpen(false),
m_doorLastChange(0),
m_spaceName("Unknown Space"),
m_firstRun(true)
{
// Initialize icons from raw data
QImage imgOpen(icon_open_data, 52, 48, 208, QImage::Format_RGBA8888);
m_iconOpen = QIcon(QPixmap::fromImage(imgOpen));
QImage imgClosed(icon_closed_data, 52, 48, 208, QImage::Format_RGBA8888);
m_iconClosed = QIcon(QPixmap::fromImage(imgClosed));
// Setup tray icon
m_trayIcon = new QSystemTrayIcon(this);
m_trayIcon->setIcon(m_iconClosed);
m_trayIcon->setVisible(true);
// Setup tray menu
m_trayMenu = new QMenu();
QAction *quitAction = m_trayMenu->addAction("Quit");
connect(quitAction, &QAction::triggered, this, &SpaceTray::quit);
m_trayIcon->setContextMenu(m_trayMenu);
connect(m_trayIcon, &QSystemTrayIcon::activated, [this](QSystemTrayIcon::ActivationReason reason) {
if (reason == QSystemTrayIcon::Trigger) {
fetchData();
}
});
// Setup network manager
m_networkManager = new QNetworkAccessManager(this);
// QTimer expects milliseconds; the command-line interval is specified in seconds.
m_timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, &SpaceTray::fetchData);
m_timer->start(intervalSeconds * 1000);
// Initial fetch
fetchData();
}
SpaceTray::~SpaceTray()
{
delete m_trayMenu;
}
void SpaceTray::fetchData()
{
QNetworkRequest request(m_statusUrl);
request.setHeader(QNetworkRequest::UserAgentHeader, "Spacetray/0.42 (Qt)");
request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);
QNetworkReply *reply = m_networkManager->get(request);
connect(reply, &QNetworkReply::finished, this, [this, reply]() { onFinished(reply); });
}
void SpaceTray::onFinished(QNetworkReply *reply)
{
if (reply->error() != QNetworkReply::NoError) {
qWarning() << "Network error:" << reply->errorString();
reply->deleteLater();
return;
}
QByteArray data = reply->readAll();
reply->deleteLater();
// Remove UTF-8 BOM if present
if (data.startsWith("\xEF\xBB\xBF")) {
data.remove(0, 3);
}
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(data, &error);
if (doc.isNull()) {
qWarning() << "Failed to parse JSON:" << error.errorString();
qWarning() << "Raw data:" << data;
return;
}
QJsonObject obj = doc.object();
m_spaceName = obj.value("space").toString("Unknown Space");
QJsonObject stateObj = obj.value("state").toObject();
m_oldDoorOpen = m_doorOpen;
m_doorOpen = stateObj.value("open").toBool();
m_doorLastChange = stateObj.value("lastchange").toVariant().toLongLong();
updateTray();
if (!m_firstRun && m_doorOpen != m_oldDoorOpen) {
QString dateStr = QDateTime::fromSecsSinceEpoch(m_doorLastChange).toString("yyyy-MM-dd HH:mm:ss");
QString status = m_doorOpen ? "open" : "closed";
showNotification(QString("%1: Door %2 since %3").arg(m_spaceName, status, dateStr));
}
m_firstRun = false;
}
void SpaceTray::updateTray()
{
m_trayIcon->setIcon(m_doorOpen ? m_iconOpen : m_iconClosed);
QString dateStr = QDateTime::fromSecsSinceEpoch(m_doorLastChange).toString("yyyy-MM-dd HH:mm:ss");
QString status = m_doorOpen ? "open" : "closed";
QString tooltip = QString("%1: Door %2 since %3").arg(m_spaceName, status, dateStr);
m_trayIcon->setToolTip(tooltip);
}
void SpaceTray::showNotification(const QString &message)
{
m_trayIcon->showMessage("SpaceAPI widget for UNIX", message, m_doorOpen ? m_iconOpen : m_iconClosed);
}
void SpaceTray::quit()
{
QCoreApplication::quit();
}

45
spacetray.h Normal file
View file

@ -0,0 +1,45 @@
#ifndef SPACETRAY_H
#define SPACETRAY_H
#include <QObject>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QTimer>
#include <QDateTime>
class SpaceTray : public QObject
{
Q_OBJECT
public:
explicit SpaceTray(const QString &url, int intervalSeconds = 300, QObject *parent = nullptr);
~SpaceTray();
private slots:
void fetchData();
void onFinished(QNetworkReply *reply);
void quit();
private:
void updateTray();
void showNotification(const QString &message);
QString m_statusUrl;
QSystemTrayIcon *m_trayIcon;
QMenu *m_trayMenu;
QNetworkAccessManager *m_networkManager;
QTimer *m_timer;
bool m_doorOpen;
bool m_oldDoorOpen;
qint64 m_doorLastChange;
QString m_spaceName;
bool m_firstRun;
QIcon m_iconOpen;
QIcon m_iconClosed;
};
#endif // SPACETRAY_H

1676
themes/lock.h Normal file

File diff suppressed because it is too large Load diff