Inital commit

This commit is contained in:
Carl Klemm 2020-06-13 12:32:49 +02:00
commit a1da4d9454
27 changed files with 744 additions and 0 deletions

View File

@ -0,0 +1 @@
8d2a153010b3e35a0500b1969e6f855421d6aee4

View File

@ -0,0 +1,13 @@
Package: sigstoped-dbgsym
Source: sigstoped
Version: 1:0.73-1
Auto-Built-Package: debug-symbols
Architecture: amd64
Maintainer: Uvos <carl@uvos.xyz>
Installed-Size: 349
Depends: sigstoped (= 1:0.73-1)
Section: debug
Priority: optional
Multi-Arch: same
Description: debug symbols for sigstoped
Build-Ids: 8d2a153010b3e35a0500b1969e6f855421d6aee4

View File

@ -0,0 +1 @@
fda7b3cbcccd3e15500982d40bd692e5 usr/lib/debug/.build-id/8d/2a153010b3e35a0500b1969e6f855421d6aee4.debug

View File

@ -0,0 +1 @@
sigstoped

3
debian/changelog vendored Normal file
View File

@ -0,0 +1,3 @@
qsigstoped (1:1.0-1) unstable; urgency=medium
Inital version
-- Uvos <carl@uvos.xyz> Mon, 10 Jun 2020 15:00:00 +0100

1
debian/compat vendored Normal file
View File

@ -0,0 +1 @@
10

18
debian/control vendored Executable file
View File

@ -0,0 +1,18 @@
Source: qsigstoped
Section: base
Priority: optional
Maintainer: Uvos <carl@uvos.xyz>
Build-Depends:
debhelper,
qt5-qmake,
qt5-default,
Standards-Version: 1.0
Package: qsigstoped
Architecture: any
Multi-arch: same
Depends:
libqt5gui5,
libqt5core5a,
Description: An application to configure the qsigstoped deamon

2
debian/copywrite vendored Normal file
View File

@ -0,0 +1,2 @@
Unless stated otherwise, all files are:
Copyright 2020 Carl Klemm and are licensed under the GPLv3

2
debian/gbp.conf vendored Normal file
View File

@ -0,0 +1,2 @@
[DEFAULT]
upstream-tag=%(version)s

4
debian/rules vendored Executable file
View File

@ -0,0 +1,4 @@
#!/usr/bin/make -f
%:
dh $@

63
desktopfile.cpp Normal file
View File

@ -0,0 +1,63 @@
#include "desktopfile.h"
#include <QFile>
#include <QFileInfo>
#include <QSettings>
#include <QDebug>
#include <QDir>
DesktopFile::DesktopFile(const QString& fileName)
{
open(fileName);
}
bool DesktopFile::operator==(const DesktopFile& in)
{
return execName == in.execName;
}
bool DesktopFile::open(const QString& fileName)
{
if(QFile::exists(fileName))
{
QSettings desktopFile(fileName, QSettings::IniFormat);
desktopFile.beginGroup("Desktop Entry");
name = desktopFile.value("Name").toString();
command = desktopFile.value("Exec").toString();
execName = QFileInfo(command).fileName().split(' ').at(0);
return true;
}
else
{
qDebug()<<fileName<<" dose not exist.";
return false;
}
}
QList<DesktopFile> DesktopFile::getDesktopFiles(const QList<QByteArray>& desktopFileDirs)
{
QList<DesktopFile> desktopFiles;
for(int i = 0; i < desktopFileDirs.size(); ++i)
{
QDir directory(desktopFileDirs[i] + "/applications");
if(directory.exists())
{
QStringList desktopFileNames = directory.entryList(QStringList() << "*.desktop",QDir::Files);
for(int j = 0; j < desktopFileNames.size(); ++j)
{
DesktopFile desktopFile(directory.path() + "/" + desktopFileNames[j]);
bool found = desktopFile.execName == "";
for(int k = 0; k < desktopFiles.size(); ++k)if( desktopFile == desktopFiles[k] )
{
found = true;
break;
}
if(!found)desktopFiles.push_back(desktopFile);
}
}
}
return desktopFiles;
}

26
desktopfile.h Normal file
View File

