diff options
Diffstat (limited to 'kdesktop/krootwm.cpp')
-rw-r--r-- | kdesktop/krootwm.cpp | 922 |
1 files changed, 922 insertions, 0 deletions
diff --git a/kdesktop/krootwm.cpp b/kdesktop/krootwm.cpp new file mode 100644 index 000000000..e5b4b76e0 --- /dev/null +++ b/kdesktop/krootwm.cpp @@ -0,0 +1,922 @@ +/* + * krootwm.cpp Part of the KDE project. + * + * Copyright (C) 1997 Matthias Ettrich + * (C) 1997 Torben Weis, weis@kde.org + * (C) 1998 S.u.S.E. weis@suse.de + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License version 2 as published by the Free Software Foundation. + + 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; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + + +#include <stdlib.h> +#include <signal.h> +#include <unistd.h> +#include <stdlib.h> +#include <sys/wait.h> +#include <sys/stat.h> +#include <unistd.h> +#include <sys/types.h> +#include <dirent.h> +#include <errno.h> + +#include <kprocess.h> +#include <kstandarddirs.h> +#include <tdepopupmenu.h> +#include <tdeapplication.h> +#include <tdeconfig.h> +#include <kcmultidialog.h> +#include <kbookmarkmenu.h> +#include <konqbookmarkmanager.h> +#include <tdelocale.h> +#include <knewmenu.h> +#include <dcopclient.h> +#include <dcopref.h> +#include <khelpmenu.h> +#include <kdebug.h> +#include <twindowlistmenu.h> +#include <twin.h> +#include <tdemenubar.h> +#include <tdemessagebox.h> +#include <kuser.h> +#include <tqfile.h> +#include <ntqthread.h> +#include <tqeventloop.h> + +#include "krootwm.h" +#include "kdiconview.h" +#include "desktop.h" +#include "kcustommenu.h" +#include "kdesktopsettings.h" +#include "lockeng.h" + +#include <netwm.h> +#include <X11/X.h> +#include <X11/Xlib.h> + +#include <dmctl.h> + +KRootWm * KRootWm::s_rootWm = 0; + +extern TQCString kdesktop_name, kicker_name, twin_name; + +KRootWm::KRootWm(SaverEngine* _saver, KDesktop* _desktop) : TQObject(_desktop), startup(FALSE) +{ + s_rootWm = this; + m_actionCollection = new TDEActionCollection(_desktop, this, "KRootWm::m_actionCollection"); + m_pSaver = _saver; + m_pDesktop = _desktop; + m_bDesktopEnabled = (m_pDesktop->iconView() != 0); + customMenu1 = 0; + customMenu2 = 0; + m_configDialog = 0; + + // Creates the new menu + menuBar = 0; // no menubar yet + menuNew = 0; + if (m_bDesktopEnabled && kapp->authorize("editable_desktop_icons")) + { + menuNew = new KNewMenu( m_actionCollection, "new_menu" ); + connect(menuNew->popupMenu(), TQT_SIGNAL( aboutToShow() ), + this, TQT_SLOT( slotFileNewAboutToShow() ) ); + connect( menuNew, TQT_SIGNAL( activated() ), + m_pDesktop->iconView(), TQT_SLOT( slotNewMenuActivated() ) ); + } + + if (kapp->authorizeTDEAction("bookmarks")) + { + bookmarks = new TDEActionMenu( i18n("Bookmarks"), "bookmark", m_actionCollection, "bookmarks" ); + // The KBookmarkMenu is needed to fill the Bookmarks menu in the desktop menubar. + bookmarkMenu = new KBookmarkMenu( KonqBookmarkManager::self(), new KBookmarkOwner(), + bookmarks->popupMenu(), + m_actionCollection, + true, false ); + } + else + { + bookmarks = 0; + bookmarkMenu = 0; + } + + // The windowList and desktop menus can be part of a menubar (Mac style) + // so we create them here + desktopMenu = new TQPopupMenu; + windowListMenu = new KWindowListMenu; + connect( windowListMenu, TQT_SIGNAL( aboutToShow() ), + this, TQT_SLOT( slotWindowListAboutToShow() ) ); + + // Create the actions +#if 0 + if (m_bDesktopEnabled) + { + // Don't do that! One action in two parent collections means some invalid write + // during the second ~TDEActionCollection. + TDEAction *action = m_pDesktop->actionCollection()->action( "paste" ); + if (action) + m_actionCollection->insert( action ); + action = m_pDesktop->actionCollection()->action( "undo" ); + if (action) + m_actionCollection->insert( action ); + } +#endif + + if (kapp->authorize("run_command")) + { + new TDEAction(i18n("Run Command..."), "system-run", 0, TQT_TQOBJECT(m_pDesktop), TQT_SLOT( slotExecuteCommand() ), m_actionCollection, "exec" ); + new TDEAction(i18n("Open Terminal Here..." ), "terminal", CTRL+Key_T, this, TQT_SLOT( slotOpenTerminal() ), + m_actionCollection, "open_terminal" ); + } + + if (!TDEGlobal::config()->isImmutable()) + { + new TDEAction(i18n("Configure Desktop..."), "configure", 0, this, TQT_SLOT( slotConfigureDesktop() ), + m_actionCollection, "configdesktop" ); + new TDEAction(i18n("Disable Desktop Menu"), 0, this, TQT_SLOT( slotToggleDesktopMenu() ), + m_actionCollection, "togglemenubar" ); + } + + new TDEAction(i18n("Unclutter Windows"), 0, this, TQT_SLOT( slotUnclutterWindows() ), + m_actionCollection, "unclutter" ); + new TDEAction(i18n("Cascade Windows"), 0, this, TQT_SLOT( slotCascadeWindows() ), + m_actionCollection, "cascade" ); + + // arrange menu actions + if (m_bDesktopEnabled && kapp->authorize("editable_desktop_icons")) + { + new TDEAction(i18n("By Name (Case Sensitive)"), 0, this, TQT_SLOT( slotArrangeByNameCS() ), + m_actionCollection, "sort_ncs"); + new TDEAction(i18n("By Name (Case Insensitive)"), 0, this, TQT_SLOT( slotArrangeByNameCI() ), + m_actionCollection, "sort_nci"); + new TDEAction(i18n("By Size"), 0, this, TQT_SLOT( slotArrangeBySize() ), + m_actionCollection, "sort_size"); + new TDEAction(i18n("By Type"), 0, this, TQT_SLOT( slotArrangeByType() ), + m_actionCollection, "sort_type"); + new TDEAction(i18n("By Date"), 0, this, TQT_SLOT( slotArrangeByDate() ), + m_actionCollection, "sort_date"); + + TDEToggleAction *aSortDirsFirst = new TDEToggleAction( i18n("Directories First"), 0, m_actionCollection, "sort_directoriesfirst" ); + connect( aSortDirsFirst, TQT_SIGNAL( toggled( bool ) ), + this, TQT_SLOT( slotToggleDirFirst( bool ) ) ); + new TDEAction(i18n("Line Up Horizontally"), 0, + this, TQT_SLOT( slotLineupIconsHoriz() ), + m_actionCollection, "lineupHoriz" ); + new TDEAction(i18n("Line Up Vertically"), 0, + this, TQT_SLOT( slotLineupIconsVert() ), + m_actionCollection, "lineupVert" ); + TDEToggleAction *aAutoAlign = new TDEToggleAction(i18n("Align to Grid"), 0, + m_actionCollection, "realign" ); + connect( aAutoAlign, TQT_SIGNAL( toggled( bool ) ), + this, TQT_SLOT( slotToggleAutoAlign( bool ) ) ); + TDEToggleAction *aLockIcons = new TDEToggleAction(i18n("Lock in Place"), 0, m_actionCollection, "lock_icons"); + connect( aLockIcons, TQT_SIGNAL( toggled( bool ) ), + this, TQT_SLOT( slotToggleLockIcons( bool ) ) ); + } + if (m_bDesktopEnabled) + { + new TDEAction(i18n("Refresh Desktop"), "desktop", 0, this, TQT_SLOT( slotRefreshDesktop() ), + m_actionCollection, "refresh" ); + } + // Icons in sync with kicker + if (kapp->authorize("lock_screen")) + { + new TDEAction(i18n("Lock Session"), "system-lock-screen", 0, this, TQT_SLOT( slotLock() ), + m_actionCollection, "lock" ); + } + if (kapp->authorize("logout")) + { + new TDEAction(i18n("Log Out \"%1\"...").arg(KUser().loginName()), "system-log-out", 0, + this, TQT_SLOT( slotLogout() ), m_actionCollection, "logout" ); + } + + if (kapp->authorize("start_new_session") && DM().isSwitchable()) + { + new TDEAction(i18n("Start New Session"), "fork", 0, this, + TQT_SLOT( slotNewSession() ), m_actionCollection, "newsession" ); + if (kapp->authorize("lock_screen")) + { + new TDEAction(i18n("Lock Current && Start New Session"), "system-lock-screen", 0, this, + TQT_SLOT( slotLockNNewSession() ), m_actionCollection, "lockNnewsession" ); + } + } + + initConfig(); +} + +KRootWm::~KRootWm() +{ + delete m_actionCollection; + delete desktopMenu; + delete windowListMenu; +} + +void KRootWm::initConfig() +{ +// kdDebug() << "KRootWm::initConfig" << endl; + + // parse the configuration + m_bGlobalMenuBar = KDesktopSettings::macStyle(); + m_bShowMenuBar = m_bGlobalMenuBar || KDesktopSettings::showMenubar(); + + static const int choiceCount = 7; + // read configuration for clicks on root window + static const char * const s_choices[choiceCount] = { "", "WindowListMenu", "DesktopMenu", "AppMenu", "CustomMenu1", "CustomMenu2", "BookmarksMenu" }; + leftButtonChoice = middleButtonChoice = rightButtonChoice = NOTHING; + TQString s = KDesktopSettings::left(); + for ( int c = 0 ; c < choiceCount ; c ++ ) + if (s == s_choices[c]) + { leftButtonChoice = (menuChoice) c; break; } + s = KDesktopSettings::middle(); + for ( int c = 0 ; c < choiceCount ; c ++ ) + if (s == s_choices[c]) + { middleButtonChoice = (menuChoice) c; break; } + s = KDesktopSettings::right(); + for ( int c = 0 ; c < choiceCount ; c ++ ) + if (s == s_choices[c]) + { rightButtonChoice = (menuChoice) c; break; } + + // Read configuration for icons alignment + if ( m_bDesktopEnabled ) { + m_pDesktop->iconView()->setAutoAlign( KDesktopSettings::autoLineUpIcons() ); + if ( kapp->authorize( "editable_desktop_icons" ) ) { + m_pDesktop->iconView()->setItemsMovable( !KDesktopSettings::lockIcons() ); + TDEToggleAction *aLockIcons = static_cast<TDEToggleAction*>(m_actionCollection->action("lock_icons")); + if (aLockIcons) + aLockIcons->setChecked( KDesktopSettings::lockIcons() ); + } + TDEToggleAction *aAutoAlign = static_cast<TDEToggleAction*>(m_actionCollection->action("realign")); + if (aAutoAlign) + aAutoAlign->setChecked( KDesktopSettings::autoLineUpIcons() ); + TDEToggleAction *aSortDirsFirst = static_cast<TDEToggleAction*>(m_actionCollection->action("sort_directoriesfirst")); + if (aSortDirsFirst) + aSortDirsFirst->setChecked( KDesktopSettings::sortDirectoriesFirst() ); + } + + buildMenus(); +} + +void KRootWm::buildMenus() +{ +// kdDebug() << "KRootWm::buildMenus" << endl; + + delete menuBar; + menuBar = 0; + + delete customMenu1; + customMenu1 = 0; + delete customMenu2; + customMenu2 = 0; + + if (m_bShowMenuBar) + { +// kdDebug() << "showMenuBar" << endl; + menuBar = new KMenuBar; + menuBar->setCaption("TDE Desktop"); + } + + // create Arrange menu + TQPopupMenu *pArrangeMenu = 0; + TQPopupMenu *pLineupMenu = 0; + TDEAction *action; + help = new KHelpMenu(0, 0, false); + help->menu()->removeItem( KHelpMenu::menuAboutApp ); + + if (m_bDesktopEnabled && m_actionCollection->action("realign")) + { + pArrangeMenu = new TQPopupMenu; + m_actionCollection->action("sort_ncs")->plug( pArrangeMenu ); + m_actionCollection->action("sort_nci")->plug( pArrangeMenu ); + m_actionCollection->action("sort_size")->plug( pArrangeMenu ); + m_actionCollection->action("sort_type")->plug( pArrangeMenu ); + m_actionCollection->action("sort_date" )->plug( pArrangeMenu ); + pArrangeMenu->insertSeparator(); + m_actionCollection->action("sort_directoriesfirst")->plug( pArrangeMenu ); + + pLineupMenu = new TQPopupMenu; + m_actionCollection->action( "lineupHoriz" )->plug( pLineupMenu ); + m_actionCollection->action( "lineupVert" )->plug( pLineupMenu ); + pLineupMenu->insertSeparator(); + m_actionCollection->action( "realign" )->plug( pLineupMenu ); + } + + sessionsMenu = 0; + if (m_actionCollection->action("newsession")) + { + sessionsMenu = new TQPopupMenu; + connect( sessionsMenu, TQT_SIGNAL(aboutToShow()), TQT_SLOT(slotPopulateSessions()) ); + connect( sessionsMenu, TQT_SIGNAL(activated(int)), TQT_SLOT(slotSessionActivated(int)) ); + } + + if (menuBar) { + bool needSeparator = false; + file = new TQPopupMenu; + + action = m_actionCollection->action("exec"); + if (action) + { + action->plug( file ); + file->insertSeparator(); + } + + action = m_actionCollection->action("open_terminal"); + if (action) + { + action->plug( file ); + } + + action = m_actionCollection->action("lock"); + if (action) + action->plug( file ); + + action = m_actionCollection->action("logout"); + if (action) + action->plug( file ); + + desk = new TQPopupMenu; + + if (m_bDesktopEnabled) + { + m_actionCollection->action("unclutter")->plug( desk ); + m_actionCollection->action("cascade")->plug( desk ); + desk->insertSeparator(); + + if (pArrangeMenu) + desk->insertItem(i18n("Sort Icons"), pArrangeMenu); + if (pLineupMenu) + desk->insertItem(i18n("Line Up Icons"), pLineupMenu ); + + m_actionCollection->action("refresh")->plug( desk ); + needSeparator = true; + } + action = m_actionCollection->action("configdesktop"); + if (action) + { + if (needSeparator) + desk->insertSeparator(); + action->plug( desk ); + needSeparator = true; + } + + action = m_actionCollection->action("togglemenubar"); + if (action) + { + if (needSeparator) + desk->insertSeparator(); + action->plug( desk ); + action->setText(i18n("Disable Desktop Menu")); + } + } + else + { + action = m_actionCollection->action("togglemenubar"); + if (action) + action->setText(i18n("Enable Desktop Menu")); + } + + desktopMenu->clear(); + desktopMenu->disconnect( this ); + bool needSeparator = false; + + if (menuNew) + { + menuNew->plug( desktopMenu ); + needSeparator = true; + } + +#if 0 + if (bookmarks) + { + bookmarks->plug( desktopMenu ); + needSeparator = true; + } +#endif + + action = m_actionCollection->action("exec"); + if (action) + { + action->plug( desktopMenu ); + needSeparator = true; + } + + action = m_actionCollection->action("open_terminal"); + if (action) + action->plug( desktopMenu ); + + if (needSeparator) + { + desktopMenu->insertSeparator(); + needSeparator = false; + } + + if (m_bDesktopEnabled) + { + action = m_pDesktop->actionCollection()->action( "undo" ); + if (action) + action->plug( desktopMenu ); + action = m_pDesktop->actionCollection()->action( "paste" ); + if (action) + action->plug( desktopMenu ); + desktopMenu->insertSeparator(); + } + + if (m_bDesktopEnabled && m_actionCollection->action("realign")) + { + TQPopupMenu* pIconOperationsMenu = new TQPopupMenu; + + pIconOperationsMenu->insertItem(i18n("Sort Icons"), pArrangeMenu); + pIconOperationsMenu->insertSeparator(); + m_actionCollection->action( "lineupHoriz" )->plug( pIconOperationsMenu ); + m_actionCollection->action( "lineupVert" )->plug( pIconOperationsMenu ); + pIconOperationsMenu->insertSeparator(); + m_actionCollection->action( "realign" )->plug( pIconOperationsMenu ); + TDEAction *aLockIcons = m_actionCollection->action( "lock_icons" ); + if ( aLockIcons ) + aLockIcons->plug( pIconOperationsMenu ); + + desktopMenu->insertItem(SmallIconSet("icons"), i18n("Icons"), pIconOperationsMenu); + } + + TQPopupMenu* pWindowOperationsMenu = new TQPopupMenu; + m_actionCollection->action("cascade")->plug( pWindowOperationsMenu ); + m_actionCollection->action("unclutter")->plug( pWindowOperationsMenu ); + desktopMenu->insertItem(SmallIconSet("window_list"), i18n("Windows"), pWindowOperationsMenu); + + if (m_bDesktopEnabled) + { + m_actionCollection->action("refresh")->plug( desktopMenu ); + } + + action = m_actionCollection->action("configdesktop"); + if (action) + { + action->plug( desktopMenu ); + } + int lastSep = desktopMenu->insertSeparator(); + + if (sessionsMenu && kapp->authorize("switch_user")) + { + desktopMenu->insertItem(SmallIconSet("switchuser" ), i18n("Switch User"), sessionsMenu); + needSeparator = true; + } + + action = m_actionCollection->action("lock"); + if (action) + { + action->plug( desktopMenu ); + needSeparator = true; + } + + action = m_actionCollection->action("logout"); + if (action) + { + action->plug( desktopMenu ); + needSeparator = true; + } + + if (!needSeparator) + { + desktopMenu->removeItem(lastSep); + } + + connect( desktopMenu, TQT_SIGNAL( aboutToShow() ), this, TQT_SLOT( slotFileNewAboutToShow() ) ); + + if (menuBar) { + menuBar->insertItem(i18n("File"), file); + if (sessionsMenu) + { + menuBar->insertItem(i18n("Sessions"), sessionsMenu); + } + if (menuNew) + { + menuBar->insertItem(i18n("New"), menuNew->popupMenu()); + } + if (bookmarks) + { + menuBar->insertItem(i18n("Bookmarks"), bookmarks->popupMenu()); + } + menuBar->insertItem(i18n("Desktop"), desk); + menuBar->insertItem(i18n("Windows"), windowListMenu); + menuBar->insertItem(i18n("Help"), help->menu()); + + menuBar->setTopLevelMenu( true ); + menuBar->show(); // we need to call show() as we delayed the creation with the timer + } +} + +void KRootWm::slotToggleDirFirst( bool b ) +{ + KDesktopSettings::setSortDirectoriesFirst( b ); + KDesktopSettings::writeConfig(); +} + +void KRootWm::slotToggleAutoAlign( bool b ) +{ + KDesktopSettings::setAutoLineUpIcons( b ); + KDesktopSettings::writeConfig(); + + // Also save it globally... + int desktop = TDEApplication::desktop()->primaryScreen(); + TQCString cfilename; + if (desktop == 0) + cfilename = "kdesktoprc"; + else + cfilename.sprintf("kdesktop-screen-%drc", desktop); + + TDEConfig *kdg_config = new TDEConfig(cfilename, false, false); + kdg_config->setGroup( "General" ); + kdg_config->writeEntry( "AutoLineUpIcons", b ); + kdg_config->sync(); + delete kdg_config; + + // Auto line-up icons + m_pDesktop->iconView()->setAutoAlign( b ); +} + +void KRootWm::slotFileNewAboutToShow() +{ + if (menuNew) + { +// kdDebug() << " KRootWm:: (" << this << ") slotFileNewAboutToShow() menuNew=" << menuNew << endl; + // As requested by KNewMenu : + menuNew->slotCheckUpToDate(); + // And set the files that the menu apply on : + menuNew->setPopupFiles( m_pDesktop->url() ); + } +} + +void KRootWm::slotWindowListAboutToShow() +{ + windowListMenu->init(); +} + +void KRootWm::activateMenu( menuChoice choice, const TQPoint& global ) +{ + switch ( choice ) + { + case SESSIONSMENU: + if (sessionsMenu) + sessionsMenu->popup(global); + break; + case WINDOWLISTMENU: + windowListMenu->popup(global); + break; + case DESKTOPMENU: + m_desktopMenuPosition = global; // for KDIconView::slotPaste + desktopMenu->popup(global); + break; + case BOOKMARKSMENU: + if (bookmarks) + bookmarks->popup(global); + break; + case APPMENU: + { + // This allows the menu to disappear when clicking on the background another time + XUngrabPointer(tqt_xdisplay(), CurrentTime); + XSync(tqt_xdisplay(), False); + + // Ask kicker to showup the menu + DCOPRef( kicker_name, kicker_name ).send( "popupKMenu", global ); + break; + } + case CUSTOMMENU1: + if (!customMenu1) + customMenu1 = new KCustomMenu("kdesktop_custom_menu1"); + customMenu1->popup(global); + break; + case CUSTOMMENU2: + if (!customMenu2) + customMenu2 = new KCustomMenu("kdesktop_custom_menu2"); + customMenu2->popup(global); + break; + case NOTHING: + default: + break; + } +} + +void KRootWm::mousePressed( const TQPoint& _global, int _button ) +{ + if (!desktopMenu) return; // initialisation not yet done + switch ( _button ) { + case Qt::LeftButton: + if ( m_bShowMenuBar && menuBar ) + menuBar->raise(); + activateMenu( leftButtonChoice, _global ); + break; + case Qt::MidButton: + activateMenu( middleButtonChoice, _global ); + break; + case Qt::RightButton: + if (!kapp->authorize("action/kdesktop_rmb")) return; + activateMenu( rightButtonChoice, _global ); + break; + default: + // nothing + break; + } +} + +void KRootWm::slotWindowList() { +// kdDebug() << "KRootWm::slotWindowList" << endl; +// Popup at the center of the screen, this is from keyboard shortcut. + TQDesktopWidget* desktop = TDEApplication::desktop(); + TQRect r; + if (desktop->numScreens() < 2) + r = desktop->geometry(); + else + r = desktop->screenGeometry( desktop->screenNumber(TQCursor::pos())); + windowListMenu->init(); + disconnect( windowListMenu, TQT_SIGNAL( aboutToShow() ), + this, TQT_SLOT( slotWindowListAboutToShow() ) ); // avoid calling init() twice + // windowListMenu->rect() is not valid before showing, use sizeHint() + windowListMenu->popup(r.center() - TQRect( TQPoint( 0, 0 ), windowListMenu->sizeHint()).center()); + windowListMenu->selectActiveWindow(); // make the popup more useful + connect( windowListMenu, TQT_SIGNAL( aboutToShow() ), + this, TQT_SLOT( slotWindowListAboutToShow() ) ); +} + +void KRootWm::slotSwitchUser() { +// kdDebug() << "KRootWm::slotSwitchUser" << endl; + if (!sessionsMenu) + return; + TQDesktopWidget* desktop = TDEApplication::desktop(); + TQRect r; + if (desktop->numScreens() < 2) + r = desktop->geometry(); + else + r = desktop->screenGeometry( desktop->screenNumber(TQCursor::pos())); + slotPopulateSessions(); + disconnect( sessionsMenu, TQT_SIGNAL( aboutToShow() ), + this, TQT_SLOT( slotPopulateSessions() ) ); // avoid calling init() twice + sessionsMenu->popup(r.center() - TQRect( TQPoint( 0, 0 ), sessionsMenu->sizeHint()).center()); + connect( sessionsMenu, TQT_SIGNAL( aboutToShow() ), + TQT_SLOT( slotPopulateSessions() ) ); +} + +void KRootWm::slotArrangeByNameCS() +{ + if (m_bDesktopEnabled) + { + bool b = static_cast<TDEToggleAction *>(m_actionCollection->action("sort_directoriesfirst"))->isChecked(); + m_pDesktop->iconView()->rearrangeIcons( KDIconView::NameCaseSensitive, b); + } +} + +void KRootWm::slotArrangeByNameCI() +{ + if (m_bDesktopEnabled) + { + bool b = static_cast<TDEToggleAction *>(m_actionCollection->action("sort_directoriesfirst"))->isChecked(); + m_pDesktop->iconView()->rearrangeIcons( KDIconView::NameCaseInsensitive, b); + } +} + +void KRootWm::slotArrangeBySize() +{ + if (m_bDesktopEnabled) + { + bool b = static_cast<TDEToggleAction *>(m_actionCollection->action("sort_directoriesfirst"))->isChecked(); + m_pDesktop->iconView()->rearrangeIcons( KDIconView::Size, b); + } +} + +void KRootWm::slotArrangeByDate() +{ + if (m_bDesktopEnabled) + { + bool b = static_cast<TDEToggleAction *>( m_actionCollection->action( "sort_directoriesfirst" ) )->isChecked(); + m_pDesktop->iconView()->rearrangeIcons( KDIconView::Date, b ); + } +} + +void KRootWm::slotArrangeByType() +{ + if (m_bDesktopEnabled) + { + bool b = static_cast<TDEToggleAction *>(m_actionCollection->action("sort_directoriesfirst"))->isChecked(); + m_pDesktop->iconView()->rearrangeIcons( KDIconView::Type, b); + } +} + +void KRootWm::slotLineupIconsHoriz() { + if (m_bDesktopEnabled) + { + m_pDesktop->iconView()->lineupIcons(TQIconView::LeftToRight); + } +} + +void KRootWm::slotLineupIconsVert() { + if (m_bDesktopEnabled) + { + m_pDesktop->iconView()->lineupIcons(TQIconView::TopToBottom); + } +} + +void KRootWm::slotLineupIcons() { + if (m_bDesktopEnabled) + { + m_pDesktop->iconView()->lineupIcons(); + } +} + +void KRootWm::slotToggleLockIcons( bool lock ) +{ + if (m_bDesktopEnabled) + { + m_pDesktop->iconView()->setItemsMovable( !lock ); + KDesktopSettings::setLockIcons( lock ); + KDesktopSettings::writeConfig(); + } +} + +void KRootWm::slotRefreshDesktop() { + if (m_bDesktopEnabled) + { + m_pDesktop->refresh(); + } +} + +TQStringList KRootWm::configModules() { + TQStringList args; + args << "tde-background.desktop" << "tde-desktopbehavior.desktop" << "tde-desktop.desktop" + << "tde-screensaver.desktop" << "tde-display.desktop"; + return args; +} + +void KRootWm::slotOpenTerminal() +{ + // kdDebug() << "KRootWm::slotOpenTerminal" << endl; + TDEProcess* p = new TDEProcess; + TQ_CHECK_PTR(p); + + TDEConfigGroupSaver gs(TDEGlobal::config(), "General"); + TQString terminal = TDEGlobal::config()->readPathEntry("TerminalApplication", "konsole"); + + *p << terminal; + p->setWorkingDirectory(TDEGlobalSettings::desktopPath()); + p->start(TDEProcess::DontCare); + + delete p; +} + +void KRootWm::slotConfigureDesktop() { + if (!m_configDialog) + { + m_configDialog = new KCMultiDialog( (TQWidget*)0, "configureDialog" ); + connect(m_configDialog, TQT_SIGNAL(finished()), this, TQT_SLOT(slotConfigClosed())); + + TQStringList modules = configModules(); + for (TQStringList::const_iterator it = modules.constBegin(); it != modules.constEnd(); ++it) + { + if (kapp->authorizeControlModule(*it)) + { + m_configDialog->addModule(*it); + } + } + } + + KWin::setOnDesktop(m_configDialog->winId(), KWin::currentDesktop()); + m_configDialog->show(); + m_configDialog->raise(); +} + +void KRootWm::slotConfigClosed() +{ + m_configDialog->delayedDestruct(); + m_configDialog = 0; +} + +void KRootWm::slotToggleDesktopMenu() +{ + KDesktopSettings::setShowMenubar( !(m_bShowMenuBar && menuBar) ); + KDesktopSettings::writeConfig(); + + TQByteArray data; + kapp->dcopClient()->send( kdesktop_name, "KDesktopIface", "configure()", data); + // for the standalone menubar setting + kapp->dcopClient()->send( "menuapplet*", "menuapplet", "configure()", data ); + kapp->dcopClient()->send( kicker_name, kicker_name, "configureMenubar()", data ); + kapp->dcopClient()->send( "twin*", "", "reconfigure()", data ); +} + + +void KRootWm::slotUnclutterWindows() +{ + kapp->dcopClient()->send(twin_name, "KWinInterface", "unclutterDesktop()", TQString("")); +} + + +void KRootWm::slotCascadeWindows() { + kapp->dcopClient()->send(twin_name, "KWinInterface", "cascadeDesktop()", TQString("")); +} + + +void KRootWm::slotLock() { + m_pSaver->lockScreen(); +} + + +void KRootWm::slotSave() { + kapp->dcopClient()->send(kdesktop_name, "KScreensaverIface", "save()", TQString("")); +} + + +void KRootWm::slotLogout() { + m_pDesktop->logout(TDEApplication::ShutdownConfirmDefault, TDEApplication::ShutdownTypeDefault); +} + +void KRootWm::slotPopulateSessions() +{ + TDEAction *action; + int p; + DM dm; + + sessionsMenu->clear(); + action = m_actionCollection->action("newsession"); + if (action && (p = dm.numReserve()) >= 0) + { + action->plug( sessionsMenu ); + action->setEnabled( p ); + action = m_actionCollection->action("lockNnewsession"); + if (action) + { + action->plug( sessionsMenu ); + action->setEnabled( p ); + } + sessionsMenu->insertSeparator(); + } + SessList sess; + if (dm.localSessions( sess )) + for (SessList::ConstIterator it = sess.begin(); it != sess.end(); ++it) { + int id = sessionsMenu->insertItem( DM::sess2Str( *it ), (*it).vt ); + if (!(*it).vt) + sessionsMenu->setItemEnabled( id, false ); + if ((*it).self) + sessionsMenu->setItemChecked( id, true ); + } +} + +void KRootWm::slotSessionActivated( int ent ) +{ + if (ent > 0 && !sessionsMenu->isItemChecked( ent )) { + m_pSaver->lockScreenAndSwitchSession(ent); + } +} + +void KRootWm::slotNewSession() +{ + doNewSession( false ); +} + +void KRootWm::slotLockNNewSession() +{ + doNewSession( true ); +} + +void KRootWm::doNewSession( bool lock ) +{ + int result = KMessageBox::warningContinueCancel( + m_pDesktop, + i18n("<p>You have chosen to open another desktop session.<br>" + "The current session will be hidden " + "and a new login screen will be displayed.<br>" + "An F-key is assigned to each session; " + "F%1 is usually assigned to the first session, " + "F%2 to the second session and so on. " + "You can switch between sessions by pressing " + "Ctrl, Alt and the appropriate F-key at the same time. " + "Additionally, the TDE Panel and Desktop menus have " + "actions for switching between sessions.</p>") + .arg(7).arg(8), + i18n("Warning - New Session"), + KGuiItem(i18n("&Start New Session"), "fork"), + ":confirmNewSession", + KMessageBox::PlainCaption | KMessageBox::Notify); + + if (result==KMessageBox::Cancel) + return; + + if (lock) { + m_pSaver->lockScreenAndDoNewSession(); + } + else { + DM().startReserve(); + } +} + +void KRootWm::slotMenuItemActivated(int /* item */ ) +{ +} + +#include "krootwm.moc" |