aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core/lumina-desktop-unified/src-desktop/src-cpp/NativeWindowObject.h
blob: fa1bf4de413fa01a8d3945d24f412bcf2d1a2fac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
//===========================================
//  Lumina-DE source code
//  Copyright (c) 2017-2018, Ken Moore
//  Available under the 3-clause BSD license
//  See the LICENSE file for full details
//===========================================
//  This is a container object for setting/announcing changes
//    in a native window's properties.
//    The WM will usually run the "setProperty" function on this object,
//     and any other classes/widgets which watch this window can act appropriatly after-the-fact
//  Non-WM classes should use the "Request" signals to ask the WM to do something, and listen for changes later
//===========================================
#ifndef _LUMINA_SOURCES_NATIVE_WINDOW_OBJECT_H
#define _LUMINA_SOURCES_NATIVE_WINDOW_OBJECT_H
#include "global-includes.h"

class NativeWindowObject : public QObject{
	Q_OBJECT
	// QML-ACCESSIBLE PROPERTIES
	Q_PROPERTY( QString name READ name NOTIFY nameChanged)
	Q_PROPERTY( QString title READ title NOTIFY titleChanged)
	Q_PROPERTY( QString shortTitle READ shortTitle NOTIFY shortTitleChanged)
	Q_PROPERTY( QIcon icon READ icon NOTIFY iconChanged)
	Q_PROPERTY( bool sticky READ isSticky NOTIFY stickyChanged)

public:
	enum State{ S_MODAL, S_STICKY, S_MAX_VERT, S_MAX_HORZ, S_SHADED, S_SKIP_TASKBAR, S_SKIP_PAGER, S_HIDDEN, S_FULLSCREEN, S_ABOVE, S_BELOW, S_ATTENTION };
	enum Type{T_DESKTOP, T_DOCK, T_TOOLBAR, T_MENU, T_UTILITY, T_SPLASH, T_DIALOG, T_DROPDOWN_MENU, T_POPUP_MENU, T_TOOLTIP, T_NOTIFICATION, T_COMBO, T_DND, T_NORMAL };
	enum Action {A_MOVE, A_RESIZE, A_MINIMIZE, A_SHADE, A_STICK, A_MAX_VERT, A_MAX_HORZ, A_FULLSCREEN, A_CHANGE_DESKTOP, A_CLOSE, A_ABOVE, A_BELOW};

	enum Property{ 	 /*QVariant Type*/
		None=0, 		/*null*/
		MinSize=1,  		/*QSize*/
		MaxSize=2, 		/*QSize*/
		Size=3, 			/*QSize*/
		GlobalPos=4,	/*QPoint*/
		Title=5, 		/*QString*/
		ShortTitle=6,	/*QString*/
		Icon=7, 		/*QIcon*/
		Name=8, 		/*QString*/
		Workspace=9,	/*int*/
		States=10,		/*QList<NativeWindowObject::State> : Current state of the window */
		WinTypes=11,	/*QList<NativeWindowObject::Type> : Current type of window (typically does not change)*/
		WinActions=12, 	/*QList<NativeWindowObject::Action> : Current actions that the window allows (Managed/set by the WM)*/
		FrameExtents=13, 	/*QList<int> : [Left, Right, Top, Bottom] in pixels */
		RelatedWindows=14, /* QList<WId> - better to use the "isRelatedTo(WId)" function instead of reading this directly*/
		Active=15, 		/*bool*/
		Visible=16 		/*bool*/
		};

	static QList<NativeWindowObject::Property> allProperties(){
	  //Return all the available properties (excluding "None" and "FrameExtents" (WM control only) )
	  QList<NativeWindowObject::Property> props;
	  props << MinSize << MaxSize << Size << GlobalPos << Title << ShortTitle << Icon << Name << Workspace \
	    << States << WinTypes << WinActions << RelatedWindows << Active << Visible;
	  return props;
	};

	static void RegisterType();

	NativeWindowObject(WId id = 0);
	~NativeWindowObject();

	void addFrameWinID(WId);
	void addDamageID(unsigned int);
	bool isRelatedTo(WId);

	WId id();
	WId frameId();
	unsigned int damageId();

	//QWindow* window();

	QVariant property(NativeWindowObject::Property);
	void setProperty(NativeWindowObject::Property, QVariant, bool force = false);
	void setProperties(QList<NativeWindowObject::Property>, QList<QVariant>, bool force = false);
	void requestProperty(NativeWindowObject::Property, QVariant, bool force = false);
	void requestProperties(QList<NativeWindowObject::Property>, QList<QVariant>, bool force = false);

	QRect geometry(); //this returns the "full" geometry of the window (window + frame)

	// QML ACCESS FUNCTIONS (shortcuts for particular properties in a format QML can use)
	Q_INVOKABLE QString name();
	Q_INVOKABLE QString title();
	Q_INVOKABLE QString shortTitle();
	Q_INVOKABLE QIcon icon();
	Q_INVOKABLE bool isSticky();

public slots:
	Q_INVOKABLE void toggleVisibility();
	Q_INVOKABLE void requestClose(); //ask the app to close the window (may/not depending on activity)
	Q_INVOKABLE void requestKill();	//ask the WM to kill the app associated with this window (harsh - only use if not responding)
	Q_INVOKABLE void requestPing();	//ask the app if it is still active (a WindowNotResponding signal will get sent out if there is no reply);

private:
	QHash <NativeWindowObject::Property, QVariant> hash;
	//QWindow *WIN;
	WId winid, frameid;
	QList<WId> relatedTo;
	unsigned int dmgID;

	void emitSinglePropChanged(NativeWindowObject::Property);

signals:
	//General Notifications
	void PropertiesChanged(QList<NativeWindowObject::Property>, QList<QVariant>);
	void RequestPropertiesChange(WId, QList<NativeWindowObject::Property>, QList<QVariant>);
	void WindowClosed(WId);
	void WindowNotResponding(WId); //will be sent out if a window does not respond to a ping request
	void VisualChanged();

	//Action Requests (not automatically emitted - typically used to ask the WM to do something)
	//Note: "WId" should be the NativeWindowObject id()
	void RequestClose(WId);				//Close the window
	void RequestKill(WId);					//Kill the window/app (usually from being unresponsive)
	void RequestPing(WId);				//Verify that the window is still active (such as not closing after a request
	void RequestReparent(WId, WId, QPoint); //client window, frame window, relative origin point in frame
	// System Tray Icon Embed/Unembed Requests
	//void RequestEmbed(WId, QWidget*);
	//void RequestUnEmbed(WId, QWidget*);

	// QML update signals
	void nameChanged();
	void titleChanged();
	void shortTitleChanged();
	void iconChanged();
	void stickyChanged();
};

// Declare the enumerations as Qt MetaTypes
Q_DECLARE_METATYPE(NativeWindowObject::Type);
Q_DECLARE_METATYPE(NativeWindowObject::Action);
Q_DECLARE_METATYPE(NativeWindowObject::State);
Q_DECLARE_METATYPE(NativeWindowObject::Property);

#endif
bgstack15