You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lxqt-globalkeys-packaging/daemon/main.cpp

256 lines
7.5 KiB

/* BEGIN_COMMON_COPYRIGHT_HEADER
* (c)LGPL2+
*
* LXDE-Qt - a lightweight, Qt based, desktop toolset
* http://razor-qt.org
*
* Copyright: 2013 Razor team
* Authors:
* Kuzma Shapran <kuzma.shapran@gmail.com>
*
* This program or library is free software; you can redistribute it
* and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
*
* END_COMMON_COPYRIGHT_HEADER */
#include <LXQt/Application>
#include <QString>
#include <QStringList>
#include <QFile>
#include "meta_types.h"
#include "core.h"
#include <errno.h>
#include <getopt.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <syslog.h>
#include <stdlib.h>
#include <libgen.h> // for basename()
#define DEFAULT_CONFIG ".config/lxqt/globalkeyshortcuts.conf"
int main(int argc, char *argv[])
{
bool wrongArgs = false;
bool printHelp = false;
bool runAsDaemon = false;
bool useSyslog = false;
bool minLogLevelSet = false;
int minLogLevel = LOG_NOTICE;
bool multipleActionsBehaviourSet = false;
MultipleActionsBehaviour multipleActionsBehaviour = MULTIPLE_ACTIONS_BEHAVIOUR_FIRST;
QStringList configFiles;
static struct option longOptions[] =
{
{"no-daemon", no_argument, 0, 'n'},
{"daemon", no_argument, 0, 'd'},
{"use-syslog", no_argument, 0, 's'},
{"log-level", required_argument, 0, 'l'},
{"multiple-actions-behaviour", required_argument, 0, 'm'},
{"config-file", required_argument, 0, 'f'},
{"help", no_argument, 0, 'h'},
{0, 0, 0, 0}
};
for (;;)
{
int optionIndex = 0;
int c = getopt_long(argc, argv, "h?", longOptions, &optionIndex);
if (c == -1)
{
break;
}
switch (c)
{
case 'n':
runAsDaemon = false;
break;
case 'd':
runAsDaemon = true;
break;
case 's':
useSyslog = true;
break;
case 'l':
if (!strcmp(optarg, "error"))
{
minLogLevel = LOG_ERR;
}
else if (!strcmp(optarg, "warning"))
{
minLogLevel = LOG_WARNING;
}
else if (!strcmp(optarg, "notice"))
{
minLogLevel = LOG_NOTICE;
}
else if (!strcmp(optarg, "info"))
{
minLogLevel = LOG_INFO;
}
else if (!strcmp(optarg, "debug"))
{
minLogLevel = LOG_DEBUG;
}
else
{
fprintf(stderr, "Invalid minimal log level: %s\n", optarg);
wrongArgs = true;
printHelp = true;
break;
}
minLogLevelSet = true;
break;
case 'm':
if (!strcmp(optarg, "first"))
{
multipleActionsBehaviour = MULTIPLE_ACTIONS_BEHAVIOUR_FIRST;
}
else if (!strcmp(optarg, "last"))
{
multipleActionsBehaviour = MULTIPLE_ACTIONS_BEHAVIOUR_LAST;
}
else if (!strcmp(optarg, "all"))
{
multipleActionsBehaviour = MULTIPLE_ACTIONS_BEHAVIOUR_ALL;
}
else if (!strcmp(optarg, "none"))
{
multipleActionsBehaviour = MULTIPLE_ACTIONS_BEHAVIOUR_NONE;
}
else
{
fprintf(stderr, "Invalid multiple actions behaviour: %s\n", optarg);
wrongArgs = true;
printHelp = true;
break;
}
multipleActionsBehaviourSet = true;
break;
case 'f':
configFiles.push_back(QString::fromLocal8Bit(optarg));
break;
case '?':
case 'h':
printHelp = true;
break;
default:
wrongArgs = true;
printHelp = true;
}
}
if (printHelp)
{
printf("Global key shortcuts daemon\n"
"\n"
"Version: " LXQT_VERSION "\n"
"License: GNU Lesser General Public License version 2.1 or later\n"
"Copyright: (c) 2013 Razor team\n"
"\n"
"Usage %s [OPTIONS]\n"
"\n"
"Possible options are:\n"
"\n"
" --no-daemon\n"
" Run as a usual application, not a daemon\n"
" and print messages to stderr.\n"
"\n"
" --daemon\n"
" Run as a daemon, not a usual application\n"
" and print messages to syslog.\n"
"\n"
" --use-syslog\n"
" Print messages to syslog if run as a usual application.\n"
"\n"
" --log-level=VALUE\n"
" Set minimal log level.\n"
" Possible values are:\n"
" error\n"
" warning\n"
" notice (default)\n"
" info\n"
" debug .\n"
"\n"
" --multiple-actions-behaviour=VALUE\n"
" Set the behaviour for the case of multiple actions\n"
" assigned to the same shortcut.\n"
" Possible values are:\n"
" first (default)\n"
" last\n"
" all\n"
" none .\n"
"\n"
" --config-file=FILENAME\n"
" Use config file FILENAME. Can be used several times.\n"
" The last loaded file is used to save settings.\n"
" Default is: ${HOME}/" DEFAULT_CONFIG "\n"
"\n"
" --help\n"
" -h\n"
" -?\n"
" This help.\n"
, basename(argv[0]));
return wrongArgs ? EXIT_FAILURE : EXIT_SUCCESS;
}
if (runAsDaemon)
{
if (daemon(0, 0) < 0)
{
fprintf(stderr, "Cannot become a daemon: %s\n", strerror(errno));
return EXIT_FAILURE;
}
}
const char* home = getenv("HOME");
int ignoreIt = chdir((home && *home) ? home : "/");
(void)ignoreIt;
if (configFiles.empty() && home && *home)
{
if( ! QFile::exists(QString::fromLocal8Bit(home) + "/" DEFAULT_CONFIG) ) //Load default settings
configFiles.push_back("/etc/xdg/lxqt/globalkeyshortcuts.conf");
configFiles.push_back(QString::fromLocal8Bit(home) + "/" DEFAULT_CONFIG);
}
LXQt::Application app(argc, argv);
Core core(runAsDaemon || useSyslog, minLogLevelSet, minLogLevel, configFiles, multipleActionsBehaviourSet, multipleActionsBehaviour);
if (!core.ready())
{
return EXIT_FAILURE;
}
return app.exec();
}