fix memory leak on mac because of wrong use of objc, by wrapping autoreleasepool
This commit is contained in:
parent
d2e98cc620
commit
cacca7295c
@ -24,6 +24,7 @@ use hbb_common::{
|
|||||||
sysinfo::{Pid, Process, ProcessRefreshKind, System},
|
sysinfo::{Pid, Process, ProcessRefreshKind, System},
|
||||||
};
|
};
|
||||||
use include_dir::{include_dir, Dir};
|
use include_dir::{include_dir, Dir};
|
||||||
|
use objc::rc::autoreleasepool;
|
||||||
use objc::{class, msg_send, sel, sel_impl};
|
use objc::{class, msg_send, sel, sel_impl};
|
||||||
use scrap::{libc::c_void, quartz::ffi::*};
|
use scrap::{libc::c_void, quartz::ffi::*};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
@ -60,6 +61,10 @@ pub fn major_version() -> u32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_process_trusted(prompt: bool) -> bool {
|
pub fn is_process_trusted(prompt: bool) -> bool {
|
||||||
|
autoreleasepool(|| unsafe_is_process_trusted(prompt))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn unsafe_is_process_trusted(prompt: bool) -> bool {
|
||||||
unsafe {
|
unsafe {
|
||||||
let value = if prompt { YES } else { NO };
|
let value = if prompt { YES } else { NO };
|
||||||
let value: id = msg_send![class!(NSNumber), numberWithBool: value];
|
let value: id = msg_send![class!(NSNumber), numberWithBool: value];
|
||||||
@ -79,10 +84,14 @@ pub fn is_can_input_monitoring(prompt: bool) -> bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_can_screen_recording(prompt: bool) -> bool {
|
||||||
|
autoreleasepool(|| unsafe_is_can_screen_recording(prompt))
|
||||||
|
}
|
||||||
|
|
||||||
// macOS >= 10.15
|
// macOS >= 10.15
|
||||||
// https://stackoverflow.com/questions/56597221/detecting-screen-recording-settings-on-macos-catalina/
|
// https://stackoverflow.com/questions/56597221/detecting-screen-recording-settings-on-macos-catalina/
|
||||||
// remove just one app from all the permissions: tccutil reset All com.carriez.rustdesk
|
// remove just one app from all the permissions: tccutil reset All com.carriez.rustdesk
|
||||||
pub fn is_can_screen_recording(prompt: bool) -> bool {
|
fn unsafe_is_can_screen_recording(prompt: bool) -> bool {
|
||||||
// we got some report that we show no permission even after set it, so we try to use new api for screen recording check
|
// we got some report that we show no permission even after set it, so we try to use new api for screen recording check
|
||||||
// the new api is only available on macOS >= 10.15, but on stackoverflow, some people said it works on >= 10.16 (crash on 10.15),
|
// the new api is only available on macOS >= 10.15, but on stackoverflow, some people said it works on >= 10.16 (crash on 10.15),
|
||||||
// but also some said it has bug on 10.16, so we just use it on 11.0.
|
// but also some said it has bug on 10.16, so we just use it on 11.0.
|
||||||
@ -297,6 +306,10 @@ pub fn get_cursor_pos() -> Option<(i32, i32)> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_focused_display(displays: Vec<DisplayInfo>) -> Option<usize> {
|
pub fn get_focused_display(displays: Vec<DisplayInfo>) -> Option<usize> {
|
||||||
|
autoreleasepool(|| unsafe_get_focused_display(displays))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn unsafe_get_focused_display(displays: Vec<DisplayInfo>) -> Option<usize> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let main_screen: id = msg_send![class!(NSScreen), mainScreen];
|
let main_screen: id = msg_send![class!(NSScreen), mainScreen];
|
||||||
let screen: id = msg_send![main_screen, deviceDescription];
|
let screen: id = msg_send![main_screen, deviceDescription];
|
||||||
@ -311,6 +324,10 @@ pub fn get_focused_display(displays: Vec<DisplayInfo>) -> Option<usize> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_cursor() -> ResultType<Option<u64>> {
|
pub fn get_cursor() -> ResultType<Option<u64>> {
|
||||||
|
autoreleasepool(|| unsafe_get_cursor())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn unsafe_get_cursor() -> ResultType<Option<u64>> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let seed = CGSCurrentCursorSeed();
|
let seed = CGSCurrentCursorSeed();
|
||||||
if seed == LATEST_SEED {
|
if seed == LATEST_SEED {
|
||||||
@ -375,8 +392,12 @@ fn get_cursor_id() -> ResultType<(id, u64)> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://github.com/stweil/OSXvnc/blob/master/OSXvnc-server/mousecursor.c
|
|
||||||
pub fn get_cursor_data(hcursor: u64) -> ResultType<CursorData> {
|
pub fn get_cursor_data(hcursor: u64) -> ResultType<CursorData> {
|
||||||
|
autoreleasepool(|| unsafe_get_cursor_data(hcursor))
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/stweil/OSXvnc/blob/master/OSXvnc-server/mousecursor.c
|
||||||
|
fn unsafe_get_cursor_data(hcursor: u64) -> ResultType<CursorData> {
|
||||||
unsafe {
|
unsafe {
|
||||||
let (c, hcursor2) = get_cursor_id()?;
|
let (c, hcursor2) = get_cursor_id()?;
|
||||||
if hcursor != hcursor2 {
|
if hcursor != hcursor2 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user