@ -0,0 +1,26 @@
#ifndef DESKTOPFILE_H
#define DESKTOPFILE_H
#include<QString>
class DesktopFile
{
public:
QString name;
QString command;
QString execName;
QString iconPath;
bool stop = false;
public:
DesktopFile(const QString& fileName);
DesktopFile(){}
bool open(const QString& fileName);
bool operator==(const DesktopFile& in);
static QList<DesktopFile> getDesktopFiles(const QList<QByteArray>& desktopFileDirs);
};
#endif // DESKTOPFILE_H

31
desktopfilewidget.cpp Normal file
View File

@ -0,0 +1,31 @@
#include "desktopfilewidget.h"
#include "ui_desktopfilewidget.h"
#include <QDebug>
DesktopFileWidget::DesktopFileWidget(const DesktopFile& desktopfile, QWidget *parent) :
QWidget(parent),
ui(new Ui::DesktopFileWidget)
{
ui->setupUi(this);
ui->label->setText(desktopfile.name);
ui->checkBox->setChecked(desktopfile.stop);
ui->checkBox->setStyleSheet("QCheckBox::indicator { width: 32px; height: 32px; } ");
ui->checkBox->setTristate(false);
}
DesktopFileWidget::~DesktopFileWidget()
{
delete ui;
}
bool DesktopFileWidget::isChecked()
{
return ui->checkBox->isChecked();
}
void DesktopFileWidget::mousePressEvent(QMouseEvent *event)
{
ui->checkBox->setCheckState(ui->checkBox->checkState() == Qt::Checked ? Qt::Unchecked : Qt::Checked);
}

30
desktopfilewidget.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef DESKTOPFILEWIDGET_H
#define DESKTOPFILEWIDGET_H
#include <QWidget>
#include <QCheckBox>
#include "desktopfile.h"
namespace Ui {
class DesktopFileWidget;
}
class DesktopFileWidget : public QWidget
{
Q_OBJECT
public:
explicit DesktopFileWidget(const DesktopFile& desktopfile, QWidget *parent = nullptr);
~DesktopFileWidget();
bool isChecked();
protected:
virtual void mousePressEvent(QMouseEvent* event);
private:
Ui::DesktopFileWidget *ui;
};
#endif // DESKTOPFILEWIDGET_H

68
desktopfilewidget.ui Normal file
View File

@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DesktopFileWidget</class>
<widget class="QWidget" name="DesktopFileWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>61</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<property name="windowIcon">
<iconset resource="resources.qrc">
<normaloff>:/icons/qsigstoped.svg</normaloff>:/icons/qsigstoped.svg</iconset>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="tabletTracking">
<bool>true</bool>
</property>
<property name="layoutDirection">
<enum>Qt::RightToLeft</enum>
</property>
<property name="autoFillBackground">
<bool>false</bool>
</property>
<property name="text">
<string/>
</property>
<property name="iconSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="resources.qrc"/>
</resources>
<connections/>
</ui>

BIN
icons/qsigstoped.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

118
icons/qsigstoped.svg Normal file
View File

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
id="svg8"
version="1.1"
viewBox="0 0 81.090889 81.090889"
height="81.090889mm"
width="81.090889mm">
<defs
id="defs2">
<linearGradient
id="linearGradient934">
<stop
style="stop-color:#e6e6e6;stop-opacity:1"
offset="0"
id="stop930" />
<stop
style="stop-color:#666666;stop-opacity:1"
offset="1"
id="stop932" />
</linearGradient>
<linearGradient
id="linearGradient928">
<stop
style="stop-color:#cccccc;stop-opacity:1"
offset="0"
id="stop924" />
<stop
style="stop-color:#666666;stop-opacity:1"
offset="1"
id="stop926" />
</linearGradient>
<linearGradient
id="linearGradient916">
<stop
id="stop912"
offset="0"
style="stop-color:#e6e6e6;stop-opacity:1" />
<stop
id="stop914"
offset="1"
style="stop-color:#666666;stop-opacity:1" />
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
y2="89.681839"
x2="144.12482"
y1="46.304626"
x1="132.61447"
id="linearGradient918"
xlink:href="#linearGradient916" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="89.680634"
x2="123.60547"
y1="46.303413"
x1="112.09513"
id="linearGradient920"
xlink:href="#linearGradient934" />
<linearGradient
gradientUnits="userSpaceOnUse"
y2="99.306366"
x2="-89.637817"
y1="87.496368"
x1="-47.003662"
id="linearGradient922"
xlink:href="#linearGradient928" />
</defs>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(-75.846843,-27.693599)"
id="layer1">
<circle
r="40.495445"
cy="68.239044"
cx="116.39229"
id="path835"
style="opacity:1;fill:#000000;fill-opacity:0.923445;fill-rule:evenodd;stroke:#000000;stroke-width:0.1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
y="46.303413"
x="112.09513"
height="43.377216"
width="11.510338"
id="rect837"
style="opacity:1;mix-blend-mode:normal;fill:url(#linearGradient920);fill-opacity:1;fill-rule:evenodd;stroke:#4d4d4d;stroke-width:0.1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
style="opacity:1;mix-blend-mode:normal;fill:url(#linearGradient918);fill-opacity:1;fill-rule:evenodd;stroke:#4d4d4d;stroke-width:0.1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect837-3"
width="11.510338"
height="43.377216"
x="132.61447"
y="46.304626" />
<rect
transform="rotate(-90)"
style="opacity:1;mix-blend-mode:normal;fill:url(#linearGradient922);fill-opacity:1;fill-rule:evenodd;stroke:#4d4d4d;stroke-width:0.1;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect837-6"
width="11.510338"
height="26.882883"
x="-74.284752"
y="80.577293" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

