File indexing completed on 2024-05-26 05:37:03

0001 /*
0002     SPDX-FileCopyrightText: 2019 Harald Sitter <sitter@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "doodad.h"
0008 
0009 #include <QKeyEvent>
0010 #include <QtGui/private/qtx11extras_p.h>
0011 
0012 #include "application.h"
0013 #include "shape.h"
0014 
0015 Doodad *Doodad::factorize(XkbDoodadPtr doodad, XkbDescPtr xkb, QObject *parent)
0016 {
0017     switch (doodad->any.type) {
0018     case XkbOutlineDoodad:
0019     case XkbSolidDoodad:
0020         return new ShapeDoodad(doodad, xkb, parent);
0021     case XkbTextDoodad:
0022         return new TextDoodad(doodad, xkb, parent);
0023     case XkbIndicatorDoodad:
0024         return new IndicatorDoodad(doodad, xkb, parent);
0025     case XkbLogoDoodad:
0026         return new LogoDoodad(doodad, xkb, parent);
0027     }
0028 
0029     Q_UNREACHABLE();
0030     return nullptr;
0031 }
0032 
0033 Doodad::Doodad(XkbDoodadPtr doodad_, XkbDescPtr xkb_, QObject *parent)
0034     : XkbObject(xkb_, parent)
0035     , doodad(doodad_)
0036 {
0037 }
0038 
0039 ShapeDoodad::ShapeDoodad(XkbDoodadPtr doodad_, XkbDescPtr xkb_, QObject *parent)
0040     : Doodad(doodad_, xkb_, parent)
0041     , shape(new Shape(xkb->geom->shapes + doodad_->shape.shape_ndx, xkb, this))
0042     , outlineOnly(doodad->any.type == XkbOutlineDoodad)
0043 {
0044 }
0045 
0046 TextDoodad::TextDoodad(XkbDoodadPtr doodad_, XkbDescPtr xkb_, QObject *parent)
0047     : Doodad(doodad_, xkb_, parent)
0048 {
0049 }
0050 
0051 IndicatorDoodad::IndicatorDoodad(XkbDoodadPtr doodad_, XkbDescPtr xkb_, QObject *parent)
0052     : Doodad(doodad_, xkb_, parent)
0053     , shape(new Shape(xkb->geom->shapes + doodad_->indicator.shape_ndx, xkb, this))
0054 {
0055     connect(Application::instance(), &Application::keyEvent, this, &IndicatorDoodad::refreshState);
0056     refreshState();
0057 }
0058 
0059 void IndicatorDoodad::refreshState()
0060 {
0061     int onInt = False;
0062     if (!XkbGetNamedIndicator(QX11Info::display(), doodad->indicator.name, nullptr, &onInt, nullptr, nullptr)) {
0063         on = false;
0064     } else {
0065         on = onInt == True ? true : false;
0066     }
0067     Q_EMIT onChanged();
0068 }
0069 
0070 LogoDoodad::LogoDoodad(XkbDoodadPtr doodad_, XkbDescPtr xkb_, QObject *parent)
0071     : ShapeDoodad(doodad_, xkb_, parent)
0072 {
0073 }
0074 
0075 #include "moc_doodad.cpp"