You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
254 lines
7.1 KiB
254 lines
7.1 KiB
15 years ago
|
/*
|
||
|
* Copyright (c) 2002,2003 Hamish Rodda <rodda@kde.org>
|
||
|
*
|
||
|
* 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();
|
||
|
}
|