Skip to content

Commit

Permalink
fix: use structs for functions with long arguments list due to ABI in…
Browse files Browse the repository at this point in the history
…compatibility issues on Apple Silicon
  • Loading branch information
vyfor committed May 1, 2024
1 parent 56bf36f commit d8e2387
Show file tree
Hide file tree
Showing 3 changed files with 138 additions and 102 deletions.
78 changes: 52 additions & 26 deletions lua/cord.lua
Original file line number Diff line number Diff line change
Expand Up @@ -65,26 +65,28 @@ local is_blacklisted

local function connect(config)
discord.init(
config.editor.client,
config.editor.image,
config.editor.tooltip,
config.idle.text,
config.idle.tooltip,
config.text.viewing,
config.text.editing,
config.text.file_browser,
config.text.plugin_manager,
config.text.lsp_manager,
config.text.workspace,
vim.fn.getcwd(),
ffi.new('InitArgs',
config.editor.client,
config.editor.image,
config.editor.tooltip,
config.idle.text,
config.idle.tooltip,
config.text.viewing,
config.text.editing,
config.text.file_browser,
config.text.plugin_manager,
config.text.lsp_manager,
config.text.workspace,
vim.fn.getcwd(),
config.display.swap_fields
),
config.display.show_repository and ffi.new(
'Buttons',
(config.buttons[1] and config.buttons[1].label) or '',
(config.buttons[1] and config.buttons[1].url) or '',
(config.buttons[2] and config.buttons[2].label) or '',
(config.buttons[2] and config.buttons[2].url) or ''
) or nil,
config.display.swap_fields
) or nil
)
end

Expand All @@ -108,7 +110,16 @@ local function update_idle_presence(config)
if config.timer.reset_on_idle then
discord.update_time()
end
discord.update_presence('', 'Cord.idle', false, nil, 0)
discord.update_presence(
ffi.new(
'PresenceArgs',
'',
'Cord.idle',
0,
nil,
false
)
)
return true
end

Expand All @@ -120,7 +131,16 @@ local function update_idle_presence(config)
if config.display.show_time and config.timer.reset_on_idle then
discord.update_time()
end
discord.update_presence('', 'Cord.idle', false, nil, 0)
discord.update_presence(
ffi.new(
'PresenceArgs',
'',
'Cord.idle',
0,
nil,
false
)
)
return true
end
return false
Expand Down Expand Up @@ -162,23 +182,29 @@ local function update_presence(config, initial)
local success
if icon then
success = discord.update_presence_with_assets(
current_presence.name,
current_presence.type,
icon.name or name,
type(icon) == 'string' and icon or icon.icon,
icon.tooltip,
icon.type or 0,
current_presence.readonly,
cursor_pos,
problem_count
ffi.new(
'PresenceArgs',
current_presence.name,
current_presence.type,
cursor_pos,
problem_count,
current_presence.readonly
)
)
else
success = discord.update_presence(
current_presence.name,
current_presence.type,
current_presence.readonly,
cursor_pos,
problem_count
ffi.new(
'PresenceArgs',
current_presence.name,
current_presence.type,
cursor_pos,
problem_count,
current_presence.readonly
)
)
end
if success then
Expand Down
50 changes: 26 additions & 24 deletions lua/cord/utils.lua
Original file line number Diff line number Diff line change
Expand Up @@ -32,45 +32,47 @@ local function init_discord(ffi)
end

