1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use crate::result::*;
use crate::ipc::sf;
use crate::mem;
use crate::util;
use crate::ipc::sf::applet;
use crate::ipc::sf::dispdrv;
use crate::version;
pub type DisplayName = util::CString<0x40>;
bit_enum! {
LayerFlags (u32) {
None = 0,
Default = bit!(0)
}
}
pub type DisplayId = u64;
pub type LayerId = u64;
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
#[repr(u32)]
pub enum DisplayServiceMode {
User = 0,
Privileged = 1
}
ipc_sf_define_interface_trait! {
trait IManagerDisplayService {
create_managed_layer [2010, version::VersionInterval::all()]: (flags: LayerFlags, display_id: DisplayId, aruid: applet::AppletResourceUserId) => (id: LayerId);
destroy_managed_layer [2011, version::VersionInterval::all()]: (id: LayerId) => ();
}
}
ipc_sf_define_interface_trait! {
trait ISystemDisplayService {
get_z_order_count_min [1200, version::VersionInterval::all()]: (display_id: DisplayId) => (z: i64);
get_z_order_count_max [1202, version::VersionInterval::all()]: (display_id: DisplayId) => (z: i64);
set_layer_position [2201, version::VersionInterval::all()]: (x: f32, y: f32, id: LayerId) => ();
set_layer_size [2203, version::VersionInterval::all()]: (id: LayerId, width: u64, height: u64) => ();
set_layer_z [2205, version::VersionInterval::all()]: (id: LayerId, z: i64) => ();
set_layer_visibility [2207, version::VersionInterval::all()]: (visible: bool, id: LayerId) => ();
}
}
ipc_sf_define_interface_trait! {
trait IApplicationDisplayService {
get_relay_service [100, version::VersionInterval::all()]: () => (relay_service: mem::Shared<dyn dispdrv::IHOSBinderDriver>);
get_system_display_service [101, version::VersionInterval::all()]: () => (system_display_service: mem::Shared<dyn ISystemDisplayService>);
get_manager_display_service [102, version::VersionInterval::all()]: () => (manager_display_service: mem::Shared<dyn IManagerDisplayService>);
open_display [1010, version::VersionInterval::all()]: (name: DisplayName) => (id: DisplayId);
close_display [1020, version::VersionInterval::all()]: (id: DisplayId) => ();
open_layer [2020, version::VersionInterval::all()]: (name: DisplayName, id: LayerId, aruid: sf::ProcessId, out_native_window: sf::OutMapAliasBuffer<u8>) => (native_window_size: usize);
create_stray_layer [2030, version::VersionInterval::all()]: (flags: LayerFlags, display_id: DisplayId, out_native_window: sf::OutMapAliasBuffer<u8>) => (id: LayerId, native_window_size: usize);
destroy_stray_layer [2031, version::VersionInterval::all()]: (id: LayerId) => ();
get_display_vsync_event [5202, version::VersionInterval::all()]: (id: DisplayId) => (event_handle: sf::CopyHandle);
}
}
ipc_sf_define_interface_trait! {
trait IApplicationRootService {
get_display_service [0, version::VersionInterval::all()]: (mode: DisplayServiceMode) => (display_service: mem::Shared<dyn IApplicationDisplayService>);
}
}
ipc_sf_define_interface_trait! {
trait ISystemRootService {
get_display_service [1, version::VersionInterval::all()]: (mode: DisplayServiceMode) => (display_service: mem::Shared<dyn IApplicationDisplayService>);
}
}
ipc_sf_define_interface_trait! {
trait IManagerRootService {
get_display_service [2, version::VersionInterval::all()]: (mode: DisplayServiceMode) => (display_service: mem::Shared<dyn IApplicationDisplayService>);
}
}