/* This source file is part of Konsole, a terminal emulator. Copyright (C) 2006-7 by Robert Knight 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 "Profile.h" // Qt #include #include // KDE #include #include #include #include #include // Konsole #include "ShellCommand.h" using namespace Konsole; QHash Profile::_propertyNames; FallbackProfile::FallbackProfile() : Profile(0) { // Fallback settings setProperty(Name,i18n("Shell")); setProperty(Command,getenv("SHELL")); setProperty(Icon,"konsole"); setProperty(Arguments,QStringList() << getenv("SHELL")); setProperty(LocalTabTitleFormat,"%d : %n"); setProperty(RemoteTabTitleFormat,"%H (%u)"); setProperty(TabBarMode,AlwaysShowTabBar); setProperty(TabBarPosition,TabBarBottom); setProperty(ShowMenuBar,true); setProperty(KeyBindings,"default"); setProperty(Font,QFont("Monospace")); setProperty(HistoryMode,FixedSizeHistory); setProperty(HistorySize,1000); setProperty(ScrollBarPosition,ScrollBarRight); setProperty(FlowControlEnabled,true); setProperty(AllowProgramsToResizeWindow,true); setProperty(BlinkingTextEnabled,true); setProperty(BlinkingCursorEnabled,false); setProperty(CursorShape,BlockCursor); setProperty(UseCustomCursorColor,false); setProperty(CustomCursorColor,Qt::black); // default taken from KDE 3 setProperty(WordCharacters,":@-./_~?&=%+#"); // Fallback should not be shown in menus setHidden(true); } Profile::Profile(Profile* parent) : _parent(parent) ,_hidden(false) { } bool Profile::isHidden() const { return _hidden; } void Profile::setHidden(bool hidden) { _hidden = hidden; } void Profile::setParent(Profile* parent) { _parent = parent; } const Profile* Profile::parent() const { return _parent; } bool Profile::isEmpty() const { return _propertyValues.isEmpty(); } QHash Profile::setProperties() const { return _propertyValues; } QVariant Profile::property(Property property) const { if ( _propertyValues.contains(property) ) return _propertyValues[property]; else if ( _parent ) return _parent->property(property); else return QVariant(); } void Profile::setProperty(Property property , const QVariant& value) { _propertyValues.insert(property,value); } bool Profile::isPropertySet(Property property) const { return _propertyValues.contains(property); } bool Profile::isNameRegistered(const QString& name) { return _propertyNames.contains(name); } Profile::Property Profile::lookupByName(const QString& name) { return _propertyNames[name]; } QList Profile::namesForProperty(Property property) { return _propertyNames.keys(property); } void Profile::registerName(Property property , const QString& name) { _propertyNames.insert(name,property); } QString KDE4ProfileWriter::getPath(const Profile* info) { QString newPath; if ( info->isPropertySet(Profile::Path) ) newPath=info->path(); // if the path is not specified, use the profile name + ".profile" if ( newPath.isEmpty() ) newPath = info->name() + ".profile"; QFileInfo fileInfo(newPath); if (!fileInfo.isAbsolute()) newPath = KGlobal::dirs()->saveLocation("data","konsole/") + newPath; qDebug() << "Saving profile under name: " << newPath; return newPath; } void KDE4ProfileWriter::writeStandardElement(KConfigGroup& group , char* name , const Profile* profile , Profile::Property attribute) { if ( profile->isPropertySet(attribute) ) group.writeEntry(name,profile->property(attribute)); } bool KDE4ProfileWriter::writeProfile(const QString& path , const Profile* profile) { KConfig config(path,KConfig::NoGlobals); // Basic Profile Settings KConfigGroup general = config.group("General"); if ( profile->isPropertySet(Profile::Name) ) general.writeEntry("Name",profile->name()); if ( profile->isPropertySet(Profile::Command) || profile->isPropertySet(Profile::Arguments) ) general.writeEntry("Command", ShellCommand(profile->command(),profile->arguments()).fullCommand()); if ( profile->isPropertySet(Profile::Directory) ) general.writeEntry("Directory",profile->defaultWorkingDirectory()); writeStandardElement( general , "Icon" , profile , Profile::Icon ); // Tab Titles writeStandardElement( general , "LocalTabTitleFormat" , profile , Profile::LocalTabTitleFormat ); writeStandardElement( general , "RemoteTabTitleFormat" , profile , Profile::RemoteTabTitleFormat ); // Menu and Tab Bar writeStandardElement( general , "TabBarMode" , profile , Profile::TabBarMode ); writeStandardElement( general , "TabBarPosition" , profile , Profile::TabBarPosition ); writeStandardElement( general , "ShowMenuBar" , profile , Profile::ShowMenuBar ); // Keyboard KConfigGroup keyboard = config.group("Keyboard"); writeStandardElement( keyboard , "KeyBindings" , profile , Profile::KeyBindings ); // Appearance KConfigGroup appearance = config.group("Appearance"); writeStandardElement( appearance , "ColorScheme" , profile , Profile::ColorScheme ); writeStandardElement( appearance , "Font" , profile , Profile::Font ); // Scrolling KConfigGroup scrolling = config.group("Scrolling"); writeStandardElement( scrolling , "HistoryMode" , profile , Profile::HistoryMode ); writeStandardElement( scrolling , "HistorySize" , profile , Profile::HistorySize ); writeStandardElement( scrolling , "ScrollBarPosition" , profile , Profile::ScrollBarPosition ); // Terminal Features KConfigGroup terminalFeatures = config.group("Terminal Features"); writeStandardElement( terminalFeatures , "FlowControl" , profile , Profile::FlowControlEnabled ); writeStandardElement( terminalFeatures , "BlinkingCursor" , profile , Profile::BlinkingCursorEnabled ); // Cursor KConfigGroup cursorOptions = config.group("Cursor Options"); writeStandardElement( cursorOptions , "UseCustomCursorColor" , profile , Profile::UseCustomCursorColor ); writeStandardElement( cursorOptions , "CustomCursorColor" , profile , Profile::CustomCursorColor ); writeStandardElement( cursorOptions , "CursorShape" , profile , Profile::CursorShape ); // Interaction KConfigGroup interactionOptions = config.group("Interaction Options"); writeStandardElement( interactionOptions , "WordCharacters" , profile , Profile::WordCharacters ); return true; } QStringList KDE4ProfileReader::findProfiles() { return KGlobal::dirs()->findAllResources("data","konsole/*.profile", KStandardDirs::NoDuplicates); } bool KDE4ProfileReader::readProfile(const QString& path , Profile* profile) { qDebug() << "KDE 4 Profile Reader:" << path; KConfig config(path,KConfig::NoGlobals); // general KConfigGroup general = config.group("General"); if ( general.hasKey("Name") ) profile->setProperty(Profile::Name,general.readEntry("Name")); else return false; if ( general.hasKey("Command") ) { ShellCommand shellCommand(general.readEntry("Command")); profile->setProperty(Profile::Command,shellCommand.command()); profile->setProperty(Profile::Arguments,shellCommand.arguments()); } readStandardElement(general,"Directory",profile,Profile::Directory); readStandardElement(general,"Icon",profile,Profile::Icon); readStandardElement(general,"LocalTabTitleFormat",profile,Profile::LocalTabTitleFormat); readStandardElement(general,"RemoteTabTitleFormat",profile,Profile::RemoteTabTitleFormat); readStandardElement(general,"TabBarMode",profile,Profile::TabBarMode); readStandardElement(general,"TabBarPosition",profile,Profile::TabBarPosition); readStandardElement(general,"ShowMenuBar",profile,Profile::ShowMenuBar); // keyboard KConfigGroup keyboard = config.group("Keyboard"); readStandardElement(keyboard,"KeyBindings",profile,Profile::KeyBindings); // appearence KConfigGroup appearance = config.group("Appearance"); readStandardElement(appearance,"ColorScheme",profile,Profile::ColorScheme); readStandardElement(appearance,"Font",profile,Profile::Font); // scrolling KConfigGroup scrolling = config.group("Scrolling"); readStandardElement(scrolling,"HistoryMode",profile,Profile::HistoryMode); readStandardElement(scrolling,"HistorySize",profile,Profile::HistorySize); readStandardElement(scrolling,"ScrollBarPosition",profile,Profile::ScrollBarPosition); // terminal features KConfigGroup terminalFeatures = config.group("Terminal Features"); readStandardElement(terminalFeatures,"FlowControl",profile,Profile::FlowControlEnabled); readStandardElement(terminalFeatures,"BlinkingCursor",profile,Profile::BlinkingCursorEnabled); // cursor settings KConfigGroup cursorOptions = config.group("Cursor Options"); readStandardElement(cursorOptions,"UseCustomCursorColor",profile,Profile::UseCustomCursorColor); readStandardElement(cursorOptions,"CustomCursorColor",profile,Profile::CustomCursorColor); readStandardElement(cursorOptions,"CursorShape",profile,Profile::CursorShape); // interaction options KConfigGroup interactionOptions = config.group("Interaction Options"); readStandardElement(interactionOptions,"WordCharacters",profile,Profile::WordCharacters); return true; } template void KDE4ProfileReader::readStandardElement(const KConfigGroup& group , char* name , Profile* info , Profile::Property property) { if ( group.hasKey(name) ) info->setProperty(property,group.readEntry(name,T())); } QStringList KDE3ProfileReader::findProfiles() { return KGlobal::dirs()->findAllResources("data", "konsole/*.desktop", KStandardDirs::NoDuplicates); } bool KDE3ProfileReader::readProfile(const QString& path , Profile* profile) { if (!QFile::exists(path)) return false; KDesktopFile* desktopFile = new KDesktopFile(path); KConfigGroup* config = new KConfigGroup( desktopFile->desktopGroup() ); if ( config->hasKey("Name") ) profile->setProperty(Profile::Name,config->readEntry("Name")); qDebug() << "reading KDE 3 profile " << profile->name(); if ( config->hasKey("Icon") ) profile->setProperty(Profile::Icon,config->readEntry("Icon")); if ( config->hasKey("Exec") ) { const QString& fullCommand = config->readEntry("Exec"); ShellCommand shellCommand(fullCommand); profile->setProperty(Profile::Command,shellCommand.command()); profile->setProperty(Profile::Arguments,shellCommand.arguments()); } if ( config->hasKey("Schema") ) { profile->setProperty(Profile::ColorScheme,config->readEntry("Schema").replace (".schema",QString())); } if ( config->hasKey("defaultfont") ) { profile->setProperty(Profile::Font,config->readEntry("defaultfont")); } if ( config->hasKey("KeyTab") ) { profile->setProperty(Profile::KeyBindings,config->readEntry("KeyTab")); } if ( config->hasKey("Term") ) { profile->setProperty(Profile::Environment, QStringList() << "TERM="+config->readEntry("Term")); } if ( config->hasKey("Cwd") ) { profile->setProperty(Profile::Directory,config->readEntry("Cwd")); } delete desktopFile; delete config; return true; } #include "Profile.moc"