Projects
Eulaceura:Factory
kylin-display-switch
_service:obs_scm:0003-Fix-the-display-error-of-...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:obs_scm:0003-Fix-the-display-error-of-flight-mode-icon.patch of Package kylin-display-switch
From 677d21aeb763366d7e6d63015106715da8e47cd5 Mon Sep 17 00:00:00 2001 From: peijiankang <peijiankang@kylinos.cn> Date: Thu, 14 Jul 2022 14:23:52 +0800 Subject: [PATCH] Fix the display error of flight mode icon --- conf/org.ukui.kds.gschema.xml | 12 ++- registerdbus/classrealize.cpp | 183 +++++++++++++++++++++++++++++++++- registerdbus/classrealize.h | 4 + 3 files changed, 197 insertions(+), 2 deletions(-) diff --git a/conf/org.ukui.kds.gschema.xml b/conf/org.ukui.kds.gschema.xml index fc89bc2..89610e8 100644 --- a/conf/org.ukui.kds.gschema.xml +++ b/conf/org.ukui.kds.gschema.xml @@ -9,6 +9,16 @@ <default>true</default> <summary>microphone enable or not</summary> <description>current microphone enable or not</description> - </key> + </key> + <key type="b" name="airplanemode"> + <default>false</default> + <summary>microphone enable or not</summary> + <description>current microphone enable or not</description> + </key> + <key type="as" name="beforeairplanemode"> + <default>['0']</default> + <summary>microphone enable or not</summary> + <description>current microphone enable or not</description> + </key> </schema> </schemalist> diff --git a/registerdbus/classrealize.cpp b/registerdbus/classrealize.cpp index 82f8f22..9133aba 100755 --- a/registerdbus/classrealize.cpp +++ b/registerdbus/classrealize.cpp @@ -33,6 +33,11 @@ extern "C" { #define RFKILL_EVENT_SIZE_V1 8 +#define VIRTUAL_PATH "/sys/devices/virtual/ieee80211" + +const char * getRFkillType(__u32 idx); +const char * getRFkillName(__u32 idx); + struct rfkill_event { __u32 idx; __u8 type; @@ -233,6 +238,36 @@ QString ClassRealize::toggleCameraDevice(QString businfo){ } } +bool ClassRealize::isVirtualWlan(QString dp){ + QDir dir(VIRTUAL_PATH); + if (!dir.exists()){ + return false; + } + + dir.setFilter(QDir::Dirs); + dir.setSorting(QDir::Name); + + int count = dir.count(); + if (count <= 0){ + return false; + } + + QFileInfoList fileinfoList = dir.entryInfoList(); + + for(QFileInfo fileinfo : fileinfoList){ + if (fileinfo.fileName() == "." || fileinfo.fileName() == ".."){ + continue; + } + + if (QString::compare(fileinfo.fileName(), dp) == 0){ + return true; + } + } + + return false; + +} + int ClassRealize::getCurrentWlanMode(){ struct rfkill_event event; ssize_t len; @@ -271,6 +306,10 @@ int ClassRealize::getCurrentWlanMode(){ if (event.type != RFKILL_TYPE_WLAN) continue; + if (isVirtualWlan(QString(getRFkillName(event.idx)))){ + continue; + } + status.append(event.soft ? 1 : 0); } @@ -418,6 +457,94 @@ QString ClassRealize::toggleBluetoothMode(bool enable){ return block ? QString("blocked") : QString("unblocked"); } +QList<int> ClassRealize::getStatusBeforeFlightModeEnable(){ + + QList<int> re; + + struct rfkill_event event; + ssize_t len; + int fd; + int bls = 0, unbls = 0; + + QList<int> status; + + fd = open("/dev/rfkill", O_RDONLY); + if (fd < 0) { + qCritical("Can't open RFKILL control device"); + return re; + } + + if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) { + qCritical("Can't set RFKILL control device to non-blocking"); + close(fd); + return re; + } + + while (1) { + len = read(fd, &event, sizeof(event)); + + if (len < 0) { + if (errno == EAGAIN) + break; + qWarning("Reading of RFKILL events failed"); + break; + } + + if (len != RFKILL_EVENT_SIZE_V1) { + qWarning("Wrong size of RFKILL event\n"); + continue; + } + + if (isVirtualWlan(QString(getRFkillName(event.idx)))){ + continue; + } + +// printf("%u: %u\n", event.idx, event.soft); +// status.append(event.soft ? 1 : 0); + if (!event.soft && !re.contains(event.type)){ + re.append(event.type); + } + + } + + close(fd); + + return re; +} + +QString ClassRealize::setSingleFlightMode(int type){ + + struct rfkill_event event; + int fd; + ssize_t len; + + __u8 block = 0; + + fd = open("/dev/rfkill", O_RDWR); + if (fd < 0) { + return QString("Can't open RFKILL control device"); + } + + memset(&event, 0, sizeof(event)); + + event.op= RFKILL_OP_CHANGE_ALL; + + /* RFKILL_TYPE_ALL = 0 */ + event.type = type; + + event.soft = block; + + len = write(fd, &event, sizeof(event)); + + if (len < 0){ + return QString("Failed to change RFKILL state"); + } + + close(fd); + return QString(); +} + + int ClassRealize::getCurrentFlightMode(){ struct rfkill_event event; @@ -454,6 +581,10 @@ int ClassRealize::getCurrentFlightMode(){ continue; } + if (isVirtualWlan(QString(getRFkillName(event.idx)))){ + continue; + } + // printf("%u: %u\n", event.idx, event.soft); status.append(event.soft ? 1 : 0); @@ -509,7 +640,7 @@ QString ClassRealize::toggleFlightMode(bool enable){ } close(fd); - return block ? QString("blocked") : QString("unblocked"); + return QString(); } int ClassRealize::setCameraKeyboardLight(bool lightup){ @@ -543,3 +674,53 @@ int ClassRealize::setAirplaneModeKeyboardLight(bool lightup){ return 1; } + +const char * getRFkillName(__u32 idx){ + + static char name[128] = {}; + char *pos, filename[64]; + int fd; + + snprintf(filename, sizeof(filename) - 1, + "/sys/class/rfkill/rfkill%u/name", idx); + + fd = open(filename, O_RDONLY); + if (fd < 0) + return NULL; + + memset(name, 0, sizeof(name)); + read(fd, name, sizeof(name) - 1); + + pos = strchr(name, '\n'); + if (pos) + *pos = '\0'; + + close(fd); + + return name; +} + +const char * getRFkillType(__u32 idx){ + + static char name[128] = {}; + char *pos, filename[64]; + int fd; + + snprintf(filename, sizeof(filename) - 1, + "/sys/class/rfkill/rfkill%u/type", idx); + + fd = open(filename, O_RDONLY); + if (fd < 0) + return NULL; + + memset(name, 0, sizeof(name)); + read(fd, name, sizeof(name) - 1); + + pos = strchr(name, '\n'); + if (pos) + *pos = '\0'; + + close(fd); + + return name; +} diff --git a/registerdbus/classrealize.h b/registerdbus/classrealize.h index 32efd06..cbb4ee3 100644 --- a/registerdbus/classrealize.h +++ b/registerdbus/classrealize.h @@ -35,6 +35,8 @@ public: explicit ClassRealize(); ~ClassRealize(); +public: + bool isVirtualWlan(QString dp); signals: Q_SCRIPTABLE void debug0(QString); @@ -66,6 +68,8 @@ public slots: Q_SCRIPTABLE QString toggleCameraDevice(QString businfo); Q_SCRIPTABLE int setCameraKeyboardLight(bool lightup); Q_SCRIPTABLE int getCurrentFlightMode(); + Q_SCRIPTABLE QList<int> getStatusBeforeFlightModeEnable(); + Q_SCRIPTABLE QString setSingleFlightMode(int type); Q_SCRIPTABLE QString toggleFlightMode(bool enable); Q_SCRIPTABLE int setAirplaneModeKeyboardLight(bool lightup); Q_SCRIPTABLE int getCurrentWlanMode(); -- 2.33.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2