fn on_keydown()

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
        }
    }
}