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
|
//===========================================
// 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>
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++){
qDebug() << " -- Check Window:" << NWindows[i]->id();
if(id==NWindows[i]->id()){ return NWindows[i]; }
}
return 0;
}
NativeWindow* findTrayWindow(WId id){
for(int i=0; i<TWindows.length(); i++){
if(id==TWindows[i]->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;
}
//RootWindow interactions
void RegisterVirtualRoot(WId);
// - Workspaces
int currentWorkspace();
//void GoToWorkspace(int);
//void RegisterWorkspaces(QStringList); //Names of workspaces, in ascending order
//void RegisterKnownInteractions();
//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
|