refact, win, clipboard, notify callback, tmp commit
Signed-off-by: dignow <linlong1265@gmail.com>
This commit is contained in:
parent
1dd599b011
commit
fc8db69d9e
@ -998,6 +998,16 @@ Widget msgboxIcon(String type) {
|
|||||||
|
|
||||||
// title should be null
|
// title should be null
|
||||||
Widget msgboxContent(String type, String title, String text) {
|
Widget msgboxContent(String type, String title, String text) {
|
||||||
|
String translateText(String text) {
|
||||||
|
List<String> words = text.split(' ');
|
||||||
|
if (words.isNotEmpty && words[0].endsWith('_tip')) {
|
||||||
|
words[0] = translate(words[0]);
|
||||||
|
return words.join(' ');
|
||||||
|
} else {
|
||||||
|
return translate(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return Row(
|
return Row(
|
||||||
children: [
|
children: [
|
||||||
msgboxIcon(type),
|
msgboxIcon(type),
|
||||||
@ -1009,7 +1019,7 @@ Widget msgboxContent(String type, String title, String text) {
|
|||||||
translate(title),
|
translate(title),
|
||||||
style: TextStyle(fontSize: 21),
|
style: TextStyle(fontSize: 21),
|
||||||
).marginOnly(bottom: 10),
|
).marginOnly(bottom: 10),
|
||||||
Text(translate(text), style: const TextStyle(fontSize: 15)),
|
Text(translateText(text), style: const TextStyle(fontSize: 15)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use cliprdr::*;
|
use cliprdr::*;
|
||||||
use hbb_common::{
|
use hbb_common::{
|
||||||
allow_err, log,
|
allow_err, lazy_static, log,
|
||||||
tokio::sync::{
|
tokio::sync::{
|
||||||
mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender},
|
mpsc::{unbounded_channel, UnboundedReceiver, UnboundedSender},
|
||||||
Mutex as TokioMutex,
|
Mutex as TokioMutex,
|
||||||
@ -19,6 +19,13 @@ pub mod context_send;
|
|||||||
pub use context_send::*;
|
pub use context_send::*;
|
||||||
|
|
||||||
const ERR_CODE_SERVER_FUNCTION_NONE: u32 = 0x00000001;
|
const ERR_CODE_SERVER_FUNCTION_NONE: u32 = 0x00000001;
|
||||||
|
const ERR_CODE_INVALID_PARAMETER: u32 = 0x00000002;
|
||||||
|
|
||||||
|
pub type FnNotifyCallback = fn(r#type: u32, msg: &str, details: &str) -> u32;
|
||||||
|
|
||||||
|
lazy_static::lazy_static! {
|
||||||
|
static ref NOTIFY_CALLBACK: Arc<Mutex<Option<FnNotifyCallback>>> = Default::default();
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
#[serde(tag = "t", content = "c")]
|
#[serde(tag = "t", content = "c")]
|
||||||
@ -462,11 +469,31 @@ pub fn create_cliprdr_context(
|
|||||||
)?)
|
)?)
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" fn notify_callback(
|
pub fn set_notify_callback(cb: FnNotifyCallback) {
|
||||||
msg: *const NOTIFICATION_MESSAGE,
|
NOTIFY_CALLBACK.lock().unwrap().replace(cb);
|
||||||
) -> UINT {
|
}
|
||||||
|
|
||||||
|
extern "C" fn notify_callback(msg: *const NOTIFICATION_MESSAGE) -> UINT {
|
||||||
log::debug!("notify_callback called");
|
log::debug!("notify_callback called");
|
||||||
0
|
if let Some(cb) = NOTIFY_CALLBACK.lock().unwrap().as_ref() {
|
||||||
|
unsafe {
|
||||||
|
let msg = &*msg;
|
||||||
|
let details = if msg.details.is_null() {
|
||||||
|
Ok("")
|
||||||
|
} else {
|
||||||
|
CStr::from_ptr(msg.details as _).to_str()
|
||||||
|
};
|
||||||
|
match (CStr::from_ptr(msg.msg as _).to_str(), details) {
|
||||||
|
(Ok(m), Ok(d)) => cb(msg.r#type, m, d),
|
||||||
|
_ => {
|
||||||
|
log::error!("notify_callback: failed to convert msg");
|
||||||
|
ERR_CODE_INVALID_PARAMETER
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ERR_CODE_SERVER_FUNCTION_NONE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" fn client_format_list(
|
extern "C" fn client_format_list(
|
||||||
|
@ -1493,7 +1493,7 @@ UINT wait_response_event(wfClipboard *clipboard, HANDLE event, void **data)
|
|||||||
{
|
{
|
||||||
NOTIFICATION_MESSAGE msg;
|
NOTIFICATION_MESSAGE msg;
|
||||||
msg.type = 2;
|
msg.type = 2;
|
||||||
msg.msg = "timeout waiting for response";
|
msg.msg = "clipboard_wait_response_timeout_tip";
|
||||||
msg.details = NULL;
|
msg.details = NULL;
|
||||||
clipboard->context->NotifyClipboardMsg(&msg);
|
clipboard->context->NotifyClipboardMsg(&msg);
|
||||||
rc = ERROR_INTERNAL_ERROR;
|
rc = ERROR_INTERNAL_ERROR;
|
||||||
|
@ -1089,6 +1089,39 @@ pub fn stop_global_event_stream(app_type: String) {
|
|||||||
let _ = GLOBAL_EVENT_STREAM.write().unwrap().remove(&app_type);
|
let _ = GLOBAL_EVENT_STREAM.write().unwrap().remove(&app_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn msgbox_clipboard_(channel: &str, r#type: u32, msg: &str, details: &str) {
|
||||||
|
let msgtype = format!(
|
||||||
|
"{}-nocancel-nook-hasclose",
|
||||||
|
if r#type == 0 {
|
||||||
|
"info"
|
||||||
|
} else if r#type == 1 {
|
||||||
|
"warn"
|
||||||
|
} else {
|
||||||
|
"error"
|
||||||
|
}
|
||||||
|
);
|
||||||
|
let text = format!("{} {}", msg, details);
|
||||||
|
if let Ok(event) = serde_json::ser::to_string(&HashMap::from([
|
||||||
|
("type", &msgtype as &str),
|
||||||
|
("title", "clipboard"),
|
||||||
|
("text", &text),
|
||||||
|
("link", ""),
|
||||||
|
("hasRetry", ""),
|
||||||
|
])) {
|
||||||
|
push_global_event(channel, event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn msgbox_clipboard_remote(r#type: u32, msg: &str, details: &str) {
|
||||||
|
msgbox_clipboard_(APP_TYPE_DESKTOP_REMOTE, r#type, msg, details);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn msgbox_clipboard_cm(r#type: u32, msg: &str, details: &str) {
|
||||||
|
msgbox_clipboard_(APP_TYPE_CM, r#type, msg, details);
|
||||||
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
unsafe extern "C" fn get_rgba() {}
|
unsafe extern "C" fn get_rgba() {}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user