92
main.cpp Normal file
View File

@ -0,0 +1,92 @@
#include "maindialog.h"
#include <QApplication>
#include <QFile>
#include <QDir>
#include <QString>
#include <QVector>
#include <QMessageBox>
#include <QDebug>
#include <sys/types.h>
#include <signal.h>
#include "desktopfile.h"
void generateBlacklistFile(QString fileName, QVector<DesktopFileWidget*> widgets, const QList<DesktopFile>& desktopFiles, pid_t sigstopedPid)
{
QFile blacklist(fileName);
blacklist.open(QIODevice::WriteOnly | QIODevice::Truncate);
if(!blacklist.isOpen())
{
QMessageBox::critical(nullptr, "Error", "Can not open: " + fileName );
}
else
{
for(int i = 0; i < widgets.size() && i < desktopFiles.size(); ++i)
{
if(widgets[i]->isChecked())
{
blacklist.write(desktopFiles[i].execName.toUtf8()+'\n');
qDebug()<<desktopFiles[i].execName;
}
}
kill(sigstopedPid, SIGUSR1);
}
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
pid_t sigstopedPid;
QString pidfileName(QDir::home().path() + "/.config/sigstoped/pidfile");
QFile pidfile(pidfileName);
pidfile.open(QIODevice::ReadOnly);
if(!pidfile.isOpen())
{
qDebug()<<QDir::home().path() + "/.config/sigstoped/pidfile";
QMessageBox::critical(nullptr, "Error", "The sigstoped deamon must be running" );
return 1;
}
else
{
sigstopedPid = pidfile.readAll().toLong();
qDebug()<<"sigstoped pid:"<<sigstopedPid;
pidfile.close();
}
QList<QByteArray> desktopFileDirs = qgetenv("XDG_DATA_DIRS").split(':');
qDebug()<<"Looking for .desktop files in:";
for(int i = 0; i < desktopFileDirs.size(); ++i) qDebug()<<QString(desktopFileDirs[i]);
if(desktopFileDirs.size() == 0) QMessageBox::critical(nullptr, "Error", "XDG_DATA_DIRS must be set" );
QFile blacklist(QDir::home().path() + "/.config/sigstoped/blacklist");
blacklist.open(QIODevice::ReadOnly);
QList<DesktopFile> desktopFiles = DesktopFile::getDesktopFiles(desktopFileDirs);
if(blacklist.isOpen())
{
QList<QByteArray> blacklistedApplicationNames = blacklist.readAll().split('\n');
if(blacklistedApplicationNames.size() > 0 && blacklistedApplicationNames.back() == "") blacklistedApplicationNames.pop_back();
for(int i = 0; i < blacklistedApplicationNames.size(); ++i)
{
qDebug()<<blacklistedApplicationNames[i];
for(int j = 0; j < desktopFiles.size(); ++j)
{
if(desktopFiles[j].execName.toUtf8() == blacklistedApplicationNames[i])
{
desktopFiles[j].stop = true;
}
}
}
}
MainDialog w;
QObject::connect(&w, &MainDialog::accepted, [&w, &desktopFiles, &sigstopedPid](){generateBlacklistFile(QDir::home().path() + "/.config/sigstoped/blacklist", w.getWidgets(), desktopFiles, sigstopedPid);});
w.setDesktopFiles(desktopFiles);
w.show();
return a.exec();
}

