submission: Wrap the structure in a safe wrapper
This commit is contained in:
@ -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();
|
||||||
|
|
||||||
|
|||||||
@ -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),
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user