gtk4/event_controller_key.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
// Take a look at the license at the top of the repository in the LICENSE file.
use std::{boxed::Box as Box_, mem::transmute};
use gdk::Key;
use glib::{signal::connect_raw, translate::*, SignalHandlerId};
use crate::{ffi, prelude::*, EventControllerKey};
impl EventControllerKey {
/// Emitted whenever a key is pressed.
/// ## `keyval`
/// the pressed key.
/// ## `keycode`
/// the raw code of the pressed key.
/// ## `state`
/// the bitmask, representing the state of modifier keys and pointer buttons.
///
/// # Returns
///
/// [`true`] if the key press was handled, [`false`] otherwise.
pub fn connect_key_pressed<
F: Fn(&EventControllerKey, Key, u32, gdk::ModifierType) -> glib::Propagation + 'static,
>(
&self,
f: F,
) -> SignalHandlerId {
unsafe extern "C" fn key_pressed_trampoline<
F: Fn(&EventControllerKey, Key, u32, gdk::ModifierType) -> glib::Propagation + 'static,
>(
this: *mut ffi::GtkEventControllerKey,
keyval: libc::c_uint,
keycode: libc::c_uint,
state: gdk::ffi::GdkModifierType,
f: glib::ffi::gpointer,
) -> glib::ffi::gboolean {
let f: &F = &*(f as *const F);
f(
&from_glib_borrow(this),
from_glib(keyval),
keycode,
from_glib(state),
)
.into_glib()
}
unsafe {
let f: Box_<F> = Box_::new(f);
connect_raw(
self.as_ptr() as *mut _,
b"key-pressed\0".as_ptr() as *const _,
Some(transmute::<*const (), unsafe extern "C" fn()>(
key_pressed_trampoline::<F> as *const (),
)),
Box_::into_raw(f),
)
}
}
/// Emitted whenever a key is released.
/// ## `keyval`
/// the released key.
/// ## `keycode`
/// the raw code of the released key.
/// ## `state`
/// the bitmask, representing the state of modifier keys and pointer buttons.
pub fn connect_key_released<
F: Fn(&EventControllerKey, Key, u32, gdk::ModifierType) + 'static,
>(
&self,
f: F,
) -> SignalHandlerId {
unsafe extern "C" fn key_released_trampoline<
F: Fn(&EventControllerKey, Key, u32, gdk::ModifierType) + 'static,
>(
this: *mut ffi::GtkEventControllerKey,
keyval: libc::c_uint,
keycode: libc::c_uint,
state: gdk::ffi::GdkModifierType,
f: glib::ffi::gpointer,
) {
let f: &F = &*(f as *const F);
f(
&from_glib_borrow(this),
from_glib(keyval),
keycode,
from_glib(state),
)
}
unsafe {
let f: Box_<F> = Box_::new(f);
connect_raw(
self.as_ptr() as *mut _,
b"key-released\0".as_ptr() as *const _,
Some(transmute::<*const (), unsafe extern "C" fn()>(
key_released_trampoline::<F> as *const (),
)),
Box_::into_raw(f),
)
}
}
}