submission: Wrap the structure in a safe wrapper

This commit is contained in:
Dorota Czaplejewicz
2021-12-09 12:43:36 +00:00
parent 81948425d8
commit d64b8cdf1a
3 changed files with 35 additions and 31 deletions

View File

@ -7,7 +7,7 @@ use ::action::{ Action, Modifier };
use ::keyboard; use ::keyboard;
use ::layout::{ Button, Label, LatchedState, Layout }; use ::layout::{ Button, Label, LatchedState, Layout };
use ::layout::c::{ Bounds, EekGtkKeyboard, Point }; use ::layout::c::{ Bounds, EekGtkKeyboard, Point };
use ::submission::Submission; use ::submission::c::Submission as CSubmission;
use glib::translate::FromGlibPtrNone; use glib::translate::FromGlibPtrNone;
use gtk::WidgetExt; use gtk::WidgetExt;
@ -76,10 +76,11 @@ mod c {
layout: *mut Layout, layout: *mut Layout,
renderer: EekRenderer, renderer: EekRenderer,
cr: *mut cairo_sys::cairo_t, cr: *mut cairo_sys::cairo_t,
submission: *const Submission, submission: CSubmission,
) { ) {
let layout = unsafe { &mut *layout }; let layout = unsafe { &mut *layout };
let submission = unsafe { &*submission }; let submission = submission.clone_ref();
let submission = submission.borrow();
let cr = unsafe { cairo::Context::from_raw_none(cr) }; let cr = unsafe { cairo::Context::from_raw_none(cr) };
let active_modifiers = submission.get_active_modifiers(); let active_modifiers = submission.get_active_modifiers();

View File

@ -44,6 +44,7 @@ pub mod c {
use gtk_sys; use gtk_sys;
use std::os::raw::c_void; use std::os::raw::c_void;
use crate::submission::c::Submission as CSubmission;
use std::ops::{ Add, Sub }; use std::ops::{ Add, Sub };
@ -207,7 +208,7 @@ pub mod c {
pub extern "C" pub extern "C"
fn squeek_layout_release( fn squeek_layout_release(
layout: *mut Layout, layout: *mut Layout,
submission: *mut Submission, submission: CSubmission,
widget_to_layout: Transformation, widget_to_layout: Transformation,
time: u32, time: u32,
manager: manager::c::Manager, manager: manager::c::Manager,
@ -215,7 +216,8 @@ pub mod c {
) { ) {
let time = Timestamp(time); let time = Timestamp(time);
let layout = unsafe { &mut *layout }; let layout = unsafe { &mut *layout };
let submission = unsafe { &mut *submission }; let submission = submission.clone_ref();
let mut submission = submission.borrow_mut();
let ui_backend = UIBackend { let ui_backend = UIBackend {
widget_to_layout, widget_to_layout,
keyboard: ui_keyboard, keyboard: ui_keyboard,
@ -227,7 +229,7 @@ pub mod c {
let key: &Rc<RefCell<KeyState>> = key.borrow(); let key: &Rc<RefCell<KeyState>> = key.borrow();
seat::handle_release_key( seat::handle_release_key(
layout, layout,
submission, &mut submission,
Some(&ui_backend), Some(&ui_backend),
time, time,
Some(manager), Some(manager),
@ -242,18 +244,19 @@ pub mod c {
pub extern "C" pub extern "C"
fn squeek_layout_release_all_only( fn squeek_layout_release_all_only(
layout: *mut Layout, layout: *mut Layout,
submission: *mut Submission, submission: CSubmission,
time: u32, time: u32,
) { ) {
let layout = unsafe { &mut *layout }; let layout = unsafe { &mut *layout };
let submission = unsafe { &mut *submission }; let submission = submission.clone_ref();
let mut submission = submission.borrow_mut();
// The list must be copied, // The list must be copied,
// because it will be mutated in the loop // because it will be mutated in the loop
for key in layout.pressed_keys.clone() { for key in layout.pressed_keys.clone() {
let key: &Rc<RefCell<KeyState>> = key.borrow(); let key: &Rc<RefCell<KeyState>> = key.borrow();
seat::handle_release_key( seat::handle_release_key(
layout, layout,
submission, &mut submission,
None, // don't update UI None, // don't update UI
Timestamp(time), Timestamp(time),
None, // don't switch layouts None, // don't switch layouts
@ -266,14 +269,15 @@ pub mod c {
pub extern "C" pub extern "C"
fn squeek_layout_depress( fn squeek_layout_depress(
layout: *mut Layout, layout: *mut Layout,
submission: *mut Submission, submission: CSubmission,
x_widget: f64, y_widget: f64, x_widget: f64, y_widget: f64,
widget_to_layout: Transformation, widget_to_layout: Transformation,
time: u32, time: u32,
ui_keyboard: EekGtkKeyboard, ui_keyboard: EekGtkKeyboard,
) { ) {
let layout = unsafe { &mut *layout }; let layout = unsafe { &mut *layout };
let submission = unsafe { &mut *submission }; let submission = submission.clone_ref();
let mut submission = submission.borrow_mut();
let point = widget_to_layout.forward( let point = widget_to_layout.forward(
Point { x: x_widget, y: y_widget } Point { x: x_widget, y: y_widget }
); );
@ -284,7 +288,7 @@ pub mod c {
if let Some(state) = state { if let Some(state) = state {
seat::handle_press_key( seat::handle_press_key(
layout, layout,
submission, &mut submission,
Timestamp(time), Timestamp(time),
&state, &state,
); );
@ -303,7 +307,7 @@ pub mod c {
pub extern "C" pub extern "C"
fn squeek_layout_drag( fn squeek_layout_drag(
layout: *mut Layout, layout: *mut Layout,
submission: *mut Submission, submission: CSubmission,
x_widget: f64, y_widget: f64, x_widget: f64, y_widget: f64,
widget_to_layout: Transformation, widget_to_layout: Transformation,
time: u32, time: u32,
@ -312,7 +316,8 @@ pub mod c {
) { ) {
let time = Timestamp(time); let time = Timestamp(time);
let layout = unsafe { &mut *layout }; let layout = unsafe { &mut *layout };
let submission = unsafe { &mut *submission }; let submission = submission.clone_ref();
let mut submission = submission.borrow_mut();
let ui_backend = UIBackend { let ui_backend = UIBackend {
widget_to_layout, widget_to_layout,
keyboard: ui_keyboard, keyboard: ui_keyboard,
@ -340,7 +345,7 @@ pub mod c {
} else { } else {
seat::handle_release_key( seat::handle_release_key(
layout, layout,
submission, &mut submission,
Some(&ui_backend), Some(&ui_backend),
time, time,
Some(manager), Some(manager),
@ -351,7 +356,7 @@ pub mod c {
if !found { if !found {
seat::handle_press_key( seat::handle_press_key(
layout, layout,
submission, &mut submission,
time, time,
&state, &state,
); );
@ -365,7 +370,7 @@ pub mod c {
let key: &Rc<RefCell<KeyState>> = wrapped_key.borrow(); let key: &Rc<RefCell<KeyState>> = wrapped_key.borrow();
seat::handle_release_key( seat::handle_release_key(
layout, layout,
submission, &mut submission,
Some(&ui_backend), Some(&ui_backend),
time, time,
Some(manager), Some(manager),

View File

@ -48,6 +48,8 @@ pub mod c {
#[repr(transparent)] #[repr(transparent)]
pub struct StateManager(*const c_void); pub struct StateManager(*const c_void);
pub type Submission = Wrapped<super::Submission>;
#[no_mangle] #[no_mangle]
pub extern "C" pub extern "C"
fn submission_new( fn submission_new(
@ -55,7 +57,7 @@ pub mod c {
vk: ZwpVirtualKeyboardV1, vk: ZwpVirtualKeyboardV1,
state_manager: *const StateManager, state_manager: *const StateManager,
visibility_manager: Wrapped<VisibilityManager>, visibility_manager: Wrapped<VisibilityManager>,
) -> *mut Submission { ) -> Submission {
let imservice = if im.is_null() { let imservice = if im.is_null() {
None None
} else { } else {
@ -67,8 +69,8 @@ pub mod c {
)) ))
}; };
// TODO: add vkeyboard too // TODO: add vkeyboard too
Box::<Submission>::into_raw(Box::new( Wrapped::new(
Submission { super::Submission {
imservice, imservice,
modifiers_active: Vec::new(), modifiers_active: Vec::new(),
virtual_keyboard: VirtualKeyboard(vk), virtual_keyboard: VirtualKeyboard(vk),
@ -76,31 +78,27 @@ pub mod c {
keymap_fds: Vec::new(), keymap_fds: Vec::new(),
keymap_idx: None, keymap_idx: None,
} }
)) )
} }
#[no_mangle] #[no_mangle]
pub extern "C" pub extern "C"
fn submission_use_layout( fn submission_use_layout(
submission: *mut Submission, submission: Submission,
layout: *const layout::Layout, layout: *const layout::Layout,
time: u32, time: u32,
) { ) {
if submission.is_null() { let submission = submission.clone_ref();
panic!("Null submission pointer"); let mut submission = submission.borrow_mut();
}
let submission: &mut Submission = unsafe { &mut *submission };
let layout = unsafe { &*layout }; let layout = unsafe { &*layout };
submission.use_layout(layout, Timestamp(time)); submission.use_layout(layout, Timestamp(time));
} }
#[no_mangle] #[no_mangle]
pub extern "C" pub extern "C"
fn submission_hint_available(submission: *mut Submission) -> u8 { fn submission_hint_available(submission: Submission) -> u8 {
if submission.is_null() { let submission = submission.clone_ref();
panic!("Null submission pointer"); let submission = submission.borrow();
}
let submission: &mut Submission = unsafe { &mut *submission };
let active = submission.imservice.as_ref() let active = submission.imservice.as_ref()
.map(|imservice| imservice.is_active()); .map(|imservice| imservice.is_active());
(Some(true) == active) as u8 (Some(true) == active) as u8