Skip to content

Commit

Permalink
Add key repetition (#16)
Browse files Browse the repository at this point in the history
  • Loading branch information
trimental authored and vberger committed Jul 24, 2018
1 parent c55ba39 commit 1691329
Show file tree
Hide file tree
Showing 4 changed files with 344 additions and 84 deletions.
77 changes: 43 additions & 34 deletions examples/kbd_input.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use std::sync::{Arc, Mutex};

use byteorder::{NativeEndian, WriteBytesExt};

use sctk::keyboard::{map_keyboard_auto, Event as KbEvent};
use sctk::keyboard::{map_keyboard_auto_with_repeat, Event as KbEvent, KeyRepeatKind, KeyRepeatEvent};
use sctk::reexports::client::protocol::wl_buffer::RequestsTrait as BufferRequests;
use sctk::reexports::client::protocol::wl_compositor::RequestsTrait as CompositorRequests;
use sctk::reexports::client::protocol::wl_display::RequestsTrait as DisplayRequests;
Expand Down Expand Up @@ -80,41 +80,50 @@ fn main() {

window.new_seat(&seat);

let _keyboard = map_keyboard_auto(seat.get_keyboard().unwrap(), move |event: KbEvent, _| {
match event {
KbEvent::Enter {
modifiers, keysyms, ..
} => {
println!(
"Gained focus while {} keys pressed and modifiers are {:?}.",
keysyms.len(),
modifiers
);
}
KbEvent::Leave { .. } => {
println!("Lost focus.");
}
KbEvent::Key {
keysym,
state,
utf8,
modifiers,
..
} => {
println!("Key {:?}: {:x}.", state, keysym);
println!(" -> Modifers are {:?}", modifiers);
if let Some(txt) = utf8 {
println!(" -> Received text \"{}\".", txt,);
let _keyboard = map_keyboard_auto_with_repeat(seat.get_keyboard().unwrap(), KeyRepeatKind::System,
move |event: KbEvent, _| {
match event {
KbEvent::Enter {
modifiers, keysyms, ..
} => {
println!(
"Gained focus while {} keys pressed and modifiers are {:?}.",
keysyms.len(),
modifiers
);
}
KbEvent::Leave { .. } => {
println!("Lost focus.");
}
KbEvent::Key {
keysym,
state,
utf8,
modifiers,
..
} => {
println!("Key {:?}: {:x}.", state, keysym);
println!(" -> Modifers are {:?}", modifiers);
if let Some(txt) = utf8 {
println!(" -> Received text \"{}\".", txt);
}
}
KbEvent::RepeatInfo { rate, delay } => {
println!(
"Received repeat info: start repeating every {}ms after an initial delay of {}ms",
rate, delay
);
}
}
},
move |repeat_event: KeyRepeatEvent, _| {
println!("Repeated key {:x}.", repeat_event.keysym);
println!(" -> Modifers are {:?}", repeat_event.modifiers);
if let Some(txt) = repeat_event.utf8 {
println!(" -> Received text \"{}\".", txt);
}
}
KbEvent::RepeatInfo { rate, delay } => {
println!(
"Received repeat info: start repeating every {}ms after an initial delay of {}ms",
rate, delay
);
}
}
});
);

if !env.shell.needs_configure() {
// initial draw to bootstrap on wl_shell
Expand Down
11 changes: 6 additions & 5 deletions examples/selection.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ use std::sync::{Arc, Mutex};
use byteorder::{NativeEndian, WriteBytesExt};

use sctk::data_device::{DataDevice, DndEvent, ReadPipe};
use sctk::keyboard::{map_keyboard_auto, Event as KbEvent};
use sctk::keyboard::{map_keyboard_auto, Event as KbEvent, KeyState};
use sctk::utils::{DoubleMemPool, MemPool};
use sctk::window::{BasicFrame, Event as WEvent, Window};
use sctk::Environment;
Expand Down Expand Up @@ -87,9 +87,10 @@ fn main() {
let _keyboard = map_keyboard_auto(seat.get_keyboard().unwrap(), move |event: KbEvent, _| {
match event {
KbEvent::Key {
state,
utf8: Some(text), ..
} => {
if text == "p" {
if text == "p" && state == KeyState::Pressed {
// pressed the 'p' key, try to read contents !
device.with_selection(|offer| {
if let Some(offer) = offer {
Expand Down Expand Up @@ -133,8 +134,8 @@ fn main() {
Some(WEvent::Refresh) => {
window.refresh();
window.surface().commit();
},
Some(WEvent::Configure { new_size, states }) => {
}
Some(WEvent::Configure { new_size, .. }) => {
if let Some((w, h)) = new_size {
window.resize(w, h);
dimensions = (w, h)
Expand Down Expand Up @@ -176,7 +177,7 @@ fn redraw(
let _ = pool.seek(SeekFrom::Start(0));
{
let mut writer = BufWriter::new(&mut *pool);
for i in 0..(buf_x * buf_y) {
for _ in 0..(buf_x * buf_y) {
let _ = writer.write_u32::<NativeEndian>(0xFF000000);
}
let _ = writer.flush();
Expand Down
1 change: 1 addition & 0 deletions src/keyboard/ffi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ functions:
fn xkb_keymap_ref(*mut xkb_keymap) -> *mut xkb_keymap,
fn xkb_keymap_unref(*mut xkb_keymap) -> (),
fn xkb_keymap_get_as_string(*mut xkb_keymap, xkb_keymap_format) -> *const c_char,
fn xkb_keymap_key_repeats(*mut xkb_keymap, xkb_keycode_t) -> c_int,

fn xkb_state_new(*mut xkb_keymap) -> *mut xkb_state,
fn xkb_state_ref(*mut xkb_state) -> *mut xkb_state,
Expand Down
Loading

0 comments on commit 1691329

Please sign in to comment.