From 96b9f499b5c750518b4a7a5b510121379df847cf Mon Sep 17 00:00:00 2001 From: zenith391 <39484230+zenith391@users.noreply.github.com> Date: Sat, 3 Dec 2022 16:42:33 +0100 Subject: [PATCH] Have an Android executable build --- android/Sdk.zig | 4 ++ android/default_icon.png | Bin 0 -> 4812 bytes build_capy.zig | 10 ++- src/backend.zig | 8 ++- src/backends/android/backend.zig | 111 +++++++++++++++++++++++++++++++ src/backends/win32/win32.zig | 2 +- src/button.zig | 2 +- src/flat/button.zig | 7 +- 8 files changed, 136 insertions(+), 8 deletions(-) create mode 100644 android/default_icon.png create mode 100644 src/backends/android/backend.zig diff --git a/android/Sdk.zig b/android/Sdk.zig index c08dde0a..f95a5413 100644 --- a/android/Sdk.zig +++ b/android/Sdk.zig @@ -739,6 +739,10 @@ pub fn compileAppLibrary( exe.strip = (mode == .ReleaseSmall); exe.export_table = true; + // XXX: temporary! + // TODO: remove and fix __emutls_get_address problem instead + exe.single_threaded = true; + exe.defineCMacro("ANDROID", null); exe.linkLibC(); diff --git a/android/default_icon.png b/android/default_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7ea4bd87ea6b463338901e4dc0c9c496bdd46541 GIT binary patch literal 4812 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 @import("backends/win32/backend.zig"), .macos => @import("backends/macos/backend.zig"), - .linux, .freebsd => @import("backends/gtk/backend.zig"), + .linux, .freebsd => blk: { + if (builtin.target.isAndroid()) { + break :blk @import("backends/android/backend.zig"); + } else { + break :blk @import("backends/gtk/backend.zig"); + } + }, .freestanding => blk: { if (builtin.cpu.arch == .wasm32 or builtin.cpu.arch == .wasm64) { break :blk @import("backends/wasm/backend.zig"); diff --git a/src/backends/android/backend.zig b/src/backends/android/backend.zig new file mode 100644 index 00000000..d41dbbbb --- /dev/null +++ b/src/backends/android/backend.zig @@ -0,0 +1,111 @@ +const std = @import("std"); +const shared = @import("../shared.zig"); +const lib = @import("../../main.zig"); + +const EventFunctions = shared.EventFunctions(@This()); +const EventType = shared.BackendEventType; +const BackendError = shared.BackendError; +const MouseButton = shared.MouseButton; +//pub const PeerType = *c.GtkWidget; +pub const PeerType = *opaque {}; + +var activeWindows = std.atomic.Atomic(usize).init(0); +var hasInit: bool = false; + +pub fn init() BackendError!void { + if (!hasInit) { + hasInit = true; + } +} + +pub fn showNativeMessageDialog(msgType: shared.MessageType, comptime fmt: []const u8, args: anytype) void { + const msg = std.fmt.allocPrintZ(lib.internal.scratch_allocator, fmt, args) catch { + std.log.err("Could not launch message dialog, original text: " ++ fmt, args); + return; + }; + defer lib.internal.scratch_allocator.free(msg); + _ = msgType; + @panic("TODO: message dialogs on Android"); +} + +/// user data used for handling events +pub const EventUserData = struct { + user: EventFunctions = .{}, + class: EventFunctions = .{}, + userdata: usize = 0, + classUserdata: usize = 0, + peer: PeerType, + focusOnClick: bool = false, +}; + +pub inline fn getEventUserData(peer: PeerType) *EventUserData { + _ = peer; + //return @ptrCast(*EventUserData, @alignCast(@alignOf(EventUserData), c.g_object_get_data(@ptrCast(*c.GObject, peer), "eventUserData").?)); +} + +pub fn Events(comptime T: type) type { + _ = T; + return struct {}; +} + +pub const Window = struct { + source_dpi: u32 = 96, + scale: f32 = 1.0, + + pub usingnamespace Events(Window); + + pub fn create() BackendError!Window { + return Window{}; + } + + pub fn resize(self: *Window, width: c_int, height: c_int) void { + _ = self; + _ = width; + _ = height; + } + + pub fn setTitle(self: *Window, title: [*:0]const u8) void { + _ = self; + _ = title; + } + + pub fn setChild(self: *Window, peer: ?PeerType) void { + _ = self; + _ = peer; + } + + pub fn setSourceDpi(self: *Window, dpi: u32) void { + self.source_dpi = 96; + // TODO + const resolution = @as(f32, 96.0); + self.scale = resolution / @intToFloat(f32, dpi); + } + + pub fn show(self: *Window) void { + _ = self; + _ = activeWindows.fetchAdd(1, .Release); + } + + pub fn close(self: *Window) void { + _ = self; + @panic("TODO: close window"); + } +}; + +pub fn postEmptyEvent() void { + @panic("TODO: postEmptyEvent"); +} + +pub fn runStep(step: shared.EventLoopStep) bool { + _ = step; + return activeWindows.load(.Acquire) != 0; +} + +pub const backendExport = struct { + pub fn panic(msg: []const u8, _: ?*std.builtin.StackTrace, _: ?usize) noreturn { + _ = msg; + + @breakpoint(); + unreachable; + } +}; diff --git a/src/backends/win32/win32.zig b/src/backends/win32/win32.zig index 4a751767..8e5310da 100644 --- a/src/backends/win32/win32.zig +++ b/src/backends/win32/win32.zig @@ -327,7 +327,7 @@ pub const SB_BOTH = 3; pub const SW_INVALIDATE = 0x0002; pub extern "comctl32" fn GetScrollInfo(hWnd: HWND, nBar: c_int, lpsi: *SCROLLINFO) callconv(WINAPI) BOOL; -pub extern "comctl32" fn SetScrollInfo(hWnd: HWND, nBar: c_int, lpsi: *const SCROLLINFO, redraw: BOOL) callconv(WINAPI) c_int; +pub extern "comctl32" fn SetScrollInfo(hWnd: HWND, nBar: c_int, lpsi: *const SCROLLINFO, redraw: BOOL) callconv(WINAPI) c_int; pub extern "comctl32" fn EnableScrollBar(hWnd: HWND, wSBflags: UINT, wArrows: UINT) callconv(WINAPI) BOOL; pub extern "comctl32" fn ScrollWindowEx(hWnd: HWND, dx: c_int, dy: c_int, prcScroll: ?*const RECT, prcClip: ?*const RECT, hrgnUpdate: ?HRGN, prcUpdate: ?LPRECT, flags: UINT) callconv(WINAPI) c_int; diff --git a/src/button.zig b/src/button.zig index 6234af12..61ecb099 100644 --- a/src/button.zig +++ b/src/button.zig @@ -36,7 +36,7 @@ pub const Button_Impl = struct { if (self.peer == null) { self.peer = try backend.Button.create(); self.peer.?.setEnabled(self.enabled.get()); - + self.peer.?.setLabel(self.label.get()); try self.show_events(); _ = try self.enabled.addChangeListener(.{ .function = wrapperEnabledChanged, .userdata = @ptrToInt(&self.peer) }); diff --git a/src/flat/button.zig b/src/flat/button.zig index 52e1cb9a..e80a67ce 100644 --- a/src/flat/button.zig +++ b/src/flat/button.zig @@ -28,8 +28,11 @@ pub const FlatButton = struct { const width = @intCast(u32, backend.getWidthFromPeer(events.peer)); const height = @intCast(u32, backend.getHeightFromPeer(events.peer)); - if (self.enabled) { ctx.setColor(0.8, 0.8, 0.8); } - else { ctx.setColor(0.7, 0.7, 0.7); } + if (self.enabled) { + ctx.setColor(0.8, 0.8, 0.8); + } else { + ctx.setColor(0.7, 0.7, 0.7); + } ctx.rectangle(0, 0, width, height); ctx.fill();