diff --git a/client/assets/css/main.css b/client/assets/css/main.css
index 73be3bb..72da165 100644
--- a/client/assets/css/main.css
+++ b/client/assets/css/main.css
@@ -33,3 +33,17 @@
margin: auto;
background: #ccc;
}
+
+#disconneced {
+ position: absolute;
+ top: 0;
+ width: 100%;
+ background: #ff6161;
+ color: #fff;
+ padding: 5px;
+}
+
+#disconneced a {
+ color: #fff;
+ font-weight: bold;
+}
diff --git a/client/assets/js/main.js b/client/assets/js/main.js
index c6a9720..d271c66 100644
--- a/client/assets/js/main.js
+++ b/client/assets/js/main.js
@@ -19,7 +19,13 @@ $(function() {
$(this).addClass('active');
});
- ws.onclose = function(event) {}
+ ws.onopen = function(event) {
+ $('#disconneced').hide();
+ }
+
+ ws.onclose = function(event) {
+ $('#disconneced').show();
+ }
ws.onmessage = function(event) {}
diff --git a/client/index.html b/client/index.html
index 897bf49..99a8ea5 100644
--- a/client/index.html
+++ b/client/index.html
@@ -152,6 +152,10 @@
+
+
diff --git a/server/Server.php b/server/Server.php
index e3016ab..daa5df3 100644
--- a/server/Server.php
+++ b/server/Server.php
@@ -16,9 +16,9 @@ class Server implements MessageComponentInterface
protected $clients;
/**
- * @var \SplObjectStorage
+ * @var array
*/
- protected $authenticatedClients;
+ protected $messageHandlers = [];
/**
* Constructor.
@@ -28,6 +28,25 @@ class Server implements MessageComponentInterface
$this->clients = new \SplObjectStorage();
}
+ /**
+ * Add a message handle.
+ *
+ * @param string $type
+ * @param callable $callable
+ *
+ * @return Server;
+ */
+ public function addMessageHandler($type, callable $callable)
+ {
+ if (!isset($this->messageHandlers[$type])) {
+ $this->messageHandlers[$type] = [];
+ }
+
+ $this->messageHandlers[$type][] = $callable;
+
+ return $this;
+ }
+
/**
* {@inheritdoc}
*/
@@ -49,110 +68,14 @@ class Server implements MessageComponentInterface
$type = $data['type'] ?? null;
- if ($type === 'pointer') {
- $x = $data['x'] ?? null;
- $y = $data['y'] ?? null;
- $click = $data['click'] ?? null;
+ if ($type === null) {
+ return;
+ }
- if ($x !== null && $y !== null) {
- $mouseLocations = shell_exec('xdotool getmouselocation');
- preg_match('/x:(\d+) y:(\d+) /', $mouseLocations, $matches);
- $mouseX = (int) ($matches[1] + $x * 2.5);
- $mouseY = (int) ($matches[2] + $y * 2.5);
+ $handlers = $this->messageHandlers[$type] ?? [];
- return shell_exec(sprintf('xdotool mousemove %s %s', $mouseX, $mouseY));
- } elseif ($click !== null) {
- if ($click === 'left') {
- return shell_exec('xdotool click 1');
- } elseif ($click === 'dleft') {
- // return shell_exec("xdotool click 1; xdotool click 1");
- } elseif ($click === 'middle') {
- return shell_exec('xdotool click 2');
- } elseif ($click === 'right') {
- return shell_exec('xdotool click 3');
- }
- }
- } elseif ($type === 'workspace') {
- $value = $data['value'] ?? null;
-
- if (!empty($value)) {
- return shell_exec(sprintf("i3-msg 'workspace \"%s\"'", $value));
- }
- } elseif ($type === 'volume') {
- $value = $data['value'] ?? null;
-
- if ($value === null) {
- return;
- }
-
- if ($value === 'up') {
- return shell_exec('amixer set Master 2%+');
- } elseif ($value === 'down') {
- return shell_exec('amixer set Master 2%-');
- } else {
- return shell_exec('amixer set Master '.((int) $value).'%');
- }
- } elseif ($type === 'media') {
- $value = $data['value'] ?? null;
-
- if ($value === 'playpause') {
- $cmd = 'PlayPause';
- } elseif ($value === 'next') {
- $cmd = 'Next';
- } elseif ($value === 'prev') {
- $cmd = 'Previous';
- }
-
- if (!empty($cmd)) {
- return shell_exec('dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.'.$cmd);
- }
- } elseif ($type === 'keys') {
- $value = $data['value'] ?? null;
-
- if (!empty($value)) {
- $keys = explode(',', $value);
-
- foreach ($keys as $k => $v) {
- if ($v === 'win') {
- $keys[$k] = 'super';
- } elseif ($v === 'ctrl') {
- $keys[$k] = 'Control_L';
- } elseif ($v === 'alt') {
- $keys[$k] = 'Alt_L';
- }
- }
-
- $value = implode('+', $keys);
-
- return shell_exec(sprintf('xdotool key %s', escapeshellarg($value)));
- }
- } elseif ($type === 'key') {
- $value = $data['value'] ?? null;
-
- if (!empty($value)) {
- switch ($value) {
- case 'up':
- return shell_exec('xdotool key Up');
- case 'down':
- return shell_exec('xdotool key Down');
- case 'left':
- return shell_exec('xdotool key Left');
- case 'right':
- return shell_exec('xdotool key Right');
- case 'tab':
- return shell_exec('xdotool key Tab');
- case 'backspace':
- return shell_exec('xdotool key BackSpace');
- case 'enter':
- return shell_exec('xdotool key Return');
- case 'space':
- return shell_exec('xdotool key space');
- case 'escape':
- return shell_exec('xdotool key Escape');
- }
-
- return shell_exec(sprintf('xdotool type %s', escapeshellarg($value)));
- }
+ foreach ($handlers as $handler) {
+ $handler($from, $data);
}
}
diff --git a/server/run_server.php b/server/run_server.php
index c61d194..631d944 100755
--- a/server/run_server.php
+++ b/server/run_server.php
@@ -7,10 +7,129 @@ require __DIR__.'/Server.php';
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
+use Ratchet\ConnectionInterface;
-$server = IoServer::factory(
- new HttpServer(new WsServer(new \Server())),
- 14598
+$server = new \Server();
+
+$server->addMessageHandler('pointer', function (ConnectionInterface $from, array $data) {
+ $x = $data['x'] ?? null;
+ $y = $data['y'] ?? null;
+ $click = $data['click'] ?? null;
+
+ if ($x !== null && $y !== null) {
+ $mouseLocations = shell_exec('xdotool getmouselocation');
+ preg_match('/x:(\d+) y:(\d+) /', $mouseLocations, $matches);
+ $mouseX = (int) ($matches[1] + $x * 2.5);
+ $mouseY = (int) ($matches[2] + $y * 2.5);
+
+ return shell_exec(sprintf('xdotool mousemove %s %s', $mouseX, $mouseY));
+ } elseif ($click !== null) {
+ if ($click === 'left') {
+ return shell_exec('xdotool click 1');
+ } elseif ($click === 'dleft') {
+ // return shell_exec("xdotool click 1; xdotool click 1");
+ } elseif ($click === 'middle') {
+ return shell_exec('xdotool click 2');
+ } elseif ($click === 'right') {
+ return shell_exec('xdotool click 3');
+ }
+ }
+});
+
+$server->addMessageHandler('workspace', function (ConnectionInterface $from, array $data) {
+ $value = $data['value'] ?? null;
+
+ if (!empty($value)) {
+ return shell_exec(sprintf("i3-msg 'workspace \"%s\"'", $value));
+ }
+});
+
+$server->addMessageHandler('volume', function (ConnectionInterface $from, array $data) {
+ $value = $data['value'] ?? null;
+
+ if ($value === null) {
+ return;
+ }
+
+ if ($value === 'up') {
+ return shell_exec('amixer set Master 2%+');
+ } elseif ($value === 'down') {
+ return shell_exec('amixer set Master 2%-');
+ } else {
+ return shell_exec('amixer set Master '.((int) $value).'%');
+ }
+});
+
+$server->addMessageHandler('media', function (ConnectionInterface $from, array $data) {
+ $value = $data['value'] ?? null;
+
+ if ($value === 'playpause') {
+ $cmd = 'PlayPause';
+ } elseif ($value === 'next') {
+ $cmd = 'Next';
+ } elseif ($value === 'prev') {
+ $cmd = 'Previous';
+ }
+
+ if (!empty($cmd)) {
+ return shell_exec('dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.'.$cmd);
+ }
+});
+
+$server->addMessageHandler('keys', function (ConnectionInterface $from, array $data) {
+ $value = $data['value'] ?? null;
+
+ if (!empty($value)) {
+ $keys = explode(',', $value);
+
+ foreach ($keys as $k => $v) {
+ if ($v === 'win') {
+ $keys[$k] = 'super';
+ } elseif ($v === 'ctrl') {
+ $keys[$k] = 'Control_L';
+ } elseif ($v === 'alt') {
+ $keys[$k] = 'Alt_L';
+ }
+ }
+
+ $value = implode('+', $keys);
+
+ return shell_exec(sprintf('xdotool key %s', escapeshellarg($value)));
+ }
+});
+
+$server->addMessageHandler('key', function (ConnectionInterface $from, array $data) {
+ $value = $data['value'] ?? null;
+
+ if (!empty($value)) {
+ switch ($value) {
+ case 'up':
+ return shell_exec('xdotool key Up');
+ case 'down':
+ return shell_exec('xdotool key Down');
+ case 'left':
+ return shell_exec('xdotool key Left');
+ case 'right':
+ return shell_exec('xdotool key Right');
+ case 'tab':
+ return shell_exec('xdotool key Tab');
+ case 'backspace':
+ return shell_exec('xdotool key BackSpace');
+ case 'enter':
+ return shell_exec('xdotool key Return');
+ case 'space':
+ return shell_exec('xdotool key space');
+ case 'escape':
+ return shell_exec('xdotool key Escape');
+ }
+
+ return shell_exec(sprintf('xdotool type %s', escapeshellarg($value)));
+ }
+});
+
+$webSocker = IoServer::factory(
+ new HttpServer(new WsServer($server)),
+ 14598
);
-$server->run();
+$webSocker->run();