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.
 
 
 
 
 

282 lines
12 KiB

/*
Copyright 2006-2008 by Robert Knight <robertknight@gmail.com>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
*/
// Own
#include "Application.h"
#include "MainWindow.h"
// OS specific
#include <kde_file.h>
// KDE
#include <KAboutData>
#include <KCmdLineArgs>
#include <KLocale>
#define KONSOLE_VERSION "2.9.999"
using Konsole::Application;
// fill the KAboutData structure with information about contributors to Konsole.
void fillAboutData(KAboutData& aboutData);
// fill the KCmdLineOptions object with konsole specific options.
void fillCommandLineOptions(KCmdLineOptions& options);
// check and report whether this konsole instance should use a new konsole
// process, or re-use an existing konsole process.
bool shouldUseNewProcess();
// restore sessions saved by KDE.
void restoreSession(Application& app);
// ***
// Entry point into the Konsole terminal application.
// ***
extern "C" int KDE_EXPORT kdemain(int argc, char** argv)
{
KAboutData about("konsole",
0,
ki18nc("@title", "<application>Konsole</application>"),
KONSOLE_VERSION,
ki18nc("@title", "Terminal emulator"),
KAboutData::License_GPL_V2
);
fillAboutData(about);
KCmdLineArgs::init(argc, argv, &about);
KCmdLineArgs::addStdCmdLineOptions(); // Qt and KDE options
KUniqueApplication::addCmdLineOptions(); // KUniqueApplication options
KCmdLineOptions konsoleOptions; // Konsole options
fillCommandLineOptions(konsoleOptions);
KCmdLineArgs::addCmdLineOptions(konsoleOptions);
KUniqueApplication::StartFlags startFlags;
if (shouldUseNewProcess())
startFlags = KUniqueApplication::NonUniqueInstance;
// create a new application instance if there are no running Konsole
// instances, otherwise inform the existing Konsole process and exit
if (!KUniqueApplication::start(startFlags)) {
exit(0);
}
Application app;
// make sure the d&d popup menu provided by libkonq get translated.
KGlobal::locale()->insertCatalog("libkonq");
restoreSession(app);
return app.exec();
}
bool shouldUseNewProcess()
{
// The "unique process" model of konsole is incompatible with some or all
// Qt/KDE options. When those incompatile options are given, konsole must
// use new process
//
// TODO: make sure the existing list is OK and add more incompatible options.
// take Qt options into consideration
const KCmdLineArgs* qtArgs = KCmdLineArgs::parsedArgs("qt");
QStringList qtProblematicOptions;
qtProblematicOptions << "session" << "name" << "reverse"
<< "stylesheet" << "graphicssystem";
#ifdef Q_WS_X11
qtProblematicOptions << "display" << "visual";
#endif
foreach(const QString& option, qtProblematicOptions) {
if ( qtArgs->isSet(option.toLocal8Bit()) ) {
return true;
}
}
// take KDE options into consideration
const KCmdLineArgs* kdeArgs = KCmdLineArgs::parsedArgs("kde");
QStringList kdeProblematicOptions;
kdeProblematicOptions << "config" << "style";
#ifdef Q_WS_X11
kdeProblematicOptions << "waitforwm";
#endif
foreach(const QString& option, kdeProblematicOptions) {
if ( kdeArgs->isSet(option.toLocal8Bit()) ) {
return true;
}
}
const KCmdLineArgs* kUniqueAppArgs = KCmdLineArgs::parsedArgs("kuniqueapp");
// when user asks konsole to run in foreground through the --nofork option
// provided by KUniqueApplication, we must use new process. Otherwise, there
// will be no process for users to wait for finishing.
const bool shouldRunInForeground = !kUniqueAppArgs->isSet("fork");
if (shouldRunInForeground) {
return true;
}
const KCmdLineArgs* konsoleArgs = KCmdLineArgs::parsedArgs();
// the only way to create new tab is to reuse existing Konsole process.
if (konsoleArgs->isSet("new-tab")) {
return false;
}
// when starting Konsole from a terminal, a new process must be used
// so that the current environment is propagated into the shells of the new
// Konsole and any debug output or warnings from Konsole are written to
// the current terminal
bool hasControllingTTY = false;
if (KDE_open("/dev/tty", O_RDONLY) != -1) {
hasControllingTTY = true;
}
return hasControllingTTY;
}
void fillCommandLineOptions(KCmdLineOptions& options)
{
options.add("profile <name>",
ki18n("Name of profile to use for new Konsole instance"));
options.add("workdir <dir>",
ki18n("Set the initial working directory of the new tab or"
" window to 'dir'"));
options.add("hold");
options.add("noclose",
ki18n("Do not close the initial session automatically when it"
" ends."));
options.add("new-tab",
ki18n("Create a new tab in an existing window rather than"
" creating a new window"));
options.add("tabs-from-file <file>",
ki18n("Create tabs as specified in given tabs configuration"
" file"));
options.add("background-mode",
ki18n("Start Konsole in the background and bring to the front"
" when Ctrl+Shift+F12 (by default) is pressed"));
options.add("show-menubar", ki18n("Show the menubar, overriding the default setting"));
options.add("hide-menubar", ki18n("Hide the menubar, overriding the default setting"));
options.add("show-tabbar", ki18n("Show the tabbar, overriding the default setting"));
options.add("hide-tabbar", ki18n("Hide the tabbar, overriding the default setting"));
options.add("notransparency",
ki18n("Disable transparent backgrounds, even if the system"
" supports them."));
options.add("list-profiles", ki18n("List the available profiles"));
options.add("list-profile-properties",
ki18n("List all the profile properties names and their type"
" (for use with -p)"));
options.add("p <property=value>",
ki18n("Change the value of a profile property."));
options.add("!e <cmd>",
ki18n("Command to execute. This option will catch all following"
" arguments, so use it as the last option."));
options.add("+[args]", ki18n("Arguments passed to command"));
options.add("", ki18n("Use --nofork to run in the foreground (helpful"
" with the -e option)."));
}
void fillAboutData(KAboutData& aboutData)
{
aboutData.setProgramIconName("utilities-terminal");
aboutData.setHomepage("http://konsole.kde.org");
aboutData.addAuthor(ki18nc("@info:credit", "Kurt Hindenburg"),
ki18nc("@info:credit", "General maintainer, bug fixes and general"
" improvements"),
"kurt.hindenburg@gmail.com");
aboutData.addAuthor(ki18nc("@info:credit", "Robert Knight"),
ki18nc("@info:credit", "Previous maintainer, ported to KDE4"),
"robertknight@gmail.com");
aboutData.addAuthor(ki18nc("@info:credit", "Lars Doelle"),
ki18nc("@info:credit", "Original author"),
"lars.doelle@on-line.de");
aboutData.addCredit(ki18nc("@info:credit", "Jekyll Wu"),
ki18nc("@info:credit", "Bug fixes and general improvements"),
"adaptee@gmail.com");
aboutData.addCredit(ki18nc("@info:credit", "Waldo Bastian"),
ki18nc("@info:credit", "Bug fixes and general improvements"),
"bastian@kde.org");
aboutData.addCredit(ki18nc("@info:credit", "Stephan Binner"),
ki18nc("@info:credit", "Bug fixes and general improvements"),
"binner@kde.org");
aboutData.addCredit(ki18nc("@info:credit", "Thomas Dreibholz"),
ki18nc("@info:credit", "General improvements"),
"dreibh@iem.uni-due.de");
aboutData.addCredit(ki18nc("@info:credit", "Chris Machemer"),
ki18nc("@info:credit", "Bug fixes"),
"machey@ceinetworks.com");
aboutData.addCredit(ki18nc("@info:credit", "Francesco Cecconi"),
ki18nc("@info:credit", "Bug fixes"),
"francesco.cecconi@gmail.com");
aboutData.addCredit(ki18nc("@info:credit", "Stephan Kulow"),
ki18nc("@info:credit", "Solaris support and history"),
"coolo@kde.org");
aboutData.addCredit(ki18nc("@info:credit", "Alexander Neundorf"),
ki18nc("@info:credit", "Bug fixes and improved startup performance"),
"neundorf@kde.org");
aboutData.addCredit(ki18nc("@info:credit", "Peter Silva"),
ki18nc("@info:credit", "Marking improvements"),
"Peter.A.Silva@gmail.com");
aboutData.addCredit(ki18nc("@info:credit", "Lotzi Boloni"),
ki18nc("@info:credit", "Embedded Konsole\n"
"Toolbar and session names"),
"boloni@cs.purdue.edu");
aboutData.addCredit(ki18nc("@info:credit", "David Faure"),
ki18nc("@info:credit", "Embedded Konsole\n"
"General improvements"),
"faure@kde.org");
aboutData.addCredit(ki18nc("@info:credit", "Antonio Larrosa"),
ki18nc("@info:credit", "Visual effects"),
"larrosa@kde.org");
aboutData.addCredit(ki18nc("@info:credit", "Matthias Ettrich"),
ki18nc("@info:credit", "Code from the kvt project\n"
"General improvements"),
"ettrich@kde.org");
aboutData.addCredit(ki18nc("@info:credit", "Warwick Allison"),
ki18nc("@info:credit", "Schema and text selection improvements"),
"warwick@troll.no");
aboutData.addCredit(ki18nc("@info:credit", "Dan Pilone"),
ki18nc("@info:credit", "SGI port"),
"pilone@slac.com");
aboutData.addCredit(ki18nc("@info:credit", "Kevin Street"),
ki18nc("@info:credit", "FreeBSD port"),
"street@iname.com");
aboutData.addCredit(ki18nc("@info:credit", "Sven Fischer"),
ki18nc("@info:credit", "Bug fixes"),
"herpes@kawo2.renditionwth-aachen.de");
aboutData.addCredit(ki18nc("@info:credit", "Dale M. Flaven"),
ki18nc("@info:credit", "Bug fixes"),
"dflaven@netport.com");
aboutData.addCredit(ki18nc("@info:credit", "Martin Jones"),
ki18nc("@info:credit", "Bug fixes"),
"mjones@powerup.com.au");
aboutData.addCredit(ki18nc("@info:credit", "Lars Knoll"),
ki18nc("@info:credit", "Bug fixes"),
"knoll@mpi-hd.mpg.de");
aboutData.addCredit(ki18nc("@info:credit", "Thanks to many others.\n"));
}
void restoreSession(Application& app)
{
if (app.isSessionRestored()) {
int n = 1;
while (KMainWindow::canBeRestored(n))
app.newMainWindow()->restore(n++);
}
}