add_subdirectory(kcminit)
add_subdirectory(khotkeys)
add_subdirectory(ksystraycmd)
-add_subdirectory(appmenu)
if(X11_Xau_FOUND AND X11_Xdmcp_FOUND)
add_subdirectory( kdm )
+++ /dev/null
-include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR})
-
-set(kded_appmenu_SRCS
- menubutton.cpp
- menuwidget.cpp
- menubar.cpp
- topmenubar.cpp
- glowbar.cpp
- verticalmenu.cpp
- shadows.cpp
-)
-
-if(DBUSMENUEQT_FOUND)
- set(kded_appmenu_SRCS
- ${kded_appmenu_SRCS}
- appmenu.cpp
- appmenu_dbus.cpp
- menuimporter.cpp
- )
-
- qt4_add_dbus_adaptor(kded_appmenu_SRCS
- com.canonical.AppMenu.Registrar.xml
- menuimporter.h
- MenuImporter
- menuimporteradaptor
- MenuImporterAdaptor
- )
-
- qt4_add_dbus_adaptor(kded_appmenu_SRCS
- org.kde.kded.appmenu.xml
- appmenu_dbus.h
- AppmenuDBus
- appmenuadaptor
- AppmenuAdaptor
- )
-endif()
-
-kde4_add_plugin(kded_appmenu ${kded_appmenu_SRCS})
-
-target_link_libraries(kded_appmenu
- ${KDE4_KIO_LIBS}
- ${X11_LIBRARIES}
- ${KDE4_PLASMA_LIBS}
-)
-
-if(DBUSMENUQT_FOUND)
- target_link_libraries(kded_appmenu ${DBUSMENUQT_LIBRARIES})
- include_directories(${DBUSMENUQT_INCLUDE_DIR})
-endif()
-
-install(
- TARGETS kded_appmenu
- DESTINATION ${KDE4_PLUGIN_INSTALL_DIR}
-)
-
-########### install files ###############
-
-install(
- FILES appmenu.desktop
- DESTINATION ${KDE4_SERVICES_INSTALL_DIR}/kded
-)
-install(
- FILES
- com.canonical.AppMenu.Registrar.xml
- org.kde.kded.appmenu.xml
- DESTINATION ${KDE4_DBUS_INTERFACES_INSTALL_DIR}
-)
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#include "appmenu.h"
-#include "kdbusimporter.h"
-#include "menuimporteradaptor.h"
-#include "appmenuadaptor.h"
-#include "appmenu_dbus.h"
-#include "topmenubar.h"
-#include "verticalmenu.h"
-
-#include <QDBusInterface>
-#include <QDBusReply>
-#include <QtDBus/qdbuspendingcall.h>
-#include <QMenu>
-#include <QApplication>
-#include <QDesktopWidget>
-
-#include <KDebug>
-#include <KWindowSystem>
-#include <KWindowInfo>
-#include <KConfig>
-#include <KConfigGroup>
-#include <kpluginfactory.h>
-#include <kpluginloader.h>
-#include <netwm.h>
-
-K_PLUGIN_FACTORY(AppMenuFactory,
- registerPlugin<AppMenuModule>();
- )
-K_EXPORT_PLUGIN(AppMenuFactory("appmenu"))
-
-AppMenuModule::AppMenuModule(QObject* parent, const QList<QVariant>&)
- : KDEDModule(parent),
- m_parent(parent),
- m_menuImporter(0),
- m_appmenuDBus(new AppmenuDBus(parent)),
- m_menubar(0),
- m_menu(0),
- m_screenTimer(new QTimer(this)),
- m_waitingAction(0),
- m_currentScreen(-1)
-{
- reconfigure();
-
- m_appmenuDBus->connectToBus();
-
- m_currentScreen = currentScreen();
-
- connect(m_appmenuDBus, SIGNAL(appShowMenu(int, int, WId)), SLOT(slotShowMenu(int, int, WId)));
- connect(m_appmenuDBus, SIGNAL(moduleReconfigure()), SLOT(reconfigure()));
-
- // transfer our signals to dbus
- connect(this, SIGNAL(showRequest(qulonglong)), m_appmenuDBus, SIGNAL(showRequest(qulonglong)));
- connect(this, SIGNAL(menuAvailable(qulonglong)), m_appmenuDBus, SIGNAL(menuAvailable(qulonglong)));
- connect(this, SIGNAL(clearMenus()), m_appmenuDBus, SIGNAL(clearMenus()));
- connect(this, SIGNAL(menuHidden(qulonglong)), m_appmenuDBus, SIGNAL(menuHidden(qulonglong)));
- connect(this, SIGNAL(WindowRegistered(qulonglong, const QString&, const QDBusObjectPath&)),
- m_appmenuDBus, SIGNAL(WindowRegistered(qulonglong, const QString&, const QDBusObjectPath&)));
- connect(this, SIGNAL(WindowUnregistered(qulonglong)), m_appmenuDBus, SIGNAL(WindowUnregistered(qulonglong)));
-}
-
-AppMenuModule::~AppMenuModule()
-{
- emit clearMenus();
- hideMenubar();
- if (m_menubar) {
- delete m_menubar;
- }
- delete m_menuImporter;
- delete m_appmenuDBus;
-}
-
-void AppMenuModule::slotShowMenu(int x, int y, WId id)
-{
- static KDBusMenuImporter *importer = 0;
-
- if (!m_menuImporter) {
- return;
- }
-
- // If menu visible, hide it
- if (m_menu && m_menu->isVisible()) {
- m_menu->hide();
- return;
- }
-
- //dbus call by user (for khotkey shortcut)
- if (x == -1 || y == -1) {
- // We do not know kwin button position, so tell kwin to show menu
- emit showRequest(KWindowSystem::self()->activeWindow());
- return;
- }
-
- importer = getImporter(id);
-
- if (!importer) {
- return;
- }
-
- QMenu *menu = importer->menu();
-
- // Window do not have menu
- if (!menu) {
- return;
- }
-
- m_menu = new VerticalMenu();
- m_menu->setParentWid(id);
- // Populate menu
- foreach (QAction *action, menu->actions()) {
- m_menu->addAction(action);
- }
- m_menu->popup(QPoint(x, y));
- // Activate waiting action if exist
- if (m_waitingAction) {
- m_menu->setActiveAction(m_waitingAction);
- m_waitingAction = 0;
- }
- connect(m_menu, SIGNAL(aboutToHide()), this, SLOT(slotAboutToHide()));
-}
-
-void AppMenuModule::slotAboutToHide()
-{
- if (m_menu) {
- emit menuHidden(m_menu->parentWid());
- m_menu->deleteLater();
- m_menu = 0;
- }
-}
-
-// New window registered
-void AppMenuModule::slotWindowRegistered(WId id, const QString& service, const QDBusObjectPath& path)
-{
- KDBusMenuImporter* importer = m_importers.take(id);
- if (importer) {
- delete importer;
- }
-
- // Application already active so check if we need create menubar
- if ( m_menuStyle == "TopMenuBar" && id == KWindowSystem::self()->activeWindow()) {
- slotActiveWindowChanged(id);
- } else if (m_menuStyle == "ButtonVertical") {
- KWindowInfo info = KWindowSystem::windowInfo(id, 0, NET::WM2WindowClass);
- // Tell Kwin menu is available
- emit menuAvailable(id);
- // FIXME: https://bugs.kde.org/show_bug.cgi?id=317926
- if (info.windowClassName() != "kmix") {
- getImporter(id);
- }
- }
-
- // Send a signal on bus for others dbus interface registrars
- emit WindowRegistered(id, service, path);
-}
-
-// Window unregistered
-void AppMenuModule::slotWindowUnregistered(WId id)
-{
- KDBusMenuImporter* importer = m_importers.take(id);
-
- // Send a signal on bus for others dbus interface registrars
- emit WindowUnregistered(id);
-
- if (importer) {
- delete importer;
- }
-
- if (m_menubar && m_menubar->parentWid() == id) {
- hideMenubar();
- }
-}
-
-// Keyboard activation requested, transmit it to menu
-void AppMenuModule::slotActionActivationRequested(QAction* a)
-{
- // If we have a topmenubar, activate action
- if (m_menubar) {
- m_menubar->setActiveAction(a);
- m_menubar->show();
- } else { // else send request to kwin or others dbus interface registrars
- m_waitingAction = a;
- emit showRequest(KWindowSystem::self()->activeWindow());
- }
-}
-
-// Current window change, update menubar
-// See comments in slotWindowRegistered() for why we get importers here
-void AppMenuModule::slotActiveWindowChanged(WId id)
-{
- KWindowInfo info = KWindowSystem::windowInfo(id, NET::WMWindowType);
- unsigned long mask = NET::AllTypesMask;
-
- m_currentScreen = currentScreen();
-
- if (id == 0) {// Ignore root window
- return;
- } else if (info.windowType(mask) & NET::Dock) { // Hide immediatly menubar for docks (krunner)
- hideMenubar();
- return;
- }
-
- if (!m_menuImporter->serviceExist(id)) { // No menu exist, check for another menu for application
- WId recursiveId = m_menuImporter->recursiveMenuId(id);
- if (recursiveId) {
- id = recursiveId;
- }
- }
-
- KDBusMenuImporter *importer = getImporter(id);
- if (!importer) {
- hideMenubar();
- return;
- }
-
- QMenu *menu = importer->menu();
-
- if(menu) {
- showMenuBar(menu);
- m_menubar->setParentWid(id);
- } else {
- hideMenubar();
- }
-}
-
-void AppMenuModule::slotShowCurrentWindowMenu()
-{
- slotActiveWindowChanged(KWindowSystem::self()->activeWindow());
-}
-
-void AppMenuModule::slotCurrentScreenChanged()
-{
- if (m_currentScreen != currentScreen()) {
- if (m_menubar) {
- m_menubar->setParentWid(0);
- }
- slotActiveWindowChanged(KWindowSystem::self()->activeWindow());
- }
-}
-
-void AppMenuModule::slotBarNeedResize()
-{
- if (m_menubar) {
- m_menubar->updateSize();
- m_menubar->move(centeredMenubarPos());
- }
-}
-
-// reload settings
-void AppMenuModule::reconfigure()
-{
- KConfig config( "kdeglobals", KConfig::FullConfig );
- KConfigGroup configGroup = config.group("Appmenu Style");
- m_menuStyle = configGroup.readEntry("Style", "InApplication");
-
- m_waitingAction = 0;
-
- // hide menubar if exist
- hideMenubar();
- if (m_menubar) {
- delete m_menubar;
- m_menubar = 0;
- }
-
- slotAboutToHide(); // hide vertical menu if exist
-
- // Disconnect all options specifics signals
- disconnect(KWindowSystem::self(), SIGNAL(activeWindowChanged(WId)), this, SLOT(slotActiveWindowChanged(WId)));
- disconnect(KWindowSystem::self(), SIGNAL(workAreaChanged()), this, SLOT(slotShowCurrentWindowMenu()));
- disconnect(m_screenTimer, SIGNAL(timeout()), this, SLOT(slotCurrentScreenChanged()));
-
- m_screenTimer->stop();
-
- // Tell kwin to clean its titlebar
- emit clearMenus();
-
- if (m_menuStyle == "InApplication") {
- if (m_menuImporter) {
- delete m_menuImporter;
- m_menuImporter = 0;
- }
- return;
- }
-
- // Setup a menu importer if needed
- if (!m_menuImporter) {
- m_menuImporter = new MenuImporter(m_parent);
- connect(m_menuImporter, SIGNAL(WindowRegistered(WId, const QString&, const QDBusObjectPath&)),
- SLOT(slotWindowRegistered(WId, const QString&, const QDBusObjectPath&)));
- connect(m_menuImporter, SIGNAL(WindowUnregistered(WId)),
- SLOT(slotWindowUnregistered(WId)));
- m_menuImporter->connectToBus();
- }
-
- if( m_menuStyle == "ButtonVertical" ) {
- foreach(WId id, m_menuImporter->ids()) {
- emit menuAvailable(id);
- }
- }
-
- // Setup top menubar if needed
- if (m_menuStyle == "TopMenuBar") {
- m_menubar = new TopMenuBar();
- connect(KWindowSystem::self(), SIGNAL(activeWindowChanged(WId)), this, SLOT(slotActiveWindowChanged(WId)));
- connect(KWindowSystem::self(), SIGNAL(workAreaChanged()), this, SLOT(slotShowCurrentWindowMenu()));
- connect(m_screenTimer, SIGNAL(timeout()), this, SLOT(slotCurrentScreenChanged()));
- connect(m_menubar, SIGNAL(needResize()), SLOT(slotBarNeedResize()));
- m_screenTimer->start(1000);
- slotShowCurrentWindowMenu();
- }
-}
-
-KDBusMenuImporter* AppMenuModule::getImporter(WId id)
-{
- KDBusMenuImporter* importer = 0;
- if (m_importers.contains(id)) { // importer already exist
- importer = m_importers.value(id);
- } else if (m_menuImporter->serviceExist(id)) { // get importer
- importer = new KDBusMenuImporter(id, m_menuImporter->serviceForWindow(id), &m_icons,
- m_menuImporter->pathForWindow(id), this);
- if (importer) {
- QMetaObject::invokeMethod(importer, "updateMenu", Qt::DirectConnection);
- connect(importer, SIGNAL(actionActivationRequested(QAction*)),
- SLOT(slotActionActivationRequested(QAction*)));
- m_importers.insert(id, importer);
- }
- }
- return importer;
-}
-
-void AppMenuModule::showMenuBar(QMenu *menu)
-{
- if (!menu) {
- return;
- }
-
- m_menubar->setMenu(menu);
- if (menu->actions().length()) {
- m_menubar->enableMouseTracking();
- }
-}
-
-void AppMenuModule::hideMenubar()
-{
- if (!m_menubar) {
- return;
- }
-
- m_menubar->enableMouseTracking(false);
- if (m_menubar->isVisible()) {
- m_menubar->hide();
- }
-}
-
-int AppMenuModule::currentScreen()
-{
- KWindowInfo info = KWindowSystem::windowInfo(KWindowSystem::self()->activeWindow(),
- NET::WMGeometry);
- int x = info.geometry().x();
- int y = info.geometry().y();
-
- QDesktopWidget *desktop = QApplication::desktop();
- return desktop->screenNumber(QPoint(x,y));
-}
-
-
-QPoint AppMenuModule::centeredMenubarPos()
-{
- QDesktopWidget *desktop = QApplication::desktop();
- m_currentScreen = currentScreen();
- QRect screen = desktop->availableGeometry(m_currentScreen);
- int x = screen.center().x() - m_menubar->sizeHint().width()/2;
- return QPoint(x, screen.topLeft().y());
-}
-
-
-#include "moc_appmenu.cpp"
+++ /dev/null
-[Desktop Entry]
-Type=Service
-Name=Application menus daemon
-Name[bs]=Demon za aplikacijske menije
-Name[ca]=Dimoni de menús d'aplicació
-Name[ca@valencia]=Dimoni de menús d'aplicació
-Name[cs]=Démon nabídky aplikací
-Name[da]=Dæmon til programmenuer
-Name[de]=Dienst für Anwendungsmenüs
-Name[el]=Δαίμων για τα μενού των εφαρμογών
-Name[en_GB]=Application menus daemon
-Name[es]=Demonio de menús de aplicación
-Name[et]=Rakenduste menüü deemon
-Name[eu]=Aplikazio-menuen daimona
-Name[fi]=Sovellusvalikkopalvelu
-Name[fr]=Démon de menus des applications
-Name[gl]=Daemon de menús do programa
-Name[he]=תהליך רקע של תפריט היישומים
-Name[hu]=Alkalmazás menük démon
-Name[ia]=Demone de menus de application
-Name[it]=Demone dei menu delle applicazioni
-Name[kk]=Қолданба мәзірінің қызметі
-Name[ko]=프로그램 메뉴 데몬
-Name[lt]=Programos meniu tarnyba
-Name[mr]=अनुप्रयोग मेन्यू डीमन
-Name[nb]=Daemon for programmenyer
-Name[nds]=Programmmenü-Dämoon
-Name[nl]=Daemon voor menu van toepassingen
-Name[pa]=ਐਪਲੀਕੇਸ਼ਨ ਮੈਨੂ ਡੈਮਨ
-Name[pl]=Demon menu programów
-Name[pt]=Servidor dos menus da aplicação
-Name[pt_BR]=Servidor dos menus do aplicativo
-Name[ro]=Demon pentru meniurile aplicațiilor
-Name[ru]=Фоновая служба меню приложений
-Name[sk]=Démon ponúk aplikácie
-Name[sl]=Ozadnji program za programske menije
-Name[sr]=Демон програмских менија
-Name[sr@ijekavian]=Демон програмских менија
-Name[sr@ijekavianlatin]=Demon programskih menija
-Name[sr@latin]=Demon programskih menija
-Name[sv]=Demon för programmenyer
-Name[tr]=Uygulama menü araçları
-Name[uk]=Фонова служба меню програм
-Name[x-test]=xxApplication menus daemonxx
-Name[zh_CN]=应用程序菜单守护程序
-Name[zh_TW]=應用程式選單伺服程式應用程式選單伺服程式
-Comment=Transfers application's menu to the desktop
-Comment[bs]=Prebacuje aplikacijski meni na radnu površinu
-Comment[ca]=Transfereix els menús d'aplicació a l'escriptori
-Comment[ca@valencia]=Transfereix els menús d'aplicació a l'escriptori
-Comment[cs]=Přesouvá nabídku aplikací na plochu
-Comment[da]=Overfører programmets menu til skrivebordet
-Comment[de]=Überträgt Anwendungsmenüs auf die Arbeitsfläche
-Comment[el]=Μεταφέρει το μενού της εφαρμογής στην επιφάνεια εργασίας
-Comment[en_GB]=Transfers application's menu to the desktop
-Comment[es]=Transfiere el menú de aplicaciones al escritorio
-Comment[et]=Rakenduste menüü paigutamine töölauale
-Comment[eu]=Aplikazioen menua mahaigainera transferitzen du
-Comment[fi]=Siirtää sovelluksen valikon työpöydälle
-Comment[fr]=Transfère le menu des applications sur le bureau
-Comment[gl]=Transfire o menú do programa ao escritorio
-Comment[he]=מעביר את התפריטים של היישום אל שולחן העבודה
-Comment[hu]=Átviszi az alkalmazás menüjét az asztalra
-Comment[ia]=Il transfere menu de applicationes al scriptorio
-Comment[it]=Trasferisce al desktop i menu delle applicazioni
-Comment[kk]=Қолданбаның мәзірін үстел бетіне тапсыру
-Comment[ko]=프로그램 메뉴를 데스크톱으로 보내기
-Comment[lt]=Perkelia programos meniu į darbastalį
-Comment[mr]=अनुप्रयोग मेन्यूचे डेस्कटॉपवर स्थानान्तरण
-Comment[nb]=Overfører programmets meny til skrivebordet
-Comment[nds]=Dat Programmmenü na den Schriefdisch överdregen
-Comment[nl]=Brengt het menu van de toepassing over naar het bureaublad
-Comment[pa]=ਐਪਲੀਕੇਸ਼ਨ ਦੇ ਮੇਨੂ ਨੂੰ ਡੈਸਕਟਾਪ ਉੱਤੇ ਭੇਜੋ
-Comment[pl]=Przenosi menu aplikacji na pulpit
-Comment[pt]=Transfere o menu da aplicação para o ecrã
-Comment[pt_BR]=Transfere o menu do aplicativo para a área de trabalho
-Comment[ro]=Transferă meniul aplicațiilor către birou
-Comment[ru]=Перемещает меню приложения на рабочий стол
-Comment[sk]=Presunúť ponuky aplikácie na plochu
-Comment[sl]=Prenese programski meni na namizje
-Comment[sr]=Пребацује меније програма на површ
-Comment[sr@ijekavian]=Пребацује меније програма на површ
-Comment[sr@ijekavianlatin]=Prebacuje menije programa na površ
-Comment[sr@latin]=Prebacuje menije programa na površ
-Comment[sv]=Överför programmets meny till skrivbordet
-Comment[tr]=Uygulamanın menüsünü masaüstüne aktarır
-Comment[uk]=Передає меню програм на стільницю
-Comment[x-test]=xxTransfers application's menu to the desktopxx
-Comment[zh_CN]=将应用程序的菜单转移到桌面上
-Comment[zh_TW]=將應用程式選單傳送到桌面
-X-KDE-ServiceTypes=KDEDModule
-X-KDE-Library=appmenu
-X-KDE-DBus-ModuleName=appmenu
-X-KDE-Kded-autoload=true
-X-KDE-Kded-load-on-demand=false
-
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef APPMENUMODULE_H
-#define APPMENUMODULE_H
-
-#include <kdedmodule.h>
-#include "menuimporter.h"
-#include "gtkicons.h"
-
-#include <QDBusPendingCallWatcher>
-class KDBusMenuImporter;
-class AppmenuDBus;
-class TopMenuBar;
-class VerticalMenu;
-
-class AppMenuModule : public KDEDModule,
- protected QDBusContext
-{
- Q_OBJECT
-public:
- AppMenuModule(QObject* parent, const QList<QVariant>& list);
- virtual ~AppMenuModule();
-
-Q_SIGNALS:
- /**
- * We do not know where is menu decoration button, so tell kwin to show menu
- */
- void showRequest(qulonglong);
- /**
- * This signal is emitted whenever application menu becomes available
- */
- void menuAvailable(qulonglong);
- /**
- * This signal is emitted whenever menus are unavailables
- */
- void clearMenus();
- /**
- * This signal is emitted whenever popup menu/menubar is hidden
- * Useful for decorations to know if menu button should be release
- */
- void menuHidden(qulonglong);
- /**
- * This signal is emitted whenever a window register to appmenu
- */
- void WindowRegistered(qulonglong wid, const QString& service, const QDBusObjectPath&);
- /**
- * This signal is emitted whenever a window unregister from appmenu
- */
- void WindowUnregistered(qulonglong wid);
-
-private Q_SLOTS:
- /**
- * Show menu at QPoint(x,y) for id
- * if x or y == -1, show in application window
- */
- void slotShowMenu(int x, int y, WId);
- /**
- * Send menuHidden signal over bus when menu is about to hide
- */
- void slotAboutToHide();
- /**
- * New window registered to appmenu
- * Emit WindowRegistered signal over bus
- */
- void slotWindowRegistered(WId id, const QString& service, const QDBusObjectPath& path);
- /**
- * Window unregistered from appmenu
- * Emit WindowUnregistered signal over bus
- */
- void slotWindowUnregistered(WId id);
- /**
- * Open a action in current menu
- */
- void slotActionActivationRequested(QAction* a);
- /**
- * Active window changed, show menubar for id
- */
- void slotActiveWindowChanged(WId id);
- /**
- * Update menubar with current window menu
- */
- void slotShowCurrentWindowMenu();
- /**
- * Current screen changed, update menubar
- */
- void slotCurrentScreenChanged();
- /**
- * Resize menubar
- */
- void slotBarNeedResize();
- /**
- * Reconfigure module
- */
- void reconfigure();
-
-private:
- /**
- * return an importer for window id
- */
- KDBusMenuImporter* getImporter(WId id);
- /**
- * Show menubar and update it with menu
- */
- void showMenuBar(QMenu *menu);
- /**
- * Hide menubar
- */
- void hideMenubar();
- /**
- * Return current screen
- */
- int currentScreen();
- /**
- * Return position of menubar for being centered on screen
- */
- QPoint centeredMenubarPos();
-
- QObject* m_parent;
- MenuImporter* m_menuImporter;
- AppmenuDBus* m_appmenuDBus;
- QHash<WId, KDBusMenuImporter*> m_importers;
- GtkIcons m_icons;
- QString m_menuStyle;
- TopMenuBar* m_menubar;
- VerticalMenu* m_menu;
- QTimer* m_screenTimer;
- QAction *m_waitingAction;
- int m_currentScreen;
-};
-
-#endif
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#include "appmenu_dbus.h"
-#include "kdbusimporter.h"
-#include "appmenuadaptor.h"
-
-#include <QApplication>
-#include <QDBusMessage>
-#include <QtDBus/qdbusextratypes.h>
-#include <QDBusServiceWatcher>
-
-static const char* DBUS_SERVICE = "org.kde.kded";
-static const char* DBUS_OBJECT_PATH = "/modules/appmenu";
-
-AppmenuDBus::AppmenuDBus(QObject* parent)
-: QObject(parent)
-{
-}
-
-AppmenuDBus::~AppmenuDBus()
-{
-}
-
-bool AppmenuDBus::connectToBus(const QString& service, const QString& path)
-{
- m_service = service.isEmpty() ? DBUS_SERVICE : service;
- QString newPath = path.isEmpty() ? DBUS_OBJECT_PATH : path;
-
- if (!QDBusConnection::sessionBus().registerService(m_service)) {
- return false;
- }
- new AppmenuAdaptor(this);
- QDBusConnection::sessionBus().registerObject(newPath, this);
-
- return true;
-}
-
-void AppmenuDBus::showMenu(int x, int y, WId id)
-{
- emit appShowMenu(x, y, id);
-}
-
-void AppmenuDBus::reconfigure()
-{
- emit moduleReconfigure();
-}
\ No newline at end of file
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef APPMENU_DBUS_H
-#define APPMENU_DBUS_H
-
-// Qt
-#include <QDBusContext>
-#include <QtDBus/qdbusextratypes.h>
-#include <QObject>
-#include <QDebug>
-#include <qwindowdefs.h>
-
-class KDBusMenuImporter;
-
-class AppmenuDBus : public QObject, protected QDBusContext
-{
- Q_OBJECT
-
-public:
- AppmenuDBus(QObject*);
- ~AppmenuDBus();
-
- bool connectToBus(const QString& service = QString(), const QString& path = QString());
-
- /**
- * DBus method showing menu at QPoint(x,y) for id
- * if x or y == -1, show in application window
- */
- void showMenu(int x, int y, WId id);
- /**
- * DBus method reconfiguring kded module
- */
- void reconfigure();
-
-Q_SIGNALS:
- /**
- * This signal is emitted on showMenu() request
- */
- void appShowMenu(int x, int y, WId id);
- /**
- * This signal is emitted on reconfigure() request
- */
- void moduleReconfigure();
-
- // Dbus signals
- /**
- * This signal is emitted whenever kded want to show menu
- * We do not know where is menu decoration button, so tell kwin to show menu
- */
- void showRequest(qulonglong);
- /**
- * This signal is emitted whenever application menu becomes available
- */
- void menuAvailable(qulonglong);
- /**
- * This signal is emitted whenever menus are unavailables
- */
- void clearMenus();
- /**
- * This signal is emitted whenever popup menu/menubar is hidden
- * Useful for decorations to know if menu button should be release
- */
- void menuHidden(qulonglong);
- /**
- * This signal is emitted whenever a window register to appmenu
- */
- void WindowRegistered(qulonglong wid, const QString& service, const QDBusObjectPath&);
- /**
- * This signal is emitted whenever a window unregister from appmenu
- */
- void WindowUnregistered(qulonglong wid);
-
-private:
- QString m_service;
-};
-
-#endif // APPMENU_DBUS_H
+++ /dev/null
-<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
-<node xmlns:dox="http://www.ayatana.org/dbus/dox.dtd">
- <dox:d><![CDATA[
- @mainpage
-
- An interface to register menus that are associated with a window in an application. The
- main interface is docuemented here: @ref com::canonical::AppMenu::Registrar.
-
- The actual menus are transported using the dbusmenu protocol which is available
- here: @ref com::canonical::dbusmenu.
- ]]></dox:d>
- <interface name="com.canonical.AppMenu.Registrar" xmlns:dox="http://www.ayatana.org/dbus/dox.dtd">
- <dox:d>
- An interface to register a menu from an application's window to be displayed in another
- window. This manages that association between XWindow Window IDs and the dbus
- address and object that provides the menu using the dbusmenu dbus interface.
- </dox:d>
- <method name="RegisterWindow">
- <dox:d><![CDATA[
- Associates a dbusmenu with a window
-
- /note this method assumes that the connection from the caller is the DBus connection
- to use for the object. Applications that use multiple DBus connections will need to
- ensure this method is called with the same connection that implmenets the object.
- ]]></dox:d>
- <arg name="windowId" type="u" direction="in">
- <dox:d>The XWindow ID of the window</dox:d>
- </arg>
- <arg name="menuObjectPath" type="o" direction="in">
- <dox:d>The object on the dbus interface implementing the dbusmenu interface</dox:d>
- </arg>
- </method>
- <method name="UnregisterWindow">
- <dox:d>
- A method to allow removing a window from the database. Windows will also be removed
- when the client drops off DBus so this is not required. It is polite though. And
- important for testing.
- </dox:d>
- <arg name="windowId" type="u" direction="in">
- <dox:d>The XWindow ID of the window</dox:d>
- </arg>
- </method>
- <method name="GetMenuForWindow">
- <dox:d>Gets the registered menu for a given window ID.</dox:d>
- <arg name="windowId" type="u" direction="in">
- <dox:d>The XWindow ID of the window to get</dox:d>
- </arg>
- <arg name="service" type="s" direction="out">
- <dox:d>The address of the connection on DBus (e.g. :1.23 or org.example.service)</dox:d>
- </arg>
- <arg name="menuObjectPath" type="o" direction="out">
- <dox:d>The path to the object which implements the com.canonical.dbusmenu interface.</dox:d>
- </arg>
- </method>
- </interface>
-</node>
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#include "glowbar.h"
-
-#include <X11/extensions/shape.h>
-#include <fixx11h.h>
-
-#include <Plasma/Svg>
-#include <KWindowSystem>
-#include <KDebug>
-
-#include <QTimer>
-#include <QDebug>
-#include <QPainter>
-#include <QtGui/qx11info_x11.h>
-
-
-GlowBar::GlowBar()
- : QWidget(0),
- m_svg(new Plasma::Svg(this))
-{
- m_svg->setImagePath("widgets/glowbar");
-
- setWindowFlags(Qt::Tool | Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint);
- setAttribute(Qt::WA_TranslucentBackground);
- setAutoFillBackground(false);
- KWindowSystem::setType(winId(), NET::Dock);
-
- QPalette pal = palette();
- pal.setColor(backgroundRole(), Qt::transparent);
- setPalette(pal);
-
- setInputMask();
-}
-
-GlowBar::~GlowBar()
-{
-}
-
-void GlowBar::paintEvent(QPaintEvent*)
-{
- QPixmap l, r, c;
- QPoint pixmapPosition(0, 0);
-
- m_buffer.fill(QColor(0, 0, 0, int(qreal(255)*0.3)));
- QPainter p(&m_buffer);
- p.setCompositionMode(QPainter::CompositionMode_SourceIn);
- l = m_svg->pixmap("bottomleft");
- r = m_svg->pixmap("bottomright");
- c = m_svg->pixmap("bottom");
- p.drawPixmap(pixmapPosition, l);
- p.drawTiledPixmap(QRect(l.width(), pixmapPosition.y(), width() - l.width() - r.width(), c.height()), c);
- p.drawPixmap(QPoint(width() - r.width(), pixmapPosition.y()), r);
- p.end();
- p.begin(this);
- p.drawPixmap(QPoint(0, 0), m_buffer);
-}
-
-void GlowBar::setPixmap(const QPoint pos, uint width)
-{
- QRect zone = QRect(pos, QSize(width, 10));
- setGeometry(zone);
- m_buffer = QPixmap(zone.size());
-}
-
-void GlowBar::setInputMask()
-{
- // Create an empty input mask to achieve click-through effect
- // Thanks to MacSlow for this!
- Pixmap mask = XCreatePixmap(QX11Info::display(),
- winId(),
- 1, /* width */
- 1, /* height */
- 1 /* depth */);
- XShapeCombineMask(QX11Info::display(),
- winId(),
- ShapeInput,
- 0, /* x-offset */
- 0, /* y-offset */
- mask,
- ShapeSet);
- XFreePixmap(QX11Info::display(), mask);
-}
-#include "moc_glowbar.cpp"
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef GLOWBAR__H
-#define GLOWBAR__H
-
-#include <QWidget>
-
-namespace Plasma
-{
- class Svg;
-}
-
-class GlowBar : public QWidget
-{
-Q_OBJECT
-public:
- GlowBar();
- ~GlowBar();
-
- void paintEvent(QPaintEvent*);
-
- void setPixmap(const QPoint pos, uint width);
-private:
- void setInputMask();
- Plasma::Svg *m_svg;
- QPixmap m_buffer;
-};
-#endif
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef GTKICONS_H
-#define GTKICONS_H
-
-#include <QtCore/QMap>
-
-class GtkIcons : public QMap<QString, QString>
-{
- public:
- GtkIcons( void ) : QMap<QString, QString> ()
- {
- insert(QString("gnome-fs-directory"), QString("folder.png"));
- insert(QString("gnome-fs-regular.png"), QString("application-x-zerosize.png"));
- insert(QString("gtk-about"), QString("help-about.png"));
- insert(QString("gtk-add"), QString("list-add.png"));
- insert(QString("gtk-apply"), QString("dialog-ok-apply.png ok-apply.png apply.png"));
- insert(QString("gtk-bold"), QString("format-text-bold.png"));
- insert(QString("gtk-cancel"), QString("dialog-cancel.png cancel.png"));
- insert(QString("gtk-cdrom"), QString("media-optical.png"));
- insert(QString("gtk-clear"), QString("edit-clear.png"));
- insert(QString("gtk-close"), QString("window-close.png"));
- insert(QString("gtk-color-picker"), QString("color-picker.png"));
- insert(QString("gtk-connect"), QString("network-connect.png"));
- insert(QString("gtk-convert"), QString("document-export.png"));
- insert(QString("gtk-copy"), QString("edit-copy.png"));
- insert(QString("gtk-cut"), QString("edit-cut.png"));
- insert(QString("gtk-delete"), QString("edit-delete.png"));
- insert(QString("gtk-dialog-authentication"), QString("dialog-password.png document-encrypt.png object-locked.png"));
- insert(QString("gtk-dialog-error"), QString("dialog-error.png"));
- insert(QString("gtk-dialog-info"), QString("dialog-information.png"));
- insert(QString("gtk-dialog-question"), QString("dialog-information.png"));
- insert(QString("gtk-dialog-warning"), QString("dialog-warning.png"));
- insert(QString("gtk-directory"), QString("folder.png"));
- insert(QString("gtk-disconnect"), QString("network-disconnect.png"));
- insert(QString("gtk-dnd"), QString("application-x-zerosize.png"));
- insert(QString("gtk-dnd-multiple"), QString("document-multiple.png"));
- insert(QString("gtk-edit"), QString("document-properties.png"));
- insert(QString("gtk-execute"), QString("fork.png"));
- insert(QString("gtk-file"), QString("application-x-zerosize.png"));
- insert(QString("gtk-find"), QString("edit-find.png"));
- insert(QString("gtk-find-and-replace"), QString("edit-find-replace.png"));
- insert(QString("gtk-floppy"), QString("media-floppy.png"));
- insert(QString("gtk-fullscreen"), QString("view-fullscreen.png"));
- insert(QString("gtk-goto-bottom"), QString("go-bottom.png"));
- insert(QString("gtk-goto-first"), QString("go-first.png"));
- insert(QString("gtk-goto-last"), QString("go-last.png"));
- insert(QString("gtk-goto-top"), QString("go-top.png"));
- insert(QString("gtk-go-back"), QString("go-previous.png"));
- insert(QString("gtk-go-back-ltr"), QString("go-previous.png"));
- insert(QString("gtk-go-back-rtl"), QString("go-next.png"));
- insert(QString("gtk-go-down"), QString("go-down.png"));
- insert(QString("gtk-go-forward"), QString("go-next.png"));
- insert(QString("gtk-go-forward-ltr"), QString("go-next.png"));
- insert(QString("gtk-go-forward-rtl"), QString("go-previous.png"));
- insert(QString("gtk-go-up"), QString("go-up.png"));
- insert(QString("gtk-harddisk"), QString("drive-harddisk.png"));
- insert(QString("gtk-help"), QString("help-contents.png"));
- insert(QString("gtk-home"), QString("go-home.png"));
- insert(QString("gtk-indent"), QString("format-indent-more.png"));
- insert(QString("gtk-index"), QString("help-contents.png"));
- insert(QString("gtk-info"), QString("help-about.png"));
- insert(QString("gtk-italic"), QString("format-text-italic.png"));
- insert(QString("gtk-jump-to"), QString("go-jump.png"));
- insert(QString("gtk-justify-center"), QString("format-justify-center.png"));
- insert(QString("gtk-justify-fill"), QString("format-justify-fill.png"));
- insert(QString("gtk-justify-left"), QString("format-justify-left.png"));
- insert(QString("gtk-justify-right"), QString("format-justify-right.png"));
- insert(QString("gtk-leave-fullscreen"), QString("view-restore.png"));
- insert(QString("gtk-media-forward"), QString("media-seek-forward.png"));
- insert(QString("gtk-media-next"), QString("media-skip-forward.png"));
- insert(QString("gtk-media-pause"), QString("media-playback-pause.png"));
- insert(QString("gtk-media-play"), QString("media-playback-start.png"));
- insert(QString("gtk-media-previous"), QString("media-skip-backward.png"));
- insert(QString("gtk-media-record"), QString("media-record.png"));
- insert(QString("gtk-media-rewind"), QString("media-seek-backward.png"));
- insert(QString("gtk-media-stop"), QString("media-playback-stop.png"));
- insert(QString("gtk-missing-image"), QString("unknown.png"));
- insert(QString("gtk-network"), QString("network-server.png"));
- insert(QString("gtk-new"), QString("document-new.png"));
- insert(QString("gtk-no"), QString("edit-delete.png"));
- insert(QString("gtk-ok"), QString("dialog-ok.png ok.png"));
- insert(QString("gtk-open"), QString("document-open.png"));
- insert(QString("gtk-paste"), QString("edit-paste.png"));
- insert(QString("gtk-preferences"), QString("configure.png"));
- insert(QString("gtk-print"), QString("document-print.png"));
- insert(QString("gtk-print-preview"), QString("document-print-preview.png"));
- insert(QString("gtk-properties"), QString("document-properties.png"));
- insert(QString("gtk-quit"), QString("application-exit.png"));
- insert(QString("gtk-redo"), QString("edit-redo.png"));
- insert(QString("gtk-refresh"), QString("view-refresh.png"));
- insert(QString("gtk-remove"), QString("edit-delete.png"));
- insert(QString("gtk-revert-to-saved"), QString("document-revert.png"));
- insert(QString("gtk-save"), QString("document-save.png"));
- insert(QString("gtk-save-as"), QString("document-save-as.png"));
- insert(QString("gtk-select-all"), QString("edit-select-all.png"));
- insert(QString("gtk-select-color"), QString("color-picker.png"));
- insert(QString("gtk-select-font"), QString("preferences-desktop-font.png"));
- insert(QString("gtk-sort-ascending"), QString("view-sort-ascending.png"));
- insert(QString("gtk-sort-descending"), QString("view-sort-descending.png"));
- insert(QString("gtk-spell-check"), QString("tools-check-spelling.png"));
- insert(QString("gtk-stop"), QString("process-stop.png"));
- insert(QString("gtk-strikethrough"), QString("format-text-strikethrough.png"));
- insert(QString("gtk-undelete"), QString("edit-undo.png"));
- insert(QString("gtk-underline"), QString("format-text-underline.png"));
- insert(QString("gtk-undo"), QString("edit-undo.png"));
- insert(QString("gtk-unindent"), QString("format-indent-less.png"));
- insert(QString("gtk-yes"), QString("dialog-ok.png ok.png"));
- insert(QString("gtk-zoom-100"), QString("zoom-original.png"));
- insert(QString("gtk-zoom-fit"), QString("zoom-fit-best.png"));
- insert(QString("gtk-zoom-in"), QString("zoom-in.png"));
- insert(QString("gtk-zoom-out"), QString("zoom-out.png"));
- insert(QString("stock_edit-bookmark"), QString("bookmarks-organize.png"));
- insert(QString("gimp-edit"), QString("edit.png"));
- insert(QString("gimp-info"), QString("dialog-information.png"));
- insert(QString("gimp-reset"), QString("reload.png"));
- insert(QString("gimp-warning"), QString("dialog-warning.png"));
- insert(QString("gimp-tool-options"), QString("tool.png"));
- insert(QString("gimp-images"), QString("image.png"));
- }
-};
-
-#endif // GTKICONS_H
\ No newline at end of file
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef KDBUSMENUIMPORTER_H
-#define KDBUSMENUIMPORTER_H
-
-#include "gtkicons.h"
-
-#include <KIcon>
-#include <KIconLoader>
-
-#include <QDBusArgument>
-
-#include <dbusmenuimporter.h>
-
-class KDBusMenuImporter : public DBusMenuImporter
-{
-
-public:
- KDBusMenuImporter(WId wid, const QString &service, GtkIcons *icons, const QString &path, QObject *parent)
- : DBusMenuImporter(service, path, parent)
- , m_service(service)
- , m_path(path)
- , m_WId(wid)
- {
- m_icons = icons;
- }
-
- QString service() const { return m_service; }
- QString path() const { return m_path; }
- WId wid() const { return m_WId; }
-
-protected:
- virtual QIcon iconForName(const QString &name)
- {
- KIcon icon;
- if(m_icons->contains(name)){
- icon = KIcon(m_icons->value(name));
- }
- else if(!KIconLoader::global()->iconPath(name, 1, true ).isNull()){
- icon = KIcon(name);
- }
- return icon;
- }
-
-private:
- GtkIcons *m_icons;
- QString m_service;
- QString m_path;
- WId m_WId;
-};
-
-#endif //KDBUSMENUIMPORTER_H
\ No newline at end of file
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#include "menubar.h"
-#include "shadows.h"
-
-#include <QGraphicsLinearLayout>
-#include <QPainter>
-#include <QMenu>
-#include <QDesktopWidget>
-#include <QtGui/qgraphicseffect.h>
-
-#include <KWindowSystem>
-#include <Plasma/FrameSvg>
-#include <Plasma/Theme>
-#include <Plasma/WindowEffects>
-#include <KApplication>
-
-MenuBar::MenuBar()
- : QGraphicsView(),
- m_hideTimer(new QTimer(this)),
- m_background(new Plasma::FrameSvg(this)),
- m_shadows(new Shadows(this)),
- m_scene(new QGraphicsScene(this)),
- m_container(new MenuWidget(this))
-{
- qreal left, top, right, bottom;
-
- //Setup the window properties
- setWindowFlags(Qt::Tool|Qt::X11BypassWindowManagerHint|Qt::WindowStaysOnTopHint);
- setAttribute(Qt::WA_TranslucentBackground);
- KWindowSystem::setType(winId(), NET::Dock);
- setFrameStyle(QFrame::NoFrame);
- viewport()->setAutoFillBackground(false);
- setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
-
- //Setup the widgets
- m_background->setImagePath("widgets/tooltip");
- m_background->setEnabledBorders(Plasma::FrameSvg::BottomBorder|Plasma::FrameSvg::LeftBorder|Plasma::FrameSvg::RightBorder);
-
- m_container->initLayout();
-
- m_scene->addItem(m_container);
-
- setScene(m_scene);
-
- m_background->getMargins(left, top, right, bottom);
- m_container->layout()->setContentsMargins(left, top, right, bottom);
-
- resize(sizeHint());
-
- connect(m_container, SIGNAL(aboutToHide()), this, SLOT(slotAboutToHide()));
- connect(m_container, SIGNAL(needResize()), this, SIGNAL(needResize()));
- connect(m_hideTimer, SIGNAL(timeout()), this, SLOT(slotAboutToHide()));
-
- connect(KWindowSystem::self(), SIGNAL(compositingChanged(bool)), this, SLOT(slotCompositingChanged(bool)));
-}
-
-MenuBar::~MenuBar()
-{
-}
-
-QSize MenuBar::sizeHint() const
-{
- QSizeF size = m_container->minimumSize();
- return QSize(size.width(), size.height() - m_container->contentBottomMargin());
-}
-
-void MenuBar::show()
-{
- // Add shadow for better readability
- if (! Plasma::WindowEffects::isEffectAvailable(Plasma::WindowEffects::BlurBehind)) {
- QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect();
- shadow->setBlurRadius(5);
- shadow->setOffset(QPointF(1, 1));
- shadow->setColor(Plasma::Theme::defaultTheme()->color(Plasma::Theme::BackgroundColor));
- setGraphicsEffect(shadow);
- } else {
- setGraphicsEffect(0);
- }
- m_hideTimer->start(1000);
- QGraphicsView::show();
-
-}
-
-void MenuBar::hide()
-{
- emit aboutToHide();
- m_hideTimer->stop();
- QGraphicsView::hide();
-}
-
-void MenuBar::slotAboutToHide()
-{
- if (m_container->aMenuIsVisible()) { // MenuBar::m_hideTimer
- m_hideTimer->stop(); // menu is visible, menubar will be hidden by another aboutToHide() signal
- }
- else if (!cursorInMenuBar()) { //MenuWidget::AboutToHide signal
- hide();
- } else if (!m_hideTimer->isActive()){ //use click on menubar button while a popup was shown
- m_hideTimer->start(1000);
- }
-}
-
-void MenuBar::slotCompositingChanged(bool)
-{
- updateMask();
-}
-
-bool MenuBar::cursorInMenuBar()
-{
- return QRect(pos(), size()).contains(QCursor::pos());
-}
-
-void MenuBar::drawBackground(QPainter *painter, const QRectF &/*rectF*/)
-{
- painter->save();
- painter->setCompositionMode(QPainter::CompositionMode_Source);
- m_background->paintFrame(painter);
- painter->restore();
-}
-
-void MenuBar::resizeEvent(QResizeEvent*)
-{
- m_background->resizeFrame(size());
- m_scene->setSceneRect(0, 0, width(), height());
- updateMask();
-}
-
-void MenuBar::updateMask()
-{
- // Enable the mask only when compositing is disabled;
- // As this operation is quite slow, it would be nice to find some
- // way to workaround it for no-compositing users.
- if (KWindowSystem::compositingActive()) {
- clearMask();
- Plasma::WindowEffects::overrideShadow(winId(), true);
- Plasma::WindowEffects::enableBlurBehind(winId(), true, m_background->mask());
- m_shadows->addWindow(this, Plasma::FrameSvg::BottomBorder|Plasma::FrameSvg::LeftBorder|Plasma::FrameSvg::RightBorder);
- } else {
- setMask(m_background->mask());
- }
-}
\ No newline at end of file
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef MENUBAR__H
-#define MENUBAR__H
-
-#include "menuwidget.h"
-
-#include <QGraphicsView>
-
-#include <QMenu>
-class Shadows;
-
-namespace Plasma
-{
- class FrameSvg;
-}
-
-class MenuBar : public QGraphicsView
-{
-Q_OBJECT
-public:
- MenuBar();
- ~MenuBar();
-
- /**
- * Set root menu
- */
- void setMenu(QMenu *menu) { m_container->setMenu(menu); }
- /**
- * Auto open menu items on mouse over
- */
- void autoOpen() { m_container->autoOpen(); }
- /**
- * Set action as active menubar action
- */
- void setActiveAction(QAction *action) { m_container->setActiveAction(action); }
-
- virtual QSize sizeHint() const;
- virtual void show();
- virtual void hide();
-
-private Q_SLOTS:
- void slotAboutToHide();
- void slotCompositingChanged(bool);
-Q_SIGNALS:
- void needResize();
- void aboutToHide();
-protected:
- /**
- * Return true if cursor in menubar
- */
- virtual bool cursorInMenuBar();
- virtual void drawBackground(QPainter* painter, const QRectF &rectF);
- virtual void resizeEvent(QResizeEvent* event);
-private:
- void updateMask();
- QTimer* m_hideTimer;
- Plasma::FrameSvg* m_background;
- Shadows *m_shadows;
- QGraphicsScene* m_scene;
- MenuWidget* m_container;
-};
-
-#endif
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#include "menubutton.h"
-
-#include <QAction>
-#include <QMenu>
-#include <QtGui/qgraphicseffect.h>
-
-#include <Plasma/Theme>
-
-MenuButton::MenuButton(QGraphicsWidget *parent):
- Plasma::ToolButton(parent),
- m_enterEvent(false),
- m_menu(0)
-{
- QGraphicsDropShadowEffect* shadow = new QGraphicsDropShadowEffect();
- shadow->setBlurRadius(5);
- shadow->setOffset(QPointF(1, 1));
- shadow->setColor(Plasma::Theme::defaultTheme()->color(Plasma::Theme::BackgroundColor));
- setGraphicsEffect(shadow);
-}
-
-void MenuButton::setHovered(bool hovered)
-{
- if (hovered) {
- hoverEnterEvent(0);
- } else {
- hoverLeaveEvent(0);
- }
-}
-
-QSizeF MenuButton::sizeHint(Qt::SizeHint which, const QSizeF& constraint) const
-{
- QSizeF sh = Plasma::ToolButton::sizeHint(which, constraint);
- if (which == Qt::MinimumSize || which == Qt::PreferredSize) {
- sh.setHeight(nativeWidget()->fontMetrics().height() + bottomMargin());
- }
- return sh;
-}
-
-qreal MenuButton::bottomMargin() const
-{
- qreal left, right, top, bottom;
- getContentsMargins(&left, &right, &top, &bottom);
- return bottom;
-}
-
-void MenuButton::hoverEnterEvent(QGraphicsSceneHoverEvent *e)
-{
- m_enterEvent = true;
- Plasma::ToolButton::hoverEnterEvent(e);
-}
-
-void MenuButton::hoverLeaveEvent(QGraphicsSceneHoverEvent *e)
-{
- if (m_enterEvent) {
- m_enterEvent = false;
- Plasma::ToolButton::hoverLeaveEvent(e);
- }
-}
-
-#include "moc_menubutton.cpp"
\ No newline at end of file
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef MENUBUTTON__H
-#define MENUBUTTON__H
-
-#include <Plasma/ToolButton>
-#include <QToolButton>
-
-#include <QMenu>
-
-class MenuButton : public Plasma::ToolButton
-{
-Q_OBJECT
-public:
- MenuButton(QGraphicsWidget *parent);
-
- void setHovered(bool hovered);
-
- QSizeF sizeHint(Qt::SizeHint which, const QSizeF& constraint) const;
- qreal bottomMargin() const;
-
- void setMenu(QMenu *menu) { m_menu = menu; }
- QMenu* menu() { return m_menu; }
-protected:
- void hoverEnterEvent(QGraphicsSceneHoverEvent *);
- void hoverLeaveEvent(QGraphicsSceneHoverEvent *);
-private:
- bool m_enterEvent;
- QMenu *m_menu;
-};
-#endif
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#include "menuimporter.h"
-#include "menuimporteradaptor.h"
-
-#include <QApplication>
-#include <QDBusMessage>
-#include <QtDBus/qdbusextratypes.h>
-#include <QDBusServiceWatcher>
-
-#include <KDebug>
-#include <KWindowSystem>
-#include <KWindowInfo>
-
-static const char* DBUS_SERVICE = "com.canonical.AppMenu.Registrar";
-static const char* DBUS_OBJECT_PATH = "/com/canonical/AppMenu/Registrar";
-
-// Marshalling code for DBusMenuLayoutItem
-QDBusArgument &operator<<(QDBusArgument &argument, const DBusMenuLayoutItem &obj)
-{
- argument.beginStructure();
- argument << obj.id << obj.properties;
- argument.beginArray(qMetaTypeId<QDBusVariant>());
- Q_FOREACH(const DBusMenuLayoutItem& child, obj.children) {
- argument << QDBusVariant(QVariant::fromValue<DBusMenuLayoutItem>(child));
- }
- argument.endArray();
- argument.endStructure();
- return argument;
-}
-
-const QDBusArgument &operator>>(const QDBusArgument &argument, DBusMenuLayoutItem &obj)
-{
- argument.beginStructure();
- argument >> obj.id >> obj.properties;
- argument.beginArray();
- while (!argument.atEnd()) {
- QDBusVariant dbusVariant;
- argument >> dbusVariant;
- QDBusArgument childArgument = dbusVariant.variant().value<QDBusArgument>();
-
- DBusMenuLayoutItem child;
- childArgument >> child;
- obj.children.append(child);
- }
- argument.endArray();
- argument.endStructure();
- return argument;
-}
-
-MenuImporter::MenuImporter(QObject* parent)
-: QObject(parent)
-, m_serviceWatcher(new QDBusServiceWatcher(this))
-{
- qDBusRegisterMetaType<DBusMenuLayoutItem>();
- m_serviceWatcher->setConnection(QDBusConnection::sessionBus());
- m_serviceWatcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration);
- connect(m_serviceWatcher, SIGNAL(serviceUnregistered(const QString&)), SLOT(slotServiceUnregistered(const QString&)));
-
- QDBusConnection::sessionBus().connect("", "", "com.canonical.dbusmenu", "LayoutUpdated",
- this, SLOT(slotLayoutUpdated(uint,int)));
-}
-
-MenuImporter::~MenuImporter()
-{
- QDBusConnection::sessionBus().unregisterService(DBUS_SERVICE);
- QDBusConnection::sessionBus().disconnect("", "", "com.canonical.dbusmenu", "LayoutUpdated",
- this, SLOT(slotLayoutUpdated(uint,int)));
-}
-
-bool MenuImporter::connectToBus()
-{
- if (!QDBusConnection::sessionBus().registerService(DBUS_SERVICE)) {
- return false;
- }
- new MenuImporterAdaptor(this);
- QDBusConnection::sessionBus().registerObject(DBUS_OBJECT_PATH, this);
-
- return true;
-}
-
-WId MenuImporter::recursiveMenuId(WId id)
-{
- KWindowInfo info = KWindowSystem::windowInfo(id, 0, NET::WM2WindowClass);
- QString classClass = info.windowClassClass();
- WId classId = 0;
-
- // First look at transient windows
- WId tid = KWindowSystem::transientFor(id);
- while (tid) {
- if (serviceExist(tid)) {
- classId = tid;
- break;
- }
- tid = KWindowSystem::transientFor(tid);
- }
-
- if (classId == 0) {
- // Look at friends windows
- QHashIterator<WId, QString> i(m_windowClasses);
- while (i.hasNext()) {
- i.next();
- if (i.value() == classClass) {
- classId = i.key();
- }
- }
- }
-
- return classId;
-}
-
-void MenuImporter::RegisterWindow(WId id, const QDBusObjectPath& path)
-{
- KWindowInfo info = KWindowSystem::windowInfo(id, NET::WMWindowType);
- unsigned long mask = NET::AllTypesMask;
-
- // Menu can try to register, right click in gimp for exemple
- if (info.windowType(mask) & (NET::Menu|NET::DropdownMenu||NET::PopupMenu)) {
- return;
- }
-
- if (path.path().isEmpty()) //prevent bad dbusmenu usage
- return;
-
- QString service = message().service();
-
- info = KWindowSystem::windowInfo(id, 0, NET::WM2WindowClass);
- QString classClass = info.windowClassClass();
- m_windowClasses.insert(id, classClass);
- m_menuServices.insert(id, service);
- m_menuPaths.insert(id, path);
- if (! m_serviceWatcher->watchedServices().contains(service)) {
- m_serviceWatcher->addWatchedService(service);
- }
- emit WindowRegistered(id, service, path);
-}
-
-void MenuImporter::UnregisterWindow(WId id)
-{
- m_menuServices.remove(id);
- m_menuPaths.remove(id);
- m_windowClasses.remove(id);
-
- emit WindowUnregistered(id);
-}
-
-QString MenuImporter::GetMenuForWindow(WId id, QDBusObjectPath& path)
-{
- path = m_menuPaths.value(id);
- return m_menuServices.value(id);
-}
-
-void MenuImporter::slotServiceUnregistered(const QString& service)
-{
- WId id = m_menuServices.key(service);
- m_menuServices.remove(id);
- m_menuPaths.remove(id);
- m_windowClasses.remove(id);
- emit WindowUnregistered(id);
- m_serviceWatcher->removeWatchedService(service);
-}
-
-void MenuImporter::slotLayoutUpdated(uint /*revision*/, int parentId)
-{
- // Fake unity-panel-service weird behavior of calling aboutToShow on
- // startup. This is necessary for Firefox menubar to work correctly at
- // startup.
- // See: https://bugs.launchpad.net/plasma-idget-menubar/+bug/878165
-
- if (parentId == 0) { //root menu
- fakeUnityAboutToShow();
- }
-}
-
-void MenuImporter::fakeUnityAboutToShow()
-{
- QDBusInterface iface(message().service(), message().path(), "com.canonical.dbusmenu");
- QDBusPendingCall call = iface.asyncCall("GetLayout", 0, 1, QStringList());
- QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(call, this);
- watcher->setProperty("service", message().service());
- watcher->setProperty("path", message().path());
- connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
- SLOT(finishFakeUnityAboutToShow(QDBusPendingCallWatcher*)));
-}
-
-void MenuImporter::finishFakeUnityAboutToShow(QDBusPendingCallWatcher* watcher)
-{
- QDBusPendingReply<uint, DBusMenuLayoutItem> reply = *watcher;
- if (reply.isError()) {
- kWarning() << "Call to GetLayout failed:" << reply.error().message();
- return;
- }
- QString service = watcher->property("service").toString();
- QString path = watcher->property("path").toString();
- DBusMenuLayoutItem root = reply.argumentAt<1>();
-
- QDBusInterface iface(service, path, "com.canonical.dbusmenu");
- Q_FOREACH(const DBusMenuLayoutItem& dbusMenuItem, root.children) {
- iface.asyncCall("AboutToShow", dbusMenuItem.id);
- }
-}
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef MENUIMPORTER_H
-#define MENUIMPORTER_H
-
-// Qt
-#include <QDBusContext>
-#include <QtDBus/qdbusextratypes.h>
-#include <QObject>
-#include <QWidget> // For WId
-
-#include <QDBusObjectPath>
-#include <QDBusPendingCallWatcher>
-#include <QDBusServiceWatcher>
-#include <QMenu>
-
-/**
- * Represents an item with its children. GetLayout() returns a
- * DBusMenuLayoutItemList.
- */
-struct DBusMenuLayoutItem
-{
- int id;
- QVariantMap properties;
- QList<DBusMenuLayoutItem> children;
-};
-Q_DECLARE_METATYPE(DBusMenuLayoutItem)
-
-class MenuImporter : public QObject, protected QDBusContext
-{
- Q_OBJECT
-
-public:
- MenuImporter(QObject*);
- ~MenuImporter();
-
- bool connectToBus();
-
- bool serviceExist(WId id) { return m_menuServices.contains(id); }
- QString serviceForWindow(WId id) { return m_menuServices.value(id); }
-
- bool pathExist(WId id) { return m_menuPaths.contains(id); }
- QString pathForWindow(WId id) { return m_menuPaths.value(id).path(); }
-
- QList<WId> ids() { return m_menuServices.keys(); }
-
- /**
- * Return id of first transient/friend window with a menu available
- */
- WId recursiveMenuId(WId id);
-
-Q_SIGNALS:
- void WindowRegistered(WId id, const QString& service, const QDBusObjectPath&);
- void WindowUnregistered(WId id);
-
-public Q_SLOTS:
- void RegisterWindow(WId id, const QDBusObjectPath& path);
- void UnregisterWindow(WId id);
- QString GetMenuForWindow(WId id, QDBusObjectPath& path);
-
-private Q_SLOTS:
- void slotServiceUnregistered(const QString& service);
- void slotLayoutUpdated(uint revision, int parentId);
- void finishFakeUnityAboutToShow(QDBusPendingCallWatcher*);
-
-private:
- QDBusServiceWatcher* m_serviceWatcher;
- QHash<WId, QString> m_menuServices;
- QHash<WId, QDBusObjectPath> m_menuPaths;
- QHash<WId, QString> m_windowClasses;
-
- void fakeUnityAboutToShow();
-};
-
-#endif /* MENUIMPORTER_H */
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#include "menuwidget.h"
-
-#include <QMenu>
-#include <QDesktopWidget>
-#include <QGraphicsView>
-#include <QGraphicsLinearLayout>
-
-#include <KWindowSystem>
-#include <KDebug>
-#include <KApplication>
-
-MenuWidget::MenuWidget(QGraphicsView *view) :
- QGraphicsWidget(),
- m_mouseTimer(new QTimer(this)),
- m_actionTimer(new QTimer(this)),
- m_view(view),
- m_layout(new QGraphicsLinearLayout(this)),
- m_currentButton(0),
- m_contentBottomMargin(0),
- m_mousePosition(-1, -1),
- m_visibleMenu(0),
- m_menu(0)
-{
- connect(m_actionTimer, SIGNAL(timeout()), SLOT(slotUpdateActions()));
- connect(m_mouseTimer, SIGNAL(timeout()), SLOT(slotCheckActiveItem()));
-}
-
-MenuWidget::~MenuWidget()
-{
- while (!m_buttons.isEmpty()) {
- delete m_buttons.front();
- m_buttons.pop_front();
- }
-}
-
-void MenuWidget::setMenu(QMenu *menu)
-{
- if (m_menu) {
- disconnect(m_menu, SIGNAL(destroyed()), this, SLOT(slotMenuDestroyed()));
- m_menu->removeEventFilter(this);
- }
- if (menu) {
- if (m_mouseTimer->isActive()) {
- m_mouseTimer->stop();
- }
- m_visibleMenu = 0;
- m_menu = menu;
- connect(m_menu, SIGNAL(destroyed()), SLOT(slotMenuDestroyed()), Qt::UniqueConnection);
- m_menu->installEventFilter(this);
- slotUpdateActions();
- }
-}
-
-void MenuWidget::initLayout()
-{
- MenuButton* button = 0;
-
- if (!m_menu) {
- return;
- }
-
- foreach (QAction* action, m_menu->actions())
- {
- button = createButton(action);
- if (button) {
- m_layout->addItem(button);
- button->setMenu(action->menu());
- m_buttons << button;
- }
- }
-
- //Assume all buttons have same margins
- if (button) {
- m_contentBottomMargin = button->bottomMargin();
- }
-}
-
-bool MenuWidget::eventFilter(QObject* object, QEvent* event)
-{
- bool filtered;
- if (object == m_menu) {
- filtered = menuEventFilter(event);
- } else {
- filtered = subMenuEventFilter(static_cast<QMenu*>(object), event);
- }
- return filtered ? true : QGraphicsWidget::eventFilter(object, event);
-}
-
-bool MenuWidget::menuEventFilter(QEvent* event)
-{
- switch (event->type()) {
- case QEvent::ActionAdded:
- case QEvent::ActionRemoved:
- case QEvent::ActionChanged:
- // Try to limit layout updates
- m_actionTimer->start(500);
- break;
- default:
- break;
- }
- return false;
-}
-
-bool MenuWidget::subMenuEventFilter(QObject* object, QEvent* event)
-{
- QMenu *menu = static_cast<QMenu*>(object);
-
- if (event->type() == QEvent::KeyPress) {
- menu->removeEventFilter(this);
- QApplication::sendEvent(menu, event);
- menu->installEventFilter(this);
- if (!event->isAccepted()) {
- QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
- switch (keyEvent->key()) {
- case Qt::Key_Left:
- showLeftRightMenu(false);
- break;
- case Qt::Key_Right:
- showLeftRightMenu(true);
- break;
- case Qt::Key_Escape:
- menu->hide();
- break;
- default:
- break;
- }
- }
- return true;
- }
- return false;
-}
-
-void MenuWidget::slotMenuDestroyed()
-{
- m_menu = 0;
- m_visibleMenu = 0;
- m_currentButton = 0;
-}
-
-void MenuWidget::slotCheckActiveItem()
-{
- MenuButton* buttonBelow = 0;
- QPoint pos = m_view->mapFromGlobal(QCursor::pos());
- QGraphicsItem* item = m_view->itemAt(pos);
-
- if (pos == m_mousePosition) {
- return;
- } else {
- m_mousePosition = pos;
- }
-
- if (item) {
- buttonBelow = qobject_cast<MenuButton*>(item->toGraphicsObject());
- }
-
- if (!buttonBelow) {
- return;
- }
-
- if (buttonBelow != m_currentButton) {
- if (m_currentButton && m_currentButton->nativeWidget()) {
- m_currentButton->nativeWidget()->setDown(false);
- m_currentButton->setHovered(false);
- }
- m_currentButton = buttonBelow;
- if (m_currentButton->nativeWidget()) {
- m_currentButton->nativeWidget()->setDown(true);
- }
- m_visibleMenu = showMenu();
- }
-}
-
-void MenuWidget::slotMenuAboutToHide()
-{
- if (m_currentButton && m_currentButton->nativeWidget()) {
- m_currentButton->nativeWidget()->setDown(false);
- }
-
- if (m_mouseTimer->isActive()) {
- m_mouseTimer->stop();
- }
- m_visibleMenu = 0;
- emit aboutToHide();
-}
-
-void MenuWidget::slotButtonClicked()
-{
- m_currentButton = qobject_cast<MenuButton*>(sender());
-
- if (m_currentButton && m_currentButton->nativeWidget()) {
- m_currentButton->nativeWidget()->setDown(true);
- }
- m_visibleMenu = showMenu();
- // Start auto navigation after click
- if (!m_mouseTimer->isActive())
- m_mouseTimer->start(100);
-}
-
-void MenuWidget::slotUpdateActions()
-{
- if (m_visibleMenu) {
- return; // Later
- }
-
- m_actionTimer->stop();
- m_currentButton = 0;
- foreach (MenuButton *button, m_buttons) {
- disconnect(button, SIGNAL(clicked()), this, SLOT(slotButtonClicked()));
- m_layout->removeItem(button);
- button->hide();
- m_buttons.removeOne(button);
- delete button;
- }
- initLayout();
- // Menu may be empty on application startup
- // slotUpdateActions will be called later by eventFilter()
- if (m_menu && m_menu->actions().length()) {
- emit needResize();
- }
-}
-
-void MenuWidget::setActiveAction(QAction *action)
-{
- if (!m_menu) {
- return;
- }
-
- m_currentButton = m_buttons.first();
-
- if (action) {
- QMenu *menu;
- int i = 0;
- foreach (MenuButton *button, m_buttons) {
- menu = m_menu->actions()[i]->menu();
- if (menu && menu == action->menu()) {
- m_currentButton = button;
- break;
- }
- if (++i >= m_menu->actions().length()) {
- break;
- }
- }
- }
- m_currentButton->nativeWidget()->animateClick();
-}
-
-void MenuWidget::hide()
-{
- if (m_mouseTimer->isActive()) {
- m_mouseTimer->stop();
- }
- QGraphicsWidget::hide();
-}
-
-MenuButton* MenuWidget::createButton(QAction *action)
-{
- if( action->isSeparator() || !action->menu() || !action->isVisible()) {
- return 0;
- }
-
- action->setShortcut(QKeySequence());
- MenuButton *button = new MenuButton(this);
- button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
- button->setText(action->text());
- connect(button, SIGNAL(clicked()), SLOT(slotButtonClicked()));
- return button;
-}
-
-QMenu* MenuWidget::showMenu()
-{
- QMenu *menu = 0;
-
- if (m_visibleMenu) {
- disconnect(m_visibleMenu, SIGNAL(aboutToHide()), this, SLOT(slotMenuAboutToHide()));
- m_visibleMenu->hide();
- }
-
- if (m_currentButton && m_menu) {
- menu = m_currentButton->menu();
- }
-
- // Last chance to get menu
- // Some applications like Firefox have empties menus on layout updates
- // They should populate this menu later but in fact, they use another object
- // So, we check here directly the button name, may fail with menubar with buttons with same name (test apps)
- if (menu && menu->actions().length() == 0) {
- foreach (QAction *action, m_menu->actions()) {
- if (action->text() == m_currentButton->text()) {
- menu = action->menu();
- break;
- }
- }
- }
-
- if (menu) {
- QPoint globalPos = m_view->mapToGlobal(QPoint(0,0));
- QPointF parentPos = m_currentButton->mapFromParent(QPoint(0,0));
- QRect screen = KApplication::desktop()->screenGeometry();
- int x = globalPos.x() - parentPos.x();
- int y = globalPos.y() + m_currentButton->size().height() - parentPos.y();
-
- menu->popup(QPoint(x, y));
-
- // Fix offscreen menu
- if (menu->size().height() + y > screen.height() + screen.y()) {
- y = globalPos.y() - parentPos.y() - menu->size().height();
- if (menu->size().width() + x > screen.width() + screen.x())
- x = screen.width() + screen.x() - menu->size().width();
- else if (menu->size().width() + x < screen.x())
- x = screen.x();
- menu->move(x, y);
- }
-
- connect(menu, SIGNAL(aboutToHide()), this, SLOT(slotMenuAboutToHide()));
-
- installEventFilterForAll(menu, this);
- }
- return menu;
-}
-
-void MenuWidget::showLeftRightMenu(bool next)
-{
- if (!m_currentButton) {
- return;
- }
-
- int index = m_buttons.indexOf(m_currentButton);
- if (index == -1) {
- kWarning() << "Couldn't find button!";
- return;
- }
- if (next) {
- index = (index + 1) % m_buttons.count();
- } else {
- index = (index == 0 ? m_buttons.count() : index) - 1;
- }
-
- if (m_currentButton && m_currentButton->nativeWidget()) {
- m_currentButton->nativeWidget()->setDown(false);
- }
- m_currentButton = m_buttons.at(index);
- if (m_currentButton && m_currentButton->nativeWidget()) {
- m_currentButton->nativeWidget()->setDown(true);
- }
- m_visibleMenu = showMenu();
-}
-
-void MenuWidget::installEventFilterForAll(QMenu *menu, QObject *object)
-{
- if (!menu) {
- return;
- }
-
- menu->installEventFilter(this);
-
- foreach (QAction *action, menu->actions()) {
- if (action->menu())
- installEventFilterForAll(action->menu(), object);
- }
-}
-
-#include "moc_menuwidget.cpp"
\ No newline at end of file
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef MENUWIDGET__H
-#define MENUWIDGET__H
-
-#include "menubutton.h"
-
-#include <QGraphicsWidget>
-#include <QTimer>
-
-#include <QGraphicsLinearLayout>
-#include <QGraphicsView>
-
-class MenuWidget : public QGraphicsWidget
-{
-Q_OBJECT
-public:
- MenuWidget(QGraphicsView *view = 0);
- ~MenuWidget();
-
- /**
- * Set root menu
- */
- void setMenu(QMenu *menu);
- /**
- * Init layout with root menu
- */
- void initLayout();
- /**
- * True if a menu is visible in menuwidget
- */
- bool aMenuIsVisible() { return m_visibleMenu; }
- /**
- * Activate action, or first action if null
- */
- void setActiveAction(QAction *action);
-
- /**
- * Auto open menu items on mouse over
- */
- void autoOpen() { m_mouseTimer->start(100); }
-
- /**
- * Return content bottom margin
- */
- qreal contentBottomMargin() { return m_contentBottomMargin; }
-
- void hide();
-
-protected:
- /**
- * Use to get keyboard events
- */
- virtual bool eventFilter(QObject*, QEvent*);
- /**
- * Filter events on main menu
- */
- bool menuEventFilter(QEvent* event);
- /**
- * Filter events on submenus
- */
- bool subMenuEventFilter(QObject* object, QEvent* event);
-private Q_SLOTS:
- /**
- * Clean menu if destroyed
- */
- void slotMenuDestroyed();
- /**
- * Check hovered item and active it
- */
- void slotCheckActiveItem();
- /**
- * A menu is hidding
- */
- void slotMenuAboutToHide();
- /**
- * Menubar button clicked
- */
- void slotButtonClicked();
- /**
- * Update pending actions
- */
- void slotUpdateActions();
-Q_SIGNALS:
- void needResize();
- void aboutToHide();
-private:
- /**
- * Return a button based on action
- */
- MenuButton* createButton(QAction *action);
- /**
- * Show current button menu
- * return showed menu
- */
- QMenu* showMenu();
- /**
- * Show next menu if next, otherwise previous
- */
- void showLeftRightMenu(bool next);
- /**
- * Install event filter for menu and it submenus
- */
- void installEventFilterForAll(QMenu *menu, QObject *object);
-
- //Follow mouse position
- QTimer *m_mouseTimer;
- //Update actions
- QTimer *m_actionTimer;
- QGraphicsView *m_view;
- QGraphicsLinearLayout *m_layout;
- QList<MenuButton*> m_buttons;
- MenuButton *m_currentButton;
- qreal m_contentBottomMargin;
- QPoint m_mousePosition;
- QMenu *m_visibleMenu;
- QMenu *m_menu;
-};
-
-#endif //MENUWIDGET__H
+++ /dev/null
-<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
-<node>
- <interface name="org.kde.kded">
- <method name="showMenu">
- <arg name="x" type="i" direction="in"/>
- <arg name="y" type="i" direction="in"/>
- <arg name="WId" type="t" direction="in"/>
- </method>
- <method name="reconfigure">
- </method>
- <signal name="showRequest">
- <arg name="WId" type="t"/>
- </signal>
- <signal name="menuAvailable">
- <arg name="WId" type="t"/>
- </signal>
- <signal name="clearMenus">
- </signal>
- <signal name="menuHidden">
- <arg name="WId" type="t"/>
- </signal>
- <signal name="WindowRegistered">
- <arg name="windowId" type="t" direction="out"/>
- <arg name="service" type="s" direction="out"/>
- <arg name="menuObjectPath" type="o" direction="out"/>
- </signal>
- <signal name="WindowUnregistered">
- <arg name="windowId" type="t" direction="out"/>
- </signal>
- </interface>
-</node>
+++ /dev/null
-/*
-* Copyright 2011 by Aaron Seigo <aseigo@kde.org>
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU Library General Public License version 2,
-* 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 Library 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 "shadows.h"
-
-#include <QWidget>
-#include <QPainter>
-
-#ifdef Q_WS_X11
-#include <QtGui/qx11info_x11.h>
-#include <X11/Xatom.h>
-#include <X11/Xlib.h>
-#include <fixx11h.h>
-#endif
-
-#include <kdebug.h>
-#include <kglobal.h>
-
-class Shadows::Private
-{
-public:
- Private(Shadows *shadows)
- : q(shadows),
- m_managePixmaps(false)
- {
- }
-
- ~Private()
- {
- clearPixmaps();
- }
-
- void clearPixmaps();
- void setupPixmaps();
- void initPixmap(const QString &element);
- QPixmap initEmptyPixmap(const QSize &size);
- void updateShadow(const QWidget *window, Plasma::FrameSvg::EnabledBorders);
- void clearShadow(const QWidget *window);
- void updateShadows();
- void windowDestroyed(QObject *deletedObject);
- void setupData(Plasma::FrameSvg::EnabledBorders enabledBorders);
-
- Shadows *q;
- QList<QPixmap> m_shadowPixmaps;
-
- QPixmap m_emptyCornerPix;
- QPixmap m_emptyCornerLeftPix;
- QPixmap m_emptyCornerTopPix;
- QPixmap m_emptyCornerRightPix;
- QPixmap m_emptyCornerBottomPix;
- QPixmap m_emptyVerticalPix;
- QPixmap m_emptyHorizontalPix;
-
- QHash<Plasma::FrameSvg::EnabledBorders, QVector<unsigned long> > data;
- QHash<const QWidget *, Plasma::FrameSvg::EnabledBorders> m_windows;
- bool m_managePixmaps;
-};
-
-class ShadowsSingleton
-{
-public:
- ShadowsSingleton()
- {
- }
-
- Shadows self;
-};
-
-K_GLOBAL_STATIC(ShadowsSingleton, privateShadowsSelf)
-
-Shadows::Shadows(QObject *parent, const QString &prefix)
- : Plasma::Svg(parent),
- d(new Private(this))
-{
- setImagePath(prefix);
- connect(this, SIGNAL(repaintNeeded()), this, SLOT(updateShadows()));
-}
-
-Shadows *Shadows::self()
-{
- return &privateShadowsSelf->self;
-}
-
-void Shadows::addWindow(const QWidget *window, Plasma::FrameSvg::EnabledBorders enabledBorders)
-{
- if (!window || !window->isWindow()) {
- return;
- }
-
- d->m_windows[window] = enabledBorders;
- d->updateShadow(window, enabledBorders);
- connect(window, SIGNAL(destroyed(QObject*)),
- this, SLOT(windowDestroyed(QObject*)), Qt::UniqueConnection);
-}
-
-void Shadows::removeWindow(const QWidget *window)
-{
- if (!d->m_windows.contains(window)) {
- return;
- }
-
- d->m_windows.remove(window);
- disconnect(window, 0, this, 0);
- d->clearShadow(window);
-
- if (d->m_windows.isEmpty()) {
- d->clearPixmaps();
- }
-}
-
-void Shadows::Private::windowDestroyed(QObject *deletedObject)
-{
- m_windows.remove(static_cast<QWidget *>(deletedObject));
-
- if (m_windows.isEmpty()) {
- clearPixmaps();
- }
-}
-
-void Shadows::Private::updateShadows()
-{
- setupPixmaps();
- QHash<const QWidget *, Plasma::FrameSvg::EnabledBorders>::const_iterator i;
- for (i = m_windows.constBegin(); i != m_windows.constEnd(); ++i) {
- updateShadow(i.key(), i.value());
- }
-}
-
-void Shadows::Private::initPixmap(const QString &element)
-{
-#ifdef Q_WS_X11
- QPixmap pix = q->pixmap(element);
- if (!pix.isNull() && pix.handle() == 0) {
- Pixmap xPix = XCreatePixmap(QX11Info::display(), QX11Info::appRootWindow(), pix.width(), pix.height(), 32);
- QPixmap tempPix = QPixmap::fromX11Pixmap(xPix, QPixmap::ExplicitlyShared);
- tempPix.fill(Qt::transparent);
- QPainter p(&tempPix);
- p.drawPixmap(QPoint(0, 0), pix);
- m_shadowPixmaps << tempPix;
- m_managePixmaps = true;
- } else {
- m_shadowPixmaps << pix;
- }
-#endif
-}
-
-QPixmap Shadows::Private::initEmptyPixmap(const QSize &size)
-{
- Pixmap emptyXPix = XCreatePixmap(QX11Info::display(), QX11Info::appRootWindow(), size.width(), size.height(), 32);
- QPixmap tempEmptyPix = QPixmap::fromX11Pixmap(emptyXPix, QPixmap::ExplicitlyShared);
- tempEmptyPix.fill(Qt::transparent);
- return tempEmptyPix;
-}
-
-void Shadows::Private::setupPixmaps()
-{
- clearPixmaps();
- initPixmap("shadow-top");
- initPixmap("shadow-topright");
- initPixmap("shadow-right");
- initPixmap("shadow-bottomright");
- initPixmap("shadow-bottom");
- initPixmap("shadow-bottomleft");
- initPixmap("shadow-left");
- initPixmap("shadow-topleft");
-
- m_emptyCornerPix = initEmptyPixmap(QSize(1,1));
- m_emptyCornerLeftPix = initEmptyPixmap(QSize(q->elementSize("shadow-topleft").width(), 1));
- m_emptyCornerTopPix = initEmptyPixmap(QSize(1, q->elementSize("shadow-topleft").height()));
- m_emptyCornerRightPix = initEmptyPixmap(QSize(q->elementSize("shadow-bottomright").width(), 1));
- m_emptyCornerBottomPix = initEmptyPixmap(QSize(1, q->elementSize("shadow-bottomright").height()));
- m_emptyVerticalPix = initEmptyPixmap(QSize(1, q->elementSize("shadow-left").height()));
- m_emptyHorizontalPix = initEmptyPixmap(QSize(q->elementSize("shadow-top").width(), 1));
-
-}
-
-
-void Shadows::Private::setupData(Plasma::FrameSvg::EnabledBorders enabledBorders)
-{
-#ifdef Q_WS_X11
- //shadow-top
- if (enabledBorders & Plasma::FrameSvg::TopBorder) {
- data[enabledBorders] << m_shadowPixmaps[0].handle();
- } else {
- data[enabledBorders] << m_emptyHorizontalPix.handle();
- }
-
- //shadow-topright
- if (enabledBorders & Plasma::FrameSvg::TopBorder &&
- enabledBorders & Plasma::FrameSvg::RightBorder) {
- data[enabledBorders] << m_shadowPixmaps[1].handle();
- } else if (enabledBorders & Plasma::FrameSvg::TopBorder) {
- data[enabledBorders] << m_emptyCornerTopPix.handle();
- } else if (enabledBorders & Plasma::FrameSvg::RightBorder) {
- data[enabledBorders] << m_emptyCornerRightPix.handle();
- } else {
- data[enabledBorders] << m_emptyCornerPix.handle();
- }
-
- //shadow-right
- if (enabledBorders & Plasma::FrameSvg::RightBorder) {
- data[enabledBorders] << m_shadowPixmaps[2].handle();
- } else {
- data[enabledBorders] << m_emptyVerticalPix.handle();
- }
-
- //shadow-bottomright
- if (enabledBorders & Plasma::FrameSvg::BottomBorder &&
- enabledBorders & Plasma::FrameSvg::RightBorder) {
- data[enabledBorders] << m_shadowPixmaps[3].handle();
- } else if (enabledBorders & Plasma::FrameSvg::BottomBorder) {
- data[enabledBorders] << m_emptyCornerBottomPix.handle();
- } else if (enabledBorders & Plasma::FrameSvg::RightBorder) {
- data[enabledBorders] << m_emptyCornerRightPix.handle();
- } else {
- data[enabledBorders] << m_emptyCornerPix.handle();
- }
-
- //shadow-bottom
- if (enabledBorders & Plasma::FrameSvg::BottomBorder) {
- data[enabledBorders] << m_shadowPixmaps[4].handle();
- } else {
- data[enabledBorders] << m_emptyHorizontalPix.handle();
- }
-
- //shadow-bottomleft
- if (enabledBorders & Plasma::FrameSvg::BottomBorder &&
- enabledBorders & Plasma::FrameSvg::LeftBorder) {
- data[enabledBorders] << m_shadowPixmaps[5].handle();
- } else if (enabledBorders & Plasma::FrameSvg::BottomBorder) {
- data[enabledBorders] << m_emptyCornerBottomPix.handle();
- } else if (enabledBorders & Plasma::FrameSvg::LeftBorder) {
- data[enabledBorders] << m_emptyCornerLeftPix.handle();
- } else {
- data[enabledBorders] << m_emptyCornerPix.handle();
- }
-
- //shadow-left
- if (enabledBorders & Plasma::FrameSvg::LeftBorder) {
- data[enabledBorders] << m_shadowPixmaps[6].handle();
- } else {
- data[enabledBorders] << m_emptyVerticalPix.handle();
- }
-
- //shadow-topleft
- if (enabledBorders & Plasma::FrameSvg::TopBorder &&
- enabledBorders & Plasma::FrameSvg::LeftBorder) {
- data[enabledBorders] << m_shadowPixmaps[7].handle();
- } else if (enabledBorders & Plasma::FrameSvg::TopBorder) {
- data[enabledBorders] << m_emptyCornerTopPix.handle();
- } else if (enabledBorders & Plasma::FrameSvg::LeftBorder) {
- data[enabledBorders] << m_emptyCornerLeftPix.handle();
- } else {
- data[enabledBorders] << m_emptyCornerPix.handle();
- }
-#endif
-
- int left, top, right, bottom = 0;
-
- QSize marginHint;
- if (enabledBorders & Plasma::FrameSvg::TopBorder) {
- marginHint = q->elementSize("shadow-hint-top-margin");
- if (marginHint.isValid()) {
- top = marginHint.height();
- } else {
- top = m_shadowPixmaps[0].height(); // top
- }
- } else {
- top = 1;
- }
-
- if (enabledBorders & Plasma::FrameSvg::RightBorder) {
- marginHint = q->elementSize("shadow-hint-right-margin");
- if (marginHint.isValid()) {
- right = marginHint.width();
- } else {
- right = m_shadowPixmaps[2].width(); // right
- }
- } else {
- right = 1;
- }
-
- if (enabledBorders & Plasma::FrameSvg::BottomBorder) {
- marginHint = q->elementSize("shadow-hint-bottom-margin");
- if (marginHint.isValid()) {
- bottom = marginHint.height();
- } else {
- bottom = m_shadowPixmaps[4].height(); // bottom
- }
- } else {
- bottom = 1;
- }
-
- if (enabledBorders & Plasma::FrameSvg::LeftBorder) {
- marginHint = q->elementSize("shadow-hint-left-margin");
- if (marginHint.isValid()) {
- left = marginHint.width();
- } else {
- left = m_shadowPixmaps[6].width(); // left
- }
- } else {
- left = 1;
- }
-
- data[enabledBorders] << top << right << bottom << left;
-}
-
-void Shadows::Private::clearPixmaps()
-{
-#ifdef Q_WS_X11
- if (m_managePixmaps) {
- foreach (const QPixmap &pixmap, m_shadowPixmaps) {
- XFreePixmap(QX11Info::display(), pixmap.handle());
- }
-
- XFreePixmap(QX11Info::display(), m_emptyCornerPix.handle());
- XFreePixmap(QX11Info::display(), m_emptyCornerBottomPix.handle());
- XFreePixmap(QX11Info::display(), m_emptyCornerLeftPix.handle());
- XFreePixmap(QX11Info::display(), m_emptyCornerRightPix.handle());
- XFreePixmap(QX11Info::display(), m_emptyCornerTopPix.handle());
- XFreePixmap(QX11Info::display(), m_emptyVerticalPix.handle());
- XFreePixmap(QX11Info::display(), m_emptyHorizontalPix.handle());
-
- m_managePixmaps = false;
- }
-#endif
- m_shadowPixmaps.clear();
- data.clear();
-}
-
-void Shadows::Private::updateShadow(const QWidget *window, Plasma::FrameSvg::EnabledBorders enabledBorders)
-{
-#ifdef Q_WS_X11
- if (m_shadowPixmaps.isEmpty()) {
- setupPixmaps();
- }
-
- if (!data.contains(enabledBorders)) {
- setupData(enabledBorders);
- }
-
- Display *dpy = QX11Info::display();
- Atom atom = XInternAtom(dpy, "_KDE_NET_WM_SHADOW", False);
-
- //kDebug() << "going to set the shadow of" << winId() << "to" << data;
- XChangeProperty(dpy, window->winId(), atom, XA_CARDINAL, 32, PropModeReplace,
- reinterpret_cast<const unsigned char *>(data[enabledBorders].constData()), data[enabledBorders].size());
-#endif
-}
-
-void Shadows::Private::clearShadow(const QWidget *window)
-{
-#ifdef Q_WS_X11
- Display *dpy = QX11Info::display();
- Atom atom = XInternAtom(dpy, "_KDE_NET_WM_SHADOW", False);
- XDeleteProperty(dpy, window->winId(), atom);
-#endif
-}
-
-bool Shadows::enabled() const
-{
- return hasElement("shadow-left");
-}
-
-#include "moc_shadows.cpp"
-
+++ /dev/null
-/*
-* Copyright 2011 by Aaron Seigo <aseigo@kde.org>
-*
-* This program is free software; you can redistribute it and/or modify
-* it under the terms of the GNU Library General Public License version 2,
-* 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 Library 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.
-*/
-
-#ifndef SHADOWS_H
-#define SHADOWS_H
-
-#include <QSet>
-
-#include "plasma/framesvg.h"
-#include "plasma/svg.h"
-
-
-class Shadows : public Plasma::Svg
-{
- Q_OBJECT
-
-public:
- explicit Shadows(QObject *parent = 0, const QString &prefix = "widgets/panel-background");
-
- static Shadows *self();
-
- void addWindow(const QWidget *window, Plasma::FrameSvg::EnabledBorders enabledBorders = Plasma::FrameSvg::AllBorders);
- void removeWindow(const QWidget *window);
-
- bool enabled() const;
-
-private:
- class Private;
- Private * const d;
-
- Q_PRIVATE_SLOT(d, void updateShadows())
- Q_PRIVATE_SLOT(d, void windowDestroyed(QObject *deletedObject))
-};
-
-#endif
-
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#include "topmenubar.h"
-#include "glowbar.h"
-
-//KDE
-#include <Plasma/Svg>
-#include <KWindowSystem>
-
-// Qt
-#include <QMenu>
-#include <QTimer>
-#include <QDebug>
-#include <QApplication>
-#include <QPropertyAnimation>
-#include <QDesktopWidget>
-
-TopMenuBar::TopMenuBar()
- : MenuBar(),
- m_prevCursorPos(-1, -1),
- m_mouseTracker(new QTimer(this)),
- m_hideGlowTimer(new QTimer(this)),
- m_glowBar(new GlowBar())
-{
- connect(this, SIGNAL(aboutToHide()), this, SLOT(slotAboutToHide()));
- connect(m_mouseTracker, SIGNAL(timeout()), this, SLOT(slotMouseTracker()));
- connect(m_hideGlowTimer, SIGNAL(timeout()), this, SLOT(slotHideGlowBar()));
-}
-
-TopMenuBar::~TopMenuBar()
-{
- delete m_mouseTracker;
- delete m_hideGlowTimer;
- hideGlowBar();
- delete m_glowBar;
-}
-
-void TopMenuBar::enableMouseTracking(bool enable)
-{
- if (enable) {
- if (!cursorInMenuBar()) {
- showGlowBar();
- }
- m_mouseTracker->start(250);
- } else {
- hideGlowBar();
- m_mouseTracker->stop();
- }
-}
-
-void TopMenuBar::updateSize()
-{
- // Enable mouse tracking on resize if needed
- if (!m_mouseTracker->isActive() && !cursorInMenuBar()) {
- enableMouseTracking();
- }
- resize(sizeHint());
-}
-
-void TopMenuBar::move(QPoint p)
-{
- MenuBar::move(p);
- if (m_glowBar) {
- m_glowBar->move(p);
- m_glowBar->setPixmap(triggerRect().topLeft(), triggerRect().width());
- }
-}
-
-bool TopMenuBar::cursorInMenuBar()
-{
- if (m_mouseTracker->isActive()) {
- return triggerRect().contains(QCursor::pos());
- } else {
- return MenuBar::cursorInMenuBar();
- }
-}
-
-void TopMenuBar::slotAboutToHide()
-{
- enableMouseTracking();
-}
-
-void TopMenuBar::slotMouseTracker()
-{
- QPoint cursorPos = QCursor::pos();
-
- // reset timer
- if (cursorPos != m_prevCursorPos && m_hideGlowTimer->isActive()) {
- m_hideGlowTimer->stop();
- m_hideGlowTimer->start(10000);
- }
-
- if (cursorInMenuBar()) { // show menubar
- m_mouseTracker->stop();
- hideGlowBar();
- show();
- } else if(cursorPos != m_prevCursorPos) { // change glowbar opacity
- qreal opacity = glowBarOpacity();
- QPropertyAnimation *anim = new QPropertyAnimation(m_glowBar, "windowOpacity");
- anim->setStartValue(m_glowBar->windowOpacity());
- anim->setEndValue(opacity);
- anim->setDuration(200);
- anim->start(QAbstractAnimation::DeleteWhenStopped);
- // Show menubar if auto hidden
- if (!m_glowBar->isVisible()) {
- m_glowBar->show();
- }
- }
- m_prevCursorPos = cursorPos;
-}
-
-void TopMenuBar::slotHideGlowBar()
-{
- if (m_prevCursorPos == QCursor::pos()) {
- hideGlowBar();
- } else {
- m_hideGlowTimer->start(10000);
- }
-}
-
-void TopMenuBar::showGlowBar()
-{
- if (m_glowBar) {
- m_hideGlowTimer->start(10000);
- m_glowBar->setWindowOpacity(glowBarOpacity());
- m_glowBar->show();
- }
-}
-
-void TopMenuBar::hideGlowBar()
-{
- if (m_glowBar) {
- m_glowBar->hide();
- }
-}
-
-qreal TopMenuBar::glowBarOpacity()
-{
- QPoint cursorPos = QCursor::pos();
- QDesktopWidget *desktop = QApplication::desktop();
- int screen = desktop->screenNumber(cursorPos);
- QRect desktopRect = desktop->availableGeometry(screen);
- return 1.0 - ((cursorPos.y() - desktopRect.y())/qreal(desktopRect.height())*2.0);
-}
-
-QRect TopMenuBar::triggerRect()
-{
- QPoint triggerPoint = QPoint(x(), y());
- QSize triggerSize = QSize(sizeHint().width(), 5);
- return QRect(triggerPoint, triggerSize);
-}
-
-#include "moc_topmenubar.cpp"
\ No newline at end of file
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef TOPMENUBAR__H
-#define TOPMENUBAR__H
-
-#include "menubar.h"
-
-#include <QTimer>
-class GlowBar;
-
-class TopMenuBar : public MenuBar
-{
-Q_OBJECT
-public:
- TopMenuBar();
- ~TopMenuBar();
-
- /**
- * Start mouse tracking (hide/show on mouse event)
- */
- void enableMouseTracking(bool enable = true);
-
- /**
- * Set menubar parent window id
- */
- void setParentWid(WId id) { m_wid = id; }
- /**
- * Get menubar parent window id
- */
- WId parentWid() { return m_wid; }
- /**
- * resize menu bar to feet content
- */
- void updateSize();
- /**
- * Move menubar and glow bar at position
- */
- void move(QPoint p);
-protected:
- bool cursorInMenuBar();
-private Q_SLOTS:
- void slotAboutToHide();
- void slotMouseTracker();
- void slotHideGlowBar();
-private:
- void showGlowBar();
- void hideGlowBar();
- qreal glowBarOpacity();
- QRect triggerRect();
-
- WId m_wid;
- QPoint m_prevCursorPos;
- QTimer* m_mouseTracker;
- QTimer* m_hideGlowTimer;
- GlowBar* m_glowBar;
-};
-
-#endif
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#include "verticalmenu.h"
-
-#include <QCoreApplication>
-#include <QtGui/qevent.h>
-#include <QEvent>
-#include <QMenu>
-#include <QtGui/qevent.h>
-
-VerticalMenu::VerticalMenu(QWidget* parent) : QMenu(parent)
-{
-}
-
-VerticalMenu::~VerticalMenu()
-{
-}
-
-QMenu *VerticalMenu::leafMenu()
-{
- QMenu *leaf = this;
- while (true) {
- QAction *act = leaf->activeAction();
- if (act && act->menu() && act->menu()->isVisible()) {
- leaf = act->menu();
- continue;
- }
- return leaf == this ? 0 : leaf;
- }
- return 0; // make gcc happy
-}
-
-void VerticalMenu::paintEvent(QPaintEvent *pe)
-{
- QMenu::paintEvent(pe);
- if (QWidget::mouseGrabber() == this)
- return;
- if (QWidget::mouseGrabber())
- QWidget::mouseGrabber()->releaseMouse();
- grabMouse();
- grabKeyboard();
-}
-
-#define FORWARD(_EVENT_, _TYPE_) \
-void VerticalMenu::_EVENT_##Event(Q##_TYPE_##Event *e) \
-{ \
- if (QMenu *leaf = leafMenu()) \
- QCoreApplication::sendEvent(leaf, e); \
- else \
- QMenu::_EVENT_##Event(e); \
-} \
-
-FORWARD(keyPress, Key)
-FORWARD(keyRelease, Key)
-
-#include "moc_verticalmenu.cpp"
\ No newline at end of file
+++ /dev/null
-/*
- This file is part of the KDE project.
-
- Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
- Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-
- Permission is hereby granted, free of charge, to any person obtaining a
- copy of this software and associated documentation files (the "Software"),
- to deal in the Software without restriction, including without limitation
- the rights to use, copy, modify, merge, publish, distribute, sublicense,
- and/or sell copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- DEALINGS IN THE SOFTWARE.
-*/
-
-#ifndef VERTICALMENU_H
-#define VERTICALMENU_H
-
-#include <QMenu>
-
-class VerticalMenu : public QMenu
-{
-Q_OBJECT
-public:
- VerticalMenu(QWidget * parent = 0);
- ~VerticalMenu();
-
- /**
- * Set menu parent window id
- */
- void setParentWid(WId id) { m_wid = id; }
- /**
- * Get menu parent window id
- */
- WId parentWid() { return m_wid; }
-protected:
- void keyPressEvent(QKeyEvent*);
- void keyReleaseEvent(QKeyEvent*);
- void paintEvent(QPaintEvent*);
-private:
- QMenu *leafMenu();
-private:
- WId m_wid;
-};
-
-#endif //VERTICALMENU_H
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="System"?>
<ui version="4.0">
<class>FineTuning</class>
<widget class="QWidget" name="FineTuning">
<x>0</x>
<y>0</y>
<width>422</width>
- <height>358</height>
+ <height>206</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_2">
- <item row="0" column="0">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Graphical effects:</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="QComboBox" name="comboGraphicEffectsLevel"/>
- </item>
<item row="0" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
</property>
</spacer>
</item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_3">
+ <item row="0" column="1">
+ <widget class="QComboBox" name="comboGraphicEffectsLevel"/>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_5">
<property name="text">
- <string>Show icons on buttons:</string>
+ <string>Show icons in menus:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
- <cstring>cbIconsOnButtons</cstring>
+ <cstring>cbIconsInMenus</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="cbIconsInMenus">
+ <property name="text">
+ <string/>
</property>
</widget>
</item>
</property>
</widget>
</item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_5">
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_3">
<property name="text">
- <string>Show icons in menus:</string>
+ <string>Show icons on buttons:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
- <cstring>cbIconsInMenus</cstring>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QCheckBox" name="cbIconsInMenus">
- <property name="text">
- <string/>
+ <cstring>cbIconsOnButtons</cstring>
</property>
</widget>
</item>
</layout>
</widget>
</item>
- <item row="4" column="0" colspan="3">
- <widget class="QGroupBox" name="menubarBox">
- <property name="title">
- <string>Menubar</string>
- </property>
- <layout class="QGridLayout" name="gridLayout1">
- <item row="0" column="0">
- <widget class="QLabel" name="labelMenubarStyle">
- <property name="text">
- <string>Menubar style:</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>comboMenubarStyle</cstring>
- </property>
- </widget>
- </item>
- <item row="0" column="1">
- <widget class="KComboBox" name="comboMenubarStyle">
- <item>
- <property name="text">
- <string>In application</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Title bar button</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Top screen menubar</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string>Only export</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="0" column="2">
- <spacer name="horizontalSpacer_3">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- </item>
- <item row="5" column="0">
+ <item row="4" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</spacer>
</item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Graphical effects:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
<customwidgets>
connect(fineTuningUi.comboGraphicEffectsLevel, SIGNAL(activated(int)), this, SLOT(setEffectsDirty()));
connect(fineTuningUi.comboToolbarIcons, SIGNAL(activated(int)), this, SLOT(setEffectsDirty()));
connect(fineTuningUi.comboSecondaryToolbarIcons, SIGNAL(activated(int)), this, SLOT(setEffectsDirty()));
- connect(fineTuningUi.comboMenubarStyle, SIGNAL(activated(int)), this, SLOT(setEffectsDirty()));
// Page1
cbStyle->setWhatsThis( i18n("Here you can choose from a list of"
fineTuningUi.comboGraphicEffectsLevel->setWhatsThis( i18n( "If you enable this option, KDE Applications will "
"run internal animations.") );
- if (!QFile::exists(QLibraryInfo::location(QLibraryInfo::PluginsPath) + "/menubar/libappmenu-qt.so")) {
- fineTuningUi.menubarBox->hide();
- }
-
// Insert the pages into the tabWidget
tabWidget->addTab(page1, i18nc("@title:tab", "&Applications"));
tabWidget->addTab(page2, i18nc("@title:tab", "&Fine Tuning"));
toolbarStyleGroup.writeEntry("ToolButtonStyleOtherToolbars",
toolbarButtonText(fineTuningUi.comboSecondaryToolbarIcons->currentIndex()));
- // menubar page
- KConfigGroup menuBarStyleGroup(&_config, "Appmenu Style");
-
- // load kded module if needed
- bool load = false;
- QList<QVariant> args;
-
- QString style = menuBarStyleText(fineTuningUi.comboMenubarStyle->currentIndex());
-
- QString previous = menuBarStyleGroup.readEntry("Style", "InApplication");
- menuBarStyleGroup.writeEntry("Style", style);
_config.sync();
- QDBusMessage method = QDBusMessage::createMethodCall("org.kde.kded",
- "/modules/appmenu",
- "org.kde.kded",
- "reconfigure");
- QDBusConnection::sessionBus().asyncCall(method);
-
- if (previous == "InApplication" && style != "InApplication") {
- load = true;
- KNotification *notification = new KNotification("reload", 0);
- notification->setComponentData(KComponentData("kcmstyle"));
- notification->setText(i18n("Settings changes will take effect only on application restart"));
- notification->sendEvent();
- }
-
-#ifdef Q_WS_X11
- // If user select ButtonVertical, we add (if needed) a button to titlebar
- if (style == "ButtonVertical") {
- KConfig _kwinConfig("kwinrc", KConfig::NoGlobals);
- KConfigGroup kwinConfig(&_kwinConfig, "Style");
- QString buttonsOnLeft = kwinConfig.readEntry("ButtonsOnLeft", KDecorationOptions::defaultTitleButtonsLeft());
- QString buttonsOnRight = kwinConfig.readEntry("ButtonsOnRight", KDecorationOptions::defaultTitleButtonsRight());
- qDebug() << buttonsOnLeft << buttonsOnRight;
- if (!buttonsOnLeft.contains("N") && !buttonsOnRight.contains("N")) {
- buttonsOnLeft = "N" + buttonsOnLeft;
- }
- kwinConfig.writeEntry("ButtonsOnLeft", buttonsOnLeft);
- kwinConfig.writeEntry("CustomButtonPositions", "true");
- }
-#endif
-
- args = QList<QVariant>() << "appmenu" << (style != "InApplication");
- method = QDBusMessage::createMethodCall("org.kde.kded",
- "/kded",
- "org.kde.kded",
- "setModuleAutoloading");
- method.setArguments(args);
- QDBusConnection::sessionBus().asyncCall(method);
-
- args = QList<QVariant>() << "appmenu";
- if (load) {
- method = QDBusMessage::createMethodCall("org.kde.kded",
- "/kded",
- "org.kde.kded",
- "loadModule");
- QDBusMessage method = QDBusMessage::createMethodCall("org.kde.kded", "/modules/appmenu", "org.kde.kded", "reconfigure");
- QDBusConnection::sessionBus().asyncCall(method);
- } else if (style == "InApplication") {
- method = QDBusMessage::createMethodCall("org.kde.kded",
- "/kded",
- "org.kde.kded",
- "unloadModule");
- }
- method.setArguments(args);
- QDBusConnection::sessionBus().asyncCall(method);
-
// Export the changes we made to qtrc, and update all qt-only
// applications on the fly, ensuring that we still follow the user's
// export fonts/colors settings.
// Effects
fineTuningUi.comboToolbarIcons->setCurrentIndex(toolbarButtonIndex("TextBesideIcon"));
fineTuningUi.comboSecondaryToolbarIcons->setCurrentIndex(toolbarButtonIndex("TextBesideIcon"));
- fineTuningUi.comboMenubarStyle->setCurrentIndex(menuBarStyleIndex("InApplication"));
fineTuningUi.cbIconsOnButtons->setChecked(true);
fineTuningUi.cbIconsInMenus->setChecked(true);
fineTuningUi.comboGraphicEffectsLevel->setCurrentIndex(fineTuningUi.comboGraphicEffectsLevel->findData(((int) KGlobalSettings::graphicEffectsLevelDefault())));
return 0;
}
-QString KCMStyle::menuBarStyleText(int index)
-{
- switch (index) {
- case 1:
- return "ButtonVertical";
- case 2:
- return "TopMenuBar";
- case 3:
- return "Others";
- }
-
- return "InApplication";
-}
-
-int KCMStyle::menuBarStyleIndex(const QString &text)
-{
- if (text == "ButtonVertical") {
- return 1;
- } else if (text == "TopMenuBar") {
- return 2;
- } else if (text == "Others") {
- return 3;
- }
-
- return 0;
-}
-
void KCMStyle::loadEffects( KConfig& config )
{
// KDE's Part via KConfig
tbIcon = configGroup.readEntry("ToolButtonStyleOtherToolbars", "TextBesideIcon");
fineTuningUi.comboSecondaryToolbarIcons->setCurrentIndex(toolbarButtonIndex(tbIcon));
- configGroup = config.group("Appmenu Style");
- QString menuBarStyle = configGroup.readEntry("Style", "InApplication");
- fineTuningUi.comboMenubarStyle->setCurrentIndex(menuBarStyleIndex(menuBarStyle));
-
configGroup = config.group("KDE");
fineTuningUi.cbIconsOnButtons->setChecked(configGroup.readEntry("ShowIconsOnPushButtons", true));
fineTuningUi.cbIconsInMenus->setChecked(configGroup.readEntry("ShowIconsInMenuItems", true));
QString currentStyle();
static QString toolbarButtonText(int index);
static int toolbarButtonIndex(const QString &text);
- static QString menuBarStyleText(int index);
- static int menuBarStyleIndex(const QString &text);
bool m_bStyleDirty, m_bEffectsDirty;
QHash <QString,StyleEntry*> styleEntries;
option(KWIN_BUILD_KCMS "Enable building of KWin configuration modules." ON)
option(KWIN_BUILD_TABBOX "Enable building of KWin Tabbox functionality" ON)
option(KWIN_BUILD_SCREENEDGES "Enable building of KWin with screen edge support" ON)
-option(KWIN_BUILD_KAPPMENU "Enable building of KWin with application menu support" ON)
option(KWIN_BUILD_COMPOSITE "Enable building of KWin with XRender Compositing support" ON)
-# without dbusmenu-qt the functionality is useless
-if(NOT DBUSMENUQT_FOUND)
- set(KWIN_BUILD_KAPPMENU OFF)
-endif()
-
include_directories(
${XCB_INCLUDE_DIR}
# for kworkspace_export.h
)
endif()
-if(KWIN_BUILD_KAPPMENU)
- set(kwin_SRCS
- ${kwin_SRCS}
- appmenu.cpp
- )
-endif()
-
kde4_add_kcfg_files(kwin_SRCS settings.kcfgc)
qt4_add_dbus_adaptor(kwin_SRCS org.kde.KWin.xml dbusinterface.h KWin::DBusInterface)
+++ /dev/null
-/********************************************************************
- KWin - the KDE window manager
- This file is part of the KDE project.
-
-Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
-Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-Copyright (C) 2013 Martin Gräßlin <mgraesslin@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, see <http://www.gnu.org/licenses/>.
-*********************************************************************/
-#include "appmenu.h"
-#include "client.h"
-#include "workspace.h"
-// Qt
-#include <QtDBus/QDBusConnection>
-#include <QtDBus/QDBusMessage>
-#include <QtDBus/QDBusPendingCall>
-
-namespace KWin {
-
-static const char *KDED_SERVICE = "org.kde.kded";
-static const char *KDED_APPMENU_PATH = "/modules/appmenu";
-static const char *KDED_INTERFACE = "org.kde.kded";
-
-KWIN_SINGLETON_FACTORY(ApplicationMenu)
-
-ApplicationMenu::ApplicationMenu(QObject *parent)
- : QObject(parent)
-{
- QDBusConnection dbus = QDBusConnection::sessionBus();
- dbus.connect(KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "showRequest",
- this, SLOT(slotShowRequest(qulonglong)));
- dbus.connect(KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "menuAvailable",
- this, SLOT(slotMenuAvailable(qulonglong)));
- dbus.connect(KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "menuHidden",
- this, SLOT(slotMenuHidden(qulonglong)));
- dbus.connect(KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "clearMenus",
- this, SLOT(slotClearMenus()));
-}
-
-ApplicationMenu::~ApplicationMenu()
-{
- s_self = NULL;
-}
-
-bool ApplicationMenu::hasMenu(xcb_window_t window)
-{
- return m_windowsMenu.removeOne(window);
-}
-
-void ApplicationMenu::slotShowRequest(qulonglong wid)
-{
- if (Client *c = Workspace::self()->findClient(WindowMatchPredicate(wid)))
- c->emitShowRequest();
-}
-
-void ApplicationMenu::slotMenuAvailable(qulonglong wid)
-{
- if (Client *c = Workspace::self()->findClient(WindowMatchPredicate(wid)))
- c->setAppMenuAvailable();
- else
- m_windowsMenu.append(wid);
-}
-
-void ApplicationMenu::slotMenuHidden(qulonglong wid)
-{
- if (Client *c = Workspace::self()->findClient(WindowMatchPredicate(wid)))
- c->emitMenuHidden();
-}
-
-void ApplicationMenu::slotClearMenus()
-{
- foreach (Client *c, Workspace::self()->clientList()) {
- c->setAppMenuUnavailable();
- }
-}
-
-void ApplicationMenu::showApplicationMenu(const QPoint &p, const xcb_window_t id)
-{
- QList<QVariant> args = QList<QVariant>() << p.x() << p.y() << qulonglong(id);
- QDBusMessage method = QDBusMessage::createMethodCall(KDED_SERVICE, KDED_APPMENU_PATH, KDED_INTERFACE, "showMenu");
- method.setArguments(args);
- QDBusConnection::sessionBus().asyncCall(method);
-}
-
-} // namespace
+++ /dev/null
-/********************************************************************
- KWin - the KDE window manager
- This file is part of the KDE project.
-
-Copyright (c) 2011 Lionel Chauvin <megabigbug@yahoo.fr>
-Copyright (c) 2011,2012 Cédric Bellegarde <gnumdk@gmail.com>
-Copyright (C) 2013 Martin Gräßlin <mgraesslin@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, see <http://www.gnu.org/licenses/>.
-*********************************************************************/
-#ifndef KWIN_APPLICATIONMENU_H
-#define KWIN_APPLICATIONMENU_H
-// KWin
-#include <kwinglobals.h>
-// Qt
-#include <QObject>
-// xcb
-#include <xcb/xcb.h>
-
-#include <QPoint>
-
-namespace KWin
-{
-
-class ApplicationMenu : public QObject
-{
- Q_OBJECT
-
-public:
- virtual ~ApplicationMenu();
-
- bool hasMenu(xcb_window_t window);
- void showApplicationMenu(const QPoint &pos, const xcb_window_t window);
-
-private Q_SLOTS:
- void slotShowRequest(qulonglong wid);
- void slotMenuAvailable(qulonglong wid);
- void slotMenuHidden(qulonglong wid);
- void slotClearMenus();
-
-private:
- QList<xcb_window_t> m_windowsMenu;
-
- KWIN_SINGLETON(ApplicationMenu)
-};
-
-}
-
-#endif // KWIN_APPLICATIONMENU_H
workspace()->showWindowMenu(p, c);
}
-void Bridge::showApplicationMenu(const QPoint &p)
-{
-#ifdef KWIN_BUILD_KAPPMENU
- c->showApplicationMenu(p);
-#endif
-}
-
-bool Bridge::menuAvailable() const
-{
-#ifdef KWIN_BUILD_KAPPMENU
- return c->menuAvailable();
-#else
- return false;
-#endif
-}
-
void Bridge::performWindowOperation(WindowOperation op)
{
workspace()->performWindowOperation(c, op);
virtual void processMousePressEvent(QMouseEvent*);
virtual void showWindowMenu(const QPoint &);
virtual void showWindowMenu(const QRect &);
- virtual void showApplicationMenu(const QPoint &);
- virtual bool menuAvailable() const;
virtual void performWindowOperation(WindowOperation);
virtual void setMask(const QRegion&, int);
virtual bool isPreview() const;
// own
#include "client.h"
// kwin
-#ifdef KWIN_BUILD_KAPPMENU
-#include "appmenu.h"
-#endif
#include "atoms.h"
#include "bridge.h"
#include "client_machine.h"
, electricMaximizing(false)
, needsSessionInteract(false)
, needsXWindowMove(false)
-#ifdef KWIN_BUILD_KAPPMENU
- , m_menuAvailable(false)
-#endif
, m_decoInputExtent()
{
// TODO: Do all as initialization
decoration, SLOT(maximizeChange()));
connect(this, SIGNAL(keepAboveChanged(bool)), decoration, SIGNAL(keepAboveChanged(bool)));
connect(this, SIGNAL(keepBelowChanged(bool)), decoration, SIGNAL(keepBelowChanged(bool)));
-#ifdef KWIN_BUILD_KAPPMENU
- connect(this, SIGNAL(showRequest()), decoration, SIGNAL(showRequest()));
- connect(this, SIGNAL(appMenuAvailable()), decoration, SIGNAL(appMenuAvailable()));
- connect(this, SIGNAL(appMenuUnavailable()), decoration, SIGNAL(appMenuUnavailable()));
- connect(this, SIGNAL(menuHidden()), decoration, SIGNAL(menuHidden()));
-#endif
// TODO: Check decoration's minimum size?
decoration->init();
decoration->widget()->installEventFilter(this);
return true;
}
-#ifdef KWIN_BUILD_KAPPMENU
-void Client::setAppMenuAvailable()
-{
- m_menuAvailable = true;
- emit appMenuAvailable();
-}
-
-void Client::setAppMenuUnavailable()
-{
- m_menuAvailable = false;
- emit appMenuUnavailable();
-}
-
-void Client::showApplicationMenu(const QPoint &p)
-{
- ApplicationMenu::self()->showApplicationMenu(p, window());
-}
-#endif
-
NET::WindowType Client::windowType(bool direct, int supportedTypes) const
{
// TODO: does it make sense to cache the returned window type for SUPPORTED_MANAGED_WINDOW_TYPES_MASK?
// a helper for the workspace window packing. tests for screen validity and updates since in maximization case as with normal moving
void packTo(int left, int top);
-#ifdef KWIN_BUILD_KAPPMENU
- // Used by workspace
- void emitShowRequest() {
- emit showRequest();
- }
- void emitMenuHidden() {
- emit menuHidden();
- }
- void setAppMenuAvailable();
- void setAppMenuUnavailable();
- void showApplicationMenu(const QPoint&);
- bool menuAvailable() {
- return m_menuAvailable;
- }
-#endif
-
template <typename T>
void print(T &stream) const;
void tabGroupChanged();
/**
- * Emitted whenever the Client want to show it menu
- */
- void showRequest();
- /**
- * Emitted whenever the Client's menu is closed
- */
- void menuHidden();
- /**
- * Emitted whenever the Client's menu is available
- **/
- void appMenuAvailable();
- /**
- * Emitted whenever the Client's menu is unavailable
- */
- void appMenuUnavailable();
-
- /**
* Emitted whenever the demands attention state changes.
**/
void demandsAttentionChanged();
bool needsSessionInteract;
bool needsXWindowMove;
-#ifdef KWIN_BUILD_KAPPMENU
- bool m_menuAvailable;
-#endif
Xcb::Window m_decoInputExtent;
QPoint input_offset;
};
qml/Decoration.qml
qml/DecorationButton.qml
qml/MenuButton.qml
- qml/AppMenuButton.qml
DESTINATION ${KDE4_DATA_INSTALL_DIR}/kwin/aurorae )
install( FILES
qml/Decoration.qml
qml/DecorationButton.qml
qml/MenuButton.qml
- qml/AppMenuButton.qml
qml/ButtonGroup.qml
qml/qmldir
DESTINATION ${KDE4_IMPORTS_INSTALL_DIR}/org/kde/kwin/decoration )
case AbilityButtonShade:
case AbilityButtonOnAllDesktops:
case AbilityButtonHelp:
- case AbilityButtonApplicationMenu:
case AbilityProvidesShadow:
return true; // TODO: correct value from theme
case AbilityTabbing:
connect(AuroraeFactory::instance(), SIGNAL(configChanged()), SIGNAL(configChanged()));
connect(AuroraeFactory::instance(), SIGNAL(titleFontChanged()), SIGNAL(fontChanged()));
connect(m_item, SIGNAL(alphaChanged()), SLOT(slotAlphaChanged()));
- connect(this, SIGNAL(appMenuAvailable()), SIGNAL(appMenuAvailableChanged()));
- connect(this, SIGNAL(appMenuUnavailable()), SIGNAL(appMenuAvailableChanged()));
}
AuroraeClient::~AuroraeClient()
showWindowMenu(QCursor::pos());
}
-void AuroraeClient::appMenuClicked()
-{
- showApplicationMenu(QCursor::pos());
-}
-
void AuroraeClient::toggleShade()
{
setShade(!isShade());
Q_PROPERTY(bool keepBelow READ keepBelow WRITE setKeepBelow NOTIFY keepBelowChangedWrapper)
Q_PROPERTY(bool maximized READ isMaximized NOTIFY maximizeChanged)
Q_PROPERTY(bool providesContextHelp READ providesContextHelp)
- Q_PROPERTY(bool appMenu READ menuAvailable NOTIFY appMenuAvailableChanged)
Q_PROPERTY(QRect transparentRect READ transparentRect)
Q_PROPERTY(int width READ width)
Q_PROPERTY(qulonglong windowId READ windowId CONSTANT)
**/
void configChanged();
void fontChanged();
- void appMenuAvailableChanged();
public slots:
void menuClicked();
- void appMenuClicked();
void toggleShade();
void toggleKeepAbove();
void toggleKeepBelow();
return QLatin1String("help");
case MenuButton:
return QLatin1String("menu");
- case AppMenuButton:
- return QLatin1String("appmenu");
default:
return QLatin1String("");
}
THEME_CONFIG(buttonWidthShade)
THEME_CONFIG(buttonWidthHelp)
THEME_CONFIG(buttonWidthMenu)
-THEME_CONFIG(buttonWidthAppMenu)
THEME_CONFIG(buttonHeight)
THEME_CONFIG(buttonSpacing)
THEME_CONFIG(buttonMarginTop)
KeepBelowButton,
ShadeButton,
HelpButton,
- MenuButton,
- AppMenuButton
+ MenuButton
};
enum DecorationPosition {
Q_PROPERTY(int buttonWidthShade READ buttonWidthShade NOTIFY themeChanged)
Q_PROPERTY(int buttonWidthHelp READ buttonWidthHelp NOTIFY themeChanged)
Q_PROPERTY(int buttonWidthMenu READ buttonWidthMenu NOTIFY themeChanged)
- Q_PROPERTY(int buttonWidthAppMenu READ buttonWidthAppMenu NOTIFY themeChanged)
Q_PROPERTY(int buttonSpacing READ buttonSpacing NOTIFY themeChanged)
Q_PROPERTY(int buttonMarginTop READ buttonMarginTop NOTIFY themeChanged)
Q_PROPERTY(int explicitButtonSpacer READ explicitButtonSpacer NOTIFY themeChanged)
int buttonWidthShade() const;
int buttonWidthHelp() const;
int buttonWidthMenu() const;
- int buttonWidthAppMenu() const;
int buttonHeight() const;
int buttonSpacing() const;
int buttonMarginTop() const;
, m_buttonWidthShade(defaultButtonWidthShade())
, m_buttonWidthHelp(defaultButtonWidthHelp())
, m_buttonWidthMenu(defaultButtonWidthMenu())
- , m_buttonWidthAppMenu(defaultButtonWidthAppMenu())
, m_buttonHeight(defaultButtonHeight())
, m_buttonSpacing(defaultButtonSpacing())
, m_buttonMarginTop(defaultButtonMarginTop())
m_buttonWidthShade = border.readEntry("ButtonWidthShade", m_buttonWidth);
m_buttonWidthHelp = border.readEntry("ButtonWidthHelp", m_buttonWidth);
m_buttonWidthMenu = border.readEntry("ButtonWidthMenu", m_buttonWidth);
- m_buttonWidthAppMenu = border.readEntry("ButtonWidthAppMenu", m_buttonWidthMenu);
m_buttonHeight = border.readEntry("ButtonHeight", defaultButtonHeight());
m_buttonSpacing = border.readEntry("ButtonSpacing", defaultButtonSpacing());
m_buttonMarginTop = border.readEntry("ButtonMarginTop", defaultButtonMarginTop());
int buttonWidthMenu() const {
return m_buttonWidthMenu;
}
- int buttonWidthAppMenu() const {
- return m_buttonWidthAppMenu;
- }
int buttonHeight() const {
return m_buttonHeight;
}
static int defaultButtonWidthMenu() {
return defaultButtonWidth();
}
- static int defaultButtonWidthAppMenu() {
- return defaultButtonWidthMenu();
- }
static int defaultButtonHeight() {
return 20;
}
int m_buttonWidthShade;
int m_buttonWidthHelp;
int m_buttonWidthMenu;
- int m_buttonWidthAppMenu;
int m_buttonHeight;
int m_buttonSpacing;
int m_buttonMarginTop;
+++ /dev/null
-/********************************************************************
-Copyright (C) 2012 Martin Gräßlin <mgraesslin@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, see <http://www.gnu.org/licenses/>.
-*********************************************************************/
-import QtQuick 1.1
-import org.kde.qtextracomponents 0.1 as QtExtra
-
-DecorationButton {
- id: appMenuButton
- buttonType: "N"
- visible: decoration.appMenu
- QtExtra.QIconItem {
- icon: decoration.icon
- anchors.fill: parent
- }
-}
case "M":
// menu
return auroraeTheme.buttonWidthMenu;
- case "N":
- // app menu
- return auroraeTheme.buttonWidthAppMenu;
case "S":
// all desktops
return auroraeTheme.buttonWidthAllDesktops;
} else if (buttons.charAt(i) == "M") {
Qt.createQmlObject("import QtQuick 1.1; MenuButton { width: auroraeTheme.buttonWidthMenu * auroraeTheme.buttonSizeFactor; height: auroraeTheme.buttonHeight * auroraeTheme.buttonSizeFactor }",
groupRow, "menuButton" + buttons + i);
- } else if (buttons.charAt(i) == "N") {
- Qt.createQmlObject("import QtQuick 1.1; AppMenuButton { width: auroraeTheme.buttonWidthAppMenu * auroraeTheme.buttonSizeFactor; height: auroraeTheme.buttonHeight * auroraeTheme.buttonSizeFactor }",
- groupRow, "appMenuButton" + buttons + i);
} else if (buttons.charAt(i) == "A") {
var maximizeComponent = Qt.createComponent("AuroraeMaximizeButton.qml");
maximizeComponent.createObject(groupRow);
case "M":
component = group.menuButton;
break;
- case "N":
- component = group.appMenuButton;
- break;
case "S":
component = group.allDesktopsButton;
break;
property variant keepBelowButton
property variant maximizeButton
property variant menuButton
- property variant appMenuButton
property variant minimizeButton
property variant allDesktopsButton
property variant shadeButton
// menu
decoration.menuClicked();
break;
- case "N":
- // app menu
- decoration.appMenuClicked();
- break;
case "S":
// all desktops
decoration.toggleOnAllDesktops();
Decoration 0.1 Decoration.qml
DecorationButton 0.1 DecorationButton.qml
MenuButton 0.1 MenuButton.qml
-AppMenuButton 0.1 AppMenuButton.qml
ButtonGroup 0.1 ButtonGroup.qml
} else {
button = ShadeIcon;
}
- } else if (idParts[0] == "N") {
- button = AppMenuIcon;
} else {
// not recognized icon
return QDeclarativeImageProvider::requestPixmap(id, size, requestedSize);
break;
}
- case AppMenuIcon:
- {
- drawObject(p, HorizontalLine, r.x(), r.top()+(lwTitleBar-1), r.width(), lwTitleBar);
- drawObject(p, HorizontalLine, r.x(), r.center().y(), r.width(), lwTitleBar);
- drawObject(p, HorizontalLine, r.x(), r.bottom()-(lwTitleBar-1), r.width(), lwTitleBar);
- break;
- }
default:
break;
NoKeepBelowIcon,
ShadeIcon,
UnShadeIcon,
- AppMenuIcon,
NumButtonIcons
};
enum Object {
if (buttonType == "H") {
visible = decoration.providesContextHelp;
}
- if (buttonType == "N") {
- visible = decoration.appMenu;
- }
}
onHoveredChanged: colorize()
onPressedChanged: colorize()
Connections {
target: decoration
onActiveChanged: button.colorize()
- onAppMenuChanged: {
- if (buttonType == "N") {
- visible = decoration.appMenu;
- }
- }
}
}
spacing: 1
explicitSpacer: root.buttonSize
menuButton: menuButtonComponent
- appMenuButton: appMenuButtonComponent
minimizeButton: minimizeButtonComponent
maximizeButton: maximizeButtonComponent
keepBelowButton: keepBelowButtonComponent
spacing: 1
explicitSpacer: root.buttonSize
menuButton: menuButtonComponent
- appMenuButton: appMenuButtonComponent
minimizeButton: minimizeButtonComponent
maximizeButton: maximizeButtonComponent
keepBelowButton: keepBelowButtonComponent
height: root.buttonSize
}
}
- Component {
- id: appMenuButtonComponent
- PlastikButton {
- buttonType: "N"
- size: root.buttonSize
- }
- }
Component.onCompleted: {
borders.setBorders(4);
borders.setTitle(top.normalHeight);
//___________________________________________________
void Button::mouseReleaseEvent( QMouseEvent* event )
{
- if (_type != ButtonApplicationMenu)
- {
- _status &= ~Pressed;
- parentUpdate();
- }
+ _status &= ~Pressed;
+ parentUpdate();
KCommonDecorationButton::mouseReleaseEvent( event );
}
{
case ButtonSticky:
- painter->drawPoint(QPointF(10.5,10.5));
- break;
+ painter->drawPoint(QPointF(10.5,10.5));
+ break;
case ButtonHelp:
- painter->translate(1.5, 1.5);
- painter->drawArc(7,5,4,4,135*16, -180*16);
- painter->drawArc(9,8,4,4,135*16,45*16);
- painter->drawPoint(9,12);
- painter->translate(-1.5, -1.5);
- break;
-
- case ButtonApplicationMenu:
- painter->drawLine(QPointF(7.5, 7.5), QPointF(13.5, 7.5));
- painter->drawLine(QPointF(7.5, 10.5), QPointF(13.5, 10.5));
- painter->drawLine(QPointF(7.5, 13.5), QPointF(13.5, 13.5));
- break;
+ painter->translate(1.5, 1.5);
+ painter->drawArc(7,5,4,4,135*16, -180*16);
+ painter->drawArc(9,8,4,4,135*16,45*16);
+ painter->drawPoint(9,12);
+ painter->translate(-1.5, -1.5);
+ break;
case ButtonMin:
- painter->drawLine(QPointF( 7.5, 9.5), QPointF(10.5,12.5));
- painter->drawLine(QPointF(10.5,12.5), QPointF(13.5, 9.5));
- break;
-
- case ButtonMax:
- switch(_client.maximizeMode())
- {
- case Client::MaximizeRestore:
- case Client::MaximizeVertical:
- case Client::MaximizeHorizontal:
- painter->drawLine(QPointF( 7.5,11.5), QPointF(10.5, 8.5));
- painter->drawLine(QPointF(10.5, 8.5), QPointF(13.5,11.5));
+ painter->drawLine(QPointF( 7.5, 9.5), QPointF(10.5,12.5));
+ painter->drawLine(QPointF(10.5,12.5), QPointF(13.5, 9.5));
break;
- case Client::MaximizeFull:
+ case ButtonMax:
+ switch(_client.maximizeMode())
{
- painter->translate(1.5, 1.5);
- QPoint points[4] = {QPoint(9, 6), QPoint(12, 9), QPoint(9, 12), QPoint(6, 9)};
- painter->drawPolygon(points, 4);
- painter->translate(-1.5, -1.5);
- break;
+ case Client::MaximizeRestore:
+ case Client::MaximizeVertical:
+ case Client::MaximizeHorizontal:
+ painter->drawLine(QPointF( 7.5,11.5), QPointF(10.5, 8.5));
+ painter->drawLine(QPointF(10.5, 8.5), QPointF(13.5,11.5));
+ break;
+
+ case Client::MaximizeFull:
+ {
+ painter->translate(1.5, 1.5);
+ QPoint points[4] = {QPoint(9, 6), QPoint(12, 9), QPoint(9, 12), QPoint(6, 9)};
+ painter->drawPolygon(points, 4);
+ painter->translate(-1.5, -1.5);
+ break;
+ }
}
- }
- break;
+ break;
case ButtonItemClose:
case ButtonClose:
- painter->drawLine(QPointF( 7.5,7.5), QPointF(13.5,13.5));
- painter->drawLine(QPointF(13.5,7.5), QPointF( 7.5,13.5));
- break;
+ painter->drawLine(QPointF( 7.5,7.5), QPointF(13.5,13.5));
+ painter->drawLine(QPointF(13.5,7.5), QPointF( 7.5,13.5));
+ break;
case ButtonAbove:
- painter->drawLine(QPointF( 7.5,14), QPointF(10.5,11));
- painter->drawLine(QPointF(10.5,11), QPointF(13.5,14));
- painter->drawLine(QPointF( 7.5,10), QPointF(10.5, 7));
- painter->drawLine(QPointF(10.5, 7), QPointF(13.5,10));
- break;
+ painter->drawLine(QPointF( 7.5,14), QPointF(10.5,11));
+ painter->drawLine(QPointF(10.5,11), QPointF(13.5,14));
+ painter->drawLine(QPointF( 7.5,10), QPointF(10.5, 7));
+ painter->drawLine(QPointF(10.5, 7), QPointF(13.5,10));
+ break;
case ButtonBelow:
- painter->drawLine(QPointF( 7.5,11), QPointF(10.5,14));
- painter->drawLine(QPointF(10.5,14), QPointF(13.5,11));
- painter->drawLine(QPointF( 7.5, 7), QPointF(10.5,10));
- painter->drawLine(QPointF(10.5,10), QPointF(13.5, 7));
- break;
+ painter->drawLine(QPointF( 7.5,11), QPointF(10.5,14));
+ painter->drawLine(QPointF(10.5,14), QPointF(13.5,11));
+ painter->drawLine(QPointF( 7.5, 7), QPointF(10.5,10));
+ painter->drawLine(QPointF(10.5,10), QPointF(13.5, 7));
+ break;
case ButtonShade:
if (!isChecked())
return;
}
- void Button::slotAppMenuHidden()
- {
- _status = Normal;
- update();
- }
-
}
//@}
- private slots:
- void slotAppMenuHidden();
-
private:
//! parent client
case MenuButton:
return new Button(*this, i18n("Window Actions Menu"), ButtonMenu);
- case AppMenuButton:
- return new Button(*this, i18n("Application Menu"), ButtonApplicationMenu);
-
case HelpButton:
return new Button(*this, i18n("Help"), ButtonHelp);
ButtonAbove,
ButtonBelow,
ButtonShade,
- ButtonApplicationMenu,
ButtonTypeCount,
// Close only one tab
{
// buttons
case AbilityButtonMenu:
- case AbilityButtonApplicationMenu:
case AbilityButtonHelp:
case AbilityButtonMinimize:
case AbilityButtonMaximize:
#cmakedefine KWIN_BUILD_TABBOX 1
#cmakedefine KWIN_BUILD_SCREENEDGES 1
-#cmakedefine KWIN_BUILD_KAPPMENU 1
#cmakedefine KWIN_BUILD_OXYGEN 1
#cmakedefine KWIN_BUILD_COMPOSITE 1
#define KWIN_VERSION_STRING "${KDE_VERSION_STRING}"
#include <KLocalizedString>
#include <kglobalsettings.h>
-#ifdef KWIN_BUILD_KAPPMENU
-#include <KConfigGroup>
-#include <KConfig>
-#endif
-
#include <kdecorationfactory.h>
bool dummy;
m_supportedButtons = "MSHIAX_FBLR";
-#ifdef KWIN_BUILD_KAPPMENU
- KConfig config("kdeglobals", KConfig::FullConfig);
- KConfigGroup configGroup = config.group("Appmenu Style");
- QString style = configGroup.readEntry("Style", "InApplication");
-
- if (style == "ButtonVertical") {
- m_supportedButtons = "MNSHIAX_FBLR"; // support all buttons
- new ButtonSourceItem(m_buttonSource, getButton('N', dummy));
- }
-#endif
new ButtonSourceItem(m_buttonSource, getButton('R', dummy));
new ButtonSourceItem(m_buttonSource, getButton('L', dummy));
QBitmap bmp = QBitmap::fromData(QSize(menu_width, menu_height), menu_bits);
bmp.createMaskFromColor(Qt::white);
return Button(i18nc("Button showing window actions menu", "Window Menu"), bmp, 'M', false, m_supportedButtons.contains('M'));
-#ifdef KWIN_BUILD_KAPPMENU
- } else if (type == 'N') {
- QBitmap bmp = QBitmap::fromData(QSize(menu_width, menu_height), menu_bits);
- bmp.createMaskFromColor(Qt::white);
- return Button(i18nc("Button showing application menu imported from dbusmenu", "Application Menu"), bmp, 'N', false, m_supportedButtons.contains('N'));
-#endif
} else if (type == '_') {
QBitmap bmp = QBitmap::fromData(QSize(spacer_width, spacer_height), spacer_bits);
bmp.createMaskFromColor(Qt::white);
{
}
-void KDecorationPreviewBridge::showApplicationMenu(const QPoint &)
-{
-}
-
-bool KDecorationPreviewBridge::menuAvailable() const
-{
- return false;
-}
-
void KDecorationPreviewBridge::performWindowOperation(WindowOperation)
{
}
virtual void processMousePressEvent(QMouseEvent*);
virtual void showWindowMenu(const QRect &);
virtual void showWindowMenu(const QPoint &);
- virtual void showApplicationMenu(const QPoint &);
- virtual bool menuAvailable() const;
virtual void performWindowOperation(WindowOperation);
virtual void setMask(const QRegion&, int);
virtual bool isPreview() const;
property bool keepBelow: false
property bool maximized: false
property bool providesContextHelp: true
- property bool appMenu: true
property string leftButtons: "MS"
property string rightButtons: "HIA__X"
function titleMouseMoved() {}
m_button[MenuButton] = btn;
}
break;
- case 'N': // Application Menu button
- if (!m_button[AppMenuButton]) {
- btn = createButton(AppMenuButton);
- if (!btn) break;
- btn->setTipText(i18nc("Button showing application menu", "Application Menu"));
- btn->setRealizeButtons(Qt::LeftButton);
- connect(btn, SIGNAL(clicked()), SLOT(appMenuButtonPressed()), Qt::QueuedConnection);
- // Application want to show it menu
- connect(decoration(), SIGNAL(showRequest()), this, SLOT(appMenuButtonPressed()), Qt::UniqueConnection);
- // Wait for menu to become available before displaying any button
- connect(decoration(), SIGNAL(appMenuAvailable()), this, SLOT(slotAppMenuAvailable()), Qt::UniqueConnection);
- // On Kded module shutdown, hide application menu button
- connect(decoration(), SIGNAL(appMenuUnavailable()), this, SLOT(slotAppMenuUnavailable()), Qt::UniqueConnection);
- // Application menu button may need to be modified on this signal
- connect(decoration(), SIGNAL(menuHidden()), btn, SLOT(slotAppMenuHidden()), Qt::UniqueConnection);
-
- // fix double deletion, see objDestroyed()
- connect(btn, SIGNAL(destroyed(QObject*)), this, SLOT(objDestroyed(QObject*)));
- m_button[AppMenuButton] = btn;
- }
- break;
case 'S': // OnAllDesktops button
if (!m_button[OnAllDesktopsButton]) {
btn = createButton(OnAllDesktopsButton);
if (btn) {
btn->setLeft(isLeft);
btn->setSize(QSize(layoutMetric(LM_ButtonWidth, true, btn), layoutMetric(LM_ButtonHeight, true, btn)));
- // will be shown later on window registration
- if (btn->type() == AppMenuButton && !isPreview() && !wrapper->menuAvailable()) {
- btn->hide();
- } else {
- btn->show();
- }
+ btn->show();
btnContainer.append(btn);
}
btnHideLastWidth = width();
//Hide buttons in the following order:
- KCommonDecorationButton* btnArray[] = { m_button[HelpButton], m_button[AppMenuButton], m_button[ShadeButton], m_button[BelowButton],
+ KCommonDecorationButton* btnArray[] = { m_button[HelpButton], m_button[ShadeButton], m_button[BelowButton],
m_button[AboveButton], m_button[OnAllDesktopsButton], m_button[MaxButton],
m_button[MinButton], m_button[MenuButton], m_button[CloseButton]
};
if (! btnArray[i]->isHidden())
break; // all buttons shown...
- if (btnArray[i]->type() != AppMenuButton || wrapper->menuAvailable())
- btnArray[i]->show();
+ btnArray[i]->show();
}
}
}
showWindowMenu(QRect(menutop, menubottom));
}
-
-void KCommonDecoration::appMenuButtonPressed()
-{
- QRect menuRect = m_button[AppMenuButton]->rect();
- wrapper->showApplicationMenu(m_button[AppMenuButton]->mapToGlobal(menuRect.bottomLeft()));
-
- KDecorationFactory* f = factory();
- if (!f->exists(decoration())) // 'this' was deleted
- return;
- m_button[AppMenuButton]->setDown(false);
-}
-
-void KCommonDecoration::slotAppMenuAvailable()
-{
- if (m_button[AppMenuButton]) {
- m_button[AppMenuButton]->show();
- updateLayout();
- }
-}
-
-void KCommonDecoration::slotAppMenuUnavailable()
-{
- if (m_button[AppMenuButton]) {
- m_button[AppMenuButton]->hide();
- updateLayout();
- }
-}
-
void KCommonDecoration::resizeEvent(QResizeEvent */*e*/)
{
if (decorationBehaviour(DB_ButtonHide))
AboveButton,
BelowButton,
ShadeButton,
- AppMenuButton,
NumButtons,
ItemCloseButton = 100, // Close only one tab
ItemMenuButton // shows the window menu for one tab
void slotKeepBelow();
void menuButtonPressed();
void menuButtonReleased();
- void appMenuButtonPressed();
- void slotAppMenuAvailable();
- void slotAppMenuUnavailable();
+
public:
virtual Position mousePosition(const QPoint &point) const;
bridge_->showWindowMenu(pos);
}
-void KDecoration::showApplicationMenu(const QPoint &p)
-{
- bridge_->showApplicationMenu(p);
-}
-
-bool KDecoration::menuAvailable() const
-{
- return bridge_->menuAvailable();
-}
-
void KDecoration::performWindowOperation(WindowOperation op)
{
bridge_->performWindowOperation(op);
AbilityButtonBelowOthers = 8, ///< decoration supports a below button
AbilityButtonShade = 9, ///< decoration supports a shade button
AbilityButtonResize = 10, ///< decoration supports a resize button
- AbilityButtonApplicationMenu = 11, ///< decoration supports the application menu button
// compositing
- AbilityProvidesShadow = 12, ///< The decoration draws its own shadows.
+ AbilityProvidesShadow = 11, ///< The decoration draws its own shadows.
/// @since 4.3
- AbilityUsesAlphaChannel = 13, ///< The decoration isn't clipped to the mask when compositing is enabled.
+ AbilityUsesAlphaChannel = 12, ///< The decoration isn't clipped to the mask when compositing is enabled.
/// The mask is still used to define the input region and the blurred
/// region, when the blur plugin is enabled.
/// @since 4.3
- AbilityExtendIntoClientArea = 14, ///< The decoration respects transparentRect()
+ AbilityExtendIntoClientArea = 13, ///< The decoration respects transparentRect()
/// @since 4.4
- AbilityUsesBlurBehind = 15, ///< The decoration wants the background to be blurred, when the blur plugin is enabled.
+ AbilityUsesBlurBehind = 14, ///< The decoration wants the background to be blurred, when the blur plugin is enabled.
/// @since 4.6
- AbilityAnnounceAlphaChannel = 16, ///< The decoration can tell whether it currently uses an alpha channel or not. Requires AbilityUsesAlphaChannel.
+ AbilityAnnounceAlphaChannel = 15, ///< The decoration can tell whether it currently uses an alpha channel or not. Requires AbilityUsesAlphaChannel.
/// @since 4.10
// Tabbing
- AbilityTabbing = 17, ///< The decoration supports tabbing
+ AbilityTabbing = 16, ///< The decoration supports tabbing
};
/**
* If customButtonPositions() returns true, titleButtonsLeft
* returns which buttons should be on the left side of the titlebar from left
* to right. Characters in the returned string have this meaning :
- * @li 'N' application menu button
* @li 'M' window menu button
* @li 'S' on_all_desktops button
* @li 'H' quickhelp button
*/
void showWindowMenu(QPoint pos);
/**
- * show application menu at p
- */
- void showApplicationMenu(const QPoint& p);
- /**
- * Returns @a true if menu available for client
- */
- bool menuAvailable() const;
- /**
* This function performs the given window operation. This function may destroy
* the current decoration object, just like showWindowMenu().
*/
void keepBelowChanged(bool);
/**
- * This signal is emitted whenever application menu is closed
- * Application menu button may need to be modified on this signal
- */
- void menuHidden();
- /**
- * This signal is emitted whenever application want to show it menu
- */
- void showRequest();
- /**
- * This signal is emitted whenever application menu becomes available
- */
- void appMenuAvailable();
- /**
- * This signal is emitted whenever application menu becomes unavailable
- */
- void appMenuUnavailable();
-
- /**
* This signal is emitted whenever the decoration changes it's alpha enabled
* change. Only relevant in case the decoration provides AbilityAnnounceAlphaChannel.
*
virtual void processMousePressEvent(QMouseEvent*) = 0;
virtual void showWindowMenu(const QRect &) = 0;
virtual void showWindowMenu(const QPoint &) = 0;
- virtual void showApplicationMenu(const QPoint&) = 0;
- virtual bool menuAvailable() const = 0;
virtual void performWindowOperation(WindowOperation) = 0;
virtual void setMask(const QRegion&, int) = 0;
virtual bool isPreview() const = 0;
// kwin libs
#include <kdecorationfactory.h>
// kwin
-#ifdef KWIN_BUILD_KAPPMENU
-#include "appmenu.h"
-#endif
#include "atoms.h"
#include "client.h"
#include "composite.h"
// If KWin was already running it saved its configuration after loosing the selection -> Reread
QFuture<void> reparseConfigFuture = QtConcurrent::run(options, &Options::reparseConfiguration);
-#ifdef KWIN_BUILD_KAPPMENU
- ApplicationMenu::create(this);
-#endif
-
_self = this;
// first initialize the extensions
if (TabBox::TabBox::self()->isDisplayed())
TabBox::TabBox::self()->reset(true);
#endif
-#ifdef KWIN_BUILD_KAPPMENU
- if (ApplicationMenu::self()->hasMenu(c->window()))
- c->setAppMenuAvailable();
-#endif
}
void Workspace::addUnmanaged(Unmanaged* c)