diff --git a/effects.cpp b/effects.cpp index 4bbcdf99d5..0650182868 100644 --- a/effects.cpp +++ b/effects.cpp @@ -1371,51 +1371,6 @@ void EffectWindowImpl::addRepaintFull() toplevel->addRepaintFull(); } -int EffectWindowImpl::desktop() const -{ - return toplevel->desktop(); -} - -bool EffectWindowImpl::isOnActivity(QString activity) const -{ - return toplevel->isOnActivity(activity); -} - -bool EffectWindowImpl::isOnAllActivities() const -{ - return toplevel->isOnAllActivities(); -} - -bool EffectWindowImpl::isOnAllDesktops() const -{ - return desktop() == NET::OnAllDesktops; -} - -QString EffectWindowImpl::caption() const -{ - if (Client* c = dynamic_cast(toplevel)) - return c->caption(); - else - return ""; -} - -QString EffectWindowImpl::windowClass() const -{ - return toplevel->resourceName() + ' ' + toplevel->resourceClass(); -} - -QString EffectWindowImpl::windowRole() const -{ - return toplevel->windowRole(); -} - -QPixmap EffectWindowImpl::icon() const -{ - if (Client* c = dynamic_cast(toplevel)) - return c->icon(); - return QPixmap(); // TODO -} - const EffectWindowGroup* EffectWindowImpl::group() const { if (Client* c = dynamic_cast< Client* >(toplevel)) @@ -1423,25 +1378,6 @@ const EffectWindowGroup* EffectWindowImpl::group() const return NULL; // TODO } -bool EffectWindowImpl::isMinimized() const -{ - if (Client* c = dynamic_cast(toplevel)) - return c->isMinimized(); - else - return false; -} - -double EffectWindowImpl::opacity() const -{ - return toplevel->opacity(); -} - -bool EffectWindowImpl::hasAlpha() const -{ - return toplevel->hasAlpha(); -} - - bool EffectWindowImpl::isDeleted() const { return (dynamic_cast(toplevel) != 0); @@ -1472,72 +1408,16 @@ void EffectWindowImpl::setSceneWindow(Scene::Window* w) sw = w; } -int EffectWindowImpl::x() const -{ - return toplevel->x(); -} - -int EffectWindowImpl::y() const -{ - return toplevel->y(); -} - -int EffectWindowImpl::width() const -{ - return toplevel->width(); -} - -int EffectWindowImpl::height() const -{ - return toplevel->height(); -} - -QSize EffectWindowImpl::basicUnit() const -{ - Client *client = dynamic_cast(toplevel); - return client ? client->basicUnit() : QSize(1,1); -} - -QRect EffectWindowImpl::geometry() const -{ - return toplevel->geometry(); -} - QRegion EffectWindowImpl::shape() const { return sw ? sw->shape() : geometry(); } -int EffectWindowImpl::screen() const -{ - return toplevel->screen(); -} - bool EffectWindowImpl::hasOwnShape() const { return toplevel->shape(); } -QSize EffectWindowImpl::size() const -{ - return toplevel->size(); -} - -QPoint EffectWindowImpl::pos() const -{ - return toplevel->pos(); -} - -QRect EffectWindowImpl::rect() const -{ - return toplevel->rect(); -} - -QRect EffectWindowImpl::contentsRect() const -{ - return QRect(toplevel->clientPos(), toplevel->clientSize()); -} - QRect EffectWindowImpl::decorationInnerRect() const { Client *client = dynamic_cast(toplevel); @@ -1554,152 +1434,11 @@ void EffectWindowImpl::deleteProperty(long int atom) const deleteWindowProperty(window()->window(), atom); } -bool EffectWindowImpl::isMovable() const -{ - if (Client* c = dynamic_cast< Client* >(toplevel)) - return c->isMovable(); - return false; -} - -bool EffectWindowImpl::isMovableAcrossScreens() const -{ - if (Client* c = dynamic_cast< Client* >(toplevel)) - return c->isMovableAcrossScreens(); - return false; -} - -bool EffectWindowImpl::isUserMove() const -{ - if (Client* c = dynamic_cast< Client* >(toplevel)) - return c->isMove(); - return false; -} - -bool EffectWindowImpl::isUserResize() const -{ - if (Client* c = dynamic_cast< Client* >(toplevel)) - return c->isResize(); - return false; -} - -QRect EffectWindowImpl::iconGeometry() const -{ - if (Client* c = dynamic_cast< Client* >(toplevel)) - return c->iconGeometry(); - return QRect(); -} - -bool EffectWindowImpl::isDesktop() const -{ - return toplevel->isDesktop(); -} - -bool EffectWindowImpl::isDock() const -{ - return toplevel->isDock(); -} - -bool EffectWindowImpl::isToolbar() const -{ - return toplevel->isToolbar(); -} - -bool EffectWindowImpl::isMenu() const -{ - return toplevel->isMenu(); -} - -bool EffectWindowImpl::isNormalWindow() const -{ - return toplevel->isNormalWindow(); -} - -bool EffectWindowImpl::isSpecialWindow() const -{ - if (Client* c = dynamic_cast(toplevel)) - return c->isSpecialWindow(); - else - return true; -} - -bool EffectWindowImpl::isDialog() const -{ - return toplevel->isDialog(); -} - -bool EffectWindowImpl::isSplash() const -{ - return toplevel->isSplash(); -} - -bool EffectWindowImpl::isUtility() const -{ - return toplevel->isUtility(); -} - -bool EffectWindowImpl::isDropdownMenu() const -{ - return toplevel->isDropdownMenu(); -} - -bool EffectWindowImpl::isPopupMenu() const -{ - return toplevel->isPopupMenu(); -} - -bool EffectWindowImpl::isTooltip() const -{ - return toplevel->isTooltip(); -} - -bool EffectWindowImpl::isNotification() const -{ - return toplevel->isNotification(); -} - -bool EffectWindowImpl::isComboBox() const -{ - return toplevel->isComboBox(); -} - -bool EffectWindowImpl::isDNDIcon() const -{ - return toplevel->isDNDIcon(); -} - -NET::WindowType EffectWindowImpl::windowType() const -{ - return toplevel->windowType(); -} - bool EffectWindowImpl::isManaged() const { return dynamic_cast< const Client* >(toplevel) != NULL; } -bool EffectWindowImpl::acceptsFocus() const -{ - const Client* client = dynamic_cast< const Client* >(toplevel); - if (!client) - return true; // We don't actually know... - return client->wantsInput(); -} - -bool EffectWindowImpl::keepAbove() const -{ - const Client* client = dynamic_cast< const Client* >(toplevel); - if (!client) - return true; - return client->keepAbove(); -} - -bool EffectWindowImpl::isModal() const -{ - if (Client* c = dynamic_cast< Client* >(toplevel)) - return c->isModal(); - return false; -} - EffectWindow* EffectWindowImpl::findModal() { if (Client* c = dynamic_cast< Client* >(toplevel)) { @@ -1721,32 +1460,11 @@ EffectWindowList EffectWindowImpl::mainWindows() const return EffectWindowList(); } -bool EffectWindowImpl::isSkipSwitcher() const -{ - if (Client* c = dynamic_cast< Client* >(toplevel)) - return c->skipSwitcher(); - return false; -} - WindowQuadList EffectWindowImpl::buildQuads(bool force) const { return sceneWindow()->buildQuads(force); } -void EffectWindowImpl::minimize() const -{ - if (Client* c = dynamic_cast< Client* >(toplevel)) { - c->minimize(); - } -} - -void EffectWindowImpl::unminimize() const -{ - if (Client* c = dynamic_cast< Client* >(toplevel)) { - c->unminimize(); - } -} - void EffectWindowImpl::closeWindow() const { if (Client* c = dynamic_cast< Client* >(toplevel)) { diff --git a/effects.h b/effects.h index 98db1fc869..3b518bc371 100644 --- a/effects.h +++ b/effects.h @@ -242,72 +242,20 @@ public: virtual void unrefWindow(); virtual bool isDeleted() const; - virtual bool isOnActivity(QString id) const; - virtual bool isOnAllActivities() const; - - virtual bool isOnAllDesktops() const; - virtual int desktop() const; // prefer isOnXXX() - virtual bool isMinimized() const; - virtual double opacity() const; - virtual bool hasAlpha() const; - virtual QString caption() const; - virtual QPixmap icon() const; - virtual QString windowClass() const; - virtual QString windowRole() const; virtual const EffectWindowGroup* group() const; - virtual int x() const; - virtual int y() const; - virtual int width() const; - virtual int height() const; - virtual QSize basicUnit() const; - virtual QRect geometry() const; virtual QRegion shape() const; - virtual int screen() const; virtual bool hasOwnShape() const; - virtual QPoint pos() const; - virtual QSize size() const; - virtual QRect rect() const; - virtual bool isMovable() const; - virtual bool isMovableAcrossScreens() const; - virtual bool isUserMove() const; - virtual bool isUserResize() const; - virtual QRect iconGeometry() const; - virtual QRect contentsRect() const; virtual QRect decorationInnerRect() const; virtual QByteArray readProperty(long atom, long type, int format) const; virtual void deleteProperty(long atom) const; - virtual bool isDesktop() const; - virtual bool isDock() const; - virtual bool isToolbar() const; - virtual bool isMenu() const; - virtual bool isNormalWindow() const; // normal as in 'NET::Normal or NET::Unknown non-transient' - virtual bool isSpecialWindow() const; - virtual bool isDialog() const; - virtual bool isSplash() const; - virtual bool isUtility() const; - virtual bool isDropdownMenu() const; - virtual bool isPopupMenu() const; // a context popup, not dropdown, not torn-off - virtual bool isTooltip() const; - virtual bool isNotification() const; - virtual bool isComboBox() const; - virtual bool isDNDIcon() const; - virtual NET::WindowType windowType() const; virtual bool isManaged() const; // managed or override-redirect - virtual bool acceptsFocus() const; - virtual bool keepAbove() const; - - virtual bool isModal() const; virtual EffectWindow* findModal(); virtual EffectWindowList mainWindows() const; - virtual bool isSkipSwitcher() const; - virtual WindowQuadList buildQuads(bool force = false) const; - virtual void minimize() const; - virtual void unminimize() const; virtual void closeWindow() const; virtual bool visibleInClientGroup() const; diff --git a/libkwineffects/kwineffects.cpp b/libkwineffects/kwineffects.cpp index 9e7e7b1ca0..51a7995eb8 100644 --- a/libkwineffects/kwineffects.cpp +++ b/libkwineffects/kwineffects.cpp @@ -291,6 +291,109 @@ EffectWindow::~EffectWindow() { } +#define WINDOW_HELPER( rettype, prototype, propertyname ) \ + rettype EffectWindow::prototype ( ) const \ + { \ + return parent()->property( propertyname ).value< rettype >(); \ + } + +WINDOW_HELPER(double, opacity, "opacity") +WINDOW_HELPER(bool, hasAlpha, "alpha") +WINDOW_HELPER(int, x, "x") +WINDOW_HELPER(int, y, "y") +WINDOW_HELPER(int, width, "width") +WINDOW_HELPER(int, height, "height") +WINDOW_HELPER(QPoint, pos, "pos") +WINDOW_HELPER(QSize, size, "size") +WINDOW_HELPER(int, screen, "screen") +WINDOW_HELPER(QRect, geometry, "geometry") +WINDOW_HELPER(QRect, rect, "rect") +WINDOW_HELPER(int, desktop, "desktop") +WINDOW_HELPER(bool, isDesktop, "desktopWindow") +WINDOW_HELPER(bool, isDock, "dock") +WINDOW_HELPER(bool, isToolbar, "toolbar") +WINDOW_HELPER(bool, isMenu, "menu") +WINDOW_HELPER(bool, isNormalWindow, "normalWindow") +WINDOW_HELPER(bool, isDialog, "dialog") +WINDOW_HELPER(bool, isSplash, "splash") +WINDOW_HELPER(bool, isUtility, "utility") +WINDOW_HELPER(bool, isDropdownMenu, "dropdownMenu") +WINDOW_HELPER(bool, isPopupMenu, "popupMenu") +WINDOW_HELPER(bool, isTooltip, "tooltip") +WINDOW_HELPER(bool, isNotification, "notification") +WINDOW_HELPER(bool, isComboBox, "comboBox") +WINDOW_HELPER(bool, isDNDIcon, "dndIcon") +WINDOW_HELPER(QString, windowRole, "windowRole") + +QString EffectWindow::windowClass() const +{ + return parent()->property("resourceName").toString() + ' ' + parent()->property("resourceClass").toString(); +} + +QRect EffectWindow::contentsRect() const +{ + return QRect(parent()->property("clientPos").toPoint(), parent()->property("clientSize").toSize()); +} + +NET::WindowType EffectWindow::windowType() const +{ + return static_cast(parent()->property("windowType").toInt()); +} + +bool EffectWindow::isOnActivity(QString activity) const +{ + const QStringList activities = parent()->property("activities").toStringList(); + return activities.isEmpty() || activities.contains(activity); +} + +bool EffectWindow::isOnAllActivities() const +{ + return parent()->property("activities").toStringList().isEmpty(); +} + +#undef WINDOW_HELPER + +#define WINDOW_HELPER_DEFAULT( rettype, prototype, propertyname, defaultValue ) \ + rettype EffectWindow::prototype ( ) const \ + { \ + const QVariant variant = parent()->property( propertyname ); \ + if (!variant.isValid()) { \ + return defaultValue; \ + } \ + return variant.value< rettype >(); \ + } + +WINDOW_HELPER_DEFAULT(bool, isMinimized, "minimized", false) +WINDOW_HELPER_DEFAULT(bool, isMovable, "moveable", false) +WINDOW_HELPER_DEFAULT(bool, isMovableAcrossScreens, "moveableAcrossScreens", false) +WINDOW_HELPER_DEFAULT(QString, caption, "caption", "") +WINDOW_HELPER_DEFAULT(bool, keepAbove, "keepAbove", true) +WINDOW_HELPER_DEFAULT(bool, isModal, "modal", false) +WINDOW_HELPER_DEFAULT(QSize, basicUnit, "basicUnit", QSize(1, 1)) +WINDOW_HELPER_DEFAULT(bool, isUserMove, "move", false) +WINDOW_HELPER_DEFAULT(bool, isUserResize, "resize", false) +WINDOW_HELPER_DEFAULT(QRect, iconGeometry, "iconGeometry", QRect()) +WINDOW_HELPER_DEFAULT(bool, isSpecialWindow, "specialWindow", true) +WINDOW_HELPER_DEFAULT(bool, acceptsFocus, "wantsInput", true) // We don't actually know... +WINDOW_HELPER_DEFAULT(QPixmap, icon, "icon", QPixmap()) +WINDOW_HELPER_DEFAULT(bool, isSkipSwitcher, "skipSwitcher", false) + +#undef WINDOW_HELPER_DEFAULT + +#define WINDOW_HELPER_SETTER( prototype, propertyname, args, value ) \ + void EffectWindow::prototype ( args ) \ + {\ + const QVariant variant = parent()->property( propertyname ); \ + if (variant.isValid()) { \ + parent()->setProperty( propertyname, value ); \ + } \ + } + +WINDOW_HELPER_SETTER(minimize, "minimized",,true) +WINDOW_HELPER_SETTER(unminimize, "minimized",,false) + +#undef WINDOW_HELPER_SETTER + bool EffectWindow::isOnCurrentActivity() const { return isOnActivity(effects->currentActivity()); @@ -306,6 +409,11 @@ bool EffectWindow::isOnDesktop(int d) const return desktop() == d || isOnAllDesktops(); } +bool EffectWindow::isOnAllDesktops() const +{ + return desktop() == NET::OnAllDesktops; +} + bool EffectWindow::hasDecoration() const { return contentsRect() != QRect(0, 0, width(), height()); diff --git a/libkwineffects/kwineffects.h b/libkwineffects/kwineffects.h index bae9b79de3..427ab08bb9 100644 --- a/libkwineffects/kwineffects.h +++ b/libkwineffects/kwineffects.h @@ -1101,45 +1101,45 @@ public: virtual void unrefWindow() = 0; virtual bool isDeleted() const = 0; - virtual bool isMinimized() const = 0; - virtual double opacity() const = 0; - virtual bool hasAlpha() const = 0; + bool isMinimized() const; + double opacity() const; + bool hasAlpha() const; - virtual bool isOnCurrentActivity() const; - virtual bool isOnActivity(QString id) const = 0; - virtual bool isOnAllActivities() const = 0; + bool isOnCurrentActivity() const; + bool isOnActivity(QString id) const; + bool isOnAllActivities() const; - virtual bool isOnDesktop(int d) const; - virtual bool isOnCurrentDesktop() const; - virtual bool isOnAllDesktops() const = 0; - virtual int desktop() const = 0; // prefer isOnXXX() + bool isOnDesktop(int d) const; + bool isOnCurrentDesktop() const; + bool isOnAllDesktops() const; + int desktop() const; // prefer isOnXXX() - virtual int x() const = 0; - virtual int y() const = 0; - virtual int width() const = 0; - virtual int height() const = 0; + int x() const; + int y() const; + int width() const; + int height() const; /** * By how much the window wishes to grow/shrink at least. Usually QSize(1,1). * MAY BE DISOBEYED BY THE WM! It's only for information, do NOT rely on it at all. */ - virtual QSize basicUnit() const = 0; - virtual QRect geometry() const = 0; + QSize basicUnit() const; + QRect geometry() const; virtual QRegion shape() const = 0; - virtual int screen() const = 0; + int screen() const; /** @internal Do not use */ virtual bool hasOwnShape() const = 0; // only for shadow effect, for now - virtual QPoint pos() const = 0; - virtual QSize size() const = 0; - virtual QRect rect() const = 0; - virtual bool isMovable() const = 0; - virtual bool isMovableAcrossScreens() const = 0; - virtual bool isUserMove() const = 0; - virtual bool isUserResize() const = 0; - virtual QRect iconGeometry() const = 0; + QPoint pos() const; + QSize size() const; + QRect rect() const; + bool isMovable() const; + bool isMovableAcrossScreens() const; + bool isUserMove() const; + bool isUserResize() const; + QRect iconGeometry() const; /** * Geometry of the actual window contents inside the whole (including decorations) window. */ - virtual QRect contentsRect() const = 0; + QRect contentsRect() const; /** * Geometry of the transparent rect in the decoration. * May be different from contentsRect() if the decoration is extended into the client area. @@ -1150,96 +1150,96 @@ public: virtual QByteArray readProperty(long atom, long type, int format) const = 0; virtual void deleteProperty(long atom) const = 0; - virtual QString caption() const = 0; - virtual QPixmap icon() const = 0; - virtual QString windowClass() const = 0; - virtual QString windowRole() const = 0; + QString caption() const; + QPixmap icon() const; + QString windowClass() const; + QString windowRole() const; virtual const EffectWindowGroup* group() const = 0; /** * Returns whether the window is a desktop background window (the one with wallpaper). * See _NET_WM_WINDOW_TYPE_DESKTOP at http://standards.freedesktop.org/wm-spec/wm-spec-latest.html . */ - virtual bool isDesktop() const = 0; + bool isDesktop() const; /** * Returns whether the window is a dock (i.e. a panel). * See _NET_WM_WINDOW_TYPE_DOCK at http://standards.freedesktop.org/wm-spec/wm-spec-latest.html . */ - virtual bool isDock() const = 0; + bool isDock() const; /** * Returns whether the window is a standalone (detached) toolbar window. * See _NET_WM_WINDOW_TYPE_TOOLBAR at http://standards.freedesktop.org/wm-spec/wm-spec-latest.html . */ - virtual bool isToolbar() const = 0; + bool isToolbar() const; /** * Returns whether the window is a torn-off menu. * See _NET_WM_WINDOW_TYPE_MENU at http://standards.freedesktop.org/wm-spec/wm-spec-latest.html . */ - virtual bool isMenu() const = 0; + bool isMenu() const; /** * Returns whether the window is a "normal" window, i.e. an application or any other window * for which none of the specialized window types fit. * See _NET_WM_WINDOW_TYPE_NORMAL at http://standards.freedesktop.org/wm-spec/wm-spec-latest.html . */ - virtual bool isNormalWindow() const = 0; // normal as in 'NET::Normal or NET::Unknown non-transient' + bool isNormalWindow() const; // normal as in 'NET::Normal or NET::Unknown non-transient' /** * Returns whether the window is any of special windows types (desktop, dock, splash, ...), * i.e. window types that usually don't have a window frame and the user does not use window * management (moving, raising,...) on them. */ - virtual bool isSpecialWindow() const = 0; + bool isSpecialWindow() const; /** * Returns whether the window is a dialog window. * See _NET_WM_WINDOW_TYPE_DIALOG at http://standards.freedesktop.org/wm-spec/wm-spec-latest.html . */ - virtual bool isDialog() const = 0; + bool isDialog() const; /** * Returns whether the window is a splashscreen. Note that many (especially older) applications * do not support marking their splash windows with this type. * See _NET_WM_WINDOW_TYPE_SPLASH at http://standards.freedesktop.org/wm-spec/wm-spec-latest.html . */ - virtual bool isSplash() const = 0; + bool isSplash() const; /** * Returns whether the window is a utility window, such as a tool window. * See _NET_WM_WINDOW_TYPE_UTILITY at http://standards.freedesktop.org/wm-spec/wm-spec-latest.html . */ - virtual bool isUtility() const = 0; + bool isUtility() const; /** * Returns whether the window is a dropdown menu (i.e. a popup directly or indirectly open * from the applications menubar). * See _NET_WM_WINDOW_TYPE_DROPDOWN_MENU at http://standards.freedesktop.org/wm-spec/wm-spec-latest.html . */ - virtual bool isDropdownMenu() const = 0; + bool isDropdownMenu() const; /** * Returns whether the window is a popup menu (that is not a torn-off or dropdown menu). * See _NET_WM_WINDOW_TYPE_POPUP_MENU at http://standards.freedesktop.org/wm-spec/wm-spec-latest.html . */ - virtual bool isPopupMenu() const = 0; // a context popup, not dropdown, not torn-off + bool isPopupMenu() const; // a context popup, not dropdown, not torn-off /** * Returns whether the window is a tooltip. * See _NET_WM_WINDOW_TYPE_TOOLTIP at http://standards.freedesktop.org/wm-spec/wm-spec-latest.html . */ - virtual bool isTooltip() const = 0; + bool isTooltip() const; /** * Returns whether the window is a window with a notification. * See _NET_WM_WINDOW_TYPE_NOTIFICATION at http://standards.freedesktop.org/wm-spec/wm-spec-latest.html . */ - virtual bool isNotification() const = 0; + bool isNotification() const; /** * Returns whether the window is a combobox popup. * See _NET_WM_WINDOW_TYPE_COMBO at http://standards.freedesktop.org/wm-spec/wm-spec-latest.html . */ - virtual bool isComboBox() const = 0; + bool isComboBox() const; /** * Returns whether the window is a Drag&Drop icon. * See _NET_WM_WINDOW_TYPE_DND at http://standards.freedesktop.org/wm-spec/wm-spec-latest.html . */ - virtual bool isDNDIcon() const = 0; + bool isDNDIcon() const; /** * Returns the NETWM window type * See http://standards.freedesktop.org/wm-spec/wm-spec-latest.html . */ - virtual NET::WindowType windowType() const = 0; + NET::WindowType windowType() const; /** * Returns whether the window is managed by KWin (it has control over its placement and other * aspects, as opposed to override-redirect windows that are entirely handled by the application). @@ -1248,13 +1248,13 @@ public: /** * Returns whether or not the window can accept keyboard focus. */ - virtual bool acceptsFocus() const = 0; + bool acceptsFocus() const; /** * Returns whether or not the window is kept above all other windows. */ - virtual bool keepAbove() const = 0; + bool keepAbove() const; - virtual bool isModal() const = 0; + bool isModal() const; virtual EffectWindow* findModal() = 0; virtual EffectWindowList mainWindows() const = 0; @@ -1262,15 +1262,15 @@ public: * Returns whether the window should be excluded from window switching effects. * @since 4.5 */ - virtual bool isSkipSwitcher() const = 0; + bool isSkipSwitcher() const; /** * Returns the unmodified window quad list. Can also be used to force rebuilding. */ virtual WindowQuadList buildQuads(bool force = false) const = 0; - virtual void minimize() const = 0; - virtual void unminimize() const = 0; + void minimize(); + void unminimize(); virtual void closeWindow() const = 0; virtual bool visibleInClientGroup() const = 0;