From 906c11caca835234a6ea919a1e65b1af078eb646 Mon Sep 17 00:00:00 2001 From: Goffredo Baroncelli Date: Wed, 21 Dec 2022 08:14:29 +0100 Subject: [PATCH] lxqt-panel: Qeyes plugin (#1847) * Adding qeyes plugin * load() returns success/failure * remove unneeded printf() * Add qeyes plugin to the list of plugin * Add dialog to confiure plugin * add qeyes.desktop * Add translation, changed name from qeyesplugin to qeyes * add several eyes type * look in the lxqt specific data dir for the eyes type * Several changes: - add support for translation of the text - reload the availables eyes not a dialog creation (which happend once), but when the dialog is showed - using QStringLiteral when possible - renamed "" as "QEyes default" * compare the old_types with the value and not the key * Add forgotten Q_OBJECT * Add qeyes.ts file * Do adjustSize() after populating the QComboBox() * Stop to import 'skins' from foreign projects --- CMakeLists.txt | 7 + plugin-qeyes/CMakeLists.txt | 25 ++ plugin-qeyes/qeyes.cpp | 146 +++++++++++ plugin-qeyes/qeyes.h | 67 +++++ plugin-qeyes/qeyesconfigdialog.cpp | 176 ++++++++++++++ plugin-qeyes/qeyesconfigdialog.h | 61 +++++ plugin-qeyes/qeyesimagewidget.cpp | 131 ++++++++++ plugin-qeyes/qeyesimagewidget.h | 58 +++++ plugin-qeyes/qeyesplugin.desktop | 7 + plugin-qeyes/qeyesvectorwidget.cpp | 72 ++++++ plugin-qeyes/qeyesvectorwidget.h | 48 ++++ plugin-qeyes/qeyeswidget.cpp | 143 +++++++++++ plugin-qeyes/qeyeswidget.h | 65 +++++ plugin-qeyes/resources/qeyes.desktop.in | 5 + plugin-qeyes/translations/qeyes.desktop.yaml | 2 + plugin-qeyes/translations/qeyes.ts | 42 ++++ plugin-qeyes/types/Bizarre/Bizarre-eye.png | Bin 0 -> 796 bytes plugin-qeyes/types/Bizarre/Bizarre-pupil.png | Bin 0 -> 143 bytes plugin-qeyes/types/Bizarre/config | 4 + .../types/Bloodshot/Bloodshot-eye.png | Bin 0 -> 1845 bytes .../types/Bloodshot/Bloodshot-pupil.png | Bin 0 -> 343 bytes plugin-qeyes/types/Bloodshot/config | 4 + .../types/Brown-EyedGirl/brown-eye.png | Bin 0 -> 1865 bytes .../types/Brown-EyedGirl/brown-pupil.png | Bin 0 -> 943 bytes plugin-qeyes/types/Brown-EyedGirl/config | 4 + plugin-qeyes/types/CMakeLists.txt | 11 + plugin-qeyes/types/Crystal/config | 4 + plugin-qeyes/types/Crystal/crystal-eye.svg | 229 ++++++++++++++++++ plugin-qeyes/types/Crystal/crystal-pupil.svg | 129 ++++++++++ .../types/Default-tiny/Default-tiny-eye.png | Bin 0 -> 807 bytes .../types/Default-tiny/Default-tiny-pupil.png | Bin 0 -> 134 bytes plugin-qeyes/types/Default-tiny/config | 4 + plugin-qeyes/types/Default/Default-eye.png | Bin 0 -> 1357 bytes plugin-qeyes/types/Default/Default-pupil.png | Bin 0 -> 168 bytes plugin-qeyes/types/Default/config | 4 + plugin-qeyes/types/Digital/Digital-eye.png | Bin 0 -> 249 bytes plugin-qeyes/types/Digital/Digital-pupil.png | Bin 0 -> 118 bytes plugin-qeyes/types/Digital/config | 4 + plugin-qeyes/types/EyelashLarge/config | 4 + plugin-qeyes/types/EyelashLarge/eye.png | Bin 0 -> 3321 bytes plugin-qeyes/types/EyelashLarge/pupil.png | Bin 0 -> 1019 bytes plugin-qeyes/types/Green-EyedGirl/config | 4 + .../types/Green-EyedGirl/green-eye.png | Bin 0 -> 1865 bytes .../types/Green-EyedGirl/green-pupil.png | Bin 0 -> 950 bytes plugin-qeyes/types/Horrid/config | 4 + plugin-qeyes/types/Horrid/horrid_eye.png | Bin 0 -> 3092 bytes plugin-qeyes/types/Horrid/horrid_pupil.png | Bin 0 -> 1272 bytes plugin-qeyes/types/Pink-EyedGirl/config | 4 + plugin-qeyes/types/Pink-EyedGirl/pink-eye.png | Bin 0 -> 1865 bytes .../types/Pink-EyedGirl/pink-pupil.png | Bin 0 -> 970 bytes plugin-qeyes/types/PumpkinMonster/config | 4 + plugin-qeyes/types/PumpkinMonster/eye.png | Bin 0 -> 3395 bytes plugin-qeyes/types/PumpkinMonster/pupil.png | Bin 0 -> 2066 bytes plugin-qeyes/types/README | 8 + plugin-qeyes/types/Tango/config | 4 + plugin-qeyes/types/Tango/tango-eye.png | Bin 0 -> 901 bytes plugin-qeyes/types/Tango/tango-pupil.png | Bin 0 -> 324 bytes 57 files changed, 1484 insertions(+) create mode 100644 plugin-qeyes/CMakeLists.txt create mode 100644 plugin-qeyes/qeyes.cpp create mode 100644 plugin-qeyes/qeyes.h create mode 100644 plugin-qeyes/qeyesconfigdialog.cpp create mode 100644 plugin-qeyes/qeyesconfigdialog.h create mode 100644 plugin-qeyes/qeyesimagewidget.cpp create mode 100644 plugin-qeyes/qeyesimagewidget.h create mode 100644 plugin-qeyes/qeyesplugin.desktop create mode 100644 plugin-qeyes/qeyesvectorwidget.cpp create mode 100644 plugin-qeyes/qeyesvectorwidget.h create mode 100644 plugin-qeyes/qeyeswidget.cpp create mode 100644 plugin-qeyes/qeyeswidget.h create mode 100644 plugin-qeyes/resources/qeyes.desktop.in create mode 100644 plugin-qeyes/translations/qeyes.desktop.yaml create mode 100644 plugin-qeyes/translations/qeyes.ts create mode 100644 plugin-qeyes/types/Bizarre/Bizarre-eye.png create mode 100644 plugin-qeyes/types/Bizarre/Bizarre-pupil.png create mode 100644 plugin-qeyes/types/Bizarre/config create mode 100644 plugin-qeyes/types/Bloodshot/Bloodshot-eye.png create mode 100644 plugin-qeyes/types/Bloodshot/Bloodshot-pupil.png create mode 100644 plugin-qeyes/types/Bloodshot/config create mode 100644 plugin-qeyes/types/Brown-EyedGirl/brown-eye.png create mode 100644 plugin-qeyes/types/Brown-EyedGirl/brown-pupil.png create mode 100644 plugin-qeyes/types/Brown-EyedGirl/config create mode 100644 plugin-qeyes/types/CMakeLists.txt create mode 100644 plugin-qeyes/types/Crystal/config create mode 100644 plugin-qeyes/types/Crystal/crystal-eye.svg create mode 100644 plugin-qeyes/types/Crystal/crystal-pupil.svg create mode 100644 plugin-qeyes/types/Default-tiny/Default-tiny-eye.png create mode 100644 plugin-qeyes/types/Default-tiny/Default-tiny-pupil.png create mode 100644 plugin-qeyes/types/Default-tiny/config create mode 100644 plugin-qeyes/types/Default/Default-eye.png create mode 100644 plugin-qeyes/types/Default/Default-pupil.png create mode 100644 plugin-qeyes/types/Default/config create mode 100644 plugin-qeyes/types/Digital/Digital-eye.png create mode 100644 plugin-qeyes/types/Digital/Digital-pupil.png create mode 100644 plugin-qeyes/types/Digital/config create mode 100644 plugin-qeyes/types/EyelashLarge/config create mode 100644 plugin-qeyes/types/EyelashLarge/eye.png create mode 100644 plugin-qeyes/types/EyelashLarge/pupil.png create mode 100644 plugin-qeyes/types/Green-EyedGirl/config create mode 100644 plugin-qeyes/types/Green-EyedGirl/green-eye.png create mode 100644 plugin-qeyes/types/Green-EyedGirl/green-pupil.png create mode 100644 plugin-qeyes/types/Horrid/config create mode 100644 plugin-qeyes/types/Horrid/horrid_eye.png create mode 100644 plugin-qeyes/types/Horrid/horrid_pupil.png create mode 100644 plugin-qeyes/types/Pink-EyedGirl/config create mode 100644 plugin-qeyes/types/Pink-EyedGirl/pink-eye.png create mode 100644 plugin-qeyes/types/Pink-EyedGirl/pink-pupil.png create mode 100644 plugin-qeyes/types/PumpkinMonster/config create mode 100644 plugin-qeyes/types/PumpkinMonster/eye.png create mode 100644 plugin-qeyes/types/PumpkinMonster/pupil.png create mode 100644 plugin-qeyes/types/README create mode 100644 plugin-qeyes/types/Tango/config create mode 100644 plugin-qeyes/types/Tango/tango-eye.png create mode 100644 plugin-qeyes/types/Tango/tango-pupil.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ac0bb6db..36f469950 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -170,6 +170,13 @@ if(SHOWDESKTOP_PLUGIN) add_subdirectory(plugin-showdesktop) endif() +setByDefault(QEYES_PLUGIN Yes) +if(QEYES_PLUGIN) + list(APPEND ENABLED_PLUGINS "QEyes") + add_subdirectory(plugin-qeyes) +endif() + + setByDefault(NETWORKMONITOR_PLUGIN Yes) if(NETWORKMONITOR_PLUGIN) find_library(STATGRAB_LIB statgrab) diff --git a/plugin-qeyes/CMakeLists.txt b/plugin-qeyes/CMakeLists.txt new file mode 100644 index 000000000..62f07f90e --- /dev/null +++ b/plugin-qeyes/CMakeLists.txt @@ -0,0 +1,25 @@ +set(PLUGIN "qeyes") + +set(HEADERS + qeyes.h + qeyesimagewidget.h + qeyesvectorwidget.h + qeyeswidget.h + qeyesconfigdialog.h +) + +set(SOURCES + qeyes.cpp + qeyesimagewidget.cpp + qeyesvectorwidget.cpp + qeyeswidget.cpp + qeyesconfigdialog.cpp +) + +set(LIBRARIES + ${LIBRARIES} +) + +add_subdirectory(types) + +BUILD_LXQT_PLUGIN(${PLUGIN}) diff --git a/plugin-qeyes/qeyes.cpp b/plugin-qeyes/qeyes.cpp new file mode 100644 index 000000000..f147f8f0b --- /dev/null +++ b/plugin-qeyes/qeyes.cpp @@ -0,0 +1,146 @@ +/* + * qeyes - an xeyes clone + * + * Copyright (C) 2022 Goffredo Baroncelli + * + * 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 2 + * 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include +#include +#include +#include +#include + +#include "../panel/pluginsettings.h" + +#include "qeyesconfigdialog.h" +#include "qeyes.h" + +ILXQtPanelPlugin *QEyesPluginLibrary::instance(const ILXQtPanelPluginStartupInfo &startupInfo) const +{ + return new QEyesPlugin(startupInfo); +} + +QEyesPlugin::QEyesPlugin(const ILXQtPanelPluginStartupInfo &startupInfo) : + QObject(), + ILXQtPanelPlugin(startupInfo) +{ + w0 = new QWidget(); + l = new QVBoxLayout(); + l->setSpacing(0); + l->setMargin(0); + l->setContentsMargins (0, 0, 0, 0); + w0->setLayout(l); + + w = new QEyesVectorWidget(); + l->addWidget(w); + w->setTransparent(true); + vectorEyes = true; + + settingsChanged(); + realign(); +} + +void QEyesPlugin::realign() { + const auto g = panel()->globalGeometry(); + if (panel()->isHorizontal()) { + w->setMinimumHeight(g.height() / 2); + w->setMinimumWidth(0.8 * g.height() * w->getNumEyes() ); + } else { + w->setMinimumWidth(g.width() / 2); + w->setMinimumHeight(g.width()); + } + w->update(); +} + + +static bool loadImage(QString path, QEyesImageWidget *w) { + QFile file(path + QStringLiteral("/config")); + file.open(QIODevice::ReadOnly); + QTextStream in(&file); + QString eye, pupil; + int num=1, wall=1; + + while(!in.atEnd()) { + QString line = in.readLine(); + QStringList fields = line.split(QLatin1String("=")); + const auto name = fields.at(0).trimmed(); + auto value = fields.at(1).trimmed(); + if (value.size() > 1 && value.at(0) == QChar(QLatin1Char('"'))) + value = value.mid(1, value.size() - 2); + if (name == QStringLiteral("wall-thickness")) { + wall = value.toInt(); + } else if (name == QStringLiteral("eye-pixmap")) { + eye = path + QStringLiteral("/") + value; + } else if (name == QStringLiteral("pupil-pixmap")) { + pupil = path + QStringLiteral("/") + value; + } else if (name.trimmed() == QStringLiteral("num-eyes")) { + num = value.toInt(); + } + } + + return w->load(eye, pupil, wall, num); +} + +void QEyesPlugin::settingsChanged() { + PluginSettings *_settings = settings(); + + const auto type = _settings->value(QStringLiteral("eye_type"), + internalEye).toString(); + + if (type == internalEye && !vectorEyes) { + l->removeWidget(w); + delete w; + w = new QEyesVectorWidget(); + l->addWidget(w); + w->setTransparent(true); + vectorEyes = true; + } else if (type != internalEye && vectorEyes) { + l->removeWidget(w); + delete w; + w = new QEyesImageWidget(); + l->addWidget(w); + w->setTransparent(true); + vectorEyes = false; + } + + if (type != internalEye && !vectorEyes) { + if (!loadImage(type, dynamic_cast(w))) { + l->removeWidget(w); + delete w; + w = new QEyesVectorWidget(); + l->addWidget(w); + w->setTransparent(true); + vectorEyes = true; + + _settings->setValue(QStringLiteral("eye_type"), + internalEye); + std::cerr << "ERROR: crash during load image\n" ; + } + } + + w->setNumEyes(_settings->value(QStringLiteral("num_eyes"), + QLatin1String("2")).toInt()); + realign(); +} + +QDialog * QEyesPlugin::configureDialog() { + return new QEyesConfigDialog(settings(), this); +} + +const QString QEyesPlugin::internalEye = QStringLiteral(""); diff --git a/plugin-qeyes/qeyes.h b/plugin-qeyes/qeyes.h new file mode 100644 index 000000000..9599f6da1 --- /dev/null +++ b/plugin-qeyes/qeyes.h @@ -0,0 +1,67 @@ +/* + * qeyes - an xeyes clone + * + * Copyright (C) 2022 Goffredo Baroncelli + * + * 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 2 + * 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include + +#include +#include +#include + +#include "../panel/ilxqtpanelplugin.h" + +#include "qeyesvectorwidget.h" +#include "qeyesimagewidget.h" + +class QEyesPlugin : public QObject, public ILXQtPanelPlugin +{ + Q_OBJECT + +public: + QEyesPlugin(const ILXQtPanelPluginStartupInfo &startupInfo); + + virtual QWidget *widget() override { return w0; } + virtual QString themeId() const override{ + return QStringLiteral("QEyesPlugin"); + } + virtual void realign() override; + virtual Flags flags() const override { return HaveConfigDialog ; } + virtual QDialog * configureDialog() override; + virtual void settingsChanged() override; + static const QString internalEye; + +private: + QWidget *w0; + QVBoxLayout *l; + QAbstractEyesWidget *w; + bool vectorEyes = true; + +}; + +class QEyesPluginLibrary: public QObject, public ILXQtPanelPluginLibrary +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "lxqt.org/Panel/PluginInterface/3.0") + Q_INTERFACES(ILXQtPanelPluginLibrary) +public: + ILXQtPanelPlugin *instance(const ILXQtPanelPluginStartupInfo &startupInfo) const; +}; + + diff --git a/plugin-qeyes/qeyesconfigdialog.cpp b/plugin-qeyes/qeyesconfigdialog.cpp new file mode 100644 index 000000000..1ebfd6124 --- /dev/null +++ b/plugin-qeyes/qeyesconfigdialog.cpp @@ -0,0 +1,176 @@ +/* + * qeyes - an xeyes clone + * + * Copyright (C) 2022 Goffredo Baroncelli + * + * 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 2 + * 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include "qeyesconfigdialog.h" +#include "qeyes.h" + +QEyesConfigDialog::QEyesConfigDialog(PluginSettings *sts, + ILXQtPanelPlugin *plugin_, QWidget *parent) : + QDialog(parent), _settings(sts), plugin(plugin_) +{ + + auto l1 = new QGridLayout(); + setLayout(l1); + + auto f = new QGroupBox(tr("Appearance")); + l1->addWidget(f, 10, 10, 10, 11); + + auto l = new QGridLayout(); + f->setLayout(l); + + l->addWidget(new QLabel(tr("Number of eyes")), 10, 10); + numEyesWidget = new QSpinBox(); + l->addWidget(numEyesWidget, 10, 20); + numEyesWidget->setMaximum(10); + numEyesWidget->setMinimum(1); + + l->addWidget(new QLabel(tr("Type")), 20, 10); + typesWidget = new QComboBox(); + l->addWidget(typesWidget, 20, 20); + + auto b = new QPushButton(tr("Close")); + l1->addWidget(b, 50, 10); + connect(b, &QPushButton::clicked, this, &QEyesConfigDialog::updateAndClose); + b->setDefault(true); + + b = new QPushButton(tr("Reset")); + l1->addWidget(b, 50, 20); + connect(b, &QPushButton::clicked, this, &QEyesConfigDialog::resetValue); + + setWindowTitle(tr("QEyes setting")); + + connect(numEyesWidget, qOverload(&QSpinBox::valueChanged), + this, &QEyesConfigDialog::updateValues); + connect(typesWidget, qOverload(&QComboBox::currentIndexChanged), + this, &QEyesConfigDialog::updateValues); + +} + +void QEyesConfigDialog::showEvent(QShowEvent *) { + old_num_eyes = _settings->value(QStringLiteral("num_eyes"), + QStringLiteral("2")).toInt(); + old_type_eyes = _settings->value(QStringLiteral("eye_type"), + QEyesPlugin::internalEye).toString(); + buildList(); + bool found = false; + for (const auto &key : types.keys()) { + if (old_type_eyes == types[key]) { + found = true; + break; + } + } + if (!found) + old_type_eyes = QEyesPlugin::internalEye; + + typesWidget->blockSignals(true); + numEyesWidget->blockSignals(true); + + typesWidget->clear(); + typesWidget->addItem(tr("QEyes default")); + for (const auto &key: types.keys()) + typesWidget->addItem(key); + + resetValue(); + + adjustSize(); + + typesWidget->blockSignals(false); + numEyesWidget->blockSignals(false); +} + +void QEyesConfigDialog::resetValue() { + int actIndex = 0; + int c = 1; // 0 is + for (const auto &key : types.keys()) { + if (old_type_eyes == types[key]) + actIndex = c; + c++; + } + + typesWidget->setCurrentIndex(actIndex); + numEyesWidget->setValue(old_num_eyes); +} + +void QEyesConfigDialog::updateValues(int) { + _settings->setValue(QStringLiteral("num_eyes"), + numEyesWidget->value()); + + if (typesWidget->currentIndex() == 0 || + !types.contains(typesWidget->currentText())) { + _settings->setValue(QStringLiteral("eye_type"), QEyesPlugin::internalEye); + } else { + _settings->setValue(QStringLiteral("eye_type"), + types[typesWidget->currentText()]); + } + _settings->sync(); + plugin->settingsChanged(); +} + +void QEyesConfigDialog::updateAndClose() { + updateValues(0); + done(QDialog::Accepted); +} + +void QEyesConfigDialog::buildList() { + types.clear(); + for (const char *root : { LXQT_SHARE_DIR "/panel/qeyes-types/", + "$HOMEDATA" + }) { + + if (!strcmp(root, "$HOMEDATA")) { + static char buf[1024]; + + if (!getenv("XDG_DATA_HOME")) + continue; + snprintf(buf, 1023, "%s/lxqt/panel/qeyes-types/", getenv("XDG_DATA_HOME")); + root = buf; + } + + auto dir = QDir(QLatin1String(root)); + auto list = dir.entryList(); + for (auto const & path : list) { + const auto fn = QString(QLatin1String(root) + QStringLiteral("/") + + path + QStringLiteral("/config")); + QFileInfo f(fn); + + if (fn == QStringLiteral(".") || fn == QStringLiteral("..")) + continue; + if (!f.exists()) + continue; + if (!f.isFile()) + continue; + + types[path] = + QString(QLatin1String(root) + QStringLiteral("/") + path); + } + } +} diff --git a/plugin-qeyes/qeyesconfigdialog.h b/plugin-qeyes/qeyesconfigdialog.h new file mode 100644 index 000000000..508fb7158 --- /dev/null +++ b/plugin-qeyes/qeyesconfigdialog.h @@ -0,0 +1,61 @@ +/* + * qeyes - an xeyes clone + * + * Copyright (C) 2022 Goffredo Baroncelli + * + * 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 2 + * 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include +#include + + +#include +#include +#include +#include + + +#include "../panel/pluginsettings.h" +#include "../panel/ilxqtpanelplugin.h" + +class QEyesConfigDialog : public QDialog { +private: + Q_OBJECT +public: + QEyesConfigDialog(PluginSettings *_settings, + ILXQtPanelPlugin *plugin, QWidget *parent = nullptr); +private: + QSpinBox *numEyesWidget; + QComboBox *typesWidget; + PluginSettings *_settings; + QMap types; + ILXQtPanelPlugin *plugin; + + void buildList(); + void resetValue(); + void updateAndClose(); + + int old_num_eyes; + QString old_type_eyes; + + void showEvent(QShowEvent *) override; + +public slots: + void updateValues(int); + +}; diff --git a/plugin-qeyes/qeyesimagewidget.cpp b/plugin-qeyes/qeyesimagewidget.cpp new file mode 100644 index 000000000..fae8cc2bf --- /dev/null +++ b/plugin-qeyes/qeyesimagewidget.cpp @@ -0,0 +1,131 @@ +/* + * qeyes - an xeyes clone + * + * Copyright (C) 2022 Goffredo Baroncelli + * + * 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 2 + * 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "qeyesimagewidget.h" + + +bool ImageStretcher::load(QString fn) { + if (fn.toLower().endsWith(QString::fromUtf8(".svg"))) { + svg = true; + if (!svgrender.load(fn)) + return false; + } else { + if (!origImage.load(fn)) + return false; + svg = false; + } + strechedImage = QPixmap(); + return true; +} + +QPixmap & ImageStretcher::ImageStretcher::getImage(int w, int h) { + if (w == strechedImage.width() && h == strechedImage.height()) + return strechedImage; + if (svg) { + strechedImage = QPixmap(w, h); + strechedImage.fill(QColor(0,0,0,0)); + QPainter painter(&strechedImage); + svgrender.render(&painter, strechedImage.rect()); + } else { + strechedImage = origImage.scaled(w, h, + Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + } + + return strechedImage; +} + +int ImageStretcher::origWidth() { + if (svg) + return svgrender.viewBox().width(); + else + return origImage.width(); +} + +int ImageStretcher::origHeight() { + if (svg) + return svgrender.viewBox().height(); + else + return origImage.height(); +} + +int ImageStretcher::strechedWidth() { + return strechedImage.width(); +} +int ImageStretcher::strechedHeight() { + return strechedImage.height(); +} + +void QEyesImageWidget::drawEye(QPainter &painter, int x, int y, int dx, int dy) { + painter.drawPixmap(x, y, background.getImage(dx, dy)); +} +void QEyesImageWidget::drawPupil(QPainter &painter, int x, int y) { + + auto & img = pupil.getImage( + pupil.origWidth() * background.strechedWidth() / background.origWidth(), + pupil.origHeight() * background.strechedHeight() / background.origHeight()); + + painter.drawPixmap(x - img.width() / 2, y - img.height() / 2, img); +} + +void QEyesImageWidget::eyeBorder(float &bx, float &by) { + bx = borderXStreched; + by = borderYStreched; +} + +bool QEyesImageWidget::load(const QString &eye, const QString &pupil_, + int wall, int num) { + + if (num < 1 || num > 10) + return false; + + borderY = borderX = wall; + if (!pupil.load(pupil_)) + return false; + if (!background.load(eye)) + return false; + numEyes = num; + return true; +} + +void QEyesImageWidget::paintEvent(QPaintEvent *event) { + if (width() != oldWidth || height() != oldHeight) { + const auto dx = width() / numEyes; + background.getImage(dx, height()); + + borderYStreched = borderY * background.strechedHeight() / background.origHeight(); + borderXStreched = borderX * background.strechedWidth() / background.origWidth(); + + oldWidth = width(); + oldHeight = height(); + } + QAbstractEyesWidget::paintEvent(event); +} + diff --git a/plugin-qeyes/qeyesimagewidget.h b/plugin-qeyes/qeyesimagewidget.h new file mode 100644 index 000000000..e01c5d428 --- /dev/null +++ b/plugin-qeyes/qeyesimagewidget.h @@ -0,0 +1,58 @@ +/* + * qeyes - an xeyes clone + * + * Copyright (C) 2022 Goffredo Baroncelli + * + * 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 2 + * 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#pragma once + +#include +#include "qeyeswidget.h" + + +class ImageStretcher { + bool svg; + QSvgRenderer svgrender; + QPixmap origImage, strechedImage; +public: + bool load(QString fn); + QPixmap &getImage(int w, int h); + int origWidth(); + int origHeight(); + int strechedWidth(); + int strechedHeight(); +}; + +class QEyesImageWidget : public QAbstractEyesWidget { +private: + void drawEye(QPainter &painter, int x, int y, int dx, int dy) override; + void drawPupil(QPainter &painter, int x, int y) override; + virtual void eyeBorder(float &bx, float &by) override; + void paintEvent(QPaintEvent *event) override; + + ImageStretcher pupil, background; + + int oldWidth = -1, oldHeight = -1; + float borderY = 0, borderXStreched = 0; + float borderX = 0, borderYStreched = 0; + +public: + //QEyesImageWidget(const QString &path = QString(), QWidget *parent = nullptr); + QEyesImageWidget(QWidget *parent = nullptr) : QAbstractEyesWidget(parent) {} + bool load(const QString &eye, const QString &pupil, int wall, int num); +}; diff --git a/plugin-qeyes/qeyesplugin.desktop b/plugin-qeyes/qeyesplugin.desktop new file mode 100644 index 000000000..f8645130f --- /dev/null +++ b/plugin-qeyes/qeyesplugin.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Type=Service +ServiceTypes=LXQtPanel/Plugin +Icon=user-desktop + +Name=QEye +Comment=QEye diff --git a/plugin-qeyes/qeyesvectorwidget.cpp b/plugin-qeyes/qeyesvectorwidget.cpp new file mode 100644 index 000000000..25912abb8 --- /dev/null +++ b/plugin-qeyes/qeyesvectorwidget.cpp @@ -0,0 +1,72 @@ +/* + * qeyes - an xeyes clone + * + * Copyright (C) 2022 Goffredo Baroncelli + * + * 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 2 + * 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include +#include +#include + +#include "qeyesvectorwidget.h" + +QEyesVectorWidget::QEyesVectorWidget(QWidget *parent) : QAbstractEyesWidget(parent) {} + +void QEyesVectorWidget::drawEye(QPainter &painter, int x, int y, int dx, int dy) { + + float w = width() / numEyes < height() ? width() / numEyes: height(); + w *= lineWidth; + if (w < lineMinWidth) + w = lineMinWidth; + + painter.setPen(borderColor); + auto pen = painter.pen(); + pen.setWidth(w); + painter.setPen(pen); + QRadialGradient grad(x + dx / 2.0, y + dy / 2.0, std::max(dx, dy)); + grad.setColorAt(0, centerColor); + grad.setColorAt(1, peripheralColor); + painter.setBrush(grad); + painter.drawEllipse(x + w, y + w, dx - 2.0 * w, dy - 2.0 * w); + +} +void QEyesVectorWidget::drawPupil(QPainter &painter, int x, int y) { + float w = width() / numEyes < height() ? width() / numEyes: height(); + w *= lineWidth; + if (w < lineMinWidth) + w = lineMinWidth; + const auto psize = w * pupilSize; + + auto pen = painter.pen(); + pen.setWidth(1); + painter.setBrush(QColor(pupilColor)); + painter.setPen(QColor(pupilColor)); + + painter.drawEllipse(QPoint(x, y), (int)(psize / 2.0), (int)(psize / 2.0)); +} + +void QEyesVectorWidget::eyeBorder(float &bx, float &by) { + float w = width() / numEyes < height() ? width() / numEyes: height(); + w *= lineWidth; + if (w < lineMinWidth) + w = lineMinWidth; + const auto psize = w * pupilSize; + + bx = by = 1.5 * w + psize/2; +} diff --git a/plugin-qeyes/qeyesvectorwidget.h b/plugin-qeyes/qeyesvectorwidget.h new file mode 100644 index 000000000..bc53edf99 --- /dev/null +++ b/plugin-qeyes/qeyesvectorwidget.h @@ -0,0 +1,48 @@ +/* + * qeyes - an xeyes clone + * + * Copyright (C) 2022 Goffredo Baroncelli + * + * 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 2 + * 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#pragma once + +#include "qeyeswidget.h" + +class QEyesVectorWidget : public QAbstractEyesWidget +{ + Q_OBJECT + + float lineWidth = 0.08f; + int lineMinWidth = 1; + float pupilSize = 3.0f; /* relative to line width */ + QString borderColor = QString::fromUtf8("black"); + QString pupilColor = QString::fromUtf8("black"); + QString centerColor = QString::fromUtf8("white"); + QString peripheralColor = QString::fromUtf8("light-gray"); + + virtual void drawEye(QPainter &painter, int x, int y, int dx, int dy) override; + virtual void drawPupil(QPainter &painter, int x, int y) override; + virtual void eyeBorder(float &bx, float &by) override; + +public: + QEyesVectorWidget(QWidget *parent = nullptr); + void setBorderColor(const QString &color) { borderColor = color; } + void setCenterColor(const QString &color) { centerColor = color; } + void setPupilColor(const QString &color) { pupilColor = color; } + void setPeripheralColor(const QString &color) { peripheralColor = color; } +}; diff --git a/plugin-qeyes/qeyeswidget.cpp b/plugin-qeyes/qeyeswidget.cpp new file mode 100644 index 000000000..9db035475 --- /dev/null +++ b/plugin-qeyes/qeyeswidget.cpp @@ -0,0 +1,143 @@ +/* + * qeyes - an xeyes clone + * + * Copyright (C) 2022 Goffredo Baroncelli + * + * 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 2 + * 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "qeyeswidget.h" + +QAbstractEyesWidget::QAbstractEyesWidget(QWidget *parent) : QWidget(parent) { + connect(&timer, &QTimer::timeout, this, &QAbstractEyesWidget::timeout); + setMouseTracking(true); + if (!underMouse()) { + timer.setInterval(timerTimeout); + timer.start(); + } + //setContextMenuPolicy(Qt::CustomContextMenu); + + //connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), + // this, SLOT(showContextMenu(const QPoint &))); +} + +QAbstractEyesWidget::~QAbstractEyesWidget() { + timer.stop(); +} + +void QAbstractEyesWidget::leaveEvent(QEvent *) { + timer.setInterval(timerTimeout); + timer.start(); +} + +void QAbstractEyesWidget::enterEvent(QEvent *) { + timer.stop(); +} + +void QAbstractEyesWidget::mouseMoveEvent(QMouseEvent *) { + repaint(); +} + +void QAbstractEyesWidget::paintEvent(QPaintEvent *) { + QPainter painter(this); + + painter.setRenderHint(QPainter::Antialiasing, true); + if (!transparent) { + painter.fillRect(0, 0, width(), height(), bgColor); + } else { + painter.fillRect(0, 0, width(), height(), Qt::transparent); + } + const auto dx = 1.0 * width() / numEyes; + + for (int i = 0 ; i < numEyes ; i++) + drawEye(painter, i * dx, 0, dx+0.9, height()); + + const auto pos = mapFromGlobal(QCursor::pos()); + float borderX, borderY; + eyeBorder(borderX, borderY); + for (int i = 0 ; i < numEyes ; i++) { + + /* center of the eye */ + const auto x0 = i * dx + dx / 2 ; + const auto y0 = height() / 2; + + /* radius of the ellipse */ + const float ry = height() / 2 - borderY; + const float rx = dx / 2 - borderX; + + /* angle */ + const float dx = pos.x() - x0; + const float dy = pos.y() - y0; + + /* + * dy y ry sin(alpha) + * ---- = --- = ---- * ------------- + * dx x rx cos(alpha) + * + * + * dy / ry sin(alpha) + * --------- = ------------- = tan(alpha) + * dx / rx cos(alpha) + * + * + * alpha = atan2( dy/rx, dx/rx) + * + */ + + const auto alpha = atan2(dy/ry, dx/rx); + + /* pupil center */ + auto y = ry * sin(alpha); + auto x = rx * cos(alpha); + + /* + * if the cursor is inside the eye, the pupil position is + * the cursor + */ + if (y < 0 && dy < 0 && dy > y) + y = dy; + else if (y > 0 && dy > 0 && dy < y) + y = dy; + if (x < 0 && dx < 0 && dx > x) + x = dx; + else if (x > 0 && dx > 0 && dx < x) + x = dx; + + //painter.drawEllipse(QPoint(x0 + x, y0 + y), psize / 2, psize / 2); + drawPupil(painter, x0 +x, y0 + y); + + } + +} + +void QAbstractEyesWidget::timeout() { + const auto pos = mapFromGlobal(QCursor::pos()); + if (pos == previousPos) + return; + previousPos = pos; + + update(); +} diff --git a/plugin-qeyes/qeyeswidget.h b/plugin-qeyes/qeyeswidget.h new file mode 100644 index 000000000..85118dafe --- /dev/null +++ b/plugin-qeyes/qeyeswidget.h @@ -0,0 +1,65 @@ +/* + * qeyes - an xeyes clone + * + * Copyright (C) 2022 Goffredo Baroncelli + * + * 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 2 + * 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 Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#pragma once + +#include +#include +#include +#include + +class QAbstractEyesWidget : public QWidget +{ + Q_OBJECT + + QTimer timer; + QPoint previousPos; + int timerTimeout = 100; /* unit ms */ + QString bgColor = QString::fromUtf8("white"); + bool transparent = false; + +private slots: + void timeout(); + +protected: + int numEyes = 3; + +private: + void leaveEvent(QEvent *) override; + void enterEvent(QEvent *) override; + void mouseMoveEvent(QMouseEvent *) override; + +protected: + virtual void drawEye(QPainter &painter, int x, int y, int dx, int dy) = 0; + virtual void drawPupil(QPainter &painter, int x, int y) = 0; + virtual void eyeBorder(float &bx, float &by) = 0; + + void paintEvent(QPaintEvent *event) override; + +public: + QAbstractEyesWidget(QWidget *parent = nullptr); + ~QAbstractEyesWidget(); + void setNumEyes(int n) { numEyes = n; } + int getNumEyes() { return numEyes; } + void setBGColor(const QString &color) { bgColor = color; } + void setTransparent(bool t = true) { transparent = t; } + +}; diff --git a/plugin-qeyes/resources/qeyes.desktop.in b/plugin-qeyes/resources/qeyes.desktop.in new file mode 100644 index 000000000..86f4214d0 --- /dev/null +++ b/plugin-qeyes/resources/qeyes.desktop.in @@ -0,0 +1,5 @@ +[Desktop Entry] +Type=Service +ServiceTypes=LXQtPanel/Plugin +Icon=qeyes + diff --git a/plugin-qeyes/translations/qeyes.desktop.yaml b/plugin-qeyes/translations/qeyes.desktop.yaml new file mode 100644 index 000000000..688832108 --- /dev/null +++ b/plugin-qeyes/translations/qeyes.desktop.yaml @@ -0,0 +1,2 @@ +Desktop Entry/Name: "QEyes" +Desktop Entry/Comment: "A follow the mouse demo" diff --git a/plugin-qeyes/translations/qeyes.ts b/plugin-qeyes/translations/qeyes.ts new file mode 100644 index 000000000..479169a06 --- /dev/null +++ b/plugin-qeyes/translations/qeyes.ts @@ -0,0 +1,42 @@ + + + + + QEyesConfigDialog + + + Appearance + + + + + Number of eyes + + + + + Type + + + + + Close + + + + + Reset + + + + + QEyes setting + + + + + QEyes default + + + + diff --git a/plugin-qeyes/types/Bizarre/Bizarre-eye.png b/plugin-qeyes/types/Bizarre/Bizarre-eye.png new file mode 100644 index 0000000000000000000000000000000000000000..76a21ce31ca5d74254f1d5e3633b71fc6df1b62b GIT binary patch literal 796 zcmV+%1LOROP)$)Nf#9jxnXYi*5Yo4J#+En4+F#7H@}&A z^WIyJRWuT*ZNNA%3Y36;;3x12cnLhJ#rjpZwO$w4M&JrCW^G>vhE^o}9SzcZyNfM-#^!D~r>@9NZ{v}?$eP)+V)?$5k1vC$w zzV@2M#jhku((QHtNGUmZ`viv{%u$V02iVJ9x%OpXh{XqUR4NsG-$zP`@B0pvrYT91 zkfy1#9lCQeAC8e)tlwGalX9%bj(>R1!u$eZ7!rn|gL6bcjy1&YO@n=7T9j}1+dBpf?%-iBaY0HfttyWmSH34)*l zY@rqy1cCFl+Ik_f(@_DGs*&R1iQD+T?;gm)^UyrZ`sUR>TuA`^KC+1&s`tfl*VjjyrVf-O z35`a>RaCuRr_pG*Z`Rl9*}3~vBgL6m_X}Fhfsb3Zbij-;XstV-T5F6k9dN6`!9h2d zz$4(Sji)gNAq3E>AStEG%lwAM7qO#;*9ShJ~Zd%S%+0J|%d6_75Pya{)wAQRToZd;Q8HzLIw z;Pl*_1KE++y@~biKwbN()f8maNX?XEJ(jn(d*<(&DaU&3W{xujne66Si}fD<@gG&| avi=u@;Dl+XZzW#<00003J^z literal 0 HcmV?d00001 diff --git a/plugin-qeyes/types/Bizarre/Bizarre-pupil.png b/plugin-qeyes/types/Bizarre/Bizarre-pupil.png new file mode 100644 index 0000000000000000000000000000000000000000..c4fd02d92e62c5a9bd860f7a4eb73281a27d3fe1 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1g!3HF2ETW&z~g*z`XRPEGc*q$*3fa-+2Zx3M^*b%xX|IQI6DQcnk#7^n0sa|)-j$w pZRY2){2hg&7901fSMTMhVDP@pQ!~MEUoy}{22WQ%mvv4FO#t{HE}j4Y literal 0 HcmV?d00001 diff --git a/plugin-qeyes/types/Bizarre/config b/plugin-qeyes/types/Bizarre/config new file mode 100644 index 000000000..20f729e91 --- /dev/null +++ b/plugin-qeyes/types/Bizarre/config @@ -0,0 +1,4 @@ +wall-thickness=2 +num-eyes = 3 +eye-pixmap = "Bizarre-eye.png" +pupil-pixmap = "Bizarre-pupil.png" diff --git a/plugin-qeyes/types/Bloodshot/Bloodshot-eye.png b/plugin-qeyes/types/Bloodshot/Bloodshot-eye.png new file mode 100644 index 0000000000000000000000000000000000000000..57b84290c5e2841a7fb17ab49ffc8a2b68978f7b GIT binary patch literal 1845 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 DNV$dD literal 0 HcmV?d00001 diff --git a/plugin-qeyes/types/Brown-EyedGirl/brown-pupil.png b/plugin-qeyes/types/Brown-EyedGirl/brown-pupil.png new file mode 100644 index 0000000000000000000000000000000000000000..d05177b5a8dac3a98bc56958ec3031620c0401c3 GIT binary patch literal 943 zcmV;g15o^lP)0~V{qCP6|p1<#MAjZ`tt&&-g^=h@!h=gRmveVGhN zN#fVzV{*EV1YF5xIjq-byN}`gGd(_sG3Gk2=)#R z$mu#Krb!`{A{q)Y(AURNy*|@*-EaK5rd|DLbkz9t#tlyQ_V5P+gjJQhNq{IWtoKs58hz_R|xJrdc@a5L;UjW z8C}N#@Ov=n%jN^|>2Kn~(ZG3(|d0i*3 z>-@OAEgF`!F2z+fq{#BikyL8f5rX#(gD-F1ByJe&uB@>(-mSir|VdbgJ)T2p%95&j;CvD7>NXQI()aZ#D1+dcidfp4zb Rt&;!%002ovPDHLkV1l-<$qN7g literal 0 HcmV?d00001 diff --git a/plugin-qeyes/types/Brown-EyedGirl/config b/plugin-qeyes/types/Brown-EyedGirl/config new file mode 100644 index 000000000..71398391f --- /dev/null +++ b/plugin-qeyes/types/Brown-EyedGirl/config @@ -0,0 +1,4 @@ +wall-thickness = 10 +num-eyes = 2 +eye-pixmap = "brown-eye.png" +pupil-pixmap = "brown-pupil.png" diff --git a/plugin-qeyes/types/CMakeLists.txt b/plugin-qeyes/types/CMakeLists.txt new file mode 100644 index 000000000..c02273355 --- /dev/null +++ b/plugin-qeyes/types/CMakeLists.txt @@ -0,0 +1,11 @@ +install(DIRECTORY + . + DESTINATION "${LXQT_SHARE_DIR}/panel/qeyes-types" + COMPONENT Runtime + PATTERN "CMake*" + EXCLUDE + PATTERN "cmake*" + EXCLUDE + PATTERN "Makefile" + EXCLUDE +) diff --git a/plugin-qeyes/types/Crystal/config b/plugin-qeyes/types/Crystal/config new file mode 100644 index 000000000..60a980668 --- /dev/null +++ b/plugin-qeyes/types/Crystal/config @@ -0,0 +1,4 @@ +wall-thickness = 3 +num-eyes = 2 +eye-pixmap = "crystal-eye.svg" +pupil-pixmap = "crystal-pupil.svg" diff --git a/plugin-qeyes/types/Crystal/crystal-eye.svg b/plugin-qeyes/types/Crystal/crystal-eye.svg new file mode 100644 index 000000000..789d6a1cb --- /dev/null +++ b/plugin-qeyes/types/Crystal/crystal-eye.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugin-qeyes/types/Crystal/crystal-pupil.svg b/plugin-qeyes/types/Crystal/crystal-pupil.svg new file mode 100644 index 000000000..a32f13ef8 --- /dev/null +++ b/plugin-qeyes/types/Crystal/crystal-pupil.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugin-qeyes/types/Default-tiny/Default-tiny-eye.png b/plugin-qeyes/types/Default-tiny/Default-tiny-eye.png new file mode 100644 index 0000000000000000000000000000000000000000..474e0cbd4a2d0abe0acb43de687fc2e878a81313 GIT binary patch literal 807 zcmV+?1K9kDP)+0RxpWhBUlTAwLfNdCXH9<;7E}N-(uc-pZ9n( z%mX%z5JDP_#``b~CqWRTj^mgh2+}YNCyhqqJt2hPTjqJ5?DcvVLI_O=F+vCifHvmkx+r6NaQUD+T zu(!82Op@f!t*tG3c6Mfuj*jpa2LMu*rMkr0D#sSZ+W1UVzF2>o#k@L2_c}ATE}rvi7^J(b-@_Jrk_#@LI{@2C1=%pSZiUe zg)s)kn6Ek-V~8=vRymciTCJw?Jm*?#R8mTx_cy1l)1I-L%-x3{Z{g4UWSrEq_LkMr|$lx1lc zV?RGXKYyVBuv)GD>U28a&1SP7<2VNA9L;7E)>@=#N+y#DE-x>UBngg>kAI!bX203Z lH~ZEyc+-C`ga5mR{smJNt3fYF3orlx002ovPDHLkV1jqWYL);1 literal 0 HcmV?d00001 diff --git a/plugin-qeyes/types/Default-tiny/Default-tiny-pupil.png b/plugin-qeyes/types/Default-tiny/Default-tiny-pupil.png new file mode 100644 index 0000000000000000000000000000000000000000..84c3bd98a08aecdea833900f5eb7d5ee0fe2c3ed GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=mUKs7M+SzC{oH>NL6WwfE{-7; zb9~QiT;_kV(?c?d;sEBTIM2x=(t! f{On@&`_H+5=Lj9@pBpU%G>E~|)z4*}Q$iB}AfGAr literal 0 HcmV?d00001 diff --git a/plugin-qeyes/types/Default-tiny/config b/plugin-qeyes/types/Default-tiny/config new file mode 100644 index 000000000..edbbee34f --- /dev/null +++ b/plugin-qeyes/types/Default-tiny/config @@ -0,0 +1,4 @@ +wall-thickness = 3 +num-eyes = 2 +eye-pixmap = "Default-tiny-eye.png" +pupil-pixmap = "Default-tiny-pupil.png" diff --git a/plugin-qeyes/types/Default/Default-eye.png b/plugin-qeyes/types/Default/Default-eye.png new file mode 100644 index 0000000000000000000000000000000000000000..ea09156c4865803c883654659ac95f5edfc57de5 GIT binary patch literal 1357 zcmV-T1+w~yP)u)yk;^LwzEG$%!NJOQiq<9TuHroz= z#7O}z@TJWo9~>O4U07J~?aqmb2~|)~;E|9lULy2C9O9(_A3U^qgr;Mxk{4AM5GOU!~;i)9n@CrlQfPN={BT4V#HA?3!aUvOPXN zDzxkCYo$*=39U5W=bG=tto-=+_(wTgUte#Cxe_G6zSO9K9J4R|u>jynA)g`FrFbJJ z`}+F46-yw3%hJm}=b>3KXy8d9pEEo>{N>)>-e+>Mw6xSKwFHsi=m)J_`r|TT3_K~| z1Fv&&aq*p;XlZFNLk1Eoj5v`507zVNffwYy3xdtTjYZ7_pk)#^vGijswY}-U8#y~W z`-0g(mz9;pkQ2ZL$F9f8h8>Qb4dF4%7;4~30dM5|{5&d+nVFg1@d~(000NO( zCW33u3XstDHvsxa;=%@A=l&i~NAE>Cu`f0HEHz@;hh6#skz>1$F=8ELA0z~$CJ8l4 z%|;tFW2l4hP1W?H&igt)doc)_fYjL4Bt`b@!%iP+iDM@KUMDLn>wh^B1VS*(NpccH zbB?~Y#=I2pI=Q*I*V1@%a}%=y0^7uLI+2p{L0$wLCFYhmDJUTk^0>el_L}Kco zD##>&D+RnxPEO7r(x{(A4LJi7Ngy6EaeylYydeKc8kd%q%}CRX$?4AoWa-iG?d??u2M2Uh znrC10)WBfMj*c$Hx6l*>?C$RRN*-3~FgxNUF|Z|%w{lG2jlzC$n46nZ+1c5q0$jB$ zIpQE(IZJgeb& zHvYW$t_H`(#>Q{(R>>e}0PXDT7;x_HAPsW(*~GvDuEY%O$9q55ueq+?Fz)K=s=K_r zY&6EOzxMq+ZUXqSpdC!lvI6<>o-U3d z6^zLV4or4-cK;jiEO+2pwy-8wMKvMKB81UH(2QpiJM#p;9IgvTw@5AsTj-teVd1L> zc}D^o(jEu9tzfue+rpu?peemY#PR9;iEq*#IWuRmUVO+?yvb~#1PjBV>0uKmKhj+b Pw2Hyg)z4*}Q$iB}LB}^k literal 0 HcmV?d00001 diff --git a/plugin-qeyes/types/Default/config b/plugin-qeyes/types/Default/config new file mode 100644 index 000000000..325abdcba --- /dev/null +++ b/plugin-qeyes/types/Default/config @@ -0,0 +1,4 @@ +wall-thickness = 6 +num-eyes = 2 +eye-pixmap = "Default-eye.png" +pupil-pixmap = "Default-pupil.png" diff --git a/plugin-qeyes/types/Digital/Digital-eye.png b/plugin-qeyes/types/Digital/Digital-eye.png new file mode 100644 index 0000000000000000000000000000000000000000..4c24a239e68fa4931099de2d17ecc0c91de83382 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9a!3HF~Pw#sVq*#ibJVQ8upoSx*1IXXt>Eak- z(VLu-kdPoyn3nPUYHCNy)AR}H2bk;XQ!0M^G&;P=yjpVAg{KmUJX@>U{{P@e*Z zu+?x_+3`@*kZr-s$|k*IM-H7kpU~vt7KX@QM+nZOJm_ zoLB7e61`F`ECG6n6^^UqmL|2Ozev(4ua;1eknqq}w4a+kqhIgbkpl+~C_FlJ;p2Dd t!`V)4fBqi(FspH5f4u@pObhHwBu4M$1`kgx0M;us<^ zH928{=` literal 0 HcmV?d00001 diff --git a/plugin-qeyes/types/Digital/config b/plugin-qeyes/types/Digital/config new file mode 100644 index 000000000..6749e5b1e --- /dev/null +++ b/plugin-qeyes/types/Digital/config @@ -0,0 +1,4 @@ +wall-thickness=2 +num-eyes = 4 +eye-pixmap = "Digital-eye.png" +pupil-pixmap = "Digital-pupil.png" diff --git a/plugin-qeyes/types/EyelashLarge/config b/plugin-qeyes/types/EyelashLarge/config new file mode 100644 index 000000000..ec90166c4 --- /dev/null +++ b/plugin-qeyes/types/EyelashLarge/config @@ -0,0 +1,4 @@ +wall-thickness = 19 +num-eyes = 2 +eye-pixmap = "eye.png" +pupil-pixmap = "pupil.png" diff --git a/plugin-qeyes/types/EyelashLarge/eye.png b/plugin-qeyes/types/EyelashLarge/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..70760ebfe0766287cb1d38135f548acdf586ad29 GIT binary patch literal 3321 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 Di6I-X literal 0 HcmV?d00001 diff --git a/plugin-qeyes/types/EyelashLarge/pupil.png b/plugin-qeyes/types/EyelashLarge/pupil.png new file mode 100644 index 0000000000000000000000000000000000000000..ce07fd800d443569e8eb0caea5882a90e3ae583e GIT binary patch literal 1019 zcmV@){go*dvv-${o09U{t0#D2PRBZGD2f8CsEX}Q z2m7rSNWem77{m#Sl+%M$So41Wp*Naauq*6G?1*4S*>B|Mk{RLo7)o&ti^N6V>OdJi zg_aQkxMM&lg_=dsk|Jmb96ZVpDezAAwzTiqClz%voKY_*^C@Oq?_o&{u){KNHdXXL z&!hA80@~MiF&LgjWcVZqO~Mt!Xo>^Spp}Lfe9x6-e=3q7jGT?2r*UY(My#De`Ms}@ z-);Q=u_AEwCZ^y265+=mLB-Nxbav4d2ng>!%RY28`C9svdS)->BWE^X$w_oBn7<7VvJKn@M;vH_%Ps6l>fes2dQ7b3FglZ$TAT0 zk|68}_<|lMXw~=3-6~pJD`;-tK|k;SReqq!Y~(Qp^6kj|#4Mh(j9*Tpy1WvsLt5AYpGk;}Yp~L%zY0U~ONlVHAF-^n~ zDU4K{!%HtG@WzV@o)Kekw}#NQr_hzgv8|{mkqx*z*Z$&iiLqvDqxw?iKJdosaZ{m8Lu) zvEsM}UXj833dCj@Fp}7Bq*13?{O0>uBDZ|G`|0^|VdcX^Ek4I*v*V)lSwfJWR+J&| zVhne zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00yy1L_t(Y$DLPuRFq{J|GnRg z#6>_v26P!12!s%nLU$!^C$&sDXbDQJCLO{=1=gkYvM!sY*)cCHmbY4sP3@edLNoyv zEHN|(tQ;H#jGGxU;0&Y8a1rP7>>teFIDUMf2rt~6A?RcJa^r`>>b-}pFe)|2m^qc8;a=|&LASTch8RBh{zoPYO9q10F7GZ zl(TDF!Sj*9>jB{MrSI|8m&X7Ar%!#IkbC%md?1}1k2he9QKw$l`c_h+oQTGRhD87X zc5dH-;xh%J&TwprJ&RY9-2hg(gJA@y}NAw<-Xnw)SiwdUH2Y@&gN$z&v5$35D= zcb6$5fl|BrD~;uN3GcoCL0j_SYAdG zgS==(LTn=ujRt_vj~sMgykOQCW=oclnv`|7t!3MX*`L5q765<%Fw5Lu{Co{zffzM6 zs<3(eU+%iPx}}4R4icYn$7*Y8AhPrg!oz}Q)YskocumGe$FT4S0fhs}`V8`tjD^2U z=2BX8YRRuP%Ec}tM|S&+^M6%z{#+3Po*s`t>DXi85tBkw(b=11$XOugz>Ay-s6Zx@azymXwSaxw|-gFfV4I?}YG4JXS&=OeC;o0L*ZB%9Z_G zc^P66djYX8PH)p{)i&PPT5c4u-fB4?9#~)`WmP5pIc`CZSmNy?@$m2jU>1l!1S(NT zW?J2 z2!ILxGAR=~IXYYN!-f&Up%6Us&ed%s#EfG+4L6i9VSrB%>|_LvV-WZDJQzmeX_)=g zN7~!l3$a$K{XZ*gsLc$twrIfB|5`f?0vg0qzUt-BR9|NjH`Fxdx2+VVy2;z6e!^fu7h zp~EtF)8&h$l({yA0DxnRDHp~ioZR=XY)kksM2qc{{`h-D2IPO0hoF$qE&XTj)#;gk z>+0@C*>}YNMhN6Ys5))m;c%{`6lOEJ>u=WNocQ8D;O;d44vym*{bhk^#f61vZ*Qe1 zPdbC)abj(IJMvF_V{~;NwQkS8!<`As-gxx4s^zxJs^rA4x4*lQOeUR8{Q2@=&4n%Q zThK#qr>~@cY{)3Lo>u$Em5Phj3z+N6v!;BX{o%W0HtXyX-XTEHHye%jY17-Ol(J%J zEfIMFfLh)9xWh+tKe3WIEt)r@Y-8pcYN%IOh`Izk(39DGpK7WrXmxU8Z+dFdH6j`X z0Bx-*{E;_XxHG1_zM8*i?W1Hi3YjgZL#g^8^9SYKa15D|*bafBxAa^_#2Kny1g0W3=A(_{RSLjZ`41w%$w}00000NkvXXu0mjf DNV$dD literal 0 HcmV?d00001 diff --git a/plugin-qeyes/types/Green-EyedGirl/green-pupil.png b/plugin-qeyes/types/Green-EyedGirl/green-pupil.png new file mode 100644 index 0000000000000000000000000000000000000000..bc84e50fbfeab8b9bd7a9774b39c898cb78d6e28 GIT binary patch literal 950 zcmV;n14;aeP)e zH_uSc=@C&4O-KoO$~m(#zU$*z{hH_Ym#w;aw{JL>TvRak4FCfCqgYY7s$5LXC7;g~ z!x=dgv_z^u?jq+D%mc&e?zIk#&E~9qVlDh-MD0S7Ufm=)i;LOe zJo#jnX0J(5lZXzfqB=GZ7o)*hr`cO|+jb?Kkr8`!6Xlu2)p$8QKk@c+B z3OI)r`SK8U(?TifM3OS2?>vh#tltQyqLHAK(I?WcJypDPWs=&_5iwCFDaN_+>PPg? z8~_9@$jhI+NikDG52>t56|{?~qSJQDg70}##zr$#KRM=dX_8<##5dQ!e1ZYImdl+F zZqYG1{IK*B&EHM{g7p2eppGRnr8matv<$vmyUpQFmF8B1e`g*T9Pb`6IzB=`77^tT zK~2gE=6;*gr5fI$O)51AuE+ni^3@{ix9<@U0*Go5d=Naxs~HbZ+5LHwhf5pm$#uem z@_(>0q;dVj_pm!Q_OZ#(^axTaQWM;^y=+#y4z5pkr_J`Q3a`w~5G|-raA+{XyI;Id zm=M}5`bv^WwFaDC&83*0{f}QQN8#8`6-a z2$k>e(fH+XrdPK%L@^e^Gu>TL5>`FOn^8v-cmbal27#zZDPG|I;yT)J0;lhA=hJ!4 z*6MGyA2e^u1qIP}9r93-*cif@?TRBo`BmMvJ_j<>0tV_rYm@^Rv5qR@Izo zEFRu`Z0x_^C>K=BgEo>PMFcHW*3Ku(e&5T6(^2dbv)0*et@LW0Ww+y+1DA6&7OMdK Y0lp4;x)mFqNB{r;07*qoM6N<$f~@w!P5=M^ literal 0 HcmV?d00001 diff --git a/plugin-qeyes/types/Horrid/config b/plugin-qeyes/types/Horrid/config new file mode 100644 index 000000000..1c0137bae --- /dev/null +++ b/plugin-qeyes/types/Horrid/config @@ -0,0 +1,4 @@ +wall-thickness = 6 +num-eyes = 1 +eye-pixmap = "horrid_eye.png" +pupil-pixmap = "horrid_pupil.png" diff --git a/plugin-qeyes/types/Horrid/horrid_eye.png b/plugin-qeyes/types/Horrid/horrid_eye.png new file mode 100644 index 0000000000000000000000000000000000000000..eebf16c516bf23c2b3f65fb1f93d4b16865c3262 GIT binary patch literal 3092 zcmV+v4D0iWP)B!*-;|q)Cowi7nD(v)S)@bUp9A zSu`axRwl8dLC)%;>Q;T{oI3Y+PC?7GQkH^$yUA20Be@X(z~99~h!7%@q;a0wb`c?z z&E+scLI?<9tJP99&2^k4Nf=|85KYrmMKKIR)3i8_DW$&e$4SB%3kHKUO_L-M01%8Z z#(~=-0DzswP7nvjp#T6y$ta3BK0cYZEK2Fj%#3N8gpke6%~PjN)$8?wqU`VQXKb5u zP6(+~Dko2#ER{;PZ{MDroJ`ZS)oQJ+t&Nt;`Fy@stF_y0-*MtN#sIK5Rv{#h#fm9a z4Wp3DS%rcC=TmfidQJUa?r@ zobT@Lx~`kg=Pk<$!_Y8{d-v`!#?mx(948FJiJbX2Y=np`XA6bVLcz}Eau{RBae^S& z-Q7)+B$vw}gzntA!#US=-7t)~xw)~iv9YnScDt=83S+F(>8!4<&dkhUjB~kMuh-k& z-fp#8gpedj!Y~YiAdX|sIRJnhix^R=O-xkA#>OQ{3d8X5@Q^X)`#yxQQmJ%0old7S zIXStwxL7Wi0RX*TFG-U1^>x>EYqgqbn!fL6GMTTw`YM;psj4c3$mjEM9Cy22P1A%B zg+k%(-HmUv0RXz5x9yQmr{lWrU@%D2LD*=#b#mX?+l7Z-is-`(Bq^?IJ? zxvr~enyRXv=OKg$A$RZI?RLAIbJH{xMS&0!LNb|*X_}0&dcFSRAOFYifB!!~h;P_J zaL?C`ksTQlVgDjD-*vFJ64+nP=A4)^6Rp1pruBSh#rc;?&fXuIm`% zPN#Etc$g%~i!Z*|YPGIhxw5{#-tYH=z()v4l49F-sZ@IK;J)vB2vGn5td^@gjh!G4 zAw(EcLKFzGENhZPO*5;ix)5S!X6D?vbM1EfqmMr7_xlqQ6K}ln#@VxHA%w?1+0nYw z>D;izfMUs+jUjFn2I%a<>oJ$n{o{MZ?R00320E0v027&|*V z!wM*s#@p@IV9@4VIF75TI)so44y)zrUaL+Ovs!&hRkbut_V@Qor7=y@=I7^iU0+>Y zU0+`pLST&N=H_01{q@DgMTF4tpdWrUaXbNz8zFe(V z5kilP;BoxW10h7e-+%MXH*2+8uh&&otzO?s(}+@)QoTAp0juRIm-KAjYBn1}z-qM` z$I;f-X0O*mNHWd5VHjg$W7E^qmo8nJot^y$;J+LFr=NcM)?06Ro|7ao0Kjz{j3pS; zA64eDowWxs+pcZOvXakRUwrY|y?bAVVL*tAF_k2Fa&q#u*Irv%S~_|1H?ga~7i5Ny;M#dg*{Z11Uh7Gt`-y~bEPF;V@=Pk!2Lwh5tyLgCd{ zUtL;SGEMWlfFH+Wj8#>=dGqFA5Hc2HOw%+1K#W?W2mk;eNK@8mYy$ww<=J2T>erP@ zB@9DKsj8}@qoag;TlT*rewhD4p)fHq0U^w0Z2&kS@^B9V0C1jqUQ-B>%awldi(j5Q zckarSD+nP)QL5GI(@#JBcu9XRCuCX9=kpgXT=?0~ehvV9RF6k#?^OlqA1FffQQy-G+fsWf*^_l&XeJ6@(mjRfH4k&z;)dy3RTs7?z!hqoH+4>K?4Ay zDB9lMCWH_|gh(-#C{>2|qXMQ>;hfd$^>(|hs+w(E3kwU6EB3!&dwY8u8ymK5_j#GGA;39<03rYYl@v;4gwWR3M!VfUapJ_n!oqMmcoGvr_`ZMR#*NL*O~Wt_4(d_l zYg#4@2eNF!p-zQUjYgwXDy3IYnBtbVCjSoNkaARX*etzEbyn4On zIPEBMh2UZ6fFV1I{7z>_k~9Fo{rej?Zd_Lsm2>{EAisCH2_d$(x368hwz9GU0C?er z7p`Bw%6Yug?8-{MPc?bZhRDLirGIIQl-@WGd_xIm@ z_uZ>kuR4x%>C&Y?|M}C~w{HM&Bxe{)2$4c2gYB&Chf&HIV-WyARdb%#+S}W^fB*jZ z^DpSS{=L|79N)Zob9s6B>eZ`*!C+xw!F8QK{_(#bY1zZP@DuqFY-ep};1Fs60Mj&- zBwdz`F!bB)ZmqUkC=^Pi(vbR3*}m_;{r20}u3cMOTk||`YHBK<&;9OqzhNwSD=|-dehd=yRnjV2E z)d1j05+OtgkrASE<;pjWnX#C2CWJtU=JQq%c!W?0;laT{zu#9B#dY0{jSbgzg%C-S zaL$KLFvbu~@?OnhA zr(3sfx^BB%p7lI83K#QUvHH;d!1c%et`| zObC%>B?!Fj?YnUts)milT6MlrbjVZsYLq>wf58T%L@g zI1C4I9NYG2CX-2$#Ii=>m|-j-grdloB#jV72#ydLPAr<1hY%rzj@T)nm`IAEW->Vl zC4?k|NE~}{9AGT_zAwu%dT2wfO_Id23Yw-njW1BF+UNgfT`bMF;_aD5XO1 zG>yWr3jmO1lTt;NWlE_jOR!q5LN%+KrmpKrk`O{VoldLO3<7U3=&EW?(=rGFjFF<~ zK@d<%`~7YvlhbwG_g%;78-{@p3Bw2>L@6B%216HzKLZd#LU5WgRn-6h7-LD2Fvc0k zv7NO!Bmg0dv7#uJWo5HjMNx!+X(}X1%Vx7e0L~eN(6((|*CmM#r`VB^Vz=ATG{Z2A zIF53;d>Dp9`Qw~pOcX^a7K?;X#+afgk|ZI7R8_TYn*}~B7t5-wK?uJY=m8W!44?m& zenAK^CXA(zwh1l(1VhOM;HY1ShiwBv1RxaRNC`AqNzzoNlndd918AtmKho&`S1Xyi iA4etAj5*)wI)4SFZ5|u>>#6(z0000PLrF!8!LK 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 DNV$dD literal 0 HcmV?d00001 diff --git a/plugin-qeyes/types/Pink-EyedGirl/pink-pupil.png b/plugin-qeyes/types/Pink-EyedGirl/pink-pupil.png new file mode 100644 index 0000000000000000000000000000000000000000..3a8d819d0e123fd95f74a65310629bfef6790a30 GIT binary patch literal 970 zcmV;*12z1KP)ZmN z#9siH9T0*Ji30*up;C!WsG}1SE$h0bDP0n^&6XEQn%Z&vh+iBE1A+MN-{q4&0)HYr z8br4w<8dLy1Zg32)E_#z-!9c84coQXD*EqtRYx<}BoF<83IHJR4^muWdNMSA z?ZwzsGRaA_>GZKs{|O^p96P-SR#7ci@=9s8+3zg<I{(h*RiA3m1C=~^Z!TWXec;hwy6@Efg_WrUxOgW_mhnS1-8 z3;?pN;*Ia$LI1!&_1kSUH>&_ZIi8axPXyDkE1B2OZ)vD6mLP95knfi8Z_0WNO1_Ds z&kck1GvFu|M+QWREcNbVb$1 z4}g0_MDCY$jD=EgEf;fNUBgOe^HNSJ%(Dp|KF>O=uGqaT!!ef{X6u|{seGCmCXI>; zHYq|Y9U#}a=X|{O`TaeuI&-tNIu8JLxBvHzY(juu=|Z3aOpxZYlcDjf<2h2C8AQWu sH@3Sw>t(IBra6WlK6MQHD>VSXAIFD{_=cajVgLXD07*qoM6N<$g3ofky#N3J literal 0 HcmV?d00001 diff --git a/plugin-qeyes/types/PumpkinMonster/config b/plugin-qeyes/types/PumpkinMonster/config new file mode 100644 index 000000000..6ccefde15 --- /dev/null +++ b/plugin-qeyes/types/PumpkinMonster/config @@ -0,0 +1,4 @@ +wall-thickness = 8 +num-eyes = 2 +eye-pixmap = "eye.png" +pupil-pixmap = "pupil.png" diff --git a/plugin-qeyes/types/PumpkinMonster/eye.png b/plugin-qeyes/types/PumpkinMonster/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..32f2ef17998bf845d3d34659dafce662457fda9c GIT binary patch literal 3395 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 bq^`dJrrnZkL!6(U00000NkvXXu0mjfBC?~a literal 0 HcmV?d00001 diff --git a/plugin-qeyes/types/Tango/tango-pupil.png b/plugin-qeyes/types/Tango/tango-pupil.png new file mode 100644 index 0000000000000000000000000000000000000000..c2add321e10d9bf9b7db693b836f4f823713b10e GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j+1|*LJgERCLYL#W93qCgW)almCqW|Nm!*YTD{x zts~ui>iTo-YY*RT1*+*eJuCVoqea&aGv5_V@wA)?ND6r>1rNRw2Aa;`>FVdQ&MBb@ E08=@D;s5{u literal 0 HcmV?d00001