Commit graph

169 commits

Author SHA1 Message Date
Admin
9cf7fbb8b7 new merge script 2026-02-26 10:08:25 +01:00
offline-ant
2631876982
Add cross-platform window icon support (#877)
Add WindowIcon and WindowIconBuffer types to platform/src/window.rs with
RGBA8 pixel buffer data. Embed a default 64x64 Makepad icon generated at
runtime (dark rounded rect with white M glyph).

Platform backends:

- Windows: CreateIcon from RGBA->BGRA data, set on WNDCLASSEXW.hIcon
- X11: XChangeProperty with _NET_WM_ICON atom (RGBA->ARGB u32 array)
- macOS: NSBitmapImageRep + NSImage, setApplicationIconImage on NSApp
- Wayland: vendor xdg-toplevel-icon-v1 protocol, regenerate bindings,
  bind wl_shm + xdg_toplevel_icon_manager_v1 globals, create shm buffer
  icon when compositor supports it, silent fallback to app_id otherwise.
  Use configurable create_app_id field (default "Makepad").

Codegen: extend tools/wayland_codegen to generate xdg toplevel_icon
bindings into libs/linux/wayland-protocols/src/xdg.rs.

Co-authored-by: ant <ant@offline.click>
2026-02-24 17:30:43 +01:00
Admin
81c3dc5dd9 fix android sdk install issues 2026-02-24 17:06:21 +01:00
Admin
f37bb78aaf fix linux 2026-02-24 16:49:11 +01:00
Admin
35f01b85a0 ssl sockets 2026-02-24 16:28:21 +01:00
Admin
7816d8da43 network refactor 2026-02-24 14:04:37 +01:00
Admin
ca17ee8baa splice out a makepad-network crate 2026-02-23 23:21:31 +01:00
Admin
1b38aad46f tunnel 2026-02-23 16:55:20 +01:00
Admin
00c64eb965 message refactor
;
2026-02-23 16:46:48 +01:00
Julián Montes de Oca
6bc8fde866
Video Widget: Support on MacOS & iOS (#863)
* Add macOS video playback support using AVPlayer + CVMetalTextureCache

Extends the Video widget from Android-only to also support macOS with
hardware-accelerated, zero-copy video rendering through Metal. Uses
AVPlayer for decoding and CVMetalTextureCache to map decoded frames
directly to MTLTextures without CPU copies.

Key changes:
- New AppleVideoPlayer module (AVPlayer + CVPixelBuffer → MTLTexture pipeline)
- FFI bindings for CVMetalTextureCache, CMTime, and related Apple APIs
- Video frame polling integrated into macOS paint cycle
- TextureFormat::VideoRGB ungated from Android-only to all platforms
- Video widget made cross-platform (TextureHandleReady wait is Android-only)
- Fixed shader aspect ratio bug (&&→|| for non-positive dimension check)
- Added video demo to uizoo and scratchpad examples

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Add iOS video playback support

* Enhance video playback functionality with seek support and current position tracking

Key changes:
- Added `seek_video_playback` operation to allow seeking to specific timestamps.
- Introduced `current_position_ms` field in `VideoTextureUpdatedEvent` for tracking playback position.
- Implemented seeking functionality across iOS, macOS, and Android platforms.
- Updated Video widget to support new controls and indicators for seeking.

* Improve error handling for unsupported texture pixel formats

* Make volume icon drawing  use fixed width

* Make play/pause drawing use fixed width

* Remove video from scratchpad

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 15:19:21 +01:00
offline-ant
209c660226
Fix some build issues + upgrade android to r28 ndk. (#862)
* fix: add **/* glob to Linux NDK unzip to match subdirectories

`*` alone doesn't match `/` on Linux unzip builds with WILD_STOP_AT_DIR,
causing only top-level files to be extracted. Adding `**/*` ensures bin/,
lib64/, sysroot/ subdirectories are included.

* Auto-bundle NDK shared library deps (e.g. libc++_shared.so) into APK

When libmakepad.so has NEEDED entries for shared libraries provided by
the NDK sysroot (like libc++_shared.so from C++ dependencies), those
libraries were not being included in the APK, causing runtime dlopen
failures on device.

Add bundle_ndk_shared_deps() which uses the NDK's llvm-readelf to scan
libmakepad.so for NEEDED entries, then copies any matching .so files
from the NDK sysroot base lib dir into the APK. System libraries
(present in the API-level subdirectory) are excluded since they are
provided by the Android OS at runtime.

The detection is general-purpose and not hardcoded to any specific
library name.

* fix: make SYS_GETTID arch-conditional (186 on x86_64, 178 on aarch64)

The constant was hardcoded to 178 (correct for aarch64 but maps to
query_module on x86_64), causing Android's seccomp filter to kill the
process immediately on x86_64 emulators.

* Upgrade Android NDK from r25 to r28, fix x86_64 seccomp crash

cargo_makepad:
- sdk.rs: NDK version 25.2.9519653 → 28.2.13676358, download URLs r25c → r28b
- sdk.rs: Update NDK_IN extract paths for all platforms (Windows, macOS, Linux)
- sdk.rs: macOS NDK extraction is now host-aware (darwin-aarch64 for Apple Silicon)
- compile.rs: MacosAarch64 uses native darwin-aarch64 prebuilt (no more Rosetta)
- compile.rs: ndk_prebuilt_dir() split for MacosX64 vs MacosAarch64

platform:
- libc_sys.rs: Make SYS_GETTID arch-conditional (186 on x86_64, 178 on aarch64)
  Was hardcoded to 178 which maps to query_module on x86_64, causing
  Android seccomp to kill the process on x86_64 emulators
- android.rs: Add pub display field on CxOs, pub make_current() on CxAndroidDisplay
  for Servo embedding support

* Fix GLSL struct constructor crash on Android GLES drivers

The r28 script-based shader backend (shader_glsl.rs) generates GLSL
struct constructor syntax in the vertex/fragment main() unpack code,
e.g.: vb_geom = QuadVertex(vec2(packed_geometry_0.x, ...));

Some GLES drivers (notably Android emulator ANGLE/SwiftShader) reject
this with 'Structure constructor arguments do not match structure
fields', even though it's valid per the GLES 3.0 spec.

This is a regression from r28. The old r25 shader compiler
(generate_glsl.rs) used VarUnpacker::unpack_var which generated direct
swizzle assignments (vb_geom.xy = packed_geometry_0.xy), never struct
constructors in the unpack path. The r25 branch is not affected.

Fix: generate per-sub-field assignments for struct-typed variables in
the main() geometry/instance/varying unpack code, matching the r25
behavior. Struct constructors in user shader function bodies are
unaffected.

* fix(android): Proper fullscreen support on API 30+ and FullscreenWindow/NormalizeWindow ops

Android platform changes:
- Add CxOsOp::FullscreenWindow handler: sets os.fullscreen flag and calls JNI setFullScreen
- Add CxOsOp::NormalizeWindow handler: clears os.fullscreen and exits fullscreen

MakepadActivity.java:
- onCreate: On API 30+, switch from legacy Theme.NoTitleBar.Fullscreen to
  Theme_DeviceDefault_NoActionBar to avoid FLAG_FULLSCREEN conflict
- onCreate: Call setDecorFitsSystemWindows(false) and set
  LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS before setContentView so SurfaceView
  is laid out at y=0 from the start
- Refactor setFullScreen into applyFullScreen with proper WindowInsetsController
  API on API 30+ (hide/show statusBars + navigationBars)
- Legacy path (pre-API 30) uses full immersive sticky flags
- ResizingLayout.onApplyWindowInsets: Return WindowInsets.CONSUMED to prevent
  system bar insets from offsetting child SurfaceView

* Fix Android touch radius DPI scaling and revert aggressive fullscreen inset handling

- Divide touch.radius by dpi_factor alongside touch.abs for correct touch sizing
- Return insets instead of consuming them in ResizingLayout so child views get proper insets
- Remove premature setDecorFitsSystemWindows/cutout mode override; let apps opt in via FullscreenWindow

* Make DrawImage image_scale/image_pan fields pub

Needed by external crates (e.g. servo makepad_shell) that create custom
widgets using DrawImage and need to flip the Y axis for GL render textures.

---------

Co-authored-by: ant <ant@offline.click>
2026-02-21 10:30:56 +01:00
Admin
74059d928c drawcall fixing 2026-02-21 06:50:39 +01:00
Admin
909dafcaab font change 2026-02-19 15:36:56 +01:00
Admin
a5510b3f53 ui proto 2026-02-18 21:10:25 +01:00
Admin
d8967385bc fix 2026-02-17 19:25:31 +01:00
Admin
cb55db99cb windows 2026-02-16 22:00:26 +01:00
Admin
90dfde084c ios support 2026-02-16 10:57:27 +01:00
Kevin Boos
26b1d49e53
cargo_makepad: return actual error code instead of silent failure (#854)
This ensures that if an error occurs in a `cargo makepad` invocation,
the `cargo makepad` binary will actually return an error
(and importantly, an error exit code) instead of returning a success
exit code of `0` in all cases.
This allows CI passes and automated testing to work as normal.

Extra: cleaned up "show help" output
2026-02-16 07:20:47 +01:00
Admin
bf6ba654bd web almost there 2026-02-14 22:46:32 +01:00
Admin
1db3ff2d08 webGL2 2026-02-14 22:07:26 +01:00
Admin
fa98587e89 linux 2026-02-14 18:07:21 +01:00
Admin
8a60aee681 x11 working 2026-02-14 16:53:27 +01:00
Admin
7969fd4ee1 fix 2026-02-14 15:12:37 +01:00
Admin
d27ab1e1f6 windows terminal 2026-02-14 14:23:07 +01:00
Admin
1cdc947ecb windows runs! 2026-02-14 13:59:45 +01:00
Admin
5fb238f0b1 windows runs! 2026-02-14 13:43:44 +01:00
Admin
641c367e89 fix remote 2026-02-14 12:52:33 +01:00
Admin
e72fce3c55 fix 2026-02-14 12:42:11 +01:00
Admin
4524c8e90a windows otw 2026-02-14 12:32:53 +01:00
Admin
3a0691697d windows otw 2026-02-14 12:28:02 +01:00
Admin
8e84ba7f56 windowsrs vendored 2026-02-14 12:27:38 +01:00
Admin
35e2b31dce vendored windows 2026-02-14 11:54:41 +01:00
Admin
e121a1d7b2 windows rs strip 2026-02-14 11:32:16 +01:00
Admin
1ba7b2f7fe First 2.0 2026-02-12 14:52:33 +01:00
Admin
af7d507488 compile 2026-02-10 18:26:51 +01:00
Julián Montes de Oca
9e53e13d68
IME: Support on Android and Input Configuration (#839)
* WIP

* Improvements for cursor control

* Enhance text selection and key event handling for Samsung keyboard compatibility

* Default to multine inputtype in android

* WIP Input configurations

* Enhance iOS text input handling

* Cleanup

* Comment out 'Next' variant across platforms for future implementation.

* Rename IME Config API to match web APIs

* Fix Android emoji deletion by implementing UTF-16 code unit index conversion

* Proper ASCII-only input and improve iOS keyboard handling

* Replace 'is_numeric_only' with 'input_mode'

* Prevent pasting invalid characters

* Cleanup

* Cleanup

* Hide clipboard actions on text change

* Cleanup

* Unify keyboard event types and fix iOS text input regressions

Unified TextInputEvent with new fields for better IME support across platforms:
- Added `composition` field for IME preview ranges (CJKinput)
- Added `full_state_sync` for complete buffer state (Android approach)
- Added `replace_range` for autocorrect/suggestion replacements (iOS approach)

All platforms: Standardized on CharOffset for character position handling

* Prevent text synchronization with the platform during active composition

* Add UITextInputCurrentInputModeDidChangeNotification support

* Add underline for active IME composition in TextInput

* Improve editor action handling for multiline inputs on Android

* Enhance IME composition tracking and clipboard action handling in TextInput

* Simplify IME state handling on Android

* Cleanup IME handling on iOS

* Cleanup

* Cleanup IME handling on iOS

* Improve docs/comments

* Improve docs/comments

* Add floating cursor support for keyboard trackpad in iOS

* Refine IME handling in TextInput to prevent iOS buffer loss during composition updates

* Move UITextInput protocol implementation into its own module

* Move MakepadInputConnection into its own file

* Cleanup

* Improve general IME handling in TextInput. Improve docs and comments

* Refactor text input configuration to separate soft keyboard settings for mobile platforms.
2026-02-02 11:48:21 +01:00
Admin
ebfdfb9d24 remove warning 2026-01-13 16:37:10 +01:00
Admin
65883107fd fix new httpserverrequest type 2026-01-09 08:09:21 +01:00
Kevin Boos
ce22d7af3a
Quick hotfix to make cargo-makepad build again (#837) 2026-01-09 08:06:00 +01:00
wyenox
ba19892a93
Fix various issues in cargo makepad wasm (#826)
* Fix `Uncaught ReferenceError: env is not defined`

at bindgen.js: const imports = __wbg_get_imports(); imports.env = env;

at (index): let wasm = await init({module_or_path: module}, env);

* fix `Uncaught DOMException: WebAssembly.Memory object could not be cloned.`

at web.js:         worker.postMessage(this.alloc_thread_stack(args.context_ptr, args.timer));

* add missing rustc flags to enable threading

* allow cargo makepad in linux arm

* debugs

* don't color cargo tree

* remove debug prints

* remove unsupported os handling that didn't exist before
2026-01-05 15:14:29 +01:00
Julián Montes de Oca
619dec61c4
Android: Implement ShowClipboardActions with native ActionMode (#821)
Cx API:
- Implement existing ShowClipboardActions
- Add HideClipboardActions
- Cross-platform API ready for iOS implementation

Android Implementation:
- Native ActionMode integration with floating toolbar (API 23+)
- JNI bindings for showing/hiding menu and handling clipboard actions
- Event system for Copy/Cut/Paste/Select All actions
- Smart menu state management based on selection and clipboard

TextInput Integration:
- Long press selects word and shows menu
- Double tap and long press selects word and shows menu
- Selection preservation when tapping selected text
2025-11-22 10:06:05 +01:00
Kevin Boos
39cd6bb06d
Ensure that LongPress (LongClick) on Android properly tracks touch movement (#820)
* Ensure that LongPress (LongClick) on Android properly uses touch slop

Previously, we assumed that multiple touch action events would occur
before a LongClick, but that is not necessarily true.
It is possible to just have one down touch immediately followed by a
LongClick, so we now account for that.

This also fixes the tracking of touch event locations such that
stale values aren't accidentally used when calculating if a finger movement
exceeded the allowable touch slop for considering a touch as a long press.
(Rust would've caught that... thanks Java)

* remove excess log stmt
2025-11-15 09:31:17 +01:00
Admin
2176889023 Fused Id and LiveId 2025-10-25 20:53:30 +02:00
Julián Montes de Oca
c659a7da56
Add audio input permission handling and example project (#792)
* Add permission handling for audio input

- Introduced `CheckPermission` and `RequestPermission` operations in `CxOsOp` for managing audio input permissions.
- Implemented permission status checks and requests across iOS, macOS, and Android.
- Added a new `Permission` module to define permission types and statuses.
- Updated event handling to include permission results in the event system.
- Updated manifest files to include necessary permissions for audio input on Android.

* Add audio example project

- Added a new example project for audio processing and permission handling
- Implemented UI components for audio device selection, microphone capture, and playback controls.
- Integrated permission handling for audio input and updated the workspace configuration to include the new example.

* Implement audio permission in Web, catch up Linux and Windows

* Refactor iOS permission handling to avoid ios_app re-entrancy

* Implement iOS mic capture and add sample rate to AudioInfo

* Ensure iOS audio output uses loudspeaker, only when not using external devices

* Enhance audio example by handling sample rates and resampling
2025-10-25 19:15:57 +02:00
Admin
9568059be3 aistream 2025-09-09 21:27:28 +02:00
Admin
97a224befb fix cargo makepad quest missing font 2025-07-14 11:36:00 +02:00
Kevin Boos
3b5c73b028
Fix iOS Info.plist to use canonical version strings. Add location permissions. (#778) 2025-07-08 19:57:51 +02:00
Julián Montes de Oca
432dd2207a
Implement data directory handling for mobile platforms (#769)
- Add `get_data_dir` method to `CxOsApi` for retrieving writable data directory paths on mobile platforms.
2025-06-20 20:48:48 +02:00
Kevin Boos
8d34458302
Allow users of TextInput to know when a keypress had no effect (#767)
* Allow users of `TextInput` to know when a keypress had no effect

This PR makes the `TextInput` widget emit a `TextInputAction::KeyDownUnhandled`
action upon keypresses that don't actually make any change to the widget's selection.

This action is currently only emitted for the Up, Down, Left, and Right arrow keys,
but we can certainly add it to others like Backspace, Delete, etc if desired.

Use case: if you want to enable custom behavior when the user uses arrow keys
to navigate an empty TextInput widget, such as jumping up out of the TextInput focus
to edit the most recent message you just sent in a chat app, then this PR
is necessary. Otherwise there's no way to know whether a given input actually had
any effect on the TextInput's inner cursor/selection state.

* Add the FaceID usage description to iOS Info.plist

Allows Makepad apps to use biometric auth on iOS
2025-06-20 20:48:06 +02:00
Kevin Boos
ea18528d4d
Restore overwritten change in internal makepad-android-state library (#763)
* Add `Dock::replace_tab()`: change the inner widget content of a tab
without having to remove and recreate the actual tab itself.

* Fix StackNavigation to forward non-visibility events to all subviews

* Allow saving/restoring the state of the `TextInput` widget

This redoes the changes introduced in #533, but modified for the new version of TextInput

* Add KeyModifiers parameter to `TextInputAction::Returned`

* Fix bug in text centering

* Properly restore the state of the TextInput

* undo version bumps for `makepad-android-state` and `makepad-jni-sys`

---------

Co-authored-by: Eddy Bruel <me@eddybruel.com>
2025-05-29 17:38:43 +02:00