@bobfrankston/msger 0.1.77 → 0.1.79
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.
- package/SESSION-NOTES.md +47 -3
- package/TODO.md +301 -0
- package/clihandler.d.ts.map +1 -1
- package/clihandler.js +7 -5
- package/clihandler.js.map +1 -1
- package/clihandler.ts +4 -3
- package/msger-native/Cargo.toml +3 -0
- package/msger-native/bin/msgernative.exe +0 -0
- package/msger-native/src/main.rs +111 -84
- package/msger-native/src/msger-api.js +84 -0
- package/msgernative-linux-x64 +0 -0
- package/package.json +1 -1
- package/shower.d.ts.map +1 -1
- package/shower.js +7 -5
- package/shower.js.map +1 -1
- package/shower.ts +7 -5
package/SESSION-NOTES.md
CHANGED
|
@@ -604,9 +604,13 @@ Added security warning to help text:
|
|
|
604
604
|
|
|
605
605
|
### Recently Fixed ✅
|
|
606
606
|
1. **Multi-monitor positioning** (Fixed 2025-11-06)
|
|
607
|
-
- Was
|
|
608
|
-
|
|
609
|
-
|
|
607
|
+
- **Rust side:** Was assuming monitors arranged left-to-right, added widths (wrong!)
|
|
608
|
+
- Now: Gets specific monitor's actual OS position and adds user offset
|
|
609
|
+
- Fix in main.rs: Use `monitor.position()` instead of adding widths
|
|
610
|
+
- **CLI parsing:** Was ignoring third parameter in `-pos x,y,screen`
|
|
611
|
+
- Previously only worked with: `msger -pos 10,10 -screen 1`
|
|
612
|
+
- Now works with: `msger -pos 10,10,1` (third parameter = screen number)
|
|
613
|
+
- Fix in clihandler.ts: Parse optional third parameter from comma-separated string
|
|
610
614
|
- Test with: `msger -message "Test" -pos 10,10,1` (screen 1 = second monitor)
|
|
611
615
|
|
|
612
616
|
### Workarounds 🔧
|
|
@@ -672,6 +676,46 @@ await msger.maximize()
|
|
|
672
676
|
|
|
673
677
|
These were disabled thinking ALL IPC was broken, but template mode IPC works fine. Could re-enable with same bidirectional pattern as file API.
|
|
674
678
|
|
|
679
|
+
#### 2b. System Menu (Windows Title Bar Menu) - ALTERNATIVE TO KEYBOARD SHORTCUTS
|
|
680
|
+
**Problem:** Keystrokes don't reliably reach the window (WebView2 captures them first)
|
|
681
|
+
- F11 doesn't trigger native fullscreen
|
|
682
|
+
- No easy way to toggle features at runtime
|
|
683
|
+
|
|
684
|
+
**Solution:** Add custom entries to Windows system menu (Alt+Space or right-click title bar)
|
|
685
|
+
|
|
686
|
+
**What to add:**
|
|
687
|
+
- "Toggle Always On Top" (checkmark shows current state)
|
|
688
|
+
- "Zoom" submenu → 50%, 75%, 100%, 125%, 150%, 200%
|
|
689
|
+
- "Toggle Fullscreen" (native window fullscreen)
|
|
690
|
+
- "Open DevTools" (F12 alternative)
|
|
691
|
+
- "Reload Content" (refresh)
|
|
692
|
+
- Separator
|
|
693
|
+
- "Copy Window Info" (position, size, monitor for debugging)
|
|
694
|
+
|
|
695
|
+
**Implementation approach:**
|
|
696
|
+
1. Get window HWND from tao window
|
|
697
|
+
2. Call Windows API: `GetSystemMenu(hwnd, FALSE)`
|
|
698
|
+
3. Add separator: `AppendMenu(menu, MF_SEPARATOR, 0, NULL)`
|
|
699
|
+
4. Add custom items with unique IDs (>= 0x1000):
|
|
700
|
+
```rust
|
|
701
|
+
AppendMenu(menu, MF_STRING, 0x1000, "Toggle Always On Top\0".as_ptr());
|
|
702
|
+
AppendMenu(menu, MF_STRING, 0x1001, "Toggle Fullscreen\0".as_ptr());
|
|
703
|
+
// etc.
|
|
704
|
+
```
|
|
705
|
+
5. Handle WM_SYSCOMMAND in window event loop
|
|
706
|
+
6. Check if wParam matches custom IDs, execute action
|
|
707
|
+
|
|
708
|
+
**Why this works:**
|
|
709
|
+
- Bypasses WebView2 keyboard capture
|
|
710
|
+
- Native Windows UI, familiar to users
|
|
711
|
+
- Can show current state (checkmarks)
|
|
712
|
+
- Works in both template and URL mode
|
|
713
|
+
|
|
714
|
+
**Libraries needed:**
|
|
715
|
+
- `winapi` crate already in dependencies
|
|
716
|
+
- `use winapi::um::winuser::{GetSystemMenu, AppendMenuW, MF_STRING, MF_SEPARATOR};`
|
|
717
|
+
- Use `raw_window_handle()` from tao to get HWND
|
|
718
|
+
|
|
675
719
|
#### 3. Periodic wry Update Check
|
|
676
720
|
Check every few months if wry has fixed the URL mode IPC crash bug. Update to newer wry version if fixed. This would enable window/file APIs in URL mode too.
|
|
677
721
|
|
package/TODO.md
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
# msger TODO List
|
|
2
|
+
|
|
3
|
+
## High Priority - Bug Fixes
|
|
4
|
+
- -detatch stopped working
|
|
5
|
+
|
|
6
|
+
## High Priority - Platform App Support
|
|
7
|
+
|
|
8
|
+
### 1. File System API (Week of 2025-11-11+)
|
|
9
|
+
**Goal:** Make msger feasible for writing platform apps with file access
|
|
10
|
+
|
|
11
|
+
**Status:** Not started - requires debugging time
|
|
12
|
+
|
|
13
|
+
**Implementation:**
|
|
14
|
+
|
|
15
|
+
#### A) File Dialogs (Always Safe - No Flag Required)
|
|
16
|
+
```javascript
|
|
17
|
+
await msger.selectFile(options) // Pick single file → {path, content}
|
|
18
|
+
await msger.selectFiles(options) // Pick multiple files → [{path, content}...]
|
|
19
|
+
await msger.saveFileAs(content, name, options) // Save dialog → path
|
|
20
|
+
await msger.selectFolder(options) // Folder picker → path
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
#### B) Direct File Access (Requires --allowFs Flag)
|
|
24
|
+
```javascript
|
|
25
|
+
// Direct file operations by path - requires: msger -htmlfrom app.html --allowFs
|
|
26
|
+
await msger.fs.read(path) // Read file content
|
|
27
|
+
await msger.fs.write(path, content) // Write file
|
|
28
|
+
await msger.fs.list(path) // List directory
|
|
29
|
+
await msger.fs.exists(path) // Check if exists
|
|
30
|
+
await msger.fs.delete(path) // Delete file
|
|
31
|
+
await msger.fs.mkdir(path) // Create directory
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Why it's possible:**
|
|
35
|
+
- IPC works perfectly in template mode (proven by button clicks)
|
|
36
|
+
- Just need bidirectional IPC pattern (JavaScript → Rust → JavaScript)
|
|
37
|
+
- Use `rfd` crate for native file dialogs
|
|
38
|
+
|
|
39
|
+
**Steps:**
|
|
40
|
+
- [ ] Add `rfd = "0.14"` to Cargo.toml
|
|
41
|
+
- [ ] Add `allowFs` flag to MessageBoxOptions struct
|
|
42
|
+
- [ ] Extend IPC handler to recognize file actions
|
|
43
|
+
- [ ] Implement file dialog operations (always allowed)
|
|
44
|
+
- [ ] Implement direct path operations (check allowFs flag first)
|
|
45
|
+
- [ ] Send results back via `webview.evaluate_script()`
|
|
46
|
+
- [ ] Add JavaScript functions that poll for result in `window.__msger_file_result`
|
|
47
|
+
- [ ] Test file dialogs
|
|
48
|
+
- [ ] Test direct file operations with --allowFs flag
|
|
49
|
+
- [ ] Test security (direct operations should fail without --allowFs)
|
|
50
|
+
- [ ] Update documentation (README, MSGER-API-SUMMARY, msgerdefs)
|
|
51
|
+
- [ ] Create sample apps demonstrating file API
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
### 2. Window Manipulation APIs via IPC
|
|
56
|
+
**Goal:** Runtime window control in template mode
|
|
57
|
+
|
|
58
|
+
**Status:** Not started - requires debugging time
|
|
59
|
+
|
|
60
|
+
**Implementation:**
|
|
61
|
+
```javascript
|
|
62
|
+
await msger.setSize(width, height)
|
|
63
|
+
await msger.setPosition(x, y)
|
|
64
|
+
await msger.setTitle(title)
|
|
65
|
+
await msger.setAlwaysOnTop(enabled)
|
|
66
|
+
await msger.minimize()
|
|
67
|
+
await msger.maximize()
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Why it's possible:**
|
|
71
|
+
- IPC works in template mode
|
|
72
|
+
- These were disabled prematurely thinking ALL IPC was broken
|
|
73
|
+
- Can be re-enabled with bidirectional IPC pattern (same as file API)
|
|
74
|
+
|
|
75
|
+
**Steps:**
|
|
76
|
+
- [ ] Extend IPC handler to recognize window actions
|
|
77
|
+
- [ ] Implement window manipulation functions in Rust
|
|
78
|
+
- [ ] Send results/confirmations back via `webview.evaluate_script()`
|
|
79
|
+
- [ ] Add JavaScript async functions
|
|
80
|
+
- [ ] Test in template mode
|
|
81
|
+
- [ ] Verify still crashes in URL mode (expected)
|
|
82
|
+
- [ ] Update documentation
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
### 3. System Menu (Windows Title Bar Menu)
|
|
87
|
+
**Goal:** Add custom entries to Windows system menu as alternative to keyboard shortcuts
|
|
88
|
+
|
|
89
|
+
**Status:** Not started - Windows-specific feature
|
|
90
|
+
|
|
91
|
+
**Problem:**
|
|
92
|
+
- Keystrokes don't reliably reach the window (WebView2 captures them first)
|
|
93
|
+
- F11 doesn't trigger native fullscreen
|
|
94
|
+
- No easy way to toggle features at runtime
|
|
95
|
+
|
|
96
|
+
**Solution:** Add custom entries to Windows system menu (Alt+Space or right-click title bar)
|
|
97
|
+
|
|
98
|
+
**Menu Items to Add:**
|
|
99
|
+
- Toggle Always On Top (with checkmark showing current state)
|
|
100
|
+
- Zoom submenu → 50%, 75%, 100%, 125%, 150%, 200%
|
|
101
|
+
- Toggle Fullscreen (native window fullscreen)
|
|
102
|
+
- Open DevTools (F12 alternative)
|
|
103
|
+
- Reload Content (refresh)
|
|
104
|
+
- Separator
|
|
105
|
+
- Copy Window Info (position, size, monitor - for debugging)
|
|
106
|
+
|
|
107
|
+
**Steps:**
|
|
108
|
+
- [ ] Get window HWND from tao window using `raw_window_handle()`
|
|
109
|
+
- [ ] Call Windows API: `GetSystemMenu(hwnd, FALSE)`
|
|
110
|
+
- [ ] Add separator: `AppendMenuW(menu, MF_SEPARATOR, 0, NULL)`
|
|
111
|
+
- [ ] Add custom menu items with unique IDs (>= 0x1000)
|
|
112
|
+
- [ ] Store window state (always on top, zoom level, fullscreen)
|
|
113
|
+
- [ ] Handle `WM_SYSCOMMAND` in window event loop
|
|
114
|
+
- [ ] Check if wParam matches custom menu IDs
|
|
115
|
+
- [ ] Execute appropriate action
|
|
116
|
+
- [ ] Update menu checkmarks when state changes
|
|
117
|
+
- [ ] Test all menu items
|
|
118
|
+
- [ ] Document in README (mention Alt+Space to access)
|
|
119
|
+
|
|
120
|
+
**Libraries needed:**
|
|
121
|
+
- `winapi` crate (already in dependencies)
|
|
122
|
+
- `use winapi::um::winuser::{GetSystemMenu, AppendMenuW, MF_STRING, MF_SEPARATOR, MF_CHECKED};`
|
|
123
|
+
|
|
124
|
+
**Why this works:**
|
|
125
|
+
- Bypasses WebView2 keyboard capture
|
|
126
|
+
- Native Windows UI, familiar to users
|
|
127
|
+
- Can show current state (checkmarks)
|
|
128
|
+
- Works in both template and URL mode
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Medium Priority - Maintenance
|
|
133
|
+
|
|
134
|
+
### 4. Periodic wry Update Check
|
|
135
|
+
**Goal:** Check if newer wry versions fix URL mode IPC crash
|
|
136
|
+
|
|
137
|
+
**Status:** Recurring task - check every few months
|
|
138
|
+
|
|
139
|
+
**Current:** wry 0.47.2 has IPC crash bug in URL mode
|
|
140
|
+
|
|
141
|
+
**Steps:**
|
|
142
|
+
- [ ] Check wry releases: https://github.com/tauri-apps/wry/releases
|
|
143
|
+
- [ ] Read changelog for IPC/WebView2 fixes
|
|
144
|
+
- [ ] Test with newer version if promising
|
|
145
|
+
- [ ] If fixed: update Cargo.toml, test thoroughly, document
|
|
146
|
+
- [ ] If fixed: re-enable file/window APIs in URL mode
|
|
147
|
+
|
|
148
|
+
**Next check:** January 2025
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Low Priority - Enhancements
|
|
153
|
+
|
|
154
|
+
### 5. Auto-Update Window Title from Document (URL Mode)
|
|
155
|
+
**Goal:** When using -url, automatically set window title from document's <title> tag
|
|
156
|
+
|
|
157
|
+
**Status:** Not started - enhancement
|
|
158
|
+
|
|
159
|
+
**Current behavior:**
|
|
160
|
+
- Window title comes from -title flag or defaults to "Message"
|
|
161
|
+
- -url mode ignores document's <title> tag
|
|
162
|
+
- User must manually specify title or get generic "Message" title
|
|
163
|
+
|
|
164
|
+
**Desired behavior:**
|
|
165
|
+
- If -title flag provided: use it (explicit override)
|
|
166
|
+
- If -title NOT provided and using -url: extract title from document's <title> tag
|
|
167
|
+
- Works like a browser - shows page title in window title bar
|
|
168
|
+
|
|
169
|
+
**Implementation approaches:**
|
|
170
|
+
|
|
171
|
+
**Option A: Listen for title changes (recommended)**
|
|
172
|
+
```rust
|
|
173
|
+
// In webview builder
|
|
174
|
+
.with_navigation_handler(|uri| {
|
|
175
|
+
// Allow navigation
|
|
176
|
+
true
|
|
177
|
+
})
|
|
178
|
+
// After page loads, get title via JavaScript
|
|
179
|
+
webview.evaluate_script("document.title").then(|title| {
|
|
180
|
+
window.set_title(&title);
|
|
181
|
+
});
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**Option B: Use WebView2 DocumentTitleChanged event**
|
|
185
|
+
```rust
|
|
186
|
+
// Windows-specific: Listen for DocumentTitleChanged event
|
|
187
|
+
// Update window.set_title() when document title changes
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Steps:**
|
|
191
|
+
- [ ] Check if -title flag was explicitly provided (distinguish from default)
|
|
192
|
+
- [ ] If -url mode AND no explicit -title: enable auto-title
|
|
193
|
+
- [ ] After page loads, extract document.title via JavaScript
|
|
194
|
+
- [ ] Call `window.set_title()` with extracted title
|
|
195
|
+
- [ ] Listen for dynamic title changes (SPA navigation)
|
|
196
|
+
- [ ] Test with static HTML files
|
|
197
|
+
- [ ] Test with dynamic web pages
|
|
198
|
+
- [ ] Test with pages that change title dynamically
|
|
199
|
+
- [ ] Document in README: "Window title automatically uses document <title> when using -url without -title flag"
|
|
200
|
+
|
|
201
|
+
**Edge cases:**
|
|
202
|
+
- Page with no <title> tag: fallback to URL or "Message"
|
|
203
|
+
- Page that changes title dynamically: update window title
|
|
204
|
+
- SPA navigation: keep listening for title changes
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
### 6. Cross-Compile Support for Raspberry Pi on Windows
|
|
209
|
+
**Goal:** Build ARM64 binary on Windows without SSH to Pi
|
|
210
|
+
|
|
211
|
+
**Status:** Not started - nice to have
|
|
212
|
+
|
|
213
|
+
**Current approach:** SSH to Pi, build there, copy back
|
|
214
|
+
|
|
215
|
+
**Research:**
|
|
216
|
+
- Rust cross-compilation to ARM64 Linux
|
|
217
|
+
- Install ARM64 toolchain on Windows
|
|
218
|
+
- Configure Cargo for cross-compilation
|
|
219
|
+
- Test binary on actual Pi
|
|
220
|
+
|
|
221
|
+
**Links:**
|
|
222
|
+
- https://www.perplexity.ai/search/can-the-rust-tool-chain-compil-kTNtAElGREq2YIU8qCpx_Q#1
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
### 6. Linux System Menu Support
|
|
227
|
+
**Goal:** Add custom menu entries on Linux (if possible)
|
|
228
|
+
|
|
229
|
+
**Status:** Not started - research needed
|
|
230
|
+
|
|
231
|
+
**Question:** Does GTK/Linux have equivalent to Windows system menu?
|
|
232
|
+
|
|
233
|
+
**Research:**
|
|
234
|
+
- GTK menu bar integration
|
|
235
|
+
- Custom right-click menu on title bar
|
|
236
|
+
- Alternative: Add menu bar inside webview content
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
### 7. Improve CSP for -htmlfrom
|
|
241
|
+
**Goal:** Allow external resources when using -htmlfrom
|
|
242
|
+
|
|
243
|
+
**Status:** Not started - may be wry limitation
|
|
244
|
+
|
|
245
|
+
**Current:** CSP blocks external CSS/JS/images when embedding HTML
|
|
246
|
+
|
|
247
|
+
**Workaround:** Use -url for pages with external resources
|
|
248
|
+
|
|
249
|
+
**Research:**
|
|
250
|
+
- Can we configure WebView2 CSP?
|
|
251
|
+
- Can we inject meta CSP tag?
|
|
252
|
+
- Can we proxy external resources?
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## Open Bugs
|
|
257
|
+
|
|
258
|
+
None currently known!
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Completed ✅
|
|
263
|
+
|
|
264
|
+
- ✅ Multi-monitor positioning fix - Rust side (2025-11-06)
|
|
265
|
+
- ✅ Multi-monitor positioning fix - CLI parsing bug (2025-11-06)
|
|
266
|
+
- Fixed: `-pos 10,10,1` now correctly parses third parameter as screen number
|
|
267
|
+
- Previously: Only `-pos 10,10 -screen 1` worked
|
|
268
|
+
- ✅ Remove redundant localStorage API wrappers (2025-11-06)
|
|
269
|
+
- ✅ Add repository field to package.json files (2025-11-06)
|
|
270
|
+
- ✅ Fix `nul` file git error (2025-11-06)
|
|
271
|
+
- ✅ Isolated storage with custom WebContext
|
|
272
|
+
- ✅ F11 HTML5 fullscreen implementation
|
|
273
|
+
- ✅ -htmlfrom option (load HTML from file/URL with buttons)
|
|
274
|
+
- ✅ -fullscreen CLI flag for native window fullscreen
|
|
275
|
+
- ✅ -dev flag parsing (partial - can't auto-open DevTools)
|
|
276
|
+
- ✅ Icon support with -icon option
|
|
277
|
+
- ✅ Fix zoomLevel declaration order bug
|
|
278
|
+
- ✅ Template mode IPC for button results
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## Notes
|
|
283
|
+
|
|
284
|
+
**Development Priority:**
|
|
285
|
+
1. File System API - Most important for platform apps
|
|
286
|
+
2. System Menu - Best UX alternative to keyboard shortcuts
|
|
287
|
+
3. Window Manipulation APIs - Nice to have, lower priority
|
|
288
|
+
4. Everything else - As time permits
|
|
289
|
+
|
|
290
|
+
**Testing Strategy:**
|
|
291
|
+
- Always test in both template mode and URL mode
|
|
292
|
+
- Verify file API security (--allowFs flag enforcement)
|
|
293
|
+
- Test on multi-monitor setups
|
|
294
|
+
- Create sample apps demonstrating new features
|
|
295
|
+
|
|
296
|
+
**Documentation Updates Required for Each Feature:**
|
|
297
|
+
- README.md - User-facing documentation
|
|
298
|
+
- SESSION-NOTES.md - Development notes
|
|
299
|
+
- MSGER-API-SUMMARY.md - API reference
|
|
300
|
+
- msgerdefs/README.md - TypeScript package docs
|
|
301
|
+
- Update msgerdefs TypeScript definitions
|
package/clihandler.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clihandler.d.ts","sourceRoot":"","sources":["clihandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA8FhD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,iBAAiB,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"clihandler.d.ts","sourceRoot":"","sources":["clihandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA8FhD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IAAE,OAAO,EAAE,iBAAiB,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CA2NpH;AAED,wBAAgB,QAAQ,IAAI,IAAI,CAE/B;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
|
package/clihandler.js
CHANGED
|
@@ -166,11 +166,13 @@ export function parseCliArgs(args) {
|
|
|
166
166
|
}
|
|
167
167
|
else if (arg === '-pos' || arg === '--pos') {
|
|
168
168
|
const pos = args[++i];
|
|
169
|
-
const
|
|
170
|
-
if (!isNaN(
|
|
171
|
-
cli.posX =
|
|
172
|
-
if (!isNaN(
|
|
173
|
-
cli.posY =
|
|
169
|
+
const parts = pos.split(',').map(s => parseInt(s.trim(), 10));
|
|
170
|
+
if (!isNaN(parts[0]))
|
|
171
|
+
cli.posX = parts[0];
|
|
172
|
+
if (!isNaN(parts[1]))
|
|
173
|
+
cli.posY = parts[1];
|
|
174
|
+
if (!isNaN(parts[2]))
|
|
175
|
+
cli.screen = parts[2]; // Optional third parameter
|
|
174
176
|
i++;
|
|
175
177
|
}
|
|
176
178
|
else if (arg === '-screen' || arg === '--screen') {
|
package/clihandler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clihandler.js","sourceRoot":"","sources":["clihandler.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,gBAAgB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC/D,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AA6BzC,MAAM,SAAS,GAAG;SACT,WAAW,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0D3B,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAc;IACvC,MAAM,GAAG,GAAe;QACpB,OAAO,EAAE,EAAE;QACX,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,KAAK;KACd,CAAC;IAEF,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACtE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;YAChB,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACnE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;YACnB,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACnD,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC/C,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC7C,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACrB,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACrD,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACzB,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAC3C,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACnD,iDAAiD;YACjD,CAAC,EAAE,CAAC;YACJ,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjD,GAAG,CAAC,OAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3B,CAAC,EAAE,CAAC;YACR,CAAC;QACL,CAAC;aAAM,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACzC,IAAI,CAAC,GAAG,CAAC,OAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,GAAG,CAAC,OAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YACD,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACjD,IAAI,CAAC,GAAG,CAAC,OAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnC,GAAG,CAAC,OAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;YACD,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC/C,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;YACjB,wDAAwD;YACxD,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtD,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,CAAC;YACD,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACnD,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YACnD,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACjD,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC;YAClB,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YACzD,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;YACtB,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,cAAc,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YACpG,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;YACvB,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACvB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC;gBAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC;gBAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;YACtB,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC7C,GAAG,CAAC,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACxC,CAAC,EAAE,CAAC;QACR,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,MAAM,
|
|
1
|
+
{"version":3,"file":"clihandler.js","sourceRoot":"","sources":["clihandler.ts"],"names":[],"mappings":"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"}
|
package/clihandler.ts
CHANGED
|
@@ -179,9 +179,10 @@ export function parseCliArgs(args: string[]): { options: MessageBoxOptions; show
|
|
|
179
179
|
i++;
|
|
180
180
|
} else if (arg === '-pos' || arg === '--pos') {
|
|
181
181
|
const pos = args[++i];
|
|
182
|
-
const
|
|
183
|
-
if (!isNaN(
|
|
184
|
-
if (!isNaN(
|
|
182
|
+
const parts = pos.split(',').map(s => parseInt(s.trim(), 10));
|
|
183
|
+
if (!isNaN(parts[0])) cli.posX = parts[0];
|
|
184
|
+
if (!isNaN(parts[1])) cli.posY = parts[1];
|
|
185
|
+
if (!isNaN(parts[2])) cli.screen = parts[2]; // Optional third parameter
|
|
185
186
|
i++;
|
|
186
187
|
} else if (arg === '-screen' || arg === '--screen') {
|
|
187
188
|
cli.screen = parseInt(args[++i], 10);
|
package/msger-native/Cargo.toml
CHANGED
|
Binary file
|
package/msger-native/src/main.rs
CHANGED
|
@@ -5,96 +5,56 @@ use tao::{
|
|
|
5
5
|
event_loop::{ControlFlow, EventLoop},
|
|
6
6
|
keyboard::KeyCode,
|
|
7
7
|
window::WindowBuilder,
|
|
8
|
+
platform::windows::WindowExtWindows,
|
|
8
9
|
};
|
|
9
10
|
use wry::{WebViewBuilder, WebContext};
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
12
|
+
#[cfg(windows)]
|
|
13
|
+
use windows::Win32::UI::WindowsAndMessaging::{
|
|
14
|
+
GetSystemMenu, AppendMenuW, MF_STRING, MF_SEPARATOR, WM_SYSCOMMAND,
|
|
15
|
+
};
|
|
16
|
+
#[cfg(windows)]
|
|
17
|
+
use windows::Win32::UI::Shell::{
|
|
18
|
+
SetWindowSubclass, DefSubclassProc,
|
|
19
|
+
};
|
|
20
|
+
#[cfg(windows)]
|
|
21
|
+
use windows::Win32::Foundation::{HWND, LPARAM, WPARAM, LRESULT};
|
|
22
|
+
#[cfg(windows)]
|
|
23
|
+
use windows::core::PCWSTR;
|
|
24
|
+
#[cfg(windows)]
|
|
25
|
+
use std::sync::atomic::{AtomicBool, Ordering};
|
|
26
|
+
|
|
27
|
+
// Custom menu ID for About item (must be < 0xF000 to avoid conflicts with system commands)
|
|
28
|
+
#[cfg(windows)]
|
|
29
|
+
const IDM_ABOUT: u32 = 0x1000;
|
|
30
|
+
|
|
31
|
+
// Global flag to signal About menu was clicked
|
|
32
|
+
#[cfg(windows)]
|
|
33
|
+
static ABOUT_CLICKED: AtomicBool = AtomicBool::new(false);
|
|
34
|
+
|
|
35
|
+
// Window subclass procedure to intercept WM_SYSCOMMAND
|
|
36
|
+
#[cfg(windows)]
|
|
37
|
+
unsafe extern "system" fn subclass_proc(
|
|
38
|
+
hwnd: HWND,
|
|
39
|
+
msg: u32,
|
|
40
|
+
wparam: WPARAM,
|
|
41
|
+
lparam: LPARAM,
|
|
42
|
+
_uidsubclass: usize,
|
|
43
|
+
_dwrefdata: usize,
|
|
44
|
+
) -> LRESULT {
|
|
45
|
+
if msg == WM_SYSCOMMAND {
|
|
46
|
+
let cmd = wparam.0 & 0xFFF0;
|
|
47
|
+
if cmd == IDM_ABOUT as usize {
|
|
48
|
+
// Set flag that About was clicked
|
|
49
|
+
ABOUT_CLICKED.store(true, Ordering::SeqCst);
|
|
50
|
+
return LRESULT(0);
|
|
32
51
|
}
|
|
33
52
|
}
|
|
53
|
+
DefSubclassProc(hwnd, msg, wparam, lparam)
|
|
54
|
+
}
|
|
34
55
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
close: function(result) {
|
|
38
|
-
// IPC is broken in wry 0.47.2, so we use window.close() instead
|
|
39
|
-
// Result cannot be returned to parent process
|
|
40
|
-
try {
|
|
41
|
-
window.close();
|
|
42
|
-
return true;
|
|
43
|
-
} catch(e) {
|
|
44
|
-
console.error('window.close() failed:', e);
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
saveData: function(key, value) {
|
|
49
|
-
try {
|
|
50
|
-
localStorage.setItem('msger_' + key, JSON.stringify(value));
|
|
51
|
-
return true;
|
|
52
|
-
} catch(e) {
|
|
53
|
-
console.error('Failed to save data:', e);
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
loadData: function(key, defaultValue) {
|
|
58
|
-
try {
|
|
59
|
-
const item = localStorage.getItem('msger_' + key);
|
|
60
|
-
return item ? JSON.parse(item) : defaultValue;
|
|
61
|
-
} catch(e) {
|
|
62
|
-
console.error('Failed to load data:', e);
|
|
63
|
-
return defaultValue;
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
removeData: function(key) {
|
|
67
|
-
try {
|
|
68
|
-
localStorage.removeItem('msger_' + key);
|
|
69
|
-
return true;
|
|
70
|
-
} catch(e) {
|
|
71
|
-
console.error('Failed to remove data:', e);
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
clearData: function() {
|
|
76
|
-
try {
|
|
77
|
-
const keys = Object.keys(localStorage);
|
|
78
|
-
for (const key of keys) {
|
|
79
|
-
if (key.startsWith('msger_')) {
|
|
80
|
-
localStorage.removeItem(key);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return true;
|
|
84
|
-
} catch(e) {
|
|
85
|
-
console.error('Failed to clear data:', e);
|
|
86
|
-
return false;
|
|
87
|
-
}
|
|
88
|
-
},
|
|
89
|
-
// Check if running in msger environment
|
|
90
|
-
isAvailable: function() {
|
|
91
|
-
return true;
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
console.log('[MSGER] API initialized successfully! window.msger =', window.msger);
|
|
96
|
-
})();
|
|
97
|
-
"#;
|
|
56
|
+
// JavaScript API to inject into webviews
|
|
57
|
+
const MSGER_JS_API: &str = include_str!("msger-api.js");
|
|
98
58
|
|
|
99
59
|
#[derive(Deserialize, Debug)]
|
|
100
60
|
#[serde(rename_all = "camelCase")]
|
|
@@ -295,7 +255,9 @@ fn main() {
|
|
|
295
255
|
|
|
296
256
|
// Calculate position with optional screen offset (Windows only)
|
|
297
257
|
let final_position = if let Some(ref pos) = options.pos {
|
|
258
|
+
#[cfg_attr(not(target_os = "windows"), allow(unused_mut))]
|
|
298
259
|
let mut x = pos.x;
|
|
260
|
+
#[cfg_attr(not(target_os = "windows"), allow(unused_mut))]
|
|
299
261
|
let mut y = pos.y;
|
|
300
262
|
|
|
301
263
|
// On Windows, get the actual monitor position if screen number provided
|
|
@@ -357,6 +319,22 @@ fn main() {
|
|
|
357
319
|
.build(&event_loop)
|
|
358
320
|
.expect("Failed to create window"));
|
|
359
321
|
|
|
322
|
+
// Add About item to Windows system menu and install subclass
|
|
323
|
+
#[cfg(windows)]
|
|
324
|
+
unsafe {
|
|
325
|
+
let hwnd = HWND(window.hwnd() as *mut _);
|
|
326
|
+
let hmenu = GetSystemMenu(hwnd, false);
|
|
327
|
+
if !hmenu.is_invalid() {
|
|
328
|
+
// Add separator
|
|
329
|
+
AppendMenuW(hmenu, MF_SEPARATOR, 0, PCWSTR::null()).ok();
|
|
330
|
+
// Add About item
|
|
331
|
+
let about_text: Vec<u16> = "About (Window Info)\0".encode_utf16().collect();
|
|
332
|
+
AppendMenuW(hmenu, MF_STRING, IDM_ABOUT as usize, PCWSTR(about_text.as_ptr())).ok();
|
|
333
|
+
}
|
|
334
|
+
// Install window subclass to intercept WM_SYSCOMMAND
|
|
335
|
+
SetWindowSubclass(hwnd, Some(subclass_proc), 1, 0).ok();
|
|
336
|
+
}
|
|
337
|
+
|
|
360
338
|
// Generate HTML
|
|
361
339
|
let html = generate_html(&options);
|
|
362
340
|
|
|
@@ -486,6 +464,55 @@ fn main() {
|
|
|
486
464
|
|
|
487
465
|
// Run event loop
|
|
488
466
|
event_loop.run(move |event, _,control_flow| {
|
|
467
|
+
// Check for About menu click
|
|
468
|
+
#[cfg(windows)]
|
|
469
|
+
if ABOUT_CLICKED.swap(false, Ordering::SeqCst) {
|
|
470
|
+
// Get window information
|
|
471
|
+
let position = window_clone.outer_position().unwrap_or_default();
|
|
472
|
+
let inner_size = window_clone.inner_size();
|
|
473
|
+
let outer_size = window_clone.outer_size();
|
|
474
|
+
let scale_factor = window_clone.scale_factor();
|
|
475
|
+
let is_maximized = window_clone.is_maximized();
|
|
476
|
+
let is_fullscreen = window_clone.fullscreen().is_some();
|
|
477
|
+
let is_always_on_top = window_clone.is_always_on_top();
|
|
478
|
+
|
|
479
|
+
// Calculate logical sizes (what you specify in the API)
|
|
480
|
+
let logical_inner_width = (inner_size.width as f64 / scale_factor) as i32;
|
|
481
|
+
let logical_inner_height = (inner_size.height as f64 / scale_factor) as i32;
|
|
482
|
+
let logical_outer_width = (outer_size.width as f64 / scale_factor) as i32;
|
|
483
|
+
let logical_outer_height = (outer_size.height as f64 / scale_factor) as i32;
|
|
484
|
+
|
|
485
|
+
let info = format!(
|
|
486
|
+
"Window Information\\n\\n\
|
|
487
|
+
Position: x={}, y={}\\n\\n\
|
|
488
|
+
Logical Size (API): {}x{} inner\\n\
|
|
489
|
+
Physical Size (Screen): {}x{} inner\\n\
|
|
490
|
+
Outer Size (Physical): {}x{}\\n\
|
|
491
|
+
Outer Size (Logical): {}x{}\\n\\n\
|
|
492
|
+
Scale Factor: {:.2} ({}% DPI)\\n\
|
|
493
|
+
Maximized: {}\\n\
|
|
494
|
+
Fullscreen: {}\\n\
|
|
495
|
+
Always On Top: {}\\n\\n\
|
|
496
|
+
Version: {}",
|
|
497
|
+
position.x, position.y,
|
|
498
|
+
logical_inner_width, logical_inner_height,
|
|
499
|
+
inner_size.width, inner_size.height,
|
|
500
|
+
outer_size.width, outer_size.height,
|
|
501
|
+
logical_outer_width, logical_outer_height,
|
|
502
|
+
scale_factor, (scale_factor * 100.0) as i32,
|
|
503
|
+
is_maximized,
|
|
504
|
+
is_fullscreen,
|
|
505
|
+
is_always_on_top,
|
|
506
|
+
env!("NPM_VERSION")
|
|
507
|
+
);
|
|
508
|
+
|
|
509
|
+
// Show the info in an alert
|
|
510
|
+
let script = format!("alert('{}')", info);
|
|
511
|
+
if let Err(e) = webview.evaluate_script(&script) {
|
|
512
|
+
eprintln!("Failed to show about dialog: {}", e);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
|
|
489
516
|
// Check timeout
|
|
490
517
|
if let Some(deadline) = timeout_instant {
|
|
491
518
|
if std::time::Instant::now() >= deadline {
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
(function() {
|
|
2
|
+
console.log('[MSGER] Initializing msger API...');
|
|
3
|
+
|
|
4
|
+
// Check if IPC is available
|
|
5
|
+
const hasIPC = typeof window.ipc !== 'undefined' && window.ipc.postMessage;
|
|
6
|
+
console.log('[MSGER] IPC available:', hasIPC);
|
|
7
|
+
|
|
8
|
+
// Helper to safely send IPC messages
|
|
9
|
+
function safePostMessage(data) {
|
|
10
|
+
try {
|
|
11
|
+
if (!hasIPC) {
|
|
12
|
+
console.error('msger API: window.ipc not available');
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
window.ipc.postMessage(JSON.stringify(data));
|
|
16
|
+
return true;
|
|
17
|
+
} catch(e) {
|
|
18
|
+
console.error('msger API error:', e);
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
window.msger = {
|
|
24
|
+
// Window control - only close() with window.close() workaround (IPC broken)
|
|
25
|
+
close: function(result) {
|
|
26
|
+
// IPC is broken in wry 0.47.2, so we use window.close() instead
|
|
27
|
+
// Result cannot be returned to parent process
|
|
28
|
+
try {
|
|
29
|
+
window.close();
|
|
30
|
+
return true;
|
|
31
|
+
} catch(e) {
|
|
32
|
+
console.error('window.close() failed:', e);
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
saveData: function(key, value) {
|
|
37
|
+
try {
|
|
38
|
+
localStorage.setItem('msger_' + key, JSON.stringify(value));
|
|
39
|
+
return true;
|
|
40
|
+
} catch(e) {
|
|
41
|
+
console.error('Failed to save data:', e);
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
loadData: function(key, defaultValue) {
|
|
46
|
+
try {
|
|
47
|
+
const item = localStorage.getItem('msger_' + key);
|
|
48
|
+
return item ? JSON.parse(item) : defaultValue;
|
|
49
|
+
} catch(e) {
|
|
50
|
+
console.error('Failed to load data:', e);
|
|
51
|
+
return defaultValue;
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
removeData: function(key) {
|
|
55
|
+
try {
|
|
56
|
+
localStorage.removeItem('msger_' + key);
|
|
57
|
+
return true;
|
|
58
|
+
} catch(e) {
|
|
59
|
+
console.error('Failed to remove data:', e);
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
clearData: function() {
|
|
64
|
+
try {
|
|
65
|
+
const keys = Object.keys(localStorage);
|
|
66
|
+
for (const key of keys) {
|
|
67
|
+
if (key.startsWith('msger_')) {
|
|
68
|
+
localStorage.removeItem(key);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
} catch(e) {
|
|
73
|
+
console.error('Failed to clear data:', e);
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
// Check if running in msger environment
|
|
78
|
+
isAvailable: function() {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
console.log('[MSGER] API initialized successfully! window.msger =', window.msger);
|
|
84
|
+
})();
|
package/msgernative-linux-x64
CHANGED
|
Binary file
|
package/package.json
CHANGED
package/shower.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shower.d.ts","sourceRoot":"","sources":["shower.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,iBAAiB;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,CAAW,uDAAuD;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,8EAA8E;IACxG,IAAI,CAAC,EAAE,MAAM,CAAC,CAAY,iDAAiD;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC,CAAa,0DAA0D;IAEpF,IAAI,CAAC,EAAE;QACH,KAAK,EAAE,MAAM,CAAC,CAAQ,mBAAmB;QACzC,MAAM,EAAE,MAAM,CAAC,CAAO,oBAAoB;KAC7C,CAAC;IACF,GAAG,CAAC,EAAE;QACF,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,MAAM,CAAC,EAAE,MAAM,CAAC,CAAM,8EAA8E;KACvG,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC,CAAK,0EAA0E;IACpG,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAO,kEAAkE;IAC5F,WAAW,CAAC,EAAE,OAAO,CAAC,CAAI,2DAA2D;IACrF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAO,0DAA0D;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC,CAAI,4DAA4D;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,wDAAwD;IACnF,UAAU,CAAC,EAAE,OAAO,CAAC,CAAK,gEAAgE;IAE1F,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,yDAAyD;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC,CAAS,0DAA0D;IACpF,UAAU,CAAC,EAAE,OAAO,CAAC,CAAK,sEAAsE;IAChG,IAAI,CAAC,EAAE,MAAM,CAAC,CAAY,6EAA6E;IACvG,GAAG,CAAC,EAAE,OAAO,CAAC,CAAY,8DAA8D;IACxF,KAAK,CAAC,EAAE,OAAO,CAAC,CAAU,uEAAuE;CACpG;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC;KACrB,CAAC;CACL;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"shower.d.ts","sourceRoot":"","sources":["shower.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,iBAAiB;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,CAAW,uDAAuD;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,8EAA8E;IACxG,IAAI,CAAC,EAAE,MAAM,CAAC,CAAY,iDAAiD;IAC3E,GAAG,CAAC,EAAE,MAAM,CAAC,CAAa,0DAA0D;IAEpF,IAAI,CAAC,EAAE;QACH,KAAK,EAAE,MAAM,CAAC,CAAQ,mBAAmB;QACzC,MAAM,EAAE,MAAM,CAAC,CAAO,oBAAoB;KAC7C,CAAC;IACF,GAAG,CAAC,EAAE;QACF,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,CAAC,EAAE,MAAM,CAAC,CAAY,kCAAkC;QACxD,MAAM,CAAC,EAAE,MAAM,CAAC,CAAM,8EAA8E;KACvG,CAAC;IACF,WAAW,CAAC,EAAE,MAAM,CAAC,CAAK,0EAA0E;IACpG,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAO,kEAAkE;IAC5F,WAAW,CAAC,EAAE,OAAO,CAAC,CAAI,2DAA2D;IACrF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAO,0DAA0D;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC,CAAI,4DAA4D;IACtF,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,wDAAwD;IACnF,UAAU,CAAC,EAAE,OAAO,CAAC,CAAK,gEAAgE;IAE1F,OAAO,CAAC,EAAE,MAAM,CAAC,CAAS,yDAAyD;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC,CAAS,0DAA0D;IACpF,UAAU,CAAC,EAAE,OAAO,CAAC,CAAK,sEAAsE;IAChG,IAAI,CAAC,EAAE,MAAM,CAAC,CAAY,6EAA6E;IACvG,GAAG,CAAC,EAAE,OAAO,CAAC,CAAY,8DAA8D;IACxF,KAAK,CAAC,EAAE,OAAO,CAAC,CAAU,uEAAuE;CACpG;AAED,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC;KACrB,CAAC;CACL;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4K1F"}
|
package/shower.js
CHANGED
|
@@ -49,8 +49,10 @@ export async function showMessageBox(options) {
|
|
|
49
49
|
if ('NODE_OPTIONS' in childEnv) {
|
|
50
50
|
delete childEnv.NODE_OPTIONS;
|
|
51
51
|
}
|
|
52
|
+
// When detached, use 'ignore' for stdout/stderr so parent can exit
|
|
53
|
+
// We only need stdin to send the options, not to receive results
|
|
52
54
|
const child = spawn(binaryPath, [], {
|
|
53
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
55
|
+
stdio: options.detach ? ['pipe', 'ignore', 'ignore'] : ['pipe', 'pipe', 'pipe'],
|
|
54
56
|
detached: options.detach || false,
|
|
55
57
|
env: childEnv
|
|
56
58
|
});
|
|
@@ -60,12 +62,12 @@ export async function showMessageBox(options) {
|
|
|
60
62
|
}
|
|
61
63
|
let stdout = '';
|
|
62
64
|
let stderr = '';
|
|
63
|
-
// Collect stdout
|
|
64
|
-
child.stdout
|
|
65
|
+
// Collect stdout (only if not detached)
|
|
66
|
+
child.stdout?.on('data', (data) => {
|
|
65
67
|
stdout += data.toString();
|
|
66
68
|
});
|
|
67
|
-
// Collect stderr
|
|
68
|
-
child.stderr
|
|
69
|
+
// Collect stderr (only if not detached)
|
|
70
|
+
child.stderr?.on('data', (data) => {
|
|
69
71
|
stderr += data.toString();
|
|
70
72
|
});
|
|
71
73
|
// Handle process completion
|
package/shower.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shower.js","sourceRoot":"","sources":["shower.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,UAAU,MAAM,cAAc,CAAC;AAiDtC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA0B;IAC3D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,SAAS,GAAG,QAAQ,EAAE,KAAK,OAAO,CAAC;QACzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAE1B,+DAA+D;QAC/D,IAAI,UAAkB,CAAC;QACvB,IAAI,SAAS,EAAE,CAAC;YACZ,UAAU,GAAG,iBAAiB,CAAC;QACnC,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,UAAU,GAAG,mBAAmB,CAAC;QACrC,CAAC;aAAM,CAAC;YACJ,UAAU,GAAG,aAAa,CAAC;QAC/B,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAErF,yBAAyB;QACzB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC,CAAC;YACrD,OAAO;QACX,CAAC;QAED,iDAAiD;QACjD,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,IAAI,CAAC;gBACD,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,KAAK,CACZ,6BAA6B,UAAU,IAAI;oBAC3C,6BAA6B,UAAU,EAAE,CAC5C,CAAC,CAAC;gBACH,OAAO;YACX,CAAC;QACL,CAAC;QAED,wBAAwB;QACxB,gEAAgE;QAChE,8DAA8D;QAC9D,2DAA2D;QAC3D,MAAM,QAAQ,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAyB,CAAC;QAC3D,IAAI,cAAc,IAAI,QAAQ,EAAE,CAAC;YAC7B,OAAO,QAAQ,CAAC,YAAY,CAAC;QACjC,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE;YAChC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/
|
|
1
|
+
{"version":3,"file":"shower.js","sourceRoot":"","sources":["shower.ts"],"names":[],"mappings":"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"}
|
package/shower.ts
CHANGED
|
@@ -102,8 +102,10 @@ export async function showMessageBox(options: MessageBoxOptions): Promise<Messag
|
|
|
102
102
|
delete childEnv.NODE_OPTIONS;
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
+
// When detached, use 'ignore' for stdout/stderr so parent can exit
|
|
106
|
+
// We only need stdin to send the options, not to receive results
|
|
105
107
|
const child = spawn(binaryPath, [], {
|
|
106
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
108
|
+
stdio: options.detach ? ['pipe', 'ignore', 'ignore'] : ['pipe', 'pipe', 'pipe'],
|
|
107
109
|
detached: options.detach || false,
|
|
108
110
|
env: childEnv
|
|
109
111
|
});
|
|
@@ -116,13 +118,13 @@ export async function showMessageBox(options: MessageBoxOptions): Promise<Messag
|
|
|
116
118
|
let stdout = '';
|
|
117
119
|
let stderr = '';
|
|
118
120
|
|
|
119
|
-
// Collect stdout
|
|
120
|
-
child.stdout
|
|
121
|
+
// Collect stdout (only if not detached)
|
|
122
|
+
child.stdout?.on('data', (data) => {
|
|
121
123
|
stdout += data.toString();
|
|
122
124
|
});
|
|
123
125
|
|
|
124
|
-
// Collect stderr
|
|
125
|
-
child.stderr
|
|
126
|
+
// Collect stderr (only if not detached)
|
|
127
|
+
child.stderr?.on('data', (data) => {
|
|
126
128
|
stderr += data.toString();
|
|
127
129
|
});
|
|
128
130
|
|