mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-21 22:47:50 +00:00
nit_focus component that implements click-to-focus
This commit is contained in:
parent
b05ad847b9
commit
f94f96c3ee
2
repos/os/recipes/src/nit_focus/content.mk
Normal file
2
repos/os/recipes/src/nit_focus/content.mk
Normal file
@ -0,0 +1,2 @@
|
||||
SRC_DIR = src/app/nit_focus
|
||||
include $(GENODE_DIR)/repos/base/recipes/src/content.inc
|
1
repos/os/recipes/src/nit_focus/hash
Normal file
1
repos/os/recipes/src/nit_focus/hash
Normal file
@ -0,0 +1 @@
|
||||
2017-11-19 8a4dfb6ff5019ef00c5428040243f05e936eb655
|
3
repos/os/recipes/src/nit_focus/used_apis
Normal file
3
repos/os/recipes/src/nit_focus/used_apis
Normal file
@ -0,0 +1,3 @@
|
||||
base
|
||||
os
|
||||
report_session
|
8
repos/os/src/app/nit_focus/README
Normal file
8
repos/os/src/app/nit_focus/README
Normal file
@ -0,0 +1,8 @@
|
||||
The nit_focus component implements the input-focus policy for the nitpicker
|
||||
GUI server. It consumes nitpicker's 'clicked' report and, in turn, produces a
|
||||
'focus' report to be consumed by nitpicker.
|
||||
|
||||
Focus changes are subjected to a configurable policy, which is selected via
|
||||
Genode's regular policy-selection mechanism based on the label of the clicked
|
||||
nitpicker client. The client is focused only if the policy has the attribute
|
||||
'focus' set to "yes".
|
65
repos/os/src/app/nit_focus/main.cc
Normal file
65
repos/os/src/app/nit_focus/main.cc
Normal file
@ -0,0 +1,65 @@
|
||||
/*
|
||||
* \brief Input-focus policy for the nitpicker GUI server
|
||||
* \author Norman Feske
|
||||
* \date 2017-11-19
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2017 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 <base/component.h>
|
||||
#include <base/attached_rom_dataspace.h>
|
||||
#include <os/session_policy.h>
|
||||
#include <os/reporter.h>
|
||||
|
||||
namespace Nit_focus {
|
||||
using namespace Genode;
|
||||
struct Main;
|
||||
}
|
||||
|
||||
|
||||
struct Nit_focus::Main
|
||||
{
|
||||
Env &_env;
|
||||
|
||||
Attached_rom_dataspace _config_rom { _env, "config" };
|
||||
Attached_rom_dataspace _clicked_rom { _env, "clicked" };
|
||||
|
||||
Reporter _focus_reporter { _env, "focus" };
|
||||
|
||||
void _handle_update()
|
||||
{
|
||||
_clicked_rom.update();
|
||||
_config_rom.update();
|
||||
|
||||
typedef String<160> Label;
|
||||
Label const label = _clicked_rom.xml().attribute_value("label", Label());
|
||||
|
||||
try {
|
||||
Session_policy const policy(label, _config_rom.xml());
|
||||
if (policy.attribute_value("focus", true)) {
|
||||
Reporter::Xml_generator xml(_focus_reporter, [&] () {
|
||||
xml.attribute("label", label); });
|
||||
}
|
||||
}
|
||||
catch (...) { /* don't change focus on policy mismatch */ }
|
||||
}
|
||||
|
||||
Signal_handler<Main> _update_handler {
|
||||
_env.ep(), *this, &Main::_handle_update };
|
||||
|
||||
Main(Env &env) : _env(env)
|
||||
{
|
||||
_clicked_rom.sigh(_update_handler);
|
||||
_focus_reporter.enabled(true);
|
||||
_handle_update();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
void Component::construct(Genode::Env &env) { static Nit_focus::Main main(env); }
|
3
repos/os/src/app/nit_focus/target.mk
Normal file
3
repos/os/src/app/nit_focus/target.mk
Normal file
@ -0,0 +1,3 @@
|
||||
TARGET = nit_focus
|
||||
SRC_CC = main.cc
|
||||
LIBS = base
|
Loading…
Reference in New Issue
Block a user