Commit f3d8b07c authored by Alf Gaida's avatar Alf Gaida

Cherry-picking upstream version 2017.09.19.

* Bump Standards to 4.1.0 - no changes needed.
parent ef8e0938
cmst
====
QT GUI for Connman with system tray icon.
The program provides graphical user interface to control the connman daemon. The connman daemon
must be started as you normally would, this program just interfaces with that daemon. You can see
what technologies and services connman has found, and for wifi services an agent is registered to
assist in obtaining the information from you necessary to logon the wifi service.
As of 2016.01.26 support for VPN connections (create, edit, delete, connect and disconnect) has been added. It is also possible to import an OpenVPN .opvn file. The import function will scan the .opvn file extracting and saving keys and certificates, and then place the proper lines into the provisioning editor.
The program requires that connman be installed and running. The program depends on QT5, but only the base package.
The [Wiki](https://github.com/andrew-bibb/cmst/wiki) has been started and announcements, news, and other information can be found there.
[Screen shots:](https://github.com/andrew-bibb/cmst/wiki/Screenshots) are now included in the Wiki
There is a PKGBUILD for this project in the Arch Linux AUR.
The Provisioning Editor and VPN Provisioning Editor both register a root helper to assist in editing files in directories owned by root (/var/lib/connman and /var/lib/connman-vpn). In order to use the root helper you must be a member of the proper group, and this group varies by distribution. To get the proper file for your distribution you need to provide it on the qmake line. Currently there are files for Arch Linux, Slackware, and Debian. If you are on Arch you don't actually need to supply the distro as that is the default if one is not supplied, but it is not wrong to do so.
If you are not on Arch or don't choose to use the AUR download the release and extract the files. Then run:
qmake DISTRO=xxxx
make
make install (as root)
Where xxx is one of [arch, debian, slackware). Distro names are case sensitive.
Development Status: The program is really kind of feature complete as of October 2016. There are several ConnMan features we've not implemented but they are all currently marked experimental. As a rule we've tried to avoid these, although we have made exceptions. I still subscribe to the ConnMan developer mailing list to keep an eye on what is happening there and will update this program accordingly. If there is a feature you need or want, either a ConnMan feature or in the CMST UI, please do not hesitate to open up an issue about it.
......@@ -98,13 +98,15 @@ idButton::idButton(QWidget* parent, const QDBusObjectPath& id) :
button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
obj_id = id;
button->setCheckable(true);
button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
connect (button, SIGNAL(clicked(bool)), this, SLOT(buttonClicked(bool)));
// create the box
QHBoxLayout* layout = new QHBoxLayout(this);
layout->setContentsMargins(m_left, m_top, m_right, m_bottom);
layout->setAlignment(Qt::AlignCenter);
layout->addWidget(button, 0, 0);
return;
}
......@@ -127,12 +129,7 @@ ControlBox::ControlBox(const QCommandLineParser& parser, QWidget *parent)
// setup the user interface
ui.setupUi(this);
// We need this if someone is running the program from the tray popup menu.
// The main UI is fine without it, but if you call up the agent dialog and then
// close that seems to be treated as the last window.
qApp->setQuitOnLastWindowClosed(false);
// set the window title
setWindowTitle(TranslateStrings::cmtr("connman system tray"));
......@@ -181,6 +178,7 @@ ControlBox::ControlBox(const QCommandLineParser& parser, QWidget *parent)
settings->beginGroup("MainWindow");
resize(settings->value("size", QSize(700, 550)).toSize() );
move(settings->value("pos", QPoint(200, 200)).toPoint() );
ui.splitter01->restoreState(settings->value("splitter_01").toByteArray() );
ui.tabWidget->setCurrentIndex(settings->value("current_page").toInt() );
settings->endGroup();
}
......@@ -426,6 +424,7 @@ ControlBox::ControlBox(const QCommandLineParser& parser, QWidget *parent)
trayicon = NULL;
ui.checkBox_hideIcon->setDisabled(true);
this->updateDisplayWidgets();
qApp->setQuitOnLastWindowClosed(true); // not running systemtray icon so normal close
this->showNormal(); // no place to minimize to, so showMaximized
} // if
else {
......@@ -542,7 +541,7 @@ void ControlBox::updateDisplayWidgets()
ui.pushButton_movebefore->setEnabled(false);
ui.pushButton_moveafter->setEnabled(false);
} // if there were no major errors
return;
}
//
......@@ -718,7 +717,6 @@ void ControlBox::connectPressed()
QDBusMessage reply = iface_serv->call(QDBus::AutoDetect, "Connect");
if (reply.errorName() != "org.freedesktop.DBus.Error.NoReply") shared::processReply(reply);
iface_serv->deleteLater();
return;
}
......@@ -1401,17 +1399,20 @@ void ControlBox::vpnSubmenuTriggered(QAction* act)
for (int i = 0; i < vpn_list.count(); ++i) {
if (getNickName(vpn_list.at(i).objpath) == act->text() ) {
QDBusInterface* iface_serv = new QDBusInterface(DBUS_CON_SERVICE, vpn_list.at(i).objpath.path(), "net.connman.Service", QDBusConnection::systemBus(), this);
iface_serv->setTimeout(1);
iface_serv->setTimeout(5);
QString state = vpn_list.at(i).objmap.value("State").toString();
QDBusMessage reply;
if (state == "ready")
shared::processReply(iface_serv->call(QDBus::AutoDetect, "Disconnect") );
reply = iface_serv->call(QDBus::AutoDetect, "Disconnect");
else
shared::processReply(iface_serv->call(QDBus::AutoDetect, "Connect") );
reply = iface_serv->call(QDBus::AutoDetect, "Connect" );
if (reply.errorName() != "org.freedesktop.DBus.Error.NoReply") shared::processReply(reply);
iface_serv->deleteLater();
break;
} // if
} // for
return;
}
......@@ -1518,7 +1519,6 @@ void ControlBox::getServiceDetails(int index)
ui.label_details_right->setText(rs);
// enable or disable the editor button
if (map.value("Type").toString() == "vpn") b_editable = false; // can't edit vpn connections
ui.pushButton_configuration->setEnabled(b_editable);
return;
......@@ -1706,18 +1706,14 @@ void ControlBox::assembleTabStatus()
ui.tableWidget_technologies->setItem(row, 1, qtwi01);
idButton* qpb02 = new idButton(this, technologies_list.at(row).objpath);
qpb02->setFixedSize(
ui.tableWidget_technologies->horizontalHeader()->sectionSize(2),
ui.tableWidget_technologies->verticalHeader()->sectionSize(0) );
connect (qpb02, SIGNAL(clickedID(QString, bool)), this, SLOT(togglePowered(QString, bool)));
QString padding = " ";
if (technologies_list.at(row).objmap.value("Powered").toBool()) {
qpb02->setText(tr("%1On%1%1", "powered").arg(padding));
qpb02->setText(tr("On", "powered") );
qpb02->setIcon(QPixmap(":/icons/images/interface/golfball_green.png"));
qpb02->setChecked(true);
}
else {
qpb02->setText(tr("%1Off%1%1", "powered").arg(padding));
qpb02->setText(tr("Off", "powered") );
qpb02->setIcon(QPixmap(":/icons/images/interface/golfball_red.png"));
qpb02->setChecked(false);
}
......@@ -1730,17 +1726,14 @@ void ControlBox::assembleTabStatus()
ui.tableWidget_technologies->setItem(row, 3, qtwi03);
idButton* qpb04 = new idButton(this, technologies_list.at(row).objpath);
qpb04->setFixedSize(
ui.tableWidget_technologies->horizontalHeader()->sectionSize(4),
ui.tableWidget_technologies->verticalHeader()->sectionSize(0) );
connect (qpb04, SIGNAL(clickedID(QString, bool)), this, SLOT(toggleTethered(QString, bool)));
if (technologies_list.at(row).objmap.value("Tethering").toBool()) {
qpb04->setText(tr("%1On%1%1", "tethering").arg(padding));
qpb04->setText(tr("On", "tethering") );
qpb04->setIcon(QPixmap(":/icons/images/interface/golfball_green.png"));
qpb04->setChecked(true);
}
else {
qpb04->setText(tr("%1Off%1%1", "tethering").arg(padding));
qpb04->setText(tr("Off", "tethering") );
qpb04->setIcon(QPixmap(":/icons/images/interface/golfball_red.png"));
qpb04->setChecked(false);
if (technologies_list.at(row).objmap.value("Type").toString() == "ethernet")
......@@ -2371,6 +2364,7 @@ void ControlBox::writeSettings()
settings->setValue("size", this->size() );
settings->setValue("pos", this->pos() );
settings->setValue("current_page", ui.tabWidget->currentIndex());
settings->setValue("splitter_01", ui.splitter01->saveState());
settings->endGroup();
settings->beginGroup("CheckBoxes");
......@@ -2514,6 +2508,11 @@ void ControlBox::createSystemTrayIcon()
connect(trayicon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
// We need this if someone is running the program from the tray popup menu.
// The main UI is fine without it, but if you call up the agent dialog and then
// close that seems to be treated as the last window.
qApp->setQuitOnLastWindowClosed(false);
// Assemble the tray icon (set the icon to display)
assembleTrayIcon();
......@@ -2917,14 +2916,14 @@ void ControlBox::configureService()
void ControlBox::provisionService()
{
if (qobject_cast<QPushButton*>(sender()) == ui.pushButton_provisioning_editor) {
ProvisioningEditor* peditor = new ProvisioningEditor(this);
ProvisioningEditor* reditor = new ProvisioningEditor(this);
// Set the whatsthis button icon
peditor->setWhatsThisIcon(iconman->getIcon("whats_this") );
reditor->setWhatsThisIcon(iconman->getIcon("whats_this") );
// call then clean up
peditor->exec();
peditor->deleteLater();
reditor->exec();
reditor->deleteLater();
}
else if (qobject_cast<QPushButton*>(sender()) == ui.pushButton_vpn_editor) {
......
......@@ -56,7 +56,7 @@
<x>0</x>
<y>0</y>
<width>647</width>
<height>431</height>
<height>437</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_2">
......@@ -190,7 +190,7 @@
</widget>
</item>
<item row="2" column="0">
<widget class="QSplitter" name="splitter">
<widget class="QSplitter" name="splitter01">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
......@@ -524,7 +524,7 @@
<x>0</x>
<y>0</y>
<width>647</width>
<height>353</height>
<height>356</height>
</rect>
</property>
<layout class="QVBoxLayout" name="_2">
......@@ -906,7 +906,7 @@
<x>0</x>
<y>0</y>
<width>647</width>
<height>431</height>
<height>437</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_7">
......@@ -946,7 +946,7 @@
<x>0</x>
<y>0</y>
<width>603</width>
<height>141</height>
<height>142</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_9">
......@@ -1002,7 +1002,7 @@
<x>0</x>
<y>0</y>
<width>603</width>
<height>140</height>
<height>141</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_10">
......@@ -1070,7 +1070,7 @@
<x>0</x>
<y>0</y>
<width>633</width>
<height>561</height>
<height>578</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_8">
......@@ -1758,7 +1758,7 @@
<x>0</x>
<y>0</y>
<width>537</width>
<height>431</height>
<height>437</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
......
......@@ -132,6 +132,12 @@ PropertiesEditor::PropertiesEditor(QWidget* parent, const arrayElement& ae)
connect(ui.pushButton_resetpage, SIGNAL(clicked()), this, SLOT(resetPage()));
connect(ui.pushButton_resetall, SIGNAL(clicked()), this, SLOT(resetAll()));
connect(ui.pushButton_ok, SIGNAL(clicked()), this, SLOT(updateConfiguration()));
// disable pages not needed for a service (mainly vpn)
if (objmap.value("Type").toString() == "vpn") {
ui.ipv4->setDisabled(true);
ui.ipv6->setDisabled(true);
}
}
......@@ -251,63 +257,73 @@ void PropertiesEditor::updateConfiguration()
shared::processReply(iface_serv->callWithArgumentList(QDBus::AutoDetect, "SetProperty", vlist) );
} // if
} //for
// ipv4
// Only update if an entry has changed.
if ((ui.comboBox_ipv4method->currentText() != TranslateStrings::cmtr(ipv4map.value("Method").toString()) ) |
(ui.lineEdit_ipv4address->text() != TranslateStrings::cmtr(ipv4map.value("Address").toString()) ) |
(ui.lineEdit_ipv4netmask->text() != TranslateStrings::cmtr(ipv4map.value("Netmask").toString()) ) |
(ui.lineEdit_ipv4gateway->text() != TranslateStrings::cmtr(ipv4map.value("Gateway").toString())) ) {
vlist.clear();
lep.clear();
slp.clear();
dict.clear();
vlist << "IPv4.Configuration";
dict.insert("Method", sl_ipv4_method.at(ui.comboBox_ipv4method->currentIndex()) );
lep << ui.lineEdit_ipv4address << ui.lineEdit_ipv4netmask << ui.lineEdit_ipv4gateway;
slp << "Address" << "Netmask" << "Gateway";
for (int i = 0; i < lep.count(); ++i) {
s = lep.at(i)->text();
s = s.simplified(); // really should not be needed with the validator
if (s.isEmpty() ) s.clear();
dict.insert(slp.at(i), s);
} // for
vlist << QVariant::fromValue(QDBusVariant(dict) );
shared::processReply(iface_serv->callWithArgumentList(QDBus::AutoDetect, "SetProperty", vlist) );
} // if ipv4 changed
// ipv6
// Only update if an entry has changed.
if ((ui.comboBox_ipv6method->currentText() != TranslateStrings::cmtr(ipv6map.value("Method").toString()) ) |
(static_cast<uint>(ui.spinBox_ipv6prefixlength->value()) != ipv6map.value("PrefixLength").toUInt() ) |
(ui.lineEdit_ipv6address->text() != TranslateStrings::cmtr(ipv6map.value("Address").toString()) ) |
(ui.lineEdit_ipv6gateway->text() != TranslateStrings::cmtr(ipv6map.value("Gateway").toString()) ) |
(ui.comboBox_ipv6privacy->currentText() != TranslateStrings::cmtr(ipv6map.value("Privacy").toString())) ) {
vlist.clear();
lep.clear();
slp.clear();
dict.clear();
vlist << "IPv6.Configuration";
dict.insert("Method", sl_ipv6_method.at(ui.comboBox_ipv6method->currentIndex()) );
dict.insert("PrefixLength", QVariant::fromValue(static_cast<quint8>(ui.spinBox_ipv6prefixlength->value())) );
dict.insert("Privacy", sl_ipv6_privacy.at(ui.comboBox_ipv6privacy->currentIndex()) );
lep << ui.lineEdit_ipv6address << ui.lineEdit_ipv6gateway;
slp << "Address" << "Gateway";
for (int i = 0; i < lep.count(); ++i) {
s = lep.at(i)->text();
s = s.simplified(); // really should not be needed with the validator
if (s.isEmpty() ) s.clear();
dict.insert(slp.at(i), s);
} // for
vlist << QVariant::fromValue(QDBusVariant(dict) );
shared::processReply(iface_serv->callWithArgumentList(QDBus::AutoDetect, "SetProperty", vlist) );
} // if ipv6 changed
if (ui.ipv4->isEnabled() ) {
// Only update if an entry has changed.
if ((ui.comboBox_ipv4method->currentText() != TranslateStrings::cmtr(ipv4map.value("Method").toString()) ) |
(ui.lineEdit_ipv4address->text() != TranslateStrings::cmtr(ipv4map.value("Address").toString()) ) |
(ui.lineEdit_ipv4netmask->text() != TranslateStrings::cmtr(ipv4map.value("Netmask").toString()) ) |
(ui.lineEdit_ipv4gateway->text() != TranslateStrings::cmtr(ipv4map.value("Gateway").toString())) ) {
vlist.clear();
lep.clear();
slp.clear();
dict.clear();
if (ui.comboBox_ipv4method->currentIndex() >= 0) {
vlist << "IPv4.Configuration";
dict.insert("Method", sl_ipv4_method.at(ui.comboBox_ipv4method->currentIndex()) );
lep << ui.lineEdit_ipv4address << ui.lineEdit_ipv4netmask << ui.lineEdit_ipv4gateway;
slp << "Address" << "Netmask" << "Gateway";
for (int i = 0; i < lep.count(); ++i) {
s = lep.at(i)->text();
s = s.simplified(); // really should not be needed with the validator
if (s.isEmpty() ) s.clear();
dict.insert(slp.at(i), s);
} // for
vlist << QVariant::fromValue(QDBusVariant(dict) );
shared::processReply(iface_serv->callWithArgumentList(QDBus::AutoDetect, "SetProperty", vlist) );
} // if there is a valid index
} // if ipv4 changed
}// ipv4 page is enabled
// iqv6
if (ui.ipv6->isEnabled() ) {
// Only update if an entry has changed.
if ((ui.comboBox_ipv6method->currentText() != TranslateStrings::cmtr(ipv6map.value("Method").toString()) ) |
(static_cast<uint>(ui.spinBox_ipv6prefixlength->value()) != ipv6map.value("PrefixLength").toUInt() ) |
(ui.lineEdit_ipv6address->text() != TranslateStrings::cmtr(ipv6map.value("Address").toString()) ) |
(ui.lineEdit_ipv6gateway->text() != TranslateStrings::cmtr(ipv6map.value("Gateway").toString()) ) |
(ui.comboBox_ipv6privacy->currentText() != TranslateStrings::cmtr(ipv6map.value("Privacy").toString())) ) {
vlist.clear();
lep.clear();
slp.clear();
dict.clear();
if (ui.comboBox_ipv6method->currentIndex() >= 0) {
vlist << "IPv6.Configuration";
dict.insert("Method", sl_ipv6_method.at(ui.comboBox_ipv6method->currentIndex()) );
dict.insert("PrefixLength", QVariant::fromValue(static_cast<quint8>(ui.spinBox_ipv6prefixlength->value())) );
dict.insert("Privacy", sl_ipv6_privacy.at(ui.comboBox_ipv6privacy->currentIndex()) );
lep << ui.lineEdit_ipv6address << ui.lineEdit_ipv6gateway;
slp << "Address" << "Gateway";
for (int i = 0; i < lep.count(); ++i) {
s = lep.at(i)->text();
s = s.simplified(); // really should not be needed with the validator
if (s.isEmpty() ) s.clear();
dict.insert(slp.at(i), s);
} // for
vlist << QVariant::fromValue(QDBusVariant(dict) );
shared::processReply(iface_serv->callWithArgumentList(QDBus::AutoDetect, "SetProperty", vlist) );
} // if there is a valid index
} // if ipv6 changed
} // if ipv6 enabled
// proxy
// Only update if an entry has changed.
......
......@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>297</width>
<height>450</height>
<height>449</height>
</rect>
</property>
<property name="windowTitle">
......@@ -22,16 +22,13 @@
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QToolBox" name="toolBox_peditor">
<property name="currentIndex">
<number>6</number>
</property>
<widget class="QWidget" name="general">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>279</width>
<height>166</height>
<height>157</height>
</rect>
</property>
<attribute name="label">
......@@ -68,8 +65,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>279</width>
<height>166</height>
<width>98</width>
<height>47</height>
</rect>
</property>
<property name="whatsThis">
......@@ -102,8 +99,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>279</width>
<height>166</height>
<width>98</width>
<height>47</height>
</rect>
</property>
<property name="whatsThis">
......@@ -136,8 +133,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>279</width>
<height>166</height>
<width>98</width>
<height>47</height>
</rect>
</property>
<property name="whatsThis">
......@@ -170,8 +167,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>279</width>
<height>166</height>
<width>159</width>
<height>136</height>
</rect>
</property>
<property name="whatsThis">
......@@ -249,7 +246,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>279</width>
<width>185</width>
<height>166</height>
</rect>
</property>
......@@ -350,8 +347,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>265</width>
<height>168</height>
<width>150</width>
<height>173</height>
</rect>
</property>
<property name="whatsThis">
......
......@@ -27,6 +27,7 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
***********************************************************************/
# include <QtCore/QDebug>
# include "./tr_strings.h"
......@@ -127,11 +128,10 @@ QStringList TranslateStrings::cmtr_sl(const QStringList& sl_src)
{
QStringList sl_rtn;
sl_rtn.clear();
for (int i = 0; i < sl_src.count(); ++i) {
sl_rtn << TranslateStrings::cmtr(sl_src.at(i) );
}
return sl_rtn;
}
/**************************** resource.h *******************************
/**************************** resource.h *******************************
Header file that contains program #defines. It used to be that we kept
all program update and version information in this single file. Now
......@@ -35,9 +35,9 @@ DEALINGS IN THE SOFTWARE.
///////////////////////////////// Program Values ///////////////////////
//
// Program Info (may be visible, but don't mark for tranalation)
#define VERSION "2017.03.18-1"
#define VERSION "2017.09.1-15"
#define RELEASE_DATE "18 March 2017"
#define RELEASE_DATE "19 September 2017"
#define COPYRIGHT_DATE "2013-2017"
// Program Values:
......
############# Building and Installing ###########################
As of 2014.10.30 CMST has had the ability to create and edit config
(provisioning) files. These files are located in /var/lib/connman
which is owned by root:root. To enable reading and writing in this
directory we have had to add a roothelper program. This roothelper
is activated automatically by DBus, however it has necessitated a change
in how you build and install.
In the examples below we use the command "qmake", but if you have
multiple versions of QT installed on your system "qmake" should be
replaced with "qmake-qt5"
DISTRO= command line option:
In order to use the provisioning editor you must be a member of a group
granted access to network services. In Arch Linux this is the "network"
group, in Slackware it is the "netdev" group. The DISTRO= command line
option is provided to make sure the conf file in /etc/dbus-1/system.d
contains the proper group name. Usage Examples:
qmake DISTRO=arch // to install on an Arch Linux system
qmake DISTRO=slackware // to install on Slackware
If the DISTRO= option is omitted then qmake will default to the Arch
Linux options (network group is "network").
There is no error checking in the .pro files so it is important to make
sure that the options are spelled correctly and in the proper case.
Currently we only have information on Arch Linux and Slackware. If your
distro uses something different please open up an issue on GitHub, let
us know what your network group is called and we'll add it in.
Roothelper install file location:
By default the roothelper (called cmstroothelper) will be installed in
/usr/lib/cmst. In Slackware /usr/lib is apparently not used for every
architecture so if you specify and export a variable called USE_LIBPATH
pointing to your install location that location will be used as the
install target instead.
Manpage file location:
By default the man page will be installed to the appropriate
subdirectory below /usr/share/man. If you wish to specify a different
location you must specify and export a variable called USE_MANPATH that
contains the install location you want.
......@@ -26,7 +26,7 @@ documentation.extra = gzip --force --keep ./misc/manpage/cmst.1
INSTALLS += documentation
# application icons -
exists(./images/application/cmst-icon.png)
exists(./images/application/cmst-icon.png) {
LIST = 16 20 22 24 32 36 40 48 64 72 96 128 192 256 384 512
for(a, LIST) {
icon$${a}.path = /usr/share/icons/hicolor/$${a}x$${a}/apps
......@@ -38,7 +38,7 @@ exists(./images/application/cmst-icon.png)
iconsvg.files = ./images/application/scalable/cmst.svg
INSTALLS += iconsvg
}
else {
} else {
system(sed -i 's/Icon=cmst/Icon=preferences-system-network/g' "./misc/desktop/cmst.desktop")
system(sed -i 's/Icon=cmst/Icon=preferences-system-network/g' "./misc/desktop/cmst-autostart.desktop")
}
......@@ -49,8 +49,8 @@ license.files = ./text/LICENSE
INSTALLS += license
# appdata
appdata.path = /usr/share/appdata
appdata.files = ./misc/appdata/cmst.appdata.xml
appdata.path = /usr/share/metainfo
appdata.files = ./misc/appdata/org.cmst.cmst.appdata.xml
INSTALLS += appdata
# desktop file
......
cmst (2017.09.19-1) unstable; urgency=medium
* Cherry-picking upstream version 2017.09.19.
* Bump Standards to 4.1.0 - no changes needed.
-- Alf Gaida <agaida@siduction.org> Thu, 21 Sep 2017 16:46:28 +0200
cmst (2017.03.18-2) unstable; urgency=medium
* Removed the superfluous debian/docs
......
......@@ -8,7 +8,7 @@ Uploaders: Unit 193 <unit193@ubuntu.com>,
Build-Depends: debhelper (>= 10),
qtbase5-dev,
qt5-qmake
Standards-Version: 4.0.0
Standards-Version: 4.1.0
Vcs-Browser: https://anonscm.debian.org/cgit/pkg-lxqt/cmst.git/?h=debian/sid
Vcs-Git: https://anonscm.debian.org/cgit/pkg-lxqt/cmst.git -b debian/sid
Homepage: https://github.com/andrew-bibb/cmst
......
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2013-2016 Andrew J Bibb -->
<application>
<id type="desktop">cmst.desktop</id>
<metadata_license>CC0</metadata_license>
<project_license>MIT (Expat)</project_license>
<component type="desktop">
<id>cmst.desktop</id>
<metadata_license>CC0-1.0</metadata_license>
<!--FIXME: convert to an SPDX license string-->
<project_license>MIT</project_license>
<name>cmst</name>
<summary>A Qt based GUI front end for the connman connection manager with systemtray icon</summary>
<description>
......@@ -15,13 +17,25 @@
</p>
</description>
<screenshots>
<screenshot type="default">https://cloud.githubusercontent.com/assets/6935544/13554586/d6b3febe-e379-11e5-92d1-b66c9918c5ff.png</screenshot>
<screenshot>https://cloud.githubusercontent.com/assets/6935544/6433032/c90476f6-c032-11e4-9f07-897a075ddc25.png</screenshot>
<screenshot>https://cloud.githubusercontent.com/assets/6935544/6433031/c901205a-c032-11e4-9caf-af1d2176d9fc.png</screenshot>
<screenshot>https://cloud.githubusercontent.com/assets/6935544/10594662/5a4e4a9e-769d-11e5-87b7-a6238acd3983.png</screenshot>
<screenshot type="default">
<image>https://cloud.githubusercontent.com/assets/6935544/13554586/d6b3febe-e379-11e5-92d1-b66c9918c5ff.png</image>
<caption/>
</screenshot>
<screenshot>
<image>https://cloud.githubusercontent.com/assets/6935544/6433032/c90476f6-c032-11e4-9f07-897a075ddc25.png</image>
<caption/>
</screenshot>
<screenshot>
<image>https://cloud.githubusercontent.com/assets/6935544/6433031/c901205a-c032-11e4-9caf-af1d2176d9fc.png</image>
<caption/>
</screenshot>
<screenshot>
<image>https://cloud.githubusercontent.com/assets/6935544/10594662/5a4e4a9e-769d-11e5-87b7-a6238acd3983.png</image>
<caption/>
</screenshot>
</screenshots>
<url type="homepage">https://github.com/andrew-bibb/cmst</url>
<updatecontact>Andrew Bibb@email_address_hidden</updatecontact>
<update_contact>Andrew Bibb@email_address_hidden</update_contact>
<kudos>
<kudo>HiDpiIcon</kudo>
<kudo>ModernToolkit</kudo>
......@@ -34,4 +48,10 @@
<keyword>tag</keyword>
<keyword>library</keyword>
</keywords>
</application>
<developer_name>Andrew J. Bibb</developer_name>
<url type="homepage">https://github.com/andrew-bibb/cmst</url>
<url type="help">https://github.com/andrew-bibb/cmst/wiki/</url>
<url type="bugtracker">https://github.com/andrew-bibb/cmst/issues</url>
<url type="donation"/>
<url type="translate">https://github.com/andrew-bibb/cmst/issues/73</url>
</component>
<b><center>Connman System Tray (CMST)</center></b>
<b><center>Change Log</center></b>
<b> 2017.09.1</b>
<ul>
<li>Removed padding hack (issue #166) from id buttons.</li>
<li>Allow configuration of VPN services from the Details tab.</li>
<li>Allow CMST to close from window decoration if not running in system tray (issue #169).<li>
<li>Fix appdata.xml install location (issue #176).</li>
<li>Fixed No Reply popup starting VPN from system tray menu (issue #175).</li>
<li>Technologies and Services splitter state retained (issue #173).</li>
<li>Fixed segfault with ipv4 and ipv6 fields in VPN details.</li>
</ul>
<b> 2017.03.18</b>
<ul>
<li>Added Keywords to .desktop files (PR from klausenbusk).</li>
......