mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-18 15:18:20 +00:00
sculpt: screensaver infrastructure
This patch enhances Sculpt with the ability to detect user inactivity for driving a screensaver by combining nitpicker's hover and focus reports with a timer. Issue #4950
This commit is contained in:
@ -273,6 +273,8 @@ install_config {
|
|||||||
<policy label="runtime -> capslock" report="global_keys_handler -> capslock"/>
|
<policy label="runtime -> capslock" report="global_keys_handler -> capslock"/>
|
||||||
<policy label="drivers -> numlock" report="global_keys_handler -> numlock"/>
|
<policy label="drivers -> numlock" report="global_keys_handler -> numlock"/>
|
||||||
<policy label="runtime -> clicked" report="nitpicker -> clicked"/>
|
<policy label="runtime -> clicked" report="nitpicker -> clicked"/>
|
||||||
|
<policy label="leitzentrale -> manager -> nitpicker_focus" report="nitpicker -> focus"/>
|
||||||
|
<policy label="leitzentrale -> manager -> nitpicker_hover" report="nitpicker -> hover"/>
|
||||||
<policy label="nit_focus -> leitzentrale"
|
<policy label="nit_focus -> leitzentrale"
|
||||||
report="global_keys_handler -> leitzentrale"/>
|
report="global_keys_handler -> leitzentrale"/>
|
||||||
<policy label="nit_focus -> slides"
|
<policy label="nit_focus -> slides"
|
||||||
@ -577,6 +579,8 @@ install_config {
|
|||||||
<child name="config_fs_rom"/> </service>
|
<child name="config_fs_rom"/> </service>
|
||||||
<service name="ROM" label_prefix="config -> ">
|
<service name="ROM" label_prefix="config -> ">
|
||||||
<child name="config_fs_rom"/> </service>
|
<child name="config_fs_rom"/> </service>
|
||||||
|
<service name="ROM" label="manager -> nitpicker_focus">
|
||||||
|
<child name="report_rom"/> </service>
|
||||||
<service name="ROM" label="manager -> nitpicker_hover">
|
<service name="ROM" label="manager -> nitpicker_hover">
|
||||||
<child name="report_rom"/> </service>
|
<child name="report_rom"/> </service>
|
||||||
<service name="ROM" label="manager -> leitzentrale">
|
<service name="ROM" label="manager -> leitzentrale">
|
||||||
|
@ -254,6 +254,8 @@
|
|||||||
<child name="config_fs_report" label="managed -> depot_query"/> </service>
|
<child name="config_fs_report" label="managed -> depot_query"/> </service>
|
||||||
<service name="Report"> <child name="report_rom"/> </service>
|
<service name="Report"> <child name="report_rom"/> </service>
|
||||||
<service name="ROM" label_prefix="report ->"> <parent/> </service>
|
<service name="ROM" label_prefix="report ->"> <parent/> </service>
|
||||||
|
<service name="ROM" label="nitpicker_focus"> <parent/> </service>
|
||||||
|
<service name="ROM" label="nitpicker_hover"> <parent/> </service>
|
||||||
<service name="ROM" label_suffix="_hover"> <child name="report_rom"/> </service>
|
<service name="ROM" label_suffix="_hover"> <child name="report_rom"/> </service>
|
||||||
<service name="ROM" label="window_list"> <child name="report_rom"/> </service>
|
<service name="ROM" label="window_list"> <child name="report_rom"/> </service>
|
||||||
<service name="ROM" label="decorator_margins"> <child name="report_rom"/> </service>
|
<service name="ROM" label="decorator_margins"> <child name="report_rom"/> </service>
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#include <model/file_operation_queue.h>
|
#include <model/file_operation_queue.h>
|
||||||
#include <model/settings.h>
|
#include <model/settings.h>
|
||||||
#include <model/presets.h>
|
#include <model/presets.h>
|
||||||
|
#include <model/screensaver.h>
|
||||||
#include <view/download_status.h>
|
#include <view/download_status.h>
|
||||||
#include <view/popup_dialog.h>
|
#include <view/popup_dialog.h>
|
||||||
#include <view/panel_dialog.h>
|
#include <view/panel_dialog.h>
|
||||||
@ -71,7 +72,8 @@ struct Sculpt::Main : Input_event_handler,
|
|||||||
Panel_dialog::State,
|
Panel_dialog::State,
|
||||||
Dialog,
|
Dialog,
|
||||||
Popup_dialog::Refresh,
|
Popup_dialog::Refresh,
|
||||||
Menu_view::Hover_update_handler
|
Menu_view::Hover_update_handler,
|
||||||
|
Screensaver::Action
|
||||||
{
|
{
|
||||||
Env &_env;
|
Env &_env;
|
||||||
|
|
||||||
@ -114,6 +116,16 @@ struct Sculpt::Main : Input_event_handler,
|
|||||||
|
|
||||||
void _handle_gui_mode();
|
void _handle_gui_mode();
|
||||||
|
|
||||||
|
Screensaver _screensaver { _env, *this };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Screensaver::Action interface
|
||||||
|
*/
|
||||||
|
void screensaver_changed() override
|
||||||
|
{
|
||||||
|
/* hook for driving the lifetime of the display driver */
|
||||||
|
}
|
||||||
|
|
||||||
Managed_config<Main> _fonts_config {
|
Managed_config<Main> _fonts_config {
|
||||||
_env, "config", "fonts", *this, &Main::_handle_fonts_config };
|
_env, "config", "fonts", *this, &Main::_handle_fonts_config };
|
||||||
|
|
||||||
|
140
repos/gems/src/app/sculpt_manager/model/screensaver.h
Normal file
140
repos/gems/src/app/sculpt_manager/model/screensaver.h
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
/*
|
||||||
|
* \brief Logic for activating/deactivating the screensaver
|
||||||
|
* \author Norman Feske
|
||||||
|
* \date 2023-06-27
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2023 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MODEL__SCREENSAVER_H_
|
||||||
|
#define _MODEL__SCREENSAVER_H_
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
|
||||||
|
namespace Sculpt { class Screensaver; }
|
||||||
|
|
||||||
|
|
||||||
|
class Sculpt::Screensaver : Noncopyable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
struct Action : Interface
|
||||||
|
{
|
||||||
|
virtual void screensaver_changed() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
Env &_env;
|
||||||
|
Action &_action;
|
||||||
|
|
||||||
|
/* config */
|
||||||
|
unsigned _max_seconds_of_inactivity = 10;
|
||||||
|
bool _blank_after_some_time = true;
|
||||||
|
|
||||||
|
/* state */
|
||||||
|
uint64_t _last_activity_ms = 0;
|
||||||
|
bool _recent_user_activity = true;
|
||||||
|
bool _forced_blanked = false;
|
||||||
|
|
||||||
|
Timer::Connection _timer { _env };
|
||||||
|
|
||||||
|
Signal_handler<Screensaver> _timer_handler {
|
||||||
|
_env.ep(), *this, &Screensaver::_handle_timer };
|
||||||
|
|
||||||
|
void _handle_timer()
|
||||||
|
{
|
||||||
|
uint64_t const now = _timer.elapsed_ms();
|
||||||
|
|
||||||
|
if (now - _last_activity_ms > _max_seconds_of_inactivity*1000) {
|
||||||
|
if (_recent_user_activity) {
|
||||||
|
_recent_user_activity = false;
|
||||||
|
_action.screensaver_changed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _wake_up()
|
||||||
|
{
|
||||||
|
_last_activity_ms = _timer.elapsed_ms();
|
||||||
|
_timer.trigger_once(_max_seconds_of_inactivity*1024*1024);
|
||||||
|
if (!_recent_user_activity) {
|
||||||
|
_recent_user_activity = true;
|
||||||
|
_action.screensaver_changed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility for watching the 'active' attribute of a ROM module
|
||||||
|
*/
|
||||||
|
struct Watched_rom : Noncopyable
|
||||||
|
{
|
||||||
|
Screensaver &_screensaver;
|
||||||
|
|
||||||
|
Attached_rom_dataspace _rom;
|
||||||
|
|
||||||
|
Signal_handler<Watched_rom> _handler {
|
||||||
|
_screensaver._env.ep(), *this, &Watched_rom::_handle };
|
||||||
|
|
||||||
|
Watched_rom(Screensaver &screensaver, char const *label)
|
||||||
|
:
|
||||||
|
_screensaver(screensaver), _rom(screensaver._env, label)
|
||||||
|
{
|
||||||
|
_rom.sigh(_handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _handle()
|
||||||
|
{
|
||||||
|
_rom.update();
|
||||||
|
if (_rom.xml().attribute_value("active", false))
|
||||||
|
_screensaver._wake_up();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Watched_rom _nitpicker_focus { *this, "nitpicker_focus" };
|
||||||
|
Watched_rom _nitpicker_hover { *this, "nitpicker_hover" };
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Screensaver(Env &env, Action &action) : _env(env), _action(action)
|
||||||
|
{
|
||||||
|
_timer.sigh(_timer_handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool display_enabled() const
|
||||||
|
{
|
||||||
|
if (_forced_blanked)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (_blank_after_some_time && !_recent_user_activity)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void blank_after_some_time(bool blank_after_some_time)
|
||||||
|
{
|
||||||
|
_blank_after_some_time = blank_after_some_time;
|
||||||
|
_wake_up();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User enforces the enabling or disabling of the display (power button)
|
||||||
|
*/
|
||||||
|
void force_toggle()
|
||||||
|
{
|
||||||
|
if (display_enabled())
|
||||||
|
_forced_blanked = true;
|
||||||
|
else
|
||||||
|
_forced_blanked = false;
|
||||||
|
|
||||||
|
_action.screensaver_changed();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _MODEL__SCREENSAVER_H_ */
|
Reference in New Issue
Block a user