Skip to content

Commit 2c00880

Browse files
Add Platform.System.os_description/0 for backend-safe OS info
Replace direct :wx_misc.getOsDescription/0 usage so apps can read a device/OS description on Wx, Json/mobile bridge, and Browser backends without depending on the Hex Bridge GenServer. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 6c51d13 commit 2c00880

12 files changed

Lines changed: 64 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
- Optional `config :desktop, :backend, :auto | :wx | :json | :browser` override
99
- Menu adapters: `Desktop.Menu.Adapter.Json` and `Desktop.Menu.Adapter.Browser`
1010
- Public `Desktop.*` APIs unchanged (`Desktop.Window`, `Desktop.Env`, `Desktop.Menu`, etc.)
11+
- `Desktop.Platform.System.os_description/0` — backend-safe replacement for `:wx_misc.getOsDescription/0` (Wx, Json bridge, Browser)
1112
- Test suite: `mix test.fast`, `xvfb-run mix test.wx`, `mix test.guard` — see `docs/TEST_PLAN.md`
1213
- Compile without OTP `:wx`: conditional `erl_src_paths` and `Desktop.Wx` fallbacks (no `wx.hrl` required)
1314

guides/faq.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ Inspect what the active backend supports:
4848
```elixir
4949
Desktop.Platform.backend() # e.g. Desktop.Backend.Wx
5050
Desktop.Platform.capabilities() # %{window: true, content: :webview, ...}
51+
Desktop.Platform.System.locale()
52+
Desktop.Platform.System.os_description() # replaces :wx_misc.getOsDescription/0
5153
```
5254

5355
| Backend | `window` | `content` | `menu` |

lib/desktop/backend/browser.ex

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ defmodule Desktop.Backend.Browser do
4545
@impl true
4646
def open_external_url(url), do: Desktop.Impl.HostBrowser.open(url)
4747

48+
@impl true
49+
def os_description, do: nil
50+
4851
@impl true
4952
def activate_event_active?(_event), do: true
5053

lib/desktop/backend/json.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ defmodule Desktop.Backend.Json do
7777
:ok
7878
end
7979

80+
@impl true
81+
def os_description do
82+
Protocol.call(:wx_misc, :getOsDescription, [])
83+
end
84+
8085
@impl true
8186
def activate_event_active?(_event), do: true
8287

lib/desktop/backend/wx.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ defmodule Desktop.Backend.Wx do
7575
end
7676
end
7777

78+
@impl true
79+
def os_description do
80+
Null.wx_call(:wx_misc, :getOsDescription, [])
81+
end
82+
7883
@impl true
7984
def activate_event_active?(event) do
8085
if function_exported?(:wxActivateEvent, :getActive, 1) do

lib/desktop/bridge/mock.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ defmodule Desktop.Bridge.Mock do
1414
def handle_method([:wx, :getObjectType, [arg]]), do: Keyword.get(arg, :type)
1515
def handle_method([:wxLocale | _]), do: ~c"en"
1616
def handle_method([:wx_misc, :launchDefaultBrowser | _]), do: :ok
17+
def handle_method([:wx_misc, :getOsDescription | _]), do: ~c"Mock OS"
1718

1819
def handle_method([type, :new | args]),
1920
do: [id: System.unique_integer([:positive]), type: type, args: args]

lib/desktop/platform/system.ex

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ defmodule Desktop.Platform.System do
1717
term()
1818
@callback wx_available?() :: boolean()
1919
@callback open_external_url(String.t()) :: :ok
20+
@callback os_description() :: String.t() | charlist() | nil
2021
@callback activate_event_active?(event :: term()) :: boolean()
2122

2223
def init_env, do: impl().init_env()
@@ -32,6 +33,33 @@ defmodule Desktop.Platform.System do
3233
def wx_available?, do: impl().wx_available?()
3334
def open_external_url(url), do: Helpers.with_wx_env(fn -> impl().open_external_url(url) end)
3435

36+
@doc """
37+
Returns a human-readable OS / device description string.
38+
39+
Replaces direct `:wx_misc.getOsDescription/0` calls so apps work on all
40+
backends (Wx, Json/mobile bridge, Browser). Returns `nil` when unavailable.
41+
"""
42+
def os_description do
43+
Helpers.with_wx_env(fn ->
44+
case impl().os_description() do
45+
nil -> nil
46+
desc when is_list(desc) -> List.to_string(desc)
47+
desc when is_binary(desc) -> desc
48+
_ -> nil
49+
end
50+
end)
51+
|> case do
52+
nil ->
53+
nil
54+
55+
str ->
56+
case String.trim(str) do
57+
"" -> nil
58+
other -> other
59+
end
60+
end
61+
end
62+
3563
def activate_event_active?(event),
3664
do: Helpers.with_wx_env(fn -> impl().activate_event_active?(event) end)
3765

test/desktop/backend/browser_test.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ defmodule Desktop.Backend.BrowserTest do
3737
assert :ok = Browser.set_env(nil)
3838
assert Browser.get_env() == nil
3939
assert Browser.locale() == nil
40+
assert Browser.os_description() == nil
4041
refute Browser.wx_available?()
4142
end
4243
end

test/desktop/backend/json_test.exs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ defmodule Desktop.Backend.JsonTest do
2727
assert Json.locale() == "en"
2828
end
2929

30+
test "T-JSN: os_description via bridge RPC" do
31+
assert Json.os_description() == ~c"Mock OS"
32+
assert Desktop.Platform.System.os_description() == "Mock OS"
33+
end
34+
3035
test "T-JSN: new frame handle shape" do
3136
wx = Transport.ensure_started()
3237

test/desktop/backend/wx_test.exs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,9 @@ defmodule Desktop.Backend.WxTest do
3939
result = Wx.locale()
4040
assert result == nil or is_binary(result)
4141
end
42+
43+
test "T-WX: os_description via Platform.System" do
44+
result = Desktop.Platform.System.os_description()
45+
assert result == nil or is_binary(result)
46+
end
4247
end

0 commit comments

Comments
 (0)