4runr-os 2.10.40 → 2.10.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,112 +1,111 @@
1
- use std::time::{Duration, Instant};
2
-
3
- #[derive(Debug, Clone, Copy, PartialEq)]
4
- pub enum RunMode {
5
- Local,
6
- Browser,
7
- }
8
-
9
- impl RunMode {
10
- pub fn detect() -> Self {
11
- if let Ok(mode) = std::env::var("RUN_MODE") {
12
- match mode.to_lowercase().as_str() {
13
- "browser" | "web" => return RunMode::Browser,
14
- "local" => return RunMode::Local,
15
- _ => {}
16
- }
17
- }
18
-
19
- // Auto-detect
20
- if std::env::var("AWS_EXECUTION_ENV").is_ok()
21
- || std::env::var("CLOUDSHELL").is_ok()
22
- || std::env::var("TUI_WEB").map(|v| v == "1").unwrap_or(false)
23
- {
24
- RunMode::Browser
25
- } else {
26
- RunMode::Local
27
- }
28
- }
29
- }
30
-
31
- pub struct RenderScheduler {
32
- run_mode: RunMode,
33
- last_render: Instant,
34
- render_scheduled: bool,
35
- immediate_render: bool, // Flag for immediate renders (bypass throttling)
36
- render_scheduled_count: u64,
37
- min_render_interval: Duration,
38
- }
39
-
40
- impl RenderScheduler {
41
- pub fn new() -> Self {
42
- let run_mode = RunMode::detect();
43
- let min_render_interval = match run_mode {
44
- RunMode::Browser => Duration::from_millis(50), // Max 20 FPS (browser limitation)
45
- RunMode::Local => Duration::from_millis(8), // Max 120 FPS (ultra-responsive, throttled for non-input)
46
- };
47
-
48
- Self {
49
- run_mode,
50
- last_render: Instant::now(),
51
- render_scheduled: false,
52
- immediate_render: false,
53
- render_scheduled_count: 0,
54
- min_render_interval,
55
- }
56
- }
57
-
58
- pub fn run_mode(&self) -> RunMode {
59
- self.run_mode
60
- }
61
-
62
- pub fn request_render(&mut self, _reason: &str) -> bool {
63
- self.render_scheduled_count += 1;
64
- self.render_scheduled = true; // Always schedule so the next should_render() can draw
65
- let now = Instant::now();
66
- let elapsed = now.duration_since(self.last_render);
67
- if elapsed >= self.min_render_interval {
68
- // Throttle allows: next frame should draw without waiting another interval
69
- self.immediate_render = true;
70
- true
71
- } else {
72
- false
73
- }
74
- }
75
-
76
- /// Request immediate render (bypass throttling) - for critical input events
77
- pub fn request_immediate_render(&mut self, _reason: &str) -> bool {
78
- self.render_scheduled_count += 1;
79
- self.render_scheduled = true;
80
- self.immediate_render = true; // Mark as immediate to bypass throttling
81
- true
82
- }
83
-
84
- pub fn should_render(&mut self) -> bool {
85
- if !self.render_scheduled {
86
- return false;
87
- }
88
-
89
- let now = Instant::now();
90
- let elapsed = now.duration_since(self.last_render);
91
-
92
- // If immediate render was requested, bypass throttling
93
- // Otherwise, respect the throttle interval
94
- if self.immediate_render || elapsed >= self.min_render_interval {
95
- self.last_render = now;
96
- self.render_scheduled = false;
97
- self.immediate_render = false; // Clear immediate flag
98
- true
99
- } else {
100
- false
101
- }
102
- }
103
-
104
- pub fn render_scheduled_count(&self) -> u64 {
105
- self.render_scheduled_count
106
- }
107
-
108
- pub fn min_render_interval_ms(&self) -> u64 {
109
- self.min_render_interval.as_millis() as u64
110
- }
111
- }
112
-
1
+ use std::time::{Duration, Instant};
2
+
3
+ #[derive(Debug, Clone, Copy, PartialEq)]
4
+ pub enum RunMode {
5
+ Local,
6
+ Browser,
7
+ }
8
+
9
+ impl RunMode {
10
+ pub fn detect() -> Self {
11
+ if let Ok(mode) = std::env::var("RUN_MODE") {
12
+ match mode.to_lowercase().as_str() {
13
+ "browser" | "web" => return RunMode::Browser,
14
+ "local" => return RunMode::Local,
15
+ _ => {}
16
+ }
17
+ }
18
+
19
+ // Auto-detect
20
+ if std::env::var("AWS_EXECUTION_ENV").is_ok()
21
+ || std::env::var("CLOUDSHELL").is_ok()
22
+ || std::env::var("TUI_WEB").map(|v| v == "1").unwrap_or(false)
23
+ {
24
+ RunMode::Browser
25
+ } else {
26
+ RunMode::Local
27
+ }
28
+ }
29
+ }
30
+
31
+ pub struct RenderScheduler {
32
+ run_mode: RunMode,
33
+ last_render: Instant,
34
+ render_scheduled: bool,
35
+ immediate_render: bool, // Flag for immediate renders (bypass throttling)
36
+ render_scheduled_count: u64,
37
+ min_render_interval: Duration,
38
+ }
39
+
40
+ impl RenderScheduler {
41
+ pub fn new() -> Self {
42
+ let run_mode = RunMode::detect();
43
+ let min_render_interval = match run_mode {
44
+ RunMode::Browser => Duration::from_millis(50), // Max 20 FPS (browser limitation)
45
+ RunMode::Local => Duration::from_millis(8), // Max 120 FPS (ultra-responsive, throttled for non-input)
46
+ };
47
+
48
+ Self {
49
+ run_mode,
50
+ last_render: Instant::now(),
51
+ render_scheduled: false,
52
+ immediate_render: false,
53
+ render_scheduled_count: 0,
54
+ min_render_interval,
55
+ }
56
+ }
57
+
58
+ pub fn run_mode(&self) -> RunMode {
59
+ self.run_mode
60
+ }
61
+
62
+ pub fn request_render(&mut self, _reason: &str) -> bool {
63
+ self.render_scheduled_count += 1;
64
+ self.render_scheduled = true; // Always schedule so the next should_render() can draw
65
+ let now = Instant::now();
66
+ let elapsed = now.duration_since(self.last_render);
67
+ if elapsed >= self.min_render_interval {
68
+ // Throttle allows: next frame should draw without waiting another interval
69
+ self.immediate_render = true;
70
+ true
71
+ } else {
72
+ false
73
+ }
74
+ }
75
+
76
+ /// Request immediate render (bypass throttling) - for critical input events
77
+ pub fn request_immediate_render(&mut self, _reason: &str) -> bool {
78
+ self.render_scheduled_count += 1;
79
+ self.render_scheduled = true;
80
+ self.immediate_render = true; // Mark as immediate to bypass throttling
81
+ true
82
+ }
83
+
84
+ pub fn should_render(&mut self) -> bool {
85
+ if !self.render_scheduled {
86
+ return false;
87
+ }
88
+
89
+ let now = Instant::now();
90
+ let elapsed = now.duration_since(self.last_render);
91
+
92
+ // If immediate render was requested, bypass throttling
93
+ // Otherwise, respect the throttle interval
94
+ if self.immediate_render || elapsed >= self.min_render_interval {
95
+ self.last_render = now;
96
+ self.render_scheduled = false;
97
+ self.immediate_render = false; // Clear immediate flag
98
+ true
99
+ } else {
100
+ false
101
+ }
102
+ }
103
+
104
+ pub fn render_scheduled_count(&self) -> u64 {
105
+ self.render_scheduled_count
106
+ }
107
+
108
+ pub fn min_render_interval_ms(&self) -> u64 {
109
+ self.min_render_interval.as_millis() as u64
110
+ }
111
+ }