mirror of
https://github.com/KDE/konsole.git
synced 2026-05-03 20:26:45 -04:00
Add basic code to associate shortcuts with profiles and load/save those shortcut/profile pairs. Move Profile class into its own source file. Move old TODO list into the 'old' directory.
svn path=/trunk/KDE/kdebase/apps/konsole/; revision=664308
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
This source file is part of Konsole, a terminal emulator.
|
||||
|
||||
Copyright (C) 2006 by Robert Knight <robertknight@gmail.com>
|
||||
Copyright (C) 2006-7 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
|
||||
@@ -45,333 +45,6 @@
|
||||
using namespace Konsole;
|
||||
|
||||
SessionManager* SessionManager::_instance = 0;
|
||||
QHash<QString,Profile::Property> 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(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::Property,QVariant> 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<QString> 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 , "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<QString>(general,"Directory",profile,Profile::Directory);
|
||||
|
||||
readStandardElement<QString>(general,"Icon",profile,Profile::Icon);
|
||||
readStandardElement<QString>(general,"LocalTabTitleFormat",profile,Profile::LocalTabTitleFormat);
|
||||
readStandardElement<QString>(general,"RemoteTabTitleFormat",profile,Profile::RemoteTabTitleFormat);
|
||||
|
||||
readStandardElement<int>(general,"TabBarMode",profile,Profile::TabBarMode);
|
||||
readStandardElement<bool>(general,"ShowMenuBar",profile,Profile::ShowMenuBar);
|
||||
|
||||
// keyboard
|
||||
KConfigGroup keyboard = config.group("Keyboard");
|
||||
readStandardElement<QString>(keyboard,"KeyBindings",profile,Profile::KeyBindings);
|
||||
|
||||
// appearence
|
||||
KConfigGroup appearance = config.group("Appearance");
|
||||
|
||||
readStandardElement<QString>(appearance,"ColorScheme",profile,Profile::ColorScheme);
|
||||
readStandardElement<QFont>(appearance,"Font",profile,Profile::Font);
|
||||
|
||||
// scrolling
|
||||
KConfigGroup scrolling = config.group("Scrolling");
|
||||
|
||||
readStandardElement<int>(scrolling,"HistoryMode",profile,Profile::HistoryMode);
|
||||
readStandardElement<int>(scrolling,"HistorySize",profile,Profile::HistorySize);
|
||||
readStandardElement<int>(scrolling,"ScrollBarPosition",profile,Profile::ScrollBarPosition);
|
||||
|
||||
// terminal features
|
||||
KConfigGroup terminalFeatures = config.group("Terminal Features");
|
||||
|
||||
readStandardElement<bool>(terminalFeatures,"FlowControl",profile,Profile::FlowControlEnabled);
|
||||
readStandardElement<bool>(terminalFeatures,"BlinkingCursor",profile,Profile::BlinkingCursorEnabled);
|
||||
|
||||
// cursor settings
|
||||
KConfigGroup cursorOptions = config.group("Cursor Options");
|
||||
|
||||
readStandardElement<bool>(cursorOptions,"UseCustomCursorColor",profile,Profile::UseCustomCursorColor);
|
||||
readStandardElement<QColor>(cursorOptions,"CustomCursorColor",profile,Profile::CustomCursorColor);
|
||||
readStandardElement<int>(cursorOptions,"CursorShape",profile,Profile::CursorShape);
|
||||
|
||||
// interaction options
|
||||
KConfigGroup interactionOptions = config.group("Interaction Options");
|
||||
|
||||
readStandardElement<QString>(interactionOptions,"WordCharacters",profile,Profile::WordCharacters);
|
||||
|
||||
return true;
|
||||
}
|
||||
template <typename T>
|
||||
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;
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
@@ -418,9 +91,9 @@ SessionManager::SessionManager()
|
||||
Q_ASSERT( _types.count() > 0 );
|
||||
Q_ASSERT( !_defaultProfile.isEmpty() );
|
||||
|
||||
// now that the session types have been loaded,
|
||||
// get the list of favorite sessions
|
||||
//loadFavorites();
|
||||
// get shortcuts and paths of profiles associated with
|
||||
// them
|
||||
loadShortcuts();
|
||||
}
|
||||
QString SessionManager::loadProfile(const QString& path)
|
||||
{
|
||||
@@ -430,7 +103,7 @@ QString SessionManager::loadProfile(const QString& path)
|
||||
{
|
||||
iter.next();
|
||||
if ( iter.value()->path() == path )
|
||||
return QString();
|
||||
return iter.key();
|
||||
}
|
||||
|
||||
// load the profile
|
||||
@@ -483,6 +156,9 @@ SessionManager::~SessionManager()
|
||||
// save default profile
|
||||
setDefaultProfile( _defaultProfile );
|
||||
|
||||
// save shortcuts
|
||||
saveShortcuts();
|
||||
|
||||
// free profiles
|
||||
QListIterator<Profile*> infoIter(_types.values());
|
||||
|
||||
@@ -803,6 +479,57 @@ void SessionManager::setFavorite(const QString& key , bool favorite)
|
||||
}
|
||||
|
||||
}
|
||||
void SessionManager::loadShortcuts()
|
||||
{
|
||||
KSharedConfigPtr appConfig = KGlobal::config();
|
||||
KConfigGroup shortcutGroup = appConfig->group("Profile Shortcuts");
|
||||
|
||||
QMap<QString,QString> entries = shortcutGroup.entryMap();
|
||||
|
||||
QMapIterator<QString,QString> iter(entries);
|
||||
while ( iter.hasNext() )
|
||||
{
|
||||
iter.next();
|
||||
|
||||
QKeySequence shortcut = QKeySequence::fromString(iter.key());
|
||||
QString profilePath = iter.value();
|
||||
|
||||
ShortcutData data;
|
||||
data.profilePath = profilePath;
|
||||
|
||||
_shortcuts.insert(shortcut,data);
|
||||
}
|
||||
}
|
||||
void SessionManager::saveShortcuts()
|
||||
{
|
||||
KSharedConfigPtr appConfig = KGlobal::config();
|
||||
KConfigGroup shortcutGroup = appConfig->group("Profile Shortcuts");
|
||||
shortcutGroup.deleteGroup();
|
||||
|
||||
QMapIterator<QKeySequence,ShortcutData> iter(_shortcuts);
|
||||
while ( iter.hasNext() )
|
||||
{
|
||||
iter.next();
|
||||
|
||||
QString shortcutString = iter.key().toString();
|
||||
|
||||
shortcutGroup.writeEntry(shortcutString,
|
||||
iter.value().profilePath);
|
||||
}
|
||||
}
|
||||
void SessionManager::setShortcut(const QString& profileKey ,
|
||||
const QKeySequence& keySequence )
|
||||
{
|
||||
QKeySequence existingShortcut = shortcut(profileKey);
|
||||
_shortcuts.remove(existingShortcut);
|
||||
|
||||
ShortcutData data;
|
||||
data.profileKey = profileKey;
|
||||
data.profilePath = profile(profileKey)->path();
|
||||
// TODO - This won't work if the profile doesn't
|
||||
// have a path yet
|
||||
_shortcuts.insert(keySequence,data);
|
||||
}
|
||||
void SessionManager::loadFavorites()
|
||||
{
|
||||
KSharedConfigPtr appConfig = KGlobal::config();
|
||||
@@ -859,6 +586,41 @@ void SessionManager::saveFavorites()
|
||||
|
||||
favoriteGroup.writeEntry("Favorites",paths);
|
||||
}
|
||||
|
||||
QList<QKeySequence> SessionManager::shortcuts()
|
||||
{
|
||||
return _shortcuts.keys();
|
||||
}
|
||||
|
||||
QString SessionManager::findByShortcut(const QKeySequence& shortcut)
|
||||
{
|
||||
Q_ASSERT( _shortcuts.contains(shortcut) );
|
||||
|
||||
if ( _shortcuts[shortcut].profileKey.isEmpty() )
|
||||
{
|
||||
QString key = loadProfile(_shortcuts[shortcut].profilePath);
|
||||
_shortcuts[shortcut].profileKey = key;
|
||||
}
|
||||
|
||||
return _shortcuts[shortcut].profileKey;
|
||||
}
|
||||
|
||||
QKeySequence SessionManager::shortcut(const QString& profileKey) const
|
||||
{
|
||||
Profile* info = profile(profileKey);
|
||||
|
||||
QMapIterator<QKeySequence,ShortcutData> iter(_shortcuts);
|
||||
while (iter.hasNext())
|
||||
{
|
||||
iter.next();
|
||||
if ( iter.value().profileKey == profileKey
|
||||
|| iter.value().profilePath == info->path() )
|
||||
return iter.key();
|
||||
}
|
||||
// dummy
|
||||
return QKeySequence(Qt::CTRL+Qt::ALT+Qt::Key_B);
|
||||
}
|
||||
|
||||
void SessionManager::setInstance(SessionManager* instance)
|
||||
{
|
||||
_instance = instance;
|
||||
@@ -868,4 +630,5 @@ SessionManager* SessionManager::instance()
|
||||
return _instance;
|
||||
}
|
||||
|
||||
|
||||
#include "SessionManager.moc"
|
||||
|
||||
Reference in New Issue
Block a user