Skip to content

Commit 4e669f8

Browse files
committed
add windows.html demo #25
1 parent 2fa40d7 commit 4e669f8

File tree

2 files changed

+206
-0
lines changed

2 files changed

+206
-0
lines changed

.npmignore

+1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ assets
44
bower.json
55
demo.html
66
iframe.html
7+
windows.html
78
sysend.php
89
test.ts

windows.html

+205
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
<!DOCTYPE HTML>
2+
<html xmlns="http://www.w3.org/1999/xhtml">
3+
<head>
4+
<meta charset="utf-8" />
5+
<title>Window Management Demo</title>
6+
<meta name="Description" content=""/>
7+
<!--[if IE]>
8+
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
9+
<![endif]-->
10+
<style>
11+
:root {
12+
--scale: 0.5;
13+
}
14+
body {
15+
margin: 0;
16+
}
17+
html, body {
18+
height: 100%;
19+
}
20+
#output {
21+
position: absolute;
22+
top: 0;
23+
left: 0;
24+
opactity: 0.4;
25+
}
26+
.primary #monitor {
27+
width: calc(var(--width) * var(--scale) * 1px);
28+
height: calc(var(--height) * var(--scale) * 1px);
29+
border: 1px solid green;
30+
position: relative;
31+
overflow: hidden;
32+
}
33+
.window {
34+
background: red;
35+
border: 2px solid black;
36+
position: absolute;
37+
left: calc(var(--left) * var(--scale) * 1px);
38+
top: calc(var(--top) * var(--scale) * 1px);
39+
width: calc(var(--width) * var(--scale) * 1px);
40+
height: calc(var(--height) * var(--scale) * 1px);
41+
transition: all 0.5s linear;
42+
}
43+
</style>
44+
<script src="https://cdn.jsdelivr.net/npm/sysend"></script>
45+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
46+
</head>
47+
<body>
48+
<pre id="output"></pre>
49+
<div id="monitor"></div>
50+
<script>
51+
function geometry() {
52+
const left = window.screenX;
53+
const top = window.screenY;
54+
const width = window.innerWidth;
55+
const height = window.innerHeight;
56+
return {
57+
top,
58+
left,
59+
width,
60+
height
61+
};
62+
}
63+
64+
function log(message) {
65+
if (typeof message === 'object') {
66+
message = JSON.stringify(message);
67+
}
68+
if (output.innerHTML) {
69+
message = '\n' + message;
70+
}
71+
output.innerHTML += message;
72+
}
73+
74+
function same(a, b) {
75+
return a.every((element, i) => {
76+
return b[i] === element;
77+
});
78+
}
79+
80+
function diff(a, b) {
81+
var keys_a = Object.keys(b).sort();
82+
var keys_b = Object.keys(a).sort();
83+
if (!same(keys_a, keys_b)) {
84+
return true;
85+
}
86+
var diff = keys_a.filter(key_a => {
87+
return a[key_a] !== b[key_a];
88+
});
89+
return diff.length > 0;
90+
}
91+
92+
function sendToPrimary(data) {
93+
return sysend.list().then(list => {
94+
console.log(list);
95+
return list.find(window => window.primary);
96+
}).then(primary => {
97+
sysend.post(primary.id, data);
98+
});
99+
}
100+
101+
class EventEmitter {
102+
constructor() {
103+
this.hadlers = {};
104+
}
105+
on(event, handler) {
106+
if (typeof handler === 'function') {
107+
this.hadlers[event] ??= [];
108+
this.hadlers[event].push(handler);
109+
}
110+
}
111+
trigger(event, ...args) {
112+
this.hadlers[event].forEach(fn => {
113+
fn?.(...args);
114+
});
115+
}
116+
}
117+
118+
function onWindowGeometryChannge(callback, delay = 100) {
119+
var events = new EventEmitter();
120+
let oldGeometry = geometry();
121+
events.on('resize', callback);
122+
setInterval(() => {
123+
const newGeometry = geometry();
124+
if (diff(newGeometry, oldGeometry)) {
125+
oldGeometry = newGeometry;
126+
events.trigger('resize', newGeometry);
127+
}
128+
}, delay);
129+
}
130+
function style(geometry) {
131+
return Object.keys(geometry).map(name => {
132+
return `--${name}: ${geometry[name]}`;
133+
}).join(';');
134+
}
135+
function div(geometry, text = '') {
136+
console.log(new Error().stack);
137+
return `<div class="window" style="${style(geometry)}">${text}</div>`;
138+
};
139+
function geometrySync(local, other) {
140+
monitor.innerHTML = div(local, 'Self (Primary)') +
141+
Object.keys(other).map(key => {
142+
return div(other[key], key)
143+
}).join('');
144+
}
145+
var windowCount = 0;
146+
var windowGeometries = {};
147+
var localGeometry;
148+
149+
function setMonitorSize() {
150+
monitor.style.setProperty('--width', window.screen.width);
151+
monitor.style.setProperty('--height', window.screen.height);
152+
}
153+
154+
onWindowGeometryChannge(function(geometry) {
155+
if (sysend.isPrimary()) {
156+
localGeometry = geometry;
157+
geometrySync(localGeometry, windowGeometries);
158+
} else {
159+
sendToPrimary({geometry});
160+
}
161+
});
162+
sysend.track('open', () => ++windowCount);
163+
sysend.track('close', ({id}) => {
164+
--windowCount;
165+
delete windowGeometries[id];
166+
});
167+
// window manager is main page
168+
sysend.track('primary', () => {
169+
document.body.classList.add('primary');
170+
setMonitorSize();
171+
sysend.track('message', ({data, origin}) => {
172+
if (data.geometry) {
173+
windowGeometries[origin] = data.geometry;
174+
geometrySync(localGeometry, windowGeometries);
175+
}
176+
});
177+
});
178+
sysend.track('ready', function() {
179+
localGeometry = geometry();
180+
if (sysend.isPrimary()) {
181+
geometrySync(localGeometry, windowGeometries);
182+
} else {
183+
sendToPrimary({geometry: localGeometry});
184+
}
185+
});
186+
</script>
187+
<!-- Start Open Web Analytics Tracker -->
188+
<script type="text/javascript">
189+
//<![CDATA[
190+
var owa_baseUrl = 'http://stats.jcubic.pl/';
191+
var owa_cmds = owa_cmds || [];
192+
owa_cmds.push(['setSiteId', 'b0fda2fd267289c39125653957851823']);
193+
owa_cmds.push(['trackPageView']);
194+
owa_cmds.push(['trackClicks']);
195+
(function() {
196+
var _owa = document.createElement('script'); _owa.type = 'text/javascript'; _owa.async = true;
197+
owa_baseUrl = ('https:' == document.location.protocol ? window.owa_baseSecUrl || owa_baseUrl.replace(/http:/, 'https:') : owa_baseUrl );
198+
_owa.src = owa_baseUrl + 'modules/base/js/owa.tracker-combined-min.js';
199+
var _owa_s = document.getElementsByTagName('script')[0]; _owa_s.parentNode.insertBefore(_owa, _owa_s);
200+
}());
201+
//]]>
202+
</script>
203+
<!-- End Open Web Analytics Code -->
204+
</body>
205+
</html>

0 commit comments

Comments
 (0)