void MainWindow::setupActions() { actQuit = KStandardAction::quit(this, SLOT(quit()), actionCollection()); KAction *a = NULL; a = actionCollection()->addAction("minimizeRestore", this, SLOT(minimizeRestore())); a->setText(i18n("Minimize")); a->setIcon(KIcon("")); a->setShortcut(0); /** Settings : ************************************************************/ // m_actShowToolbar = KStandardAction::showToolbar( this, SLOT(toggleToolBar()), actionCollection()); m_actShowStatusbar = KStandardAction::showStatusbar(this, SLOT(toggleStatusBar()), actionCollection()); // m_actShowToolbar->setCheckedState( KGuiItem(i18n("Hide &Toolbar")) ); (void) KStandardAction::keyBindings(this, SLOT(showShortcutsSettingsDialog()), actionCollection()); (void) KStandardAction::configureToolbars(this, SLOT(configureToolbars()), actionCollection()); //KAction *actCfgNotifs = KStandardAction::configureNotifications(this, SLOT(configureNotifications()), actionCollection() ); //actCfgNotifs->setEnabled(false); // Not yet implemented ! actAppConfig = KStandardAction::preferences(this, SLOT(showSettingsDialog()), actionCollection()); }
void SystemTray::init() { ActionCollection *coll = QtUi::actionCollection("General"); _minimizeRestoreAction = new Action(tr("&Minimize"), this, this, SLOT(minimizeRestore())); #ifdef HAVE_KDE KMenu *kmenu; _trayMenu = kmenu = new KMenu(); kmenu->addTitle(_activeIcon, "Quassel IRC"); #else _trayMenu = new QMenu(associatedWidget()); #endif _trayMenu->setTitle("Quassel IRC"); #ifndef HAVE_KDE _trayMenu->setAttribute(Qt::WA_Hover); #endif _trayMenu->addAction(coll->action("ConnectCore")); _trayMenu->addAction(coll->action("DisconnectCore")); _trayMenu->addAction(coll->action("CoreInfo")); _trayMenu->addSeparator(); _trayMenu->addAction(_minimizeRestoreAction); _trayMenu->addAction(coll->action("Quit")); connect(_trayMenu, SIGNAL(aboutToShow()), SLOT(trayMenuAboutToShow())); NotificationSettings notificationSettings; notificationSettings.initAndNotify("Systray/Animate", this, SLOT(enableAnimationChanged(QVariant)), true); }
// called from the popup menu - always do what the menu entry says, // i.e. if the window is shown, no matter if active or not, the menu // entry is "minimize", otherwise it's "restore" void KSystemTray::minimizeRestoreAction() { if(parentWidget()) { bool restore = !(parentWidget()->isVisible()); minimizeRestore(restore); } }
// called when left-clicking the tray icon // if the window is not the active one, show it if needed, and activate it // (just like taskbar); otherwise hide it void KSystemTray::activateOrHide() { QWidget *pw = parentWidget(); if(!pw) return; #ifdef Q_WS_X11 KWin::WindowInfo info1 = KWin::windowInfo(pw->winId(), NET::XAWMState | NET::WMState); // mapped = visible (but possibly obscured) bool mapped = (info1.mappingState() == NET::Visible) && !info1.isMinimized(); // - not mapped -> show, raise, focus // - mapped // - obscured -> raise, focus // - not obscured -> hide if(!mapped) minimizeRestore(true); else { KWinModule module; for(QValueList< WId >::ConstIterator it = module.stackingOrder().fromLast(); it != module.stackingOrder().end() && (*it) != pw->winId(); --it) { KWin::WindowInfo info2 = KWin::windowInfo(*it, NET::WMGeometry | NET::XAWMState | NET::WMState | NET::WMWindowType); if(info2.mappingState() != NET::Visible) continue; // not visible on current desktop -> ignore if(!info2.geometry().intersects(pw->geometry())) continue; // not obscuring the window -> ignore if(!info1.hasState(NET::KeepAbove) && info2.hasState(NET::KeepAbove)) continue; // obscured by window kept above -> ignore NET::WindowType type = info2.windowType(NET::NormalMask | NET::DesktopMask | NET::DockMask | NET::ToolbarMask | NET::MenuMask | NET::DialogMask | NET::OverrideMask | NET::TopMenuMask | NET::UtilityMask | NET::SplashMask); if(type == NET::Dock || type == NET::TopMenu) continue; // obscured by dock or topmenu -> ignore pw->raise(); KWin::activateWindow(pw->winId()); return; } minimizeRestore(false); // hide } #endif }
void KSystemTray::setInactive() { minimizeRestore(false); }
void KSystemTray::setActive() { minimizeRestore(true); }
bool GraphicalUi::checkMainWidgetVisibility(bool perform) { #ifdef Q_OS_WIN // the problem is that we lose focus when the systray icon is activated // and we don't know the former active window // therefore we watch for activation event and use our stopwatch :) if (GetTickCount() - _dwTickCount < 300) { // we were active in the last 300ms -> hide it if (perform) minimizeRestore(false); return false; } else { if (perform) minimizeRestore(true); return true; } #elif defined(HAVE_KDE4) && defined(Q_WS_X11) KWindowInfo info1 = KWindowSystem::windowInfo(mainWidget()->winId(), NET::XAWMState | NET::WMState | NET::WMDesktop); // mapped = visible (but possibly obscured) bool mapped = (info1.mappingState() == NET::Visible) && !info1.isMinimized(); // - not mapped -> show, raise, focus // - mapped // - obscured -> raise, focus // - not obscured -> hide //info1.mappingState() != NET::Visible -> window on another desktop? if (!mapped) { if (perform) minimizeRestore(true); return true; } else { QListIterator<WId> it(KWindowSystem::stackingOrder()); it.toBack(); while (it.hasPrevious()) { WId id = it.previous(); if (id == mainWidget()->winId()) break; KWindowInfo info2 = KWindowSystem::windowInfo(id, NET::WMDesktop | NET::WMGeometry | NET::XAWMState | NET::WMState | NET::WMWindowType); if (info2.mappingState() != NET::Visible) continue; // not visible on current desktop -> ignore if (!info2.geometry().intersects(mainWidget()->geometry())) continue; // not obscuring the window -> ignore if (!info1.hasState(NET::KeepAbove) && info2.hasState(NET::KeepAbove)) continue; // obscured by window kept above -> ignore NET::WindowType type = info2.windowType(NET::NormalMask | NET::DesktopMask | NET::DockMask | NET::ToolbarMask | NET::MenuMask | NET::DialogMask | NET::OverrideMask | NET::TopMenuMask | NET::UtilityMask | NET::SplashMask); if (type == NET::Dock || type == NET::TopMenu) continue; // obscured by dock or topmenu -> ignore if (perform) { KWindowSystem::raiseWindow(mainWidget()->winId()); KWindowSystem::activateWindow(mainWidget()->winId()); } return true; } //not on current desktop? if (!info1.isOnCurrentDesktop()) { if (perform) KWindowSystem::activateWindow(mainWidget()->winId()); return true; } if (perform) minimizeRestore(false); // hide return false; } #else if (!mainWidget()->isVisible() || mainWidget()->isMinimized() || !mainWidget()->isActiveWindow()) { if (perform) minimizeRestore(true); return true; } else { if (perform) minimizeRestore(false); return false; } #endif return true; }