From 3863de95898db861baff7a43d9513083ca7b1fdf Mon Sep 17 00:00:00 2001
From: Norman Feske <norman.feske@genode-labs.com>
Date: Thu, 2 Jul 2020 20:10:08 +0200
Subject: [PATCH] Input-event-bridging service

The sole purpose of this service is the migration path from the use of
input session interface to the event session interface.

Issue #3812
---
 .../recipes/src/input_event_bridge/content.mk |  2 +
 repos/os/recipes/src/input_event_bridge/hash  |  1 +
 .../recipes/src/input_event_bridge/used_apis  |  4 +
 .../os/src/server/input_event_bridge/main.cc  | 96 +++++++++++++++++++
 .../src/server/input_event_bridge/target.mk   |  3 +
 5 files changed, 106 insertions(+)
 create mode 100644 repos/os/recipes/src/input_event_bridge/content.mk
 create mode 100644 repos/os/recipes/src/input_event_bridge/hash
 create mode 100644 repos/os/recipes/src/input_event_bridge/used_apis
 create mode 100644 repos/os/src/server/input_event_bridge/main.cc
 create mode 100644 repos/os/src/server/input_event_bridge/target.mk

diff --git a/repos/os/recipes/src/input_event_bridge/content.mk b/repos/os/recipes/src/input_event_bridge/content.mk
new file mode 100644
index 0000000000..a55b5a0699
--- /dev/null
+++ b/repos/os/recipes/src/input_event_bridge/content.mk
@@ -0,0 +1,2 @@
+SRC_DIR = src/server/input_event_bridge
+include $(GENODE_DIR)/repos/base/recipes/src/content.inc
diff --git a/repos/os/recipes/src/input_event_bridge/hash b/repos/os/recipes/src/input_event_bridge/hash
new file mode 100644
index 0000000000..317170c6b5
--- /dev/null
+++ b/repos/os/recipes/src/input_event_bridge/hash
@@ -0,0 +1 @@
+2020-07-02 7738008ffb465e667621655e8718f02290361bc0
diff --git a/repos/os/recipes/src/input_event_bridge/used_apis b/repos/os/recipes/src/input_event_bridge/used_apis
new file mode 100644
index 0000000000..a2645a0156
--- /dev/null
+++ b/repos/os/recipes/src/input_event_bridge/used_apis
@@ -0,0 +1,4 @@
+base
+os
+event_session
+input_session
diff --git a/repos/os/src/server/input_event_bridge/main.cc b/repos/os/src/server/input_event_bridge/main.cc
new file mode 100644
index 0000000000..8abd09e99c
--- /dev/null
+++ b/repos/os/src/server/input_event_bridge/main.cc
@@ -0,0 +1,96 @@
+/*
+ * \brief  Service for connecting an input client with an event client
+ * \author Norman Feske
+ * \date   2020-07-02
+ */
+
+/*
+ * Copyright (C) 2020 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU Affero General Public License version 3.
+ */
+
+/* Genode includes */
+#include <event_session/event_session.h>
+#include <input/component.h>
+#include <input/event.h>
+#include <os/static_root.h>
+#include <base/component.h>
+#include <base/attached_ram_dataspace.h>
+
+namespace Input_event_bridge {
+
+	using namespace Genode;
+
+	struct Event_session;
+	struct Main;
+}
+
+
+struct Input_event_bridge::Event_session : Rpc_object<Event::Session, Event_session>
+{
+	Attached_ram_dataspace _ds;
+
+	Input::Session_component &_input_session;
+
+	Dataspace_capability dataspace() { return _ds.cap(); }
+
+	void submit_batch(unsigned count)
+	{
+		size_t const max_events = _ds.size() / sizeof(Input::Event);
+
+		if (count > max_events)
+			warning("number of events exceeds dataspace capacity");
+
+		count = min(count, max_events);
+
+		Input::Event const * const events = _ds.local_addr<Input::Event>();
+
+		for (unsigned i = 0; i < count; i++)
+			_input_session.submit(events[i]);
+	}
+
+	Event_session(Env &env, Input::Session_component &input_session)
+	:
+		_ds(env.ram(), env.rm(), 4096), _input_session(input_session)
+	{ }
+};
+
+
+/******************
+ ** Main program **
+ ******************/
+
+struct Input_event_bridge::Main
+{
+	Env &_env;
+
+	Attached_ram_dataspace _ds { _env.ram(), _env.rm(), 4096 };
+
+	Input::Session_component _input_session { _env, _env.ram() };
+	Event_session            _event_session { _env, _input_session };
+
+	/*
+	 * Attach root interfaces to the entry point
+	 */
+	Static_root<Input::Session> _input_root { _env.ep().manage(_input_session) };
+	Static_root<Event::Session> _event_root { _env.ep().manage(_event_session) };
+
+	/**
+	 * Constructor
+	 */
+	Main(Env &env) : _env(env)
+	{
+		_input_session.event_queue().enabled(true);
+
+		_env.parent().announce(env.ep().manage(_input_root));
+		_env.parent().announce(env.ep().manage(_event_root));
+	}
+};
+
+
+void Component::construct(Genode::Env &env)
+{
+	static Input_event_bridge::Main inst(env);
+}
diff --git a/repos/os/src/server/input_event_bridge/target.mk b/repos/os/src/server/input_event_bridge/target.mk
new file mode 100644
index 0000000000..8eca320bd8
--- /dev/null
+++ b/repos/os/src/server/input_event_bridge/target.mk
@@ -0,0 +1,3 @@
+TARGET = input_event_bridge
+SRC_CC = main.cc
+LIBS   = base