37
maindialog.cpp Normal file
View File

@ -0,0 +1,37 @@
#include "maindialog.h"
#include "ui_maindialog.h"
#include <QPushButton>
#include <QScroller>
#include <QTouchDevice>
MainDialog::MainDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::MainDialog)
{
ui->setupUi(this);
connect(ui->buttonBox->button(ui->buttonBox->Apply), &QPushButton::clicked, this, &MainDialog::accepted);
QScroller::grabGesture(ui->scrollArea, QScroller::TouchGesture);
QScroller::grabGesture(ui->scrollArea, QScroller::LeftMouseButtonGesture);
ui->scrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
}
MainDialog::~MainDialog()
{
delete ui;
for(int i = 0; i<widgets_.size(); ++i) delete widgets_[i];
}
void MainDialog::setDesktopFiles(const QList<DesktopFile>& desktopFiles)
{
for(int i = 0; i<desktopFiles.size(); ++i) widgets_.push_back(new DesktopFileWidget(desktopFiles[i]));
for(int i = 0; i<widgets_.size(); ++i) ui->scollItemLayout->insertWidget(-1, widgets_[i]);
}
QVector<DesktopFileWidget*> MainDialog::getWidgets()
{
return widgets_;
}

30
maindialog.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef MAINDIALOG_H
#define MAINDIALOG_H
#include <QDialog>
#include <QVector>
#include "desktopfilewidget.h"
namespace Ui {
class MainDialog;
}
class MainDialog : public QDialog
{
Q_OBJECT
QVector<DesktopFileWidget*> widgets_;
public:
explicit MainDialog(QWidget *parent = nullptr);
~MainDialog();
void setDesktopFiles(const QList<DesktopFile>& desktopFiles);
QVector<DesktopFileWidget*> getWidgets();
private:
Ui::MainDialog *ui;
};
#endif // MAINDIALOG_H

116
maindialog.ui Normal file
View File

@ -0,0 +1,116 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainDialog</class>
<widget class="QDialog" name="MainDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>400</width>
<height>200</height>
</size>
</property>
<property name="windowTitle">
<string>QSigstoped</string>
</property>
<property name="windowIcon">
<iconset>
<activeoff>:/icons/qsigstoped.png</activeoff>
</iconset>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Select Applications to stop in background:</string>
</property>
</widget>
</item>
<item>
<widget class="QScrollArea" name="scrollArea">
<property name="frameShadow">
<enum>QFrame::Plain</enum>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>384</width>
<height>216</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QVBoxLayout" name="scollItemLayout"/>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
<property name="centerButtons">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>MainDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>MainDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

15
mainwindow.cpp Normal file
View File

@ -0,0 +1,15 @@
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}

24
qsigstoped.desktop Normal file
View File

@ -0,0 +1,24 @@
[Desktop Entry]
# The type as listed above
Type=Application
# The version of the desktop entry specification to which this file complies
Version=1.0
# The name of the application
Name=QSigstoped
# A comment which can/will be used as a tooltip
Comment=Tool to configure sigstoped
# The executable of the application, possibly with arguments.
Exec=qsigstoped
# The name of the icon that will be used to display this entry
Icon=qsigstoped
# Describes whether this application needs to be run in a terminal or not
Terminal=false

43
qsigstoped.pro Normal file
View File

@ -0,0 +1,43 @@
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
desktopfile.cpp \
desktopfilewidget.cpp \
main.cpp \
maindialog.cpp
HEADERS += \
desktopfile.h \
desktopfilewidget.h \
maindialog.h
FORMS += \
desktopfilewidget.ui \
maindialog.ui
unix:target.path = /usr/bin
unix:icons.path = /usr/share/icons
unix:icons.files = icons/*
unix:desktopfile.path = /usr/share/applications
unix:desktopfile.files = qsigstoped.desktop
INSTALLS += target icons desktopfile
RESOURCES += \
resources.qrc

5
resources.qrc Normal file
View File

@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/">
<file>icons/qsigstoped.png</file>
</qresource>
</RCC>