From 4aed2c8219774f5d797760606b8489a92ddc5163 Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kxkb/layoutmap.cpp | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 kxkb/layoutmap.cpp (limited to 'kxkb/layoutmap.cpp') diff --git a/kxkb/layoutmap.cpp b/kxkb/layoutmap.cpp new file mode 100644 index 000000000..f6273c967 --- /dev/null +++ b/kxkb/layoutmap.cpp @@ -0,0 +1,132 @@ +// +// C++ Implementation: layoutmap +// +// Description: +// +// +// Author: Andriy Rysin , (C) 2006 +// +// Copyright: See COPYING file that comes with this distribution +// +// + +#include "layoutmap.h" + +#include "x11helper.h" + + +LayoutMap::LayoutMap(const KxkbConfig& kxkbConfig_): + m_kxkbConfig(kxkbConfig_), + m_currentWinId( X11Helper::UNKNOWN_WINDOW_ID ) +{ +} + +// private +void LayoutMap::clearMaps() +{ + m_appLayouts.clear(); + m_winLayouts.clear(); + m_globalLayouts.clear(); + //setCurrentWindow( -1 ); +} + +void LayoutMap::reset() +{ + clearMaps(); + setCurrentWindow( X11Helper::UNKNOWN_WINDOW_ID ); +} + + + +void LayoutMap::setCurrentWindow(WId winId) +{ + m_currentWinId = winId; + if( m_kxkbConfig.m_switchingPolicy == SWITCH_POLICY_WIN_CLASS ) + m_currentWinClass = X11Helper::getWindowClass(winId, qt_xdisplay()); +} + +// private +//LayoutQueue& +QPtrQueue& LayoutMap::getCurrentLayoutQueueInternal(WId winId) +{ + if( winId == X11Helper::UNKNOWN_WINDOW_ID ) + return m_globalLayouts; + + switch( m_kxkbConfig.m_switchingPolicy ) { + case SWITCH_POLICY_WIN_CLASS: { +// QString winClass = X11Helper::getWindowClass(winId, qt_xdisplay()); + return m_appLayouts[ m_currentWinClass ]; + } + case SWITCH_POLICY_WINDOW: + return m_winLayouts[ winId ]; + + default: + return m_globalLayouts; + } +} + +// private +//LayoutQueue& +QPtrQueue& LayoutMap::getCurrentLayoutQueue(WId winId) +{ + QPtrQueue& layoutQueue = getCurrentLayoutQueueInternal(winId); + if( layoutQueue.count() == 0 ) { + initLayoutQueue(layoutQueue); + kdDebug() << "map: Created queue for " << winId << " size: " << layoutQueue.count() << endl; + } + + return layoutQueue; +} + +LayoutState& LayoutMap::getCurrentLayout() { + return *getCurrentLayoutQueue(m_currentWinId).head(); +} + +LayoutState& LayoutMap::getNextLayout() { + LayoutQueue& layoutQueue = getCurrentLayoutQueue(m_currentWinId); + LayoutState* layoutState = layoutQueue.dequeue(); + layoutQueue.enqueue(layoutState); + + kdDebug() << "map: Next layout: " << layoutQueue.head()->layoutUnit.toPair() + << " group: " << layoutQueue.head()->layoutUnit.defaultGroup << " for " << m_currentWinId << endl; + + return *layoutQueue.head(); +} + +void LayoutMap::setCurrentGroup(int group) { + getCurrentLayout().group = group; +} + +void LayoutMap::setCurrentLayout(const LayoutUnit& layoutUnit) { + LayoutQueue& layoutQueue = getCurrentLayoutQueue(m_currentWinId); + kdDebug() << "map: Storing layout: " << layoutUnit.toPair() + << " group: " << layoutUnit.defaultGroup << " for " << m_currentWinId << endl; + + int queueSize = (int)layoutQueue.count(); + for(int ii=0; iilayoutUnit == layoutUnit ) + return; // if present return when it's in head + + LayoutState* layoutState = layoutQueue.dequeue(); + if( ii < queueSize - 1 ) { + layoutQueue.enqueue(layoutState); + } + else { + delete layoutState; + layoutQueue.enqueue(new LayoutState(layoutUnit)); + } + } + for(int ii=0; ii