keycodes: Moved submission to Rust
This commit is contained in:
		@ -31,6 +31,7 @@
 | 
				
			|||||||
#include <glib/gprintf.h>
 | 
					#include <glib/gprintf.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "eek-enumtypes.h"
 | 
					#include "eek-enumtypes.h"
 | 
				
			||||||
 | 
					#include "eekboard/eekboard-context-service.h"
 | 
				
			||||||
#include "eekboard/key-emitter.h"
 | 
					#include "eekboard/key-emitter.h"
 | 
				
			||||||
#include "keymap.h"
 | 
					#include "keymap.h"
 | 
				
			||||||
#include "src/keyboard.h"
 | 
					#include "src/keyboard.h"
 | 
				
			||||||
@ -93,17 +94,8 @@ set_level_from_press (LevelKeyboard *keyboard, struct squeek_key *key)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void eek_keyboard_press_key(LevelKeyboard *keyboard, struct squeek_key *key, guint32 timestamp) {
 | 
					void eek_keyboard_press_key(LevelKeyboard *keyboard, struct squeek_key *key, guint32 timestamp) {
 | 
				
			||||||
    squeek_key_set_pressed(key, TRUE);
 | 
					 | 
				
			||||||
    keyboard->pressed_keys = g_list_prepend (keyboard->pressed_keys, key);
 | 
					    keyboard->pressed_keys = g_list_prepend (keyboard->pressed_keys, key);
 | 
				
			||||||
 | 
					    squeek_key_press(key, keyboard->manager->virtual_keyboard, KEY_PRESS, timestamp);
 | 
				
			||||||
    // Only take action about setting level *after* the key has taken effect, i.e. on release
 | 
					 | 
				
			||||||
    //set_level_from_press (keyboard, key);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // "Borrowed" from eek-context-service; doesn't influence the state but forwards the event
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    guint keycode = squeek_key_get_keycode (key);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    emit_key_activated(keyboard->manager, keyboard, keycode, TRUE, timestamp);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void eek_keyboard_release_key(LevelKeyboard *keyboard,
 | 
					void eek_keyboard_release_key(LevelKeyboard *keyboard,
 | 
				
			||||||
@ -118,12 +110,7 @@ void eek_keyboard_release_key(LevelKeyboard *keyboard,
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    set_level_from_press (keyboard, key);
 | 
					    set_level_from_press (keyboard, key);
 | 
				
			||||||
 | 
					    squeek_key_press(key, keyboard->manager->virtual_keyboard, KEY_RELEASE, timestamp);
 | 
				
			||||||
    // "Borrowed" from eek-context-service; doesn't influence the state but forwards the event
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    guint keycode = squeek_key_get_keycode (key);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    emit_key_activated(keyboard->manager, keyboard, keycode, FALSE, timestamp);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void level_keyboard_deinit(LevelKeyboard *self) {
 | 
					void level_keyboard_deinit(LevelKeyboard *self) {
 | 
				
			||||||
 | 
				
			|||||||
@ -131,7 +131,6 @@ emit_key_activated (EekboardContextService *manager,
 | 
				
			|||||||
*/
 | 
					*/
 | 
				
			||||||
    SeatEmitter emitter = {0};
 | 
					    SeatEmitter emitter = {0};
 | 
				
			||||||
    emitter.virtual_keyboard = manager->virtual_keyboard;
 | 
					    emitter.virtual_keyboard = manager->virtual_keyboard;
 | 
				
			||||||
    emitter.keymap = keyboard->keymap;
 | 
					 | 
				
			||||||
    update_modifier_info (&emitter);
 | 
					    update_modifier_info (&emitter);
 | 
				
			||||||
    send_fake_key (&emitter, keyboard, keycode, pressed, timestamp);
 | 
					    send_fake_key (&emitter, keyboard, keycode, pressed, timestamp);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,15 +1,21 @@
 | 
				
			|||||||
#ifndef __KEYBOARD_H
 | 
					#ifndef __KEYBOARD_H
 | 
				
			||||||
#define __KEYBOARD_H
 | 
					#define __KEYBOARD_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "stdbool.h"
 | 
					 | 
				
			||||||
#include "inttypes.h"
 | 
					#include "inttypes.h"
 | 
				
			||||||
 | 
					#include "stdbool.h"
 | 
				
			||||||
 | 
					#include "virtual-keyboard-unstable-v1-client-protocol.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct squeek_key;
 | 
					struct squeek_key;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uint32_t squeek_key_is_pressed(struct squeek_key *key);
 | 
					uint32_t squeek_key_is_pressed(struct squeek_key *key);
 | 
				
			||||||
void squeek_key_set_pressed(struct squeek_key *key, uint32_t pressed);
 | 
					 | 
				
			||||||
uint32_t squeek_key_is_locked(struct squeek_key *key);
 | 
					uint32_t squeek_key_is_locked(struct squeek_key *key);
 | 
				
			||||||
void squeek_key_set_locked(struct squeek_key *key, uint32_t pressed);
 | 
					void squeek_key_set_locked(struct squeek_key *key, uint32_t pressed);
 | 
				
			||||||
uint32_t squeek_key_get_keycode(struct squeek_key *key);
 | 
					 | 
				
			||||||
uint32_t squeek_key_equal(struct squeek_key* key, struct squeek_key* key1);
 | 
					uint32_t squeek_key_equal(struct squeek_key* key, struct squeek_key* key1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum key_press {
 | 
				
			||||||
 | 
					    KEY_RELEASE = 0,
 | 
				
			||||||
 | 
					    KEY_PRESS = 1,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void squeek_key_press(struct squeek_key *key, struct zwp_virtual_keyboard_v1*, enum key_press press, uint32_t timestamp);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -17,8 +17,25 @@ pub mod c {
 | 
				
			|||||||
    use super::*;
 | 
					    use super::*;
 | 
				
			||||||
    use ::util::c;
 | 
					    use ::util::c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    use std::os::raw::c_void;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub type CKeyState = c::Wrapped<KeyState>;
 | 
					    pub type CKeyState = c::Wrapped<KeyState>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[repr(transparent)]
 | 
				
			||||||
 | 
					    pub struct ZwpVirtualKeyboardV1(*const c_void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    #[no_mangle]
 | 
				
			||||||
 | 
					    extern "C" {
 | 
				
			||||||
 | 
					        /// Checks if point falls within bounds,
 | 
				
			||||||
 | 
					        /// which are relative to origin and rotated by angle (I think)
 | 
				
			||||||
 | 
					        pub fn eek_virtual_keyboard_v1_key(
 | 
				
			||||||
 | 
					            virtual_keyboard: *mut ZwpVirtualKeyboardV1,
 | 
				
			||||||
 | 
					            timestamp: u32,
 | 
				
			||||||
 | 
					            keycode: u32,
 | 
				
			||||||
 | 
					            press: u32,
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // The following defined in Rust. TODO: wrap naked pointers to Rust data inside RefCells to prevent multiple writers
 | 
					    // The following defined in Rust. TODO: wrap naked pointers to Rust data inside RefCells to prevent multiple writers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Compares pointers to the data
 | 
					    /// Compares pointers to the data
 | 
				
			||||||
@ -35,14 +52,6 @@ pub mod c {
 | 
				
			|||||||
        return key.to_owned().pressed as u32;
 | 
					        return key.to_owned().pressed as u32;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[no_mangle]
 | 
					 | 
				
			||||||
    pub extern "C"
 | 
					 | 
				
			||||||
    fn squeek_key_set_pressed(key: CKeyState, pressed: u32) {
 | 
					 | 
				
			||||||
        let key = key.clone_ref();
 | 
					 | 
				
			||||||
        let mut key = key.borrow_mut();
 | 
					 | 
				
			||||||
        key.pressed = pressed != 0;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    #[no_mangle]
 | 
					    #[no_mangle]
 | 
				
			||||||
    pub extern "C"
 | 
					    pub extern "C"
 | 
				
			||||||
    fn squeek_key_is_locked(key: CKeyState) -> u32 {
 | 
					    fn squeek_key_is_locked(key: CKeyState) -> u32 {
 | 
				
			||||||
@ -59,8 +68,24 @@ pub mod c {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    #[no_mangle]
 | 
					    #[no_mangle]
 | 
				
			||||||
    pub extern "C"
 | 
					    pub extern "C"
 | 
				
			||||||
    fn squeek_key_get_keycode(key: CKeyState) -> u32 {
 | 
					    fn squeek_key_press(
 | 
				
			||||||
        return key.to_owned().keycode.unwrap_or(0u32);
 | 
					        key: CKeyState,
 | 
				
			||||||
 | 
					        virtual_keyboard: *mut ZwpVirtualKeyboardV1,
 | 
				
			||||||
 | 
					        press: u32,
 | 
				
			||||||
 | 
					        timestamp: u32,
 | 
				
			||||||
 | 
					    ) {
 | 
				
			||||||
 | 
					        let key = key.clone_ref();
 | 
				
			||||||
 | 
					        let mut key = key.borrow_mut();
 | 
				
			||||||
 | 
					        key.pressed = press != 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if let Some(keycode) = key.keycode {
 | 
				
			||||||
 | 
					            let keycode = keycode - 8;
 | 
				
			||||||
 | 
					            unsafe {
 | 
				
			||||||
 | 
					                eek_virtual_keyboard_v1_key(
 | 
				
			||||||
 | 
					                    virtual_keyboard, timestamp, keycode, press
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,12 @@
 | 
				
			|||||||
#include "wayland.h"
 | 
					#include "wayland.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct squeek_wayland *squeek_wayland = NULL;
 | 
					struct squeek_wayland *squeek_wayland = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// The following functions only exist
 | 
				
			||||||
 | 
					// to create linkable symbols out of inline functions,
 | 
				
			||||||
 | 
					// because those are not directly callable from Rust
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					eek_virtual_keyboard_v1_key(struct zwp_virtual_keyboard_v1 *zwp_virtual_keyboard_v1, uint32_t time, uint32_t key, uint32_t state) {
 | 
				
			||||||
 | 
					    zwp_virtual_keyboard_v1_key(zwp_virtual_keyboard_v1, time, key, state);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user