aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core/libLumina/NativeWindowSystem.h
blob: 0084190339244f5c66d2b869042bddceaf720b4b (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
137
138
139
140
141
142
143
144
145
//===========================================
//  Lumina-DE source code
//  Copyright (c) 2017, Ken Moore
//  Available under the 3-clause BSD license
//  See the LICENSE file for full details
//===========================================
//  This is a Qt5/Lumina wrapper around native graphics system calls
//  It is primarily designed around the creation/modification of instances of
//   the "NativeWindow" class for passing information around
//===========================================
#ifndef _LUMINA_NATIVE_WINDOW_SYSTEM_H
#define _LUMINA_NATIVE_WINDOW_SYSTEM_H

#include "NativeWindow.h"
#include <QDateTime>
#include <QTimer>
#include <QDebug>

class NativeWindowSystem : public QObject{
	Q_OBJECT
private:
	QList<NativeWindow*> NWindows;
	QList<NativeWindow*> TWindows;

	//Simplifications to find an already-created window object
	NativeWindow* findWindow(WId id){
	  qDebug() << "Find Window:" << id;
	  for(int i=0; i<NWindows.length(); i++){
	    if(NWindows[i]->isRelatedTo(id)){ qDebug() << "  -- Got Match!"; return NWindows[i]; }
	  }
	  qDebug() << "  -- Could not find Window!";
	  return 0;
	}

	NativeWindow* findTrayWindow(WId id){
	  for(int i=0; i<TWindows.length(); i++){
	    if(TWindows[i]->isRelatedTo(id)){ return TWindows[i]; }
	  }
	  return 0;
	}

	//Now define a simple private_objects class so that each implementation
	//  has a storage container for defining/placing private objects as needed
	class p_objects;
	p_objects* obj;

	//Internal timers/variables for managing pings
	QTimer *pingTimer;
	QHash<WId, QDateTime> waitingForPong;
	void checkPings(){
	  QDateTime cur = QDateTime::currentDateTime();
	  QList<WId> waiting = waitingForPong.keys();
	  for(int i=0; i<waiting.length(); i++){
	    if(waitingForPong.value(waiting[i]) < cur){
	      waitingForPong.remove(waiting[i]); //Timeout on this window
	      if(waitingForPong.isEmpty() && pingTimer!=0){ pingTimer->stop(); }
	      NativeWindow *win = findWindow(waiting[i]);
	      if(win==0){ win = findTrayWindow(waiting[i]); }
	      if(win!=0){ win->emit WindowNotResponding(waiting[i]); }
	    }
	  }
	}

	// Since some properties may be easier to update in bulk
	//   let the native system interaction do them in whatever logical groups are best
	void UpdateWindowProperties(NativeWindow* win, QList< NativeWindow::Property > props);

	//Generic private variables
	bool screenLocked;

public:
	//enum Property{ None, CurrentWorkspace, Workspaces, VirtualRoots, WorkAreas };
	enum MouseButton{NoButton, LeftButton, RightButton, MidButton, BackButton, ForwardButton, TaskButton, WheelUp, WheelDown, WheelLeft, WheelRight};

	NativeWindowSystem();
	~NativeWindowSystem();

	//Overarching start/stop functions
	bool start();
	void stop();

	//General-purpose listing functions
	QList<NativeWindow*> currentWindows(){ return NWindows; }
	QList<NativeWindow*> currentTrayWindows(){ return TWindows; }

	//Small simplification functions
	static Qt::Key KeycodeToQt(int keycode);
	static NativeWindowSystem::MouseButton MouseToQt(int button);

public slots:
	//These are the slots which are typically only used by the desktop system itself or the NativeWindowEventFilter

	//This is called by the lock screen to keep the NWS aware of the current status
	// it is **NOT** the function to call for the user to actually lock the session (that is in the screensaver/lockscreen class)
	 void ScreenLockChanged(bool lock){
	  screenLocked = lock;
	}

	//Root Window property registrations
	void RegisterVirtualRoot(WId);
	void setRoot_supportedActions();
	void setRoot_numberOfWorkspaces(QStringList names);
	void setRoot_currentWorkspace(int);
	void setRoot_clientList(QList<WId>, bool stackorder = false);
	void setRoot_desktopGeometry(QRect);
	void setRoot_desktopWorkarea(QList<QRect>);
	void setRoot_activeWindow(WId);

	//  - Workspaces
	int currentWorkspace();
	//void GoToWorkspace(int);


	//NativeWindowEventFilter interactions
	void NewWindowDetected(WId); //will automatically create the new NativeWindow object
	void NewTrayWindowDetected(WId); //will automatically create the new NativeWindow object
	void WindowCloseDetected(WId); //will update the lists and make changes if needed
	void WindowPropertyChanged(WId, NativeWindow::Property); //will rescan the window and update the object as needed
	void GotPong(WId);

	void NewKeyPress(int keycode, WId win = 0);
	void NewKeyRelease(int keycode, WId win = 0);
	void NewMousePress(int buttoncode, WId win = 0);
	void NewMouseRelease(int buttoncode, WId win = 0);
	void CheckDamageID(WId);

private slots:
	//These are the slots which are built-in and automatically connected when a new NativeWindow is created
	void RequestPropertiesChange(WId, QList<NativeWindow::Property>, QList<QVariant>);
	void RequestClose(WId);
	void RequestKill(WId);
	void RequestPing(WId);

signals:
	void NewWindowAvailable(NativeWindow*);
	void NewTrayWindowAvailable(NativeWindow*);
	void NewInputEvent(); //a mouse or keypress was detected (lock-state independent);
	void KeyPressDetected(WId, int); //only emitted if lockstate = false
	void KeyReleaseDetected(WId, int); //only emitted if lockstate = false
	void MousePressDetected(WId, NativeWindowSystem::MouseButton); //only emitted if lockstate = false
	void MouseReleaseDetected(WId, NativeWindowSystem::MouseButton); //only emitted if lockstate = false

};

#endif
bgstack15