1
0
mirror of https://github.com/KDE/latte-dock.git synced 2025-03-28 18:50:40 +03:00

expose WindowAbilities from LastActiveWindow API

--expose isClosable,isMinimizable, isMaximizable etc..
through the LastActiveWindow API for applets or containments
to use
This commit is contained in:
Michail Vourlakos 2020-01-22 13:02:00 +02:00
parent 63f6d22f47
commit f8dd3d5c40
5 changed files with 456 additions and 27 deletions

View File

@ -198,6 +198,145 @@ void LastActiveWindow::setHasSkipTaskbar(bool skip)
emit hasSkipTaskbarChanged();
}
//! BEGIN: Window Abitilities
bool LastActiveWindow::isClosable() const
{
return m_isClosable;
}
void LastActiveWindow::setIsClosable(bool closable)
{
if (m_isClosable == closable) {
return;
}
m_isClosable = closable;
emit isClosableChanged();
}
bool LastActiveWindow::isFullScreenable() const
{
return m_isFullScreenable;
}
void LastActiveWindow::setIsFullScreenable(bool fullscreenable)
{
if (m_isFullScreenable == fullscreenable) {
return;
}
m_isFullScreenable = fullscreenable;
emit isFullScreenableChanged();
}
bool LastActiveWindow::isGroupable() const
{
return m_isGroupable;
}
void LastActiveWindow::setIsGroupable(bool groupable)
{
if (m_isGroupable == groupable) {
return;
}
m_isGroupable = groupable;
emit isGroupableChanged();
}
bool LastActiveWindow::isMaximizable() const
{
return m_isMaximizable;
}
void LastActiveWindow::setIsMaximizable(bool maximizable)
{
if (m_isMaximizable == maximizable) {
return;
}
m_isMaximizable = maximizable;
emit isMaximizableChanged();
}
bool LastActiveWindow::isMinimizable() const
{
return m_isMinimizable;
}
void LastActiveWindow::setIsMinimizable(bool minimizable)
{
if (m_isMinimizable == minimizable) {
return;
}
m_isMinimizable = minimizable;
emit isMinimizableChanged();
}
bool LastActiveWindow::isMovable() const
{
return m_isMovable;
}
void LastActiveWindow::setIsMovable(bool movable)
{
if (m_isMovable == movable) {
return;
}
m_isMovable = movable;
emit isMovableChanged();
}
bool LastActiveWindow::isResizable() const
{
return m_isResizable;
}
void LastActiveWindow::setIsResizable(bool resizable)
{
if (m_isResizable == resizable) {
return;
}
m_isResizable = resizable;
emit isResizableChanged();
}
bool LastActiveWindow::isShadeable() const
{
return m_isShadeable;
}
void LastActiveWindow::setIsShadeable(bool shadeable)
{
if (m_isShadeable == shadeable) {
return;
}
m_isShadeable = shadeable;
emit isShadeableChanged();
}
bool LastActiveWindow::isVirtualDesktopChangeable() const
{
return m_isVirtualDesktopsChangeable;
}
void LastActiveWindow::setIsVirtualDesktopsChangeable(bool virtualdestkopschangeable)
{
if (m_isVirtualDesktopsChangeable == virtualdestkopschangeable) {
return;
}
m_isVirtualDesktopsChangeable = virtualdestkopschangeable;
emit isVirtualDesktopChangeableChanged();
}
//! END: Window Abitilities
QRect LastActiveWindow::geometry() const
{
return m_geometry;
@ -309,6 +448,18 @@ void LastActiveWindow::setInformation(const WindowInfoWrap &info)
setIsMaximized(info.isMaximized());
setIsOnAllDesktops(info.isOnAllDesktops());
//! Window Abilities
setIsClosable(info.isCloseable());
setIsFullScreenable(info.isFullScreenable());
setIsGroupable(info.isGroupable());
setIsMaximizable(info.isMaximizable());
setIsMinimizable(info.isMinimizable());
setIsMovable(info.isMovable());
setIsResizable(info.isResizable());
setIsShadeable(info.isShadeable());
setIsVirtualDesktopsChangeable(info.isVirtualDesktopsChangeable());
//! Window Abilities
setAppName(info.appName());
setDisplay(info.display());
setGeometry(info.geometry());

View File

@ -45,6 +45,8 @@ namespace Tracker {
class LastActiveWindow : public QObject {
Q_OBJECT
Q_PROPERTY(bool isValid READ isValid NOTIFY isValidChanged)
Q_PROPERTY(bool isActive READ isActive NOTIFY isActiveChanged)
Q_PROPERTY(bool isMinimized READ isMinimized NOTIFY isMinimizedChanged)
Q_PROPERTY(bool isMaximized READ isMaximized NOTIFY isMaximizedChanged)
@ -52,9 +54,21 @@ class LastActiveWindow : public QObject {
Q_PROPERTY(bool isKeepAbove READ isKeepAbove NOTIFY isKeepAboveChanged)
Q_PROPERTY(bool isOnAllDesktops READ isOnAllDesktops NOTIFY isOnAllDesktopsChanged)
Q_PROPERTY(bool isShaded READ isShaded NOTIFY isShadedChanged)
Q_PROPERTY(bool isValid READ isValid NOTIFY isValidChanged)
Q_PROPERTY(bool hasSkipTaskbar READ hasSkipTaskbar NOTIFY hasSkipTaskbarChanged)
//! BEGIN: Window Abitilities
/*since Latte v0.9.8*/
Q_PROPERTY(bool isClosable READ isClosable NOTIFY isClosableChanged)
Q_PROPERTY(bool isFullScreenable READ isFullScreenable NOTIFY isFullScreenableChanged)
Q_PROPERTY(bool isGroupable READ isGroupable NOTIFY isGroupableChanged)
Q_PROPERTY(bool isMaximizable READ isMaximizable NOTIFY isMaximizableChanged)
Q_PROPERTY(bool isMinimizable READ isMinimizable NOTIFY isMinimizableChanged)
Q_PROPERTY(bool isMovable READ isMovable NOTIFY isMovableChanged)
Q_PROPERTY(bool isResizable READ isResizable NOTIFY isResizableChanged)
Q_PROPERTY(bool isShadeable READ isShadeable NOTIFY isShadeableChanged)
Q_PROPERTY(bool isVirtualDesktopChangeable READ isVirtualDesktopChangeable NOTIFY isVirtualDesktopChangeableChanged)
//! END: Window Abitilities
/*since Latte v0.9.4*/
Q_PROPERTY(QString colorScheme READ colorScheme NOTIFY colorSchemeChanged)
@ -70,6 +84,7 @@ public:
LastActiveWindow(TrackedGeneralInfo *trackedInfo);
~LastActiveWindow() override;
bool isValid() const;
bool isActive() const;
bool isMinimized() const;
bool isMaximized() const;
@ -77,9 +92,21 @@ public:
bool isKeepAbove() const;
bool isOnAllDesktops() const;
bool isShaded() const;
bool isValid() const;
bool hasSkipTaskbar() const;
//! BEGIN: Window Abitilities
/*since Latte v0.9.8*/
bool isClosable() const;
bool isFullScreenable() const;
bool isGroupable() const;
bool isMaximizable() const;
bool isMinimizable() const;
bool isMovable() const;
bool isResizable() const;
bool isShadeable() const;
bool isVirtualDesktopChangeable() const;
//! END: Window Abitilities
QString appName() const;
QString colorScheme() const;
QString display() const;
@ -123,6 +150,19 @@ signals:
void isValidChanged();
void hasSkipTaskbarChanged();
//! BEGIN: Window Abitilities
/*since Latte v0.9.8*/
void isClosableChanged();
void isFullScreenableChanged();
void isGroupableChanged();
void isMaximizableChanged();
void isMinimizableChanged();
void isMovableChanged();
void isResizableChanged();
void isShadeableChanged();
void isVirtualDesktopChangeableChanged();
//! END: Window Abitilities
void appNameChanged();
void displayChanged();
@ -140,6 +180,19 @@ private:
void setIsValid(bool valid);
void setHasSkipTaskbar(bool skip);
//! BEGIN: Window Abitilities
/*since Latte v0.9.8*/
void setIsClosable(bool closable);
void setIsFullScreenable(bool fullscreenable);
void setIsGroupable(bool groupable);
void setIsMaximizable(bool maximizable);
void setIsMinimizable(bool minimizable);
void setIsMovable(bool movable);
void setIsResizable(bool resizable);
void setIsShadeable(bool shadeable);
void setIsVirtualDesktopsChangeable(bool virtualdestkopschangeable);
//! END: Window Abitilities
void setColorScheme(QString scheme);
void setAppName(QString appName);
@ -164,6 +217,19 @@ private:
bool m_isValid{false};
bool m_hasSkipTaskbar{false};
//! BEGIN: Window Abitilities
/*since Latte v0.9.8*/
bool m_isClosable{true};
bool m_isFullScreenable{true};
bool m_isGroupable{true};
bool m_isMaximizable{true};
bool m_isMinimizable{true};
bool m_isMovable{true};
bool m_isResizable{true};
bool m_isShadeable{true};
bool m_isVirtualDesktopsChangeable{true};
//! END: Window Abitilities
QString m_colorScheme;
QString m_appName;

View File

@ -431,6 +431,19 @@ WindowInfoWrap WaylandInterface::requestInfo(WindowId wid) const
winfoWrap.setIsValid(true);
winfoWrap.setIsPlasmaDesktop(true);
winfoWrap.setWid(wid);
//! Window Abilities
winfoWrap.setIsClosable(false);
winfoWrap.setIsFullScreenable(false);
winfoWrap.setIsGroupable(false);
winfoWrap.setIsMaximizable(false);
winfoWrap.setIsMinimizable(false);
winfoWrap.setIsMovable(false);
winfoWrap.setIsResizable(false);
winfoWrap.setIsShadeable(false);
winfoWrap.setIsVirtualDesktopsChangeable(false);
//! Window Abilities
} else if (isValidWindow(w)) {
winfoWrap.setIsValid(true);
winfoWrap.setWid(wid);
@ -445,6 +458,18 @@ WindowInfoWrap WaylandInterface::requestInfo(WindowId wid) const
winfoWrap.setIsOnAllActivities(true);
winfoWrap.setGeometry(w->geometry());
winfoWrap.setHasSkipTaskbar(w->skipTaskbar());
//! Window Abilities
winfoWrap.setIsClosable(w->isCloseable());
winfoWrap.setIsFullScreenable(w->isFullscreenable());
winfoWrap.setIsMaximizable(w->isMaximizeable());
winfoWrap.setIsMinimizable(w->isMinimizeable());
winfoWrap.setIsMovable(w->isMovable());
winfoWrap.setIsResizable(w->isResizable());
winfoWrap.setIsShadeable(w->isShadeable());
winfoWrap.setIsVirtualDesktopsChangeable(w->isVirtualDesktopChangeable());
//! Window Abilities
winfoWrap.setDisplay(w->title());
#if KF5_VERSION_MINOR >= 52
winfoWrap.setDesktops(w->plasmaVirtualDesktops());

View File

@ -48,7 +48,17 @@ public:
, m_isKeepAbove(false)
, m_hasSkipTaskbar(false)
, m_isOnAllDesktops(false)
, m_isOnAllActivities(false) {
, m_isOnAllActivities(false)
, m_isClosable(false)
, m_isFullScreenable(false)
, m_isGroupable(false)
, m_isMaximizable(false)
, m_isMinimizable(false)
, m_isMovable(false)
, m_isResizable(false)
, m_isShadeable(false)
, m_isVirtualDesktopsChangeable(false)
{
}
WindowInfoWrap(const WindowInfoWrap &o) noexcept
@ -67,6 +77,15 @@ public:
, m_hasSkipTaskbar(o.m_hasSkipTaskbar)
, m_isOnAllDesktops(o.m_isOnAllDesktops)
, m_isOnAllActivities(o.m_isOnAllActivities)
, m_isClosable(o.m_isClosable)
, m_isFullScreenable(o.m_isFullScreenable)
, m_isGroupable(o.m_isGroupable)
, m_isMaximizable(o.m_isMaximizable)
, m_isMinimizable(o.m_isMinimizable)
, m_isMovable(o.m_isMovable)
, m_isResizable(o.m_isResizable)
, m_isShadeable(o.m_isShadeable)
, m_isVirtualDesktopsChangeable(o.m_isVirtualDesktopsChangeable)
, m_desktops(o.m_desktops)
, m_activities(o.m_activities)
, m_display(o.m_display) {
@ -88,6 +107,15 @@ public:
, m_hasSkipTaskbar(o.m_hasSkipTaskbar)
, m_isOnAllDesktops(o.m_isOnAllDesktops)
, m_isOnAllActivities(o.m_isOnAllActivities)
, m_isClosable(o.m_isClosable)
, m_isFullScreenable(o.m_isFullScreenable)
, m_isGroupable(o.m_isGroupable)
, m_isMaximizable(o.m_isMaximizable)
, m_isMinimizable(o.m_isMinimizable)
, m_isMovable(o.m_isMovable)
, m_isResizable(o.m_isResizable)
, m_isShadeable(o.m_isShadeable)
, m_isVirtualDesktopsChangeable(o.m_isVirtualDesktopsChangeable)
, m_desktops(o.m_desktops)
, m_activities(o.m_activities)
, m_display(o.m_display) {
@ -137,6 +165,35 @@ public:
inline bool isOnAllActivities() const noexcept;
inline void setIsOnAllActivities(bool allactivities) noexcept;
//!BEGIN: Window Abilities
inline bool isCloseable() const noexcept;
inline void setIsClosable(bool closable) noexcept;
inline bool isFullScreenable() const noexcept;
inline void setIsFullScreenable(bool fullscreenable) noexcept;
inline bool isGroupable() const noexcept;
inline void setIsGroupable(bool groupable) noexcept;
inline bool isMaximizable() const noexcept;
inline void setIsMaximizable(bool maximizable) noexcept;
inline bool isMinimizable() const noexcept;
inline void setIsMinimizable(bool minimizable) noexcept;
inline bool isMovable() const noexcept;
inline void setIsMovable(bool movable) noexcept;
inline bool isResizable() const noexcept;
inline void setIsResizable(bool resizable) noexcept;
inline bool isShadeable() const noexcept;
inline void setIsShadeable(bool shadeble) noexcept;
inline bool isVirtualDesktopsChangeable() const noexcept;
inline void setIsVirtualDesktopsChangeable(bool virtualdesktopchangeable) noexcept;
//!END: Window Abilities
inline bool isMainWindow() const noexcept;
inline bool isChildWindow() const noexcept;
@ -186,6 +243,18 @@ private:
bool m_isOnAllDesktops: 1;
bool m_isOnAllActivities: 1;
//!BEGIN: Window Abilities
bool m_isClosable : 1;
bool m_isFullScreenable : 1;
bool m_isGroupable : 1;
bool m_isMaximizable : 1;
bool m_isMinimizable : 1;
bool m_isMovable : 1;
bool m_isResizable : 1;
bool m_isShadeable : 1;
bool m_isVirtualDesktopsChangeable : 1;
//!END: Window Abilities
QString m_appName;
QString m_display;
@ -213,6 +282,16 @@ inline WindowInfoWrap &WindowInfoWrap::operator=(WindowInfoWrap &&rhs) noexcept
m_hasSkipTaskbar = rhs.m_hasSkipTaskbar;
m_isOnAllDesktops = rhs.m_isOnAllDesktops;
m_isOnAllActivities = rhs.m_isOnAllActivities;
m_isClosable = rhs.m_isClosable;
m_isFullScreenable = rhs.m_isFullScreenable;
m_isGroupable = rhs.m_isGroupable;
m_isMaximizable = rhs.m_isMaximizable;
m_isMinimizable = rhs.m_isMinimizable;
m_isMovable = rhs.m_isMovable;
m_isResizable = rhs.m_isResizable;
m_isShadeable = rhs.m_isShadeable;
m_isVirtualDesktopsChangeable = rhs.m_isVirtualDesktopsChangeable;
m_display = rhs.m_display;
m_desktops = rhs.m_desktops;
m_activities = rhs.m_activities;
@ -236,6 +315,16 @@ inline WindowInfoWrap &WindowInfoWrap::operator=(const WindowInfoWrap &rhs) noex
m_hasSkipTaskbar = rhs.m_hasSkipTaskbar;
m_isOnAllDesktops = rhs.m_isOnAllDesktops;
m_isOnAllActivities = rhs.m_isOnAllActivities;
m_isClosable = rhs.m_isClosable;
m_isFullScreenable = rhs.m_isFullScreenable;
m_isGroupable = rhs.m_isGroupable;
m_isMaximizable = rhs.m_isMaximizable;
m_isMinimizable = rhs.m_isMinimizable;
m_isMovable = rhs.m_isMovable;
m_isResizable = rhs.m_isResizable;
m_isShadeable = rhs.m_isShadeable;
m_isVirtualDesktopsChangeable = rhs.m_isVirtualDesktopsChangeable;;
m_display = rhs.m_display;
m_desktops = rhs.m_desktops;
m_activities = rhs.m_activities;
@ -382,6 +471,91 @@ inline void WindowInfoWrap::setIsOnAllActivities(bool allactivities) noexcept
m_isOnAllActivities = allactivities;
}
//!BEGIN: Window Abilities
inline bool WindowInfoWrap::isCloseable() const noexcept
{
return m_isClosable;
}
inline void WindowInfoWrap::setIsClosable(bool closable) noexcept
{
m_isClosable = closable;
}
inline bool WindowInfoWrap::isFullScreenable() const noexcept
{
return m_isFullScreenable;
}
inline void WindowInfoWrap::setIsFullScreenable(bool fullscreenable) noexcept
{
m_isFullScreenable = fullscreenable;
}
inline bool WindowInfoWrap::isGroupable() const noexcept
{
return m_isGroupable;
}
inline void WindowInfoWrap::setIsGroupable(bool groupable) noexcept
{
m_isGroupable = groupable;
}
inline bool WindowInfoWrap::isMaximizable() const noexcept
{
return m_isMaximizable;
}
inline void WindowInfoWrap::setIsMaximizable(bool maximizable) noexcept
{
m_isMaximizable = maximizable;
}
inline bool WindowInfoWrap::isMinimizable() const noexcept
{
return m_isMinimizable;
}
inline void WindowInfoWrap::setIsMinimizable(bool minimizable) noexcept
{
m_isMinimizable = minimizable;
}
inline bool WindowInfoWrap::isMovable() const noexcept
{
return m_isMovable;
}
inline void WindowInfoWrap::setIsMovable(bool movable) noexcept
{
m_isMovable = movable;
}
inline bool WindowInfoWrap::isResizable() const noexcept
{
return m_isResizable;
}
inline void WindowInfoWrap::setIsResizable(bool resizable) noexcept
{
m_isResizable = resizable;
}
inline bool WindowInfoWrap::isShadeable() const noexcept
{
return m_isShadeable;
}
inline void WindowInfoWrap::setIsShadeable(bool shadeble) noexcept
{
m_isShadeable = shadeble;
}
inline bool WindowInfoWrap::isVirtualDesktopsChangeable() const noexcept
{
return m_isVirtualDesktopsChangeable;
}
inline void WindowInfoWrap::setIsVirtualDesktopsChangeable(bool virtualdesktopchangeable) noexcept
{
m_isVirtualDesktopsChangeable = virtualdesktopchangeable;
}
//!END: Window Abilities
inline bool WindowInfoWrap::isMainWindow() const noexcept
{
return (m_parentId.toInt() <= 0);

View File

@ -315,6 +315,7 @@ WindowInfoWrap XWindowInterface::requestInfo(WindowId wid) const
| NET::WMVisibleName,
NET::WM2WindowClass
| NET::WM2Activities
| NET::WM2AllowedActions
| NET::WM2TransientFor};
//! update desktop id
@ -344,8 +345,19 @@ WindowInfoWrap XWindowInterface::requestInfo(WindowId wid) const
winfoWrap.setGeometry(winfo.frameGeometry());
winfoWrap.setIsKeepAbove(winfo.hasState(NET::KeepAbove));
winfoWrap.setHasSkipTaskbar(winfo.hasState(NET::SkipTaskbar));
winfoWrap.setDisplay(winfo.visibleName());
//! Window Abilities
winfoWrap.setIsClosable(winfo.actionSupported(NET::ActionClose));
winfoWrap.setIsFullScreenable(winfo.actionSupported(NET::ActionFullScreen));
winfoWrap.setIsMaximizable(winfo.actionSupported(NET::ActionMax));
winfoWrap.setIsMinimizable(winfo.actionSupported(NET::ActionMinimize));
winfoWrap.setIsMovable(winfo.actionSupported(NET::ActionMove));
winfoWrap.setIsResizable(winfo.actionSupported(NET::ActionResize));
winfoWrap.setIsShadeable(winfo.actionSupported(NET::ActionShade));
winfoWrap.setIsVirtualDesktopsChangeable(winfo.actionSupported(NET::ActionChangeDesktop));
//! Window Abilities
winfoWrap.setDisplay(winfo.visibleName());
winfoWrap.setDesktops({QString(winfo.desktop())});
winfoWrap.setActivities(winfo.activities());
} else if (m_desktopId == wid) {
@ -354,6 +366,18 @@ WindowInfoWrap XWindowInterface::requestInfo(WindowId wid) const
winfoWrap.setWid(wid);
winfoWrap.setParentId(0);
winfoWrap.setHasSkipTaskbar(true);
//! Window Abilities
winfoWrap.setIsClosable(false);
winfoWrap.setIsFullScreenable(false);
winfoWrap.setIsGroupable(false);
winfoWrap.setIsMaximizable(false);
winfoWrap.setIsMinimizable(false);
winfoWrap.setIsMovable(false);
winfoWrap.setIsResizable(false);
winfoWrap.setIsShadeable(false);
winfoWrap.setIsVirtualDesktopsChangeable(false);
//! Window Abilities
}
return winfoWrap;
@ -402,34 +426,23 @@ QUrl XWindowInterface::windowUrl(WindowId wid) const
bool XWindowInterface::windowCanBeDragged(WindowId wid) const
{
KWindowInfo info(wid.value<WId>(), 0, NET::WM2AllowedActions);
if (info.valid()) {
WindowInfoWrap winfo = requestInfo(wid);
return (winfo.isValid()
&& info.actionSupported(NET::ActionMove)
&& !winfo.isMinimized()
&& inCurrentDesktopActivity(winfo)
&& !winfo.isPlasmaDesktop());
}
return false;
WindowInfoWrap winfo = requestInfo(wid);
return (winfo.isValid()
&& !winfo.isMinimized()
&& winfo.isMovable()
&& inCurrentDesktopActivity(winfo)
&& !winfo.isPlasmaDesktop());
}
bool XWindowInterface::windowCanBeMaximized(WindowId wid) const
{
KWindowInfo info(wid.value<WId>(), 0, NET::WM2AllowedActions);
if (info.valid()) {
WindowInfoWrap winfo = requestInfo(wid);
return (winfo.isValid()
&& !winfo.isMinimized()
&& info.actionSupported(NET::ActionMax)
&& inCurrentDesktopActivity(winfo)
&& !winfo.isPlasmaDesktop());
}
return false;
WindowInfoWrap winfo = requestInfo(wid);
return (winfo.isValid()
&& !winfo.isMinimized()
&& winfo.isMaximizable()
&& inCurrentDesktopActivity(winfo)
&& !winfo.isPlasmaDesktop());
}
void XWindowInterface::requestActivate(WindowId wid) const