diff options
Diffstat (limited to 'kcontrol/randr/krandrtray.cpp')
-rw-r--r-- | kcontrol/randr/krandrtray.cpp | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/kcontrol/randr/krandrtray.cpp b/kcontrol/randr/krandrtray.cpp new file mode 100644 index 000000000..8e80c7cc6 --- /dev/null +++ b/kcontrol/randr/krandrtray.cpp @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2002,2003 Hamish Rodda <[email protected]> + * + * 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. + */ + +#include <qtimer.h> +#include <qtooltip.h> + +#include <kaction.h> +#include <kapplication.h> +#include <kcmultidialog.h> +#include <kdebug.h> +#include <khelpmenu.h> +#include <kiconloader.h> +#include <klocale.h> +#include <kpopupmenu.h> +#include <kstdaction.h> +#include <kstdguiitem.h> + +#include "krandrtray.h" +#include "krandrpassivepopup.h" +#include "krandrtray.moc" + +KRandRSystemTray::KRandRSystemTray(QWidget* parent, const char *name) + : KSystemTray(parent, name) + , m_popupUp(false) + , m_help(new KHelpMenu(this, KGlobal::instance()->aboutData(), false, actionCollection())) +{ + setPixmap(KSystemTray::loadIcon("randr")); + setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); + connect(this, SIGNAL(quitSelected()), kapp, SLOT(quit())); + QToolTip::add(this, i18n("Screen resize & rotate")); +} + +void KRandRSystemTray::mousePressEvent(QMouseEvent* e) +{ + // Popup the context menu with left-click + if (e->button() == LeftButton) { + contextMenuAboutToShow(contextMenu()); + contextMenu()->popup(e->globalPos()); + e->accept(); + return; + } + + KSystemTray::mousePressEvent(e); +} + +void KRandRSystemTray::contextMenuAboutToShow(KPopupMenu* menu) +{ + int lastIndex = 0; + + menu->clear(); + menu->setCheckable(true); + + if (!isValid()) { + lastIndex = menu->insertItem(i18n("Required X Extension Not Available")); + menu->setItemEnabled(lastIndex, false); + + } else { + m_screenPopups.clear(); + for (int s = 0; s < numScreens() /*&& numScreens() > 1 */; s++) { + setCurrentScreen(s); + if (s == screenIndexOfWidget(this)) { + /*lastIndex = menu->insertItem(i18n("Screen %1").arg(s+1)); + menu->setItemEnabled(lastIndex, false);*/ + } else { + KPopupMenu* subMenu = new KPopupMenu(menu, QString("screen%1").arg(s+1).latin1()); + m_screenPopups.append(subMenu); + populateMenu(subMenu); + lastIndex = menu->insertItem(i18n("Screen %1").arg(s+1), subMenu); + connect(subMenu, SIGNAL(activated(int)), SLOT(slotScreenActivated())); + } + } + + setCurrentScreen(screenIndexOfWidget(this)); + populateMenu(menu); + } + + menu->insertSeparator(); + + KAction *actPrefs = new KAction( i18n( "Configure Display..." ), + SmallIconSet( "configure" ), KShortcut(), this, SLOT( slotPrefs() ), + actionCollection() ); + actPrefs->plug( menu ); + + menu->insertItem(SmallIcon("help"),KStdGuiItem::help().text(), m_help->menu()); + KAction *quitAction = actionCollection()->action(KStdAction::name(KStdAction::Quit)); + quitAction->plug(menu); +} + +void KRandRSystemTray::slotScreenActivated() +{ + setCurrentScreen(m_screenPopups.find(static_cast<const KPopupMenu*>(sender()))); +} + +void KRandRSystemTray::configChanged() +{ + refresh(); + + static bool first = true; + + if (!first) + KRandrPassivePopup::message( + i18n("Screen configuration has changed"), + currentScreen()->changedMessage(), SmallIcon("window_fullscreen"), + this, "ScreenChangeNotification"); + + first = false; +} + +void KRandRSystemTray::populateMenu(KPopupMenu* menu) +{ + int lastIndex = 0; + + menu->insertTitle(SmallIcon("window_fullscreen"), i18n("Screen Size")); + + int numSizes = currentScreen()->numSizes(); + int* sizeSort = new int[numSizes]; + + for (int i = 0; i < numSizes; i++) { + sizeSort[i] = currentScreen()->pixelCount(i); + } + + for (int j = 0; j < numSizes; j++) { + int highest = -1, highestIndex = -1; + + for (int i = 0; i < numSizes; i++) { + if (sizeSort[i] && sizeSort[i] > highest) { + highest = sizeSort[i]; + highestIndex = i; + } + } + sizeSort[highestIndex] = -1; + Q_ASSERT(highestIndex != -1); + + lastIndex = menu->insertItem(i18n("%1 x %2").arg(currentScreen()->pixelSize(highestIndex).width()).arg(currentScreen()->pixelSize(highestIndex).height())); + + if (currentScreen()->proposedSize() == highestIndex) + menu->setItemChecked(lastIndex, true); + + menu->setItemParameter(lastIndex, highestIndex); + menu->connectItem(lastIndex, this, SLOT(slotResolutionChanged(int))); + } + delete [] sizeSort; + sizeSort = 0L; + + // Don't display the rotation options if there is no point (ie. none are supported) + // XFree86 4.3 does not include rotation support. + if (currentScreen()->rotations() != RandRScreen::Rotate0) { + menu->insertTitle(SmallIcon("reload"), i18n("Orientation")); + + for (int i = 0; i < 6; i++) { + if ((1 << i) & currentScreen()->rotations()) { + lastIndex = menu->insertItem(currentScreen()->rotationIcon(1 << i), RandRScreen::rotationName(1 << i)); + + if (currentScreen()->proposedRotation() & (1 << i)) + menu->setItemChecked(lastIndex, true); + + menu->setItemParameter(lastIndex, 1 << i); + menu->connectItem(lastIndex, this, SLOT(slotOrientationChanged(int))); + } + } + } + + QStringList rr = currentScreen()->refreshRates(currentScreen()->proposedSize()); + + if (rr.count()) + menu->insertTitle(SmallIcon("clock"), i18n("Refresh Rate")); + + int i = 0; + for (QStringList::Iterator it = rr.begin(); it != rr.end(); ++it, i++) { + lastIndex = menu->insertItem(*it); + + if (currentScreen()->proposedRefreshRate() == i) + menu->setItemChecked(lastIndex, true); + + menu->setItemParameter(lastIndex, i); + menu->connectItem(lastIndex, this, SLOT(slotRefreshRateChanged(int))); + } +} + +void KRandRSystemTray::slotResolutionChanged(int parameter) +{ + if (currentScreen()->currentSize() == parameter) + return; + + currentScreen()->proposeSize(parameter); + + currentScreen()->proposeRefreshRate(-1); + + if (currentScreen()->applyProposedAndConfirm()) { + KConfig config("kcmrandrrc"); + if (syncTrayApp(config)) + currentScreen()->save(config); + } +} + +void KRandRSystemTray::slotOrientationChanged(int parameter) +{ + int propose = currentScreen()->currentRotation(); + + if (parameter & RandRScreen::RotateMask) + propose &= RandRScreen::ReflectMask; + + propose ^= parameter; + + if (currentScreen()->currentRotation() == propose) + return; + + currentScreen()->proposeRotation(propose); + + if (currentScreen()->applyProposedAndConfirm()) { + KConfig config("kcmrandrrc"); + if (syncTrayApp(config)) + currentScreen()->save(config); + } +} + +void KRandRSystemTray::slotRefreshRateChanged(int parameter) +{ + if (currentScreen()->currentRefreshRate() == parameter) + return; + + currentScreen()->proposeRefreshRate(parameter); + + if (currentScreen()->applyProposedAndConfirm()) { + KConfig config("kcmrandrrc"); + if (syncTrayApp(config)) + currentScreen()->save(config); + } +} + +void KRandRSystemTray::slotPrefs() +{ + KCMultiDialog *kcm = new KCMultiDialog( KDialogBase::Plain, i18n( "Configure" ), this ); + + kcm->addModule( "display" ); + kcm->setPlainCaption( i18n( "Configure Display" ) ); + kcm->exec(); +} |