summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock6
-rw-r--r--Cargo.toml1
-rwxr-xr-xautostart10
-rw-r--r--src/main.rs27
-rw-r--r--src/safe_x11/event.rs2
-rw-r--r--src/socket.rs63
-rw-r--r--src/socket/mod.rs31
-rw-r--r--src/socket/parser.rs70
8 files changed, 132 insertions, 78 deletions
diff --git a/Cargo.lock b/Cargo.lock
index eabeb47..646922b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3,6 +3,7 @@ name = "dotwm"
version = "0.1.0"
dependencies = [
"libc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "nom 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"unix_socket 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
"x11 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -23,6 +24,11 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
+name = "nom"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
name = "pkg-config"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index 66e2b19..d3f709f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,6 +6,7 @@ authors = ["Matias Linares <matiaslina@openmailbox.org>"]
[dependencies]
libc = "0.2.*"
unix_socket = "*"
+nom = "*"
[dependencies.x11]
version = "*"
diff --git a/autostart b/autostart
index 82cc3f6..1e98405 100755
--- a/autostart
+++ b/autostart
@@ -1,4 +1,10 @@
#!/bin/mksh
-echo -n "hola" | netcat -U ./dotwm.sock
-echo -n "done" | netcat -U ./dotwm.sock
+netcat -U dotwm.sock <<EOF
+add-binding Mod4Mask p exec dmenu_run
+add-binding Mod4Mask h move_win -10 0
+add-binding Mod4Mask j move_win 0 10
+add-binding Mod4Mask k move_win 0 -10
+add-binding Mod4Mask l move_win 10 0
+add-binding Mod4Mask Return exec xterm
+EOF
diff --git a/src/main.rs b/src/main.rs
index 8bf3caa..a7d8077 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -3,6 +3,8 @@
extern crate libc;
extern crate x11;
extern crate unix_socket;
+#[macro_use]
+extern crate nom;
pub mod safe_x11;
pub mod command;
@@ -13,7 +15,7 @@ pub mod socket;
use dotwm::DotWM;
use command::*;
use event::{Event,next_event};
-use socket::{configure_wm, listen_socket};
+use socket::listen_socket;
use safe_x11::event as x11_event;
use std::collections::HashMap;
@@ -32,15 +34,14 @@ fn main() {
let mut bindings: BindingHash = HashMap::new();
let x11_fd = x11_event::x11_fd(dotwm.display);
- add_binding(&mut dotwm,&mut bindings, keysym::XK_Return, xlib::Mod4Mask, exec,
- &["xterm"]);
- add_binding(&mut dotwm,&mut bindings, keysym::XK_p, xlib::Mod4Mask, exec,
- &["dmenu_run"]);
- add_binding(&mut dotwm,&mut bindings, keysym::XK_Tab, xlib::Mod4Mask, focus_next, &[]);
- add_binding(&mut dotwm,&mut bindings, keysym::XK_h, xlib::Mod4Mask, move_win, &["-10", "0"]);
- add_binding(&mut dotwm,&mut bindings, keysym::XK_j, xlib::Mod4Mask, move_win, &["0", "10"]);
- add_binding(&mut dotwm,&mut bindings, keysym::XK_k, xlib::Mod4Mask, move_win, &["0", "-10"]);
- add_binding(&mut dotwm,&mut bindings, keysym::XK_l, xlib::Mod4Mask, move_win, &["10", "0"]);
+ //add_binding(&mut dotwm,&mut bindings, keysym::XK_Return, xlib::Mod4Mask, exec,
+ // &["xterm"]);
+ //add_binding(&mut dotwm,&mut bindings, keysym::XK_p, xlib::Mod4Mask, exec,
+ // &["dmenu_run"]);
+ //add_binding(&mut dotwm,&mut bindings, keysym::XK_h, xlib::Mod4Mask, move_win, &["-10", "0"]);
+ //add_binding(&mut dotwm,&mut bindings, keysym::XK_j, xlib::Mod4Mask, move_win, &["0", "10"]);
+ //add_binding(&mut dotwm,&mut bindings, keysym::XK_k, xlib::Mod4Mask, move_win, &["0", "-10"]);
+ //add_binding(&mut dotwm,&mut bindings, keysym::XK_l, xlib::Mod4Mask, move_win, &["10", "0"]);
// Resize
add_binding(&mut dotwm,&mut bindings, keysym::XK_h, xlib::Mod4Mask | xlib::ControlMask,
@@ -52,6 +53,7 @@ fn main() {
add_binding(&mut dotwm,&mut bindings, keysym::XK_l, xlib::Mod4Mask | xlib::ControlMask,
resize_win, &["10", "0"]);
+ add_binding(&mut dotwm,&mut bindings, keysym::XK_Tab, xlib::Mod4Mask, focus_next, &[]);
add_binding(&mut dotwm, &mut bindings, keysym::XK_q, xlib::Mod4Mask | xlib::ShiftMask, quit_dotwm, &[]);
let (transmission, receiver) = channel();
@@ -67,12 +69,13 @@ fn main() {
}
}
});
- configure_wm(&mut dotwm, &receiver);
+
+ exec_cmd("./autostart", &[]).unwrap();
// Main loop
loop {
println!("Listening socket");
- listen_socket(&mut dotwm, &receiver);
+ listen_socket(&mut dotwm, &mut bindings, &receiver);
// Event handling.
println!("Waiting event");
let event = next_event(dotwm.display, x11_fd);
diff --git a/src/safe_x11/event.rs b/src/safe_x11/event.rs
index 2519bad..8a4bc32 100644
--- a/src/safe_x11/event.rs
+++ b/src/safe_x11/event.rs
@@ -26,7 +26,7 @@ pub fn x11_fd(display: *mut Display) -> c_int {
pub fn next_xevent(display: *mut Display, fd: c_int) -> XEvent {
unsafe {
let mut last_event: XEvent = uninitialized();
- let retval = select_next_event(display, fd, &mut last_event) as i32;
+ select_next_event(display, fd, &mut last_event) as i32;
last_event
}
}
diff --git a/src/socket.rs b/src/socket.rs
deleted file mode 100644
index b3bb9cc..0000000
--- a/src/socket.rs
+++ /dev/null
@@ -1,63 +0,0 @@
-// See LICENSE file for copyright and license details.
-
-use std::io::{Read,Write};
-use std::sync::mpsc::{Receiver, TryRecvError};
-
-use unix_socket::UnixStream;
-
-use dotwm::DotWM;
-use command::*;
-
-#[allow(unused_variables)]
-fn handle_socket(dotwm: &mut DotWM, stream: UnixStream) {
- let mut s = stream.try_clone().unwrap();
- let mut buf = String::new();
- s.read_to_string(&mut buf).unwrap();
- println!("buf: {}", buf);
-
- let _ = write!(s, "ok");
-}
-
-#[allow(unused_variables)]
-/// Handles the configuration and returns true when we're finished.
-fn handle_configure(dotwm: &mut DotWM, s: UnixStream) -> bool {
- let mut stream = match s.try_clone() {
- Ok(s) => s,
- Err(_) => { println!("Error"); return true },
- };
-
- let mut input = String::new();
- stream.read_to_string(&mut input).unwrap();
-
- if input != "done" {
- let _ = write!(stream, "ok");
- false
- } else {
- let _ = write!(stream, "exit");
- true
- }
-}
-
-pub fn configure_wm(dotwm: &mut DotWM, rx: &Receiver<UnixStream>) {
- exec_cmd("./autostart", &[]).unwrap();
- loop {
- match rx.recv() {
- Ok(stream) => {
- if handle_configure(dotwm, stream) {
- break;
- }
- },
- Err(e) => panic!("Socket: {}", e),
- }
- }
-}
-
-pub fn listen_socket(dotwm: &mut DotWM, rx: &Receiver<UnixStream>) {
- loop {
- match rx.try_recv() {
- Ok(stream) => handle_socket(dotwm, stream) ,
- Err(TryRecvError::Empty) => break,
- Err(TryRecvError::Disconnected) => panic!("Socket disconnected"),
- }
- }
-}
diff --git a/src/socket/mod.rs b/src/socket/mod.rs
new file mode 100644
index 0000000..804f7ac
--- /dev/null
+++ b/src/socket/mod.rs
@@ -0,0 +1,31 @@
+// See LICENSE file for copyright and license details.
+
+pub mod parser;
+
+use std::io::{Read,Write};
+use std::sync::mpsc::{Receiver, TryRecvError};
+
+use unix_socket::UnixStream;
+
+use dotwm::DotWM;
+use command::*;
+
+/// Listen a socket parsing and executing all the commands.
+pub fn listen_socket(dotwm: &mut DotWM, bindings: &mut BindingHash, rx: &Receiver<UnixStream>) {
+ loop {
+ match rx.try_recv() {
+ Ok(stream) => {
+ let mut s = stream.try_clone().unwrap();
+ let mut buf = String::new();
+ s.read_to_string(&mut buf).unwrap();
+
+ for line in buf.lines() {
+ let result = parser::parse(dotwm, bindings, &line);
+ let _ = write!(s, "{}", result);
+ }
+ },
+ Err(TryRecvError::Empty) => break,
+ Err(TryRecvError::Disconnected) => panic!("Socket disconnected"),
+ }
+ }
+}
diff --git a/src/socket/parser.rs b/src/socket/parser.rs
new file mode 100644
index 0000000..3cfc15d
--- /dev/null
+++ b/src/socket/parser.rs
@@ -0,0 +1,70 @@
+// See LICENSE file for copyright and license details.
+
+//! Parse the socket info.
+//!
+//! For now this module will have 2 methods. One for inmediate execution and
+//! other for add a bindind.
+
+use x11::xlib;
+use x11::keysym;
+
+use command::*;
+use dotwm::DotWM;
+
+fn str_to_modifier<'a>(s: &'a str) -> Result<u32, ()> {
+ match s {
+ "Mod1Mask" => Ok(xlib::Mod4Mask),
+ "Mod2Mask" => Ok(xlib::Mod4Mask),
+ "Mod3Mask" => Ok(xlib::Mod4Mask),
+ "Mod4Mask" => Ok(xlib::Mod4Mask),
+ "ControlMask" => Ok(xlib::ControlMask),
+ "ShiftMask" => Ok(xlib::ShiftMask),
+ _ => Err(()),
+ }
+}
+
+fn str_to_key<'a>(s: &'a str) -> Result<u32, ()> {
+ match s {
+ "h" => Ok(keysym::XK_h),
+ "j" => Ok(keysym::XK_j),
+ "k" => Ok(keysym::XK_k),
+ "l" => Ok(keysym::XK_l),
+ "Tab" => Ok(keysym::XK_Tab),
+ "p" => Ok(keysym::XK_p),
+ "Return" => Ok(keysym::XK_Return),
+ "q" => Ok(keysym::XK_q),
+ _ => Err(()),
+ }
+}
+
+fn str_to_func<'a>(s: &'a str) -> Result<ExecFn,()> {
+ match s {
+ "exec" => Ok(exec),
+ "move_win" => Ok(move_win),
+ "resize_win" => Ok(resize_win),
+ _ => Err(()),
+ }
+}
+
+pub fn parse<'a>(dotwm: &mut DotWM, bindings: &mut BindingHash, input: &'a str) -> &'a str {
+ let args: Vec<&str> = input.split_whitespace().collect();
+
+ match args.first() {
+ Some(cmd) => {
+ match cmd {
+ &"add-binding" => {
+ let modifier = str_to_modifier(args[1]).unwrap();
+ let key = str_to_key(args[2]).unwrap();
+ let func = str_to_func(args[3]).unwrap();
+ let arguments = &args[4..];
+
+ add_binding(dotwm, bindings, key, modifier, func, arguments);
+ },
+ &"exec" => { println!("exec"); },
+ _ => { println!("anotherthing ._."); },
+ }
+ },
+ None => println!("error"),
+ }
+ "ok"
+}