in native/desktop-linux-sample/src/sample_linux.rs [369:479]
fn on_keydown(event: &KeyDownEvent, app_ptr: AppPtr<'_>, state: &mut State) -> bool {
const KEYCODE_BACKSPACE: u32 = 14;
const KEYCODE_TAB: u32 = 15;
const KEYCODE_C: u32 = 46;
const KEYCODE_N: u32 = 49;
const KEYCODE_O: u32 = 24;
const KEYCODE_P: u32 = 25;
const KEYCODE_S: u32 = 31;
const KEYCODE_V: u32 = 47;
const KEY_MODIFIER_CTRL: u8 = KeyModifier::Ctrl as u8;
let modifiers: KeyModifierBitflag = shortcut_modifiers(state.key_modifiers);
let window_id = state.key_window_id.expect("Key window not found");
let key_code: u32 = event.code.0;
match (modifiers.0, key_code) {
(0, KEYCODE_BACKSPACE) => {
let window_state = state.windows.get_mut(&window_id).unwrap();
window_state.text.pop();
if window_state.text_input_available {
update_text_input_context(app_ptr, &window_state.text, false);
}
debug!("{window_id:?} : {} : {}", window_state.text.len(), window_state.text);
true
}
(KEY_MODIFIER_CTRL, KEYCODE_TAB) => {
window_request_internal_activation_token(app_ptr, state.key_window_id.unwrap());
true
}
(KEY_MODIFIER_CTRL, KEYCODE_V) => {
application_clipboard_paste(app_ptr, 0, BorrowedStrPtr::new(TEXT_MIME_TYPE));
true
}
(KEY_MODIFIER_CTRL, KEYCODE_C) => {
application_clipboard_put(app_ptr, BorrowedStrPtr::new(ALL_MIMES));
true
}
(KEY_MODIFIER_CTRL, KEYCODE_P) => {
let title = format!("Notification from window {}", window_id.0);
let body = format!("Clicking this notification will activate window {}", window_id.0);
let title_cstr = CString::new(title).unwrap();
let body_cstr = CString::new(body).unwrap();
let request_id = application_request_show_notification(
app_ptr,
BorrowedStrPtr::new(&title_cstr),
BorrowedStrPtr::new(&body_cstr),
BorrowedStrPtr::null(),
);
if request_id.0 != 0 {
state.request_sources.insert(request_id, window_id);
}
true
}
(KEY_MODIFIER_CTRL, KEYCODE_O) => {
let common_params = CommonFileDialogParams {
modal: false,
title: c"Open File for Linux Native Sample App test".into(),
accept_label: c"Let's go!".into(),
current_folder: c"/etc".into(),
};
let open_params = OpenFileDialogParams {
select_directories: false,
allows_multiple_selection: true,
};
let request_id = window_show_open_file_dialog(app_ptr, window_id, &common_params, &open_params);
debug!("Requested open file dialog for {window_id:?}, request_id = {request_id:?}");
true
}
(KEY_MODIFIER_CTRL, KEYCODE_S) => {
let common_params = CommonFileDialogParams {
modal: false,
title: c"Save File for Linux Native Sample App test".into(),
accept_label: c"Let's go!".into(),
current_folder: c"/tmp".into(),
};
let save_params = SaveFileDialogParams {
name_field_string_value: c"file from Linux Native Sample App.txt".into(),
};
let request_id = window_show_save_file_dialog(app_ptr, window_id, &common_params, &save_params);
debug!("Requested open file dialog for {window_id:?}, request_id = {request_id:?}");
true
}
(KEY_MODIFIER_CTRL, KEYCODE_N) => {
let new_window_id = WindowId(state.windows.len() as i64 + 1);
window_create(
state.app_ptr.get(),
WindowParams {
window_id: new_window_id,
size: LogicalSize {
width: LogicalPixels(300.),
height: LogicalPixels(200.),
},
title: BorrowedStrPtr::new(c"Window N"),
app_id: BorrowedStrPtr::new(APP_ID),
prefer_client_side_decoration: true,
rendering_mode: RenderingMode::Auto,
},
);
state.windows.insert(new_window_id, WindowState::default());
true
}
(_, _) => {
if let Some(s) = event.characters.as_optional_str().unwrap() {
let window_state = state.windows.get_mut(&window_id).unwrap();
window_state.text += s;
}
false
}
}
}