ffi.cdef[[
typedef struct {
const char* client;
const char* image;
const char* editor_tooltip;
const char* idle_text;
const char* idle_tooltip;
const char* viewing_text;
const char* editing_text;
const char* file_browser_text;
const char* plugin_manager_text;
const char* lsp_manager_text;
const char* workspace_text;
const char* initial_path;
const bool swap;
} InitArgs;
typedef struct {
const char* filename;
const char* filetype;
const char* cursor_position;
int problem_count;
bool is_read_only;
} PresenceArgs;
typedef struct {
const char* first_label;
const char* first_url;
const char* second_label;
const char* second_url;
} Buttons;
void init(
const char* client,
const char* image,
const char* editor_tooltip,
const char* idle_text,
const char* idle_tooltip,
const char* viewing_text,
const char* editing_text,
const char* file_browser_text,
const char* plugin_manager_text,
const char* lsp_manager_text,
const char* workspace_text,
const char* initial_path,
const Buttons* buttons,
const bool swap
const InitArgs* args,
const Buttons* buttons
);
const bool update_presence(
const char* filename,
const char* filetype,
bool is_read_only,
const char* cursor_position,
int problem_count
const PresenceArgs* args
);
const bool update_presence_with_assets(
const char* filename,
const char* filetype,
const char* name,
const char* icon,
const char* tooltip,
int asset_type,
bool is_read_only,
const char* cursor_position,
int problem_count
const InitArgs* args
);
void clear_presence();
void disconnect();
Expand Down
112 changes: 60 additions & 52 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,29 +50,44 @@ pub struct Buttons {
pub second_url: *const c_char,
}

#[repr(C)]
pub struct InitArgs {
pub client: *const c_char,
pub image: *const c_char,
pub editor_tooltip: *const c_char,
pub idle_text: *const c_char,
pub idle_tooltip: *const c_char,
pub viewing_text: *const c_char,
pub editing_text: *const c_char,
pub file_browser_text: *const c_char,
pub plugin_manager_text: *const c_char,
pub lsp_manager_text: *const c_char,
pub workspace_text: *const c_char,
pub initial_path: *const c_char,
pub swap_fields: bool,
}

#[repr(C)]
pub struct PresenceArgs {
pub filename: *const c_char,
pub filetype: *const c_char,
pub cursor_position: *const c_char,
pub problem_count: i32,
pub is_read_only: bool,
}

#[no_mangle]
pub extern "C" fn init(
client: *const c_char,
image: *const c_char,
editor_tooltip: *const c_char,
idle_text: *const c_char,
idle_tooltip: *const c_char,
viewing_text: *const c_char,
editing_text: *const c_char,
file_browser_text: *const c_char,
plugin_manager_text: *const c_char,
lsp_manager_text: *const c_char,
workspace_text: *const c_char,
initial_path: *const c_char,
buttons_ptr: *const Buttons,
swap_fields: bool,
) {
pub extern "C" fn init(args_ptr: *const InitArgs, buttons_ptr: *const Buttons) {
unsafe {
if INITIALIZED {
return;
}

let (client_id, client_image) = match ptr_to_string(client).as_str() {
let args = &*args_ptr;

let (client_id, client_image) = match ptr_to_string(args.client)
.as_str()
{
"vim" => (1219918645770059796, get_asset("editor", "vim")),
"neovim" => (1219918880005165137, get_asset("editor", "neovim")),
"lunarvim" => {
Expand All @@ -84,20 +99,21 @@ pub extern "C" fn init(
}
id => (
id.parse::<u64>().expect("Invalid client ID"),
ptr_to_string(image),
ptr_to_string(args.image),
),
};

let editor_tooltip = ptr_to_string(editor_tooltip);
let idle_text = ptr_to_string(idle_text);
let idle_tooltip = ptr_to_string(idle_tooltip);
let viewing_text = ptr_to_string(viewing_text);
let editing_text = ptr_to_string(editing_text);
let file_browser_text = ptr_to_string(file_browser_text);
let plugin_manager_text = ptr_to_string(plugin_manager_text);
let lsp_manager_text = ptr_to_string(lsp_manager_text);
let workspace_text = ptr_to_string(workspace_text);
let workspace = find_workspace(&ptr_to_string(initial_path));
let editor_tooltip = ptr_to_string(args.editor_tooltip);
let idle_text = ptr_to_string(args.idle_text);
let idle_tooltip = ptr_to_string(args.idle_tooltip);
let viewing_text = ptr_to_string(args.viewing_text);
let editing_text = ptr_to_string(args.editing_text);
let file_browser_text = ptr_to_string(args.file_browser_text);
let plugin_manager_text = ptr_to_string(args.plugin_manager_text);
let lsp_manager_text = ptr_to_string(args.lsp_manager_text);
let workspace_text = ptr_to_string(args.workspace_text);
let swap_fields = args.swap_fields;
let workspace = find_workspace(&ptr_to_string(args.initial_path));

let buttons = if buttons_ptr.is_null() {
Vec::new()
Expand Down Expand Up @@ -146,23 +162,18 @@ pub extern "C" fn init(
}

#[no_mangle]
pub extern "C" fn update_presence(
filename: *const c_char,
filetype: *const c_char,
is_read_only: bool,
cursor_position: *const c_char,
problem_count: i32,
) -> bool {
pub extern "C" fn update_presence(args_ptr: *const PresenceArgs) -> bool {
unsafe {
if !INITIALIZED {
return false;
}

CONFIG.as_mut().map_or(false, |config| {
let filename = ptr_to_string(filename);
let filetype = ptr_to_string(filetype);
let cursor_position = if !cursor_position.is_null() {
Some(ptr_to_string(cursor_position))
let args = &*args_ptr;
let filename = ptr_to_string(args.filename);
let filetype = ptr_to_string(args.filetype);
let cursor_position = if !args.cursor_position.is_null() {
Some(ptr_to_string(args.cursor_position))
} else {
None
};
Expand All @@ -183,7 +194,7 @@ pub extern "C" fn update_presence(
&config,
&filename,
&filetype,
is_read_only,
args.is_read_only,
cursor_position.as_deref(),
)
};
Expand All @@ -193,7 +204,7 @@ pub extern "C" fn update_presence(
details,
large_image,
large_text,
problem_count,
args.problem_count,
START_TIME.as_ref(),
config.swap_fields,
);
Expand All @@ -211,29 +222,26 @@ pub extern "C" fn update_presence(

#[no_mangle]
pub extern "C" fn update_presence_with_assets(
filename: *const c_char,
filetype: *const c_char,
name: *const c_char,
icon: *const c_char,
tooltip: *const c_char,
asset_type: i32,
is_read_only: bool,
cursor_position: *const c_char,
problem_count: i32,
args_ptr: *const PresenceArgs,
) -> bool {
unsafe {
if !INITIALIZED {
return false;
}

CONFIG.as_mut().map_or(false, |config| {
let filename = ptr_to_string(filename);
let filetype = ptr_to_string(filetype);
let args = &*args_ptr;
let filename = ptr_to_string(args.filename);
let filetype = ptr_to_string(args.filetype);
let name = ptr_to_string(name);
let mut icon = ptr_to_string(icon);
let mut tooltip = ptr_to_string(tooltip);
let cursor_position = if !cursor_position.is_null() {
Some(ptr_to_string(cursor_position))
let cursor_position = if !args.cursor_position.is_null() {
Some(ptr_to_string(args.cursor_position))
} else {
None
};
Expand All @@ -250,7 +258,7 @@ pub extern "C" fn update_presence_with_assets(
"a new file"
}
};
let details = if is_read_only {
let details = if args.is_read_only {
config.viewing_text.replace("{}", filename)
} else {
config.editing_text.replace("{}", filename)
Expand Down Expand Up @@ -373,7 +381,7 @@ pub extern "C" fn update_presence_with_assets(
details,
Some(large_image),
large_text,
problem_count,
args.problem_count,
START_TIME.as_ref(),
config.swap_fields,
);
Expand Down

0 comments on commit d8e2387

Please sign in to comment.