added filed from refactor
branch
This commit is contained in:
parent
9f77d5f570
commit
8bd8894736
205
src/backends/keycodes.rs
Normal file
205
src/backends/keycodes.rs
Normal file
|
@ -0,0 +1,205 @@
|
||||||
|
#![allow(dead_code)]
|
||||||
|
|
||||||
|
#[derive(Debug, Hash, Ord, PartialOrd, PartialEq, Eq, Clone, Copy)]
|
||||||
|
pub enum MouseButton {
|
||||||
|
Left,
|
||||||
|
Middle,
|
||||||
|
Right,
|
||||||
|
ScrollUp,
|
||||||
|
ScrollDown,
|
||||||
|
ScrollLeft,
|
||||||
|
ScrollRight,
|
||||||
|
Forward,
|
||||||
|
Backward,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// from winit
|
||||||
|
#[derive(Debug, Hash, Ord, PartialOrd, PartialEq, Eq, Clone, Copy)]
|
||||||
|
#[repr(u32)]
|
||||||
|
pub enum VirtualKeyCode {
|
||||||
|
Key1,
|
||||||
|
Key2,
|
||||||
|
Key3,
|
||||||
|
Key4,
|
||||||
|
Key5,
|
||||||
|
Key6,
|
||||||
|
Key7,
|
||||||
|
Key8,
|
||||||
|
Key9,
|
||||||
|
Key0,
|
||||||
|
A,
|
||||||
|
B,
|
||||||
|
C,
|
||||||
|
D,
|
||||||
|
E,
|
||||||
|
F,
|
||||||
|
G,
|
||||||
|
H,
|
||||||
|
I,
|
||||||
|
J,
|
||||||
|
K,
|
||||||
|
L,
|
||||||
|
M,
|
||||||
|
N,
|
||||||
|
O,
|
||||||
|
P,
|
||||||
|
Q,
|
||||||
|
R,
|
||||||
|
S,
|
||||||
|
T,
|
||||||
|
U,
|
||||||
|
V,
|
||||||
|
W,
|
||||||
|
X,
|
||||||
|
Y,
|
||||||
|
Z,
|
||||||
|
|
||||||
|
/// The Escape key, next to F1.
|
||||||
|
Escape,
|
||||||
|
|
||||||
|
F1,
|
||||||
|
F2,
|
||||||
|
F3,
|
||||||
|
F4,
|
||||||
|
F5,
|
||||||
|
F6,
|
||||||
|
F7,
|
||||||
|
F8,
|
||||||
|
F9,
|
||||||
|
F10,
|
||||||
|
F11,
|
||||||
|
F12,
|
||||||
|
F13,
|
||||||
|
F14,
|
||||||
|
F15,
|
||||||
|
F16,
|
||||||
|
F17,
|
||||||
|
F18,
|
||||||
|
F19,
|
||||||
|
F20,
|
||||||
|
F21,
|
||||||
|
F22,
|
||||||
|
F23,
|
||||||
|
F24,
|
||||||
|
|
||||||
|
/// Print Screen/SysRq.
|
||||||
|
Snapshot,
|
||||||
|
/// Scroll Lock.
|
||||||
|
Scroll,
|
||||||
|
/// Pause/Break key, next to Scroll lock.
|
||||||
|
Pause,
|
||||||
|
|
||||||
|
/// `Insert`, next to Backspace.
|
||||||
|
Insert,
|
||||||
|
Home,
|
||||||
|
Delete,
|
||||||
|
End,
|
||||||
|
PageDown,
|
||||||
|
PageUp,
|
||||||
|
|
||||||
|
Left,
|
||||||
|
Up,
|
||||||
|
Right,
|
||||||
|
Down,
|
||||||
|
|
||||||
|
/// The Backspace key, right over Enter.
|
||||||
|
// TODO: rename
|
||||||
|
Back,
|
||||||
|
/// The Enter key.
|
||||||
|
Return,
|
||||||
|
/// The space bar.
|
||||||
|
Space,
|
||||||
|
|
||||||
|
/// The "Compose" key on Linux.
|
||||||
|
Compose,
|
||||||
|
|
||||||
|
Caret,
|
||||||
|
|
||||||
|
Numlock,
|
||||||
|
Numpad0,
|
||||||
|
Numpad1,
|
||||||
|
Numpad2,
|
||||||
|
Numpad3,
|
||||||
|
Numpad4,
|
||||||
|
Numpad5,
|
||||||
|
Numpad6,
|
||||||
|
Numpad7,
|
||||||
|
Numpad8,
|
||||||
|
Numpad9,
|
||||||
|
NumpadAdd,
|
||||||
|
NumpadDivide,
|
||||||
|
NumpadDecimal,
|
||||||
|
NumpadComma,
|
||||||
|
NumpadEnter,
|
||||||
|
NumpadEquals,
|
||||||
|
NumpadMultiply,
|
||||||
|
NumpadSubtract,
|
||||||
|
|
||||||
|
AbntC1,
|
||||||
|
AbntC2,
|
||||||
|
Apostrophe,
|
||||||
|
Apps,
|
||||||
|
Asterisk,
|
||||||
|
At,
|
||||||
|
Ax,
|
||||||
|
Backslash,
|
||||||
|
Calculator,
|
||||||
|
Capital,
|
||||||
|
Colon,
|
||||||
|
Comma,
|
||||||
|
Convert,
|
||||||
|
Equals,
|
||||||
|
Grave,
|
||||||
|
Kana,
|
||||||
|
Kanji,
|
||||||
|
LAlt,
|
||||||
|
LBracket,
|
||||||
|
LControl,
|
||||||
|
LShift,
|
||||||
|
LWin,
|
||||||
|
Mail,
|
||||||
|
MediaSelect,
|
||||||
|
MediaStop,
|
||||||
|
Minus,
|
||||||
|
Mute,
|
||||||
|
MyComputer,
|
||||||
|
// also called "Next"
|
||||||
|
NavigateForward,
|
||||||
|
// also called "Prior"
|
||||||
|
NavigateBackward,
|
||||||
|
NextTrack,
|
||||||
|
NoConvert,
|
||||||
|
OEM102,
|
||||||
|
Period,
|
||||||
|
PlayPause,
|
||||||
|
Plus,
|
||||||
|
Power,
|
||||||
|
PrevTrack,
|
||||||
|
RAlt,
|
||||||
|
RBracket,
|
||||||
|
RControl,
|
||||||
|
RShift,
|
||||||
|
RWin,
|
||||||
|
Semicolon,
|
||||||
|
Slash,
|
||||||
|
Sleep,
|
||||||
|
Stop,
|
||||||
|
Sysrq,
|
||||||
|
Tab,
|
||||||
|
Underline,
|
||||||
|
Unlabeled,
|
||||||
|
VolumeDown,
|
||||||
|
VolumeUp,
|
||||||
|
Wake,
|
||||||
|
WebBack,
|
||||||
|
WebFavorites,
|
||||||
|
WebForward,
|
||||||
|
WebHome,
|
||||||
|
WebRefresh,
|
||||||
|
WebSearch,
|
||||||
|
WebStop,
|
||||||
|
Yen,
|
||||||
|
Copy,
|
||||||
|
Paste,
|
||||||
|
Cut,
|
||||||
|
}
|
104
src/backends/mod.rs
Normal file
104
src/backends/mod.rs
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
use self::window_event::KeyBind;
|
||||||
|
|
||||||
|
pub mod keycodes;
|
||||||
|
pub mod window_event;
|
||||||
|
|
||||||
|
pub trait WindowServerBackend<Window = u64> {
|
||||||
|
fn next_event(&self) -> window_event::WindowEvent;
|
||||||
|
fn add_keybind(&mut self, keybind: KeyBind, window: Some<Window>);
|
||||||
|
fn remove_keybind(&mut self, keybind: KeyBind, window: Some<Window>);
|
||||||
|
fn add_mousebind(&mut self, keybind: KeyBind, window: Some<Window>);
|
||||||
|
fn remove_mousebind(&mut self, keybind: KeyBind, window: Some<Window>);
|
||||||
|
fn focus_window(&self, window: Window);
|
||||||
|
fn unfocus_window(&self, window: Window);
|
||||||
|
fn move_window(&self, window: Window, pos: i32);
|
||||||
|
fn resize_window(&self, window: Window, pos: i32);
|
||||||
|
fn hide_window(&self, window: Window);
|
||||||
|
fn screen_size(&self) -> (i32, i32);
|
||||||
|
fn kill_window(&self, window: Window);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub mod xlib {
|
||||||
|
use std::ffi::CString;
|
||||||
|
|
||||||
|
use x11::xlib::{Atom, Window, XInternAtom};
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct Display(Rc<*mut xlib::Display>);
|
||||||
|
|
||||||
|
impl Deref for Display {}
|
||||||
|
|
||||||
|
impl Display {
|
||||||
|
pub fn new(display: *mut x11::xlib::Display) -> Self {
|
||||||
|
Self {
|
||||||
|
0: Rc::new(display),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get(&self) -> *mut x11::xlib::Display {
|
||||||
|
*self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct XLib {
|
||||||
|
display: Display,
|
||||||
|
root: Window,
|
||||||
|
screen: i32,
|
||||||
|
atoms: XLibAtoms,
|
||||||
|
keybinds: Vec<()>,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct XLibAtoms {
|
||||||
|
protocols: Atom,
|
||||||
|
delete_window: Atom,
|
||||||
|
active_window: Atom,
|
||||||
|
take_focus: Atom,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl XLibAtoms {
|
||||||
|
fn init(display: Display) -> Self {
|
||||||
|
unsafe {
|
||||||
|
Self {
|
||||||
|
protocols: {
|
||||||
|
let name = CString::new("WM_PROTOCOLS").unwrap();
|
||||||
|
XInternAtom(display.get(), name.as_c_str().as_ptr(), 0)
|
||||||
|
},
|
||||||
|
delete_window: {
|
||||||
|
let name = CString::new("WM_DELETE_WINDOW").unwrap();
|
||||||
|
XInternAtom(display.get(), name.as_c_str().as_ptr(), 0)
|
||||||
|
},
|
||||||
|
active_window: {
|
||||||
|
let name = CString::new("WM_ACTIVE_WINDOW").unwrap();
|
||||||
|
XInternAtom(display.get(), name.as_c_str().as_ptr(), 0)
|
||||||
|
},
|
||||||
|
take_focus: {
|
||||||
|
let name = CString::new("WM_TAKE_FOCUS").unwrap();
|
||||||
|
XInternAtom(display.get(), name.as_c_str().as_ptr(), 0)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
unsafe extern "C" fn xlib_error_handler(
|
||||||
|
_dpy: *mut x11::xlib::Display,
|
||||||
|
ee: *mut x11::xlib::XErrorEvent,
|
||||||
|
) -> std::os::raw::c_int {
|
||||||
|
let err = ee.as_ref().unwrap();
|
||||||
|
|
||||||
|
if err.error_code == x11::xlib::BadWindow
|
||||||
|
|| err.error_code == x11::xlib::BadDrawable
|
||||||
|
|| err.error_code == x11::xlib::BadAccess
|
||||||
|
|| err.error_code == x11::xlib::BadMatch
|
||||||
|
{
|
||||||
|
0
|
||||||
|
} else {
|
||||||
|
error!(
|
||||||
|
"wm: fatal error:\nrequest_code: {}\nerror_code: {}",
|
||||||
|
err.request_code, err.error_code
|
||||||
|
);
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
238
src/backends/window_event.rs
Normal file
238
src/backends/window_event.rs
Normal file
|
@ -0,0 +1,238 @@
|
||||||
|
#![allow(dead_code)]
|
||||||
|
use x11::xlib::Window;
|
||||||
|
|
||||||
|
use super::keycodes::{MouseButton, VirtualKeyCode};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum WindowEvent {
|
||||||
|
KeyEvent {
|
||||||
|
window: Window,
|
||||||
|
event: KeyEvent,
|
||||||
|
},
|
||||||
|
ButtonEvent {
|
||||||
|
window: Window,
|
||||||
|
event: ButtonEvent,
|
||||||
|
},
|
||||||
|
MotionEvent {
|
||||||
|
window: Window,
|
||||||
|
event: MotionEvent,
|
||||||
|
},
|
||||||
|
MapRequestEvent {
|
||||||
|
window: Window,
|
||||||
|
event: MapEvent,
|
||||||
|
},
|
||||||
|
MapEvent {
|
||||||
|
window: Window,
|
||||||
|
event: MapEvent,
|
||||||
|
},
|
||||||
|
UnmapEvent {
|
||||||
|
window: Window,
|
||||||
|
event: UnmapEvent,
|
||||||
|
},
|
||||||
|
CreateEvent {
|
||||||
|
window: Window,
|
||||||
|
event: CreateEvent,
|
||||||
|
},
|
||||||
|
DestroyEvent {
|
||||||
|
window: Window,
|
||||||
|
event: DestroyEvent,
|
||||||
|
},
|
||||||
|
EnterEvent {
|
||||||
|
window: Window,
|
||||||
|
event: EnterEvent,
|
||||||
|
},
|
||||||
|
ConfigureEvent {
|
||||||
|
window: Window,
|
||||||
|
event: ConfigureEvent,
|
||||||
|
},
|
||||||
|
FullscreenEvent {
|
||||||
|
window: Window,
|
||||||
|
event: FullscreenEvent,
|
||||||
|
}, //1 { window: Window, event: 1 },
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum KeyState {
|
||||||
|
Pressed,
|
||||||
|
Released,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
|
||||||
|
#[repr(u8)]
|
||||||
|
pub enum ModifierKey {
|
||||||
|
Shift,
|
||||||
|
ShiftLock,
|
||||||
|
Control,
|
||||||
|
Alt,
|
||||||
|
AltGr,
|
||||||
|
/// Windows key on most keyboards
|
||||||
|
Super,
|
||||||
|
NumLock,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Default, Debug, Clone)]
|
||||||
|
pub struct ModifierState {
|
||||||
|
modifiers: std::collections::HashSet<ModifierKey>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ModifierState {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self::default()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_modifier(&mut self, modifier: ModifierKey) {
|
||||||
|
self.modifiers.insert(modifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn unset_modifier(&mut self, modifier: ModifierKey) {
|
||||||
|
self.modifiers.remove(&modifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_modifier(&mut self, modifier: ModifierKey) -> bool {
|
||||||
|
self.modifiers.contains(&modifier)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct KeyEvent {
|
||||||
|
pub state: KeyState,
|
||||||
|
pub keycode: VirtualKeyCode,
|
||||||
|
pub modifierstate: ModifierState,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl KeyEvent {
|
||||||
|
pub fn new(
|
||||||
|
state: KeyState,
|
||||||
|
keycode: VirtualKeyCode,
|
||||||
|
modifierstate: ModifierState,
|
||||||
|
) -> Self {
|
||||||
|
Self {
|
||||||
|
state,
|
||||||
|
keycode,
|
||||||
|
modifierstate,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct ButtonEvent {
|
||||||
|
pub state: KeyState,
|
||||||
|
pub keycode: MouseButton,
|
||||||
|
pub modifierstate: ModifierState,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ButtonEvent {
|
||||||
|
pub fn new(
|
||||||
|
state: KeyState,
|
||||||
|
keycode: MouseButton,
|
||||||
|
modifierstate: ModifierState,
|
||||||
|
) -> Self {
|
||||||
|
Self {
|
||||||
|
state,
|
||||||
|
keycode,
|
||||||
|
modifierstate,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct MotionEvent {
|
||||||
|
pub position: [i32; 2],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MotionEvent {
|
||||||
|
pub fn new(position: [i32; 2]) -> Self {
|
||||||
|
Self { position }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct MapEvent {
|
||||||
|
pub window: Window,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MapEvent {
|
||||||
|
pub fn new(window: Window) -> Self {
|
||||||
|
Self { window }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct UnmapEvent {
|
||||||
|
pub window: Window,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl UnmapEvent {
|
||||||
|
pub fn new(window: Window) -> Self {
|
||||||
|
Self { window }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct EnterEvent {}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct DestroyEvent {
|
||||||
|
pub window: Window,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DestroyEvent {
|
||||||
|
pub fn new(window: Window) -> Self {
|
||||||
|
Self { window }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct CreateEvent {
|
||||||
|
pub window: Window,
|
||||||
|
pub position: [i32; 2],
|
||||||
|
pub size: [i32; 2],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CreateEvent {
|
||||||
|
pub fn new(window: Window, position: [i32; 2], size: [i32; 2]) -> Self {
|
||||||
|
Self {
|
||||||
|
window,
|
||||||
|
position,
|
||||||
|
size,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct ConfigureEvent {
|
||||||
|
pub window: Window,
|
||||||
|
pub position: [i32; 2],
|
||||||
|
pub size: [i32; 2],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ConfigureEvent {
|
||||||
|
pub fn new(window: Window, position: [i32; 2], size: [i32; 2]) -> Self {
|
||||||
|
Self {
|
||||||
|
window,
|
||||||
|
position,
|
||||||
|
size,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct FullscreenEvent {
|
||||||
|
new_fullscreen: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FullscreenEvent {
|
||||||
|
pub fn new(new_fullscreen: bool) -> Self {
|
||||||
|
Self { new_fullscreen }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct KeyBind {
|
||||||
|
key: VirtualKeyCode,
|
||||||
|
modifiers: ModifierState,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct MouseBind {
|
||||||
|
button: MouseButton,
|
||||||
|
modifiers: ModifierState,
|
||||||
|
}
|
|
@ -7,6 +7,7 @@ use log4rs::{
|
||||||
};
|
};
|
||||||
use state::WMConfig;
|
use state::WMConfig;
|
||||||
|
|
||||||
|
mod backends;
|
||||||
mod clients;
|
mod clients;
|
||||||
//mod clients2;
|
//mod clients2;
|
||||||
mod state;
|
mod state;
|
||||||
|
|
Loading…
Reference in a new issue