Don't use well-typed structs anymore

This can lead to maintainance problems if `sway` decides to change a
structure by only a field that we don't even use.
This seems to already happen if you have an output declared in your `sway`
configuration that is unplugged.
This commit is contained in:
Skia 2021-02-11 11:59:30 +01:00
parent e2f59801d0
commit 9200db526a
3 changed files with 9 additions and 106 deletions

52
Cargo.lock generated
View file

@ -12,24 +12,6 @@ version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"
[[package]]
name = "proc-macro2"
version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
dependencies = [
"unicode-xid",
]
[[package]]
name = "quote"
version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df"
dependencies = [
"proc-macro2",
]
[[package]] [[package]]
name = "ryu" name = "ryu"
version = "1.0.5" version = "1.0.5"
@ -41,20 +23,6 @@ name = "serde"
version = "1.0.118" version = "1.0.118"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800" checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.118"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c84d3526699cd55261af4b941e4e725444df67aa4f9e6a3564f18030d12672df"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "serde_json" name = "serde_json"
@ -69,26 +37,8 @@ dependencies = [
[[package]] [[package]]
name = "swaysome" name = "swaysome"
version = "0.1.0" version = "0.2.0"
dependencies = [ dependencies = [
"byteorder", "byteorder",
"serde",
"serde_json", "serde_json",
] ]
[[package]]
name = "syn"
version = "1.0.55"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a571a711dddd09019ccc628e1b17fe87c59b09d513c06c026877aa708334f37a"
dependencies = [
"proc-macro2",
"quote",
"unicode-xid",
]
[[package]]
name = "unicode-xid"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"

View file

@ -8,5 +8,4 @@ edition = "2018"
[dependencies] [dependencies]
byteorder = "1" byteorder = "1"
serde = { version = "1", features = ["derive"] }
serde_json = "1" serde_json = "1"

View file

@ -1,6 +1,5 @@
// client.rs // client.rs
extern crate byteorder; extern crate byteorder;
extern crate serde;
extern crate serde_json; extern crate serde_json;
use std::env; use std::env;
@ -11,8 +10,6 @@ use std::os::unix::net::UnixStream;
use std::mem; use std::mem;
use std::io::Cursor; use std::io::Cursor;
use serde::{Deserialize, Serialize};
use byteorder::{ReadBytesExt, WriteBytesExt, LittleEndian}; use byteorder::{ReadBytesExt, WriteBytesExt, LittleEndian};
const RUN_COMMAND: u32 = 0; const RUN_COMMAND: u32 = 0;
@ -20,49 +17,6 @@ const GET_WORKSPACES: u32 = 1;
const SUBSCRIBE: u32 = 2; const SUBSCRIBE: u32 = 2;
const GET_OUTPUTS: u32 = 3; const GET_OUTPUTS: u32 = 3;
#[derive(Debug)]
#[derive(Serialize, Deserialize)]
struct WorkspaceRect {
x: usize,
y: usize,
}
#[derive(Debug)]
#[derive(Serialize, Deserialize)]
struct Workspace {
num: usize,
name: String,
visible: bool,
focused: bool,
rect: WorkspaceRect,
output: String,
}
#[derive(Debug)]
#[derive(Serialize, Deserialize)]
struct OutputMode {
width: usize,
height: usize,
refresh: usize,
}
#[derive(Debug)]
#[derive(Serialize, Deserialize)]
struct Output {
name: String,
make: String,
model: String,
serial: String,
active: bool,
primary: bool,
focused: bool,
scale: f32,
subpixel_hinting: String,
transform: String,
current_workspace: String,
modes: Vec<OutputMode>,
current_mode: OutputMode,
}
fn get_stream() -> UnixStream { fn get_stream() -> UnixStream {
@ -146,7 +100,7 @@ fn check_success(stream: &UnixStream) {
}; };
} }
fn get_outputs(stream: &UnixStream) -> Vec<Output> { fn get_outputs(stream: &UnixStream) -> Vec<serde_json::Value> {
send_msg(&stream, GET_OUTPUTS, ""); send_msg(&stream, GET_OUTPUTS, "");
let o = match read_msg(&stream) { let o = match read_msg(&stream) {
Ok(msg) => msg, Ok(msg) => msg,
@ -155,7 +109,7 @@ fn get_outputs(stream: &UnixStream) -> Vec<Output> {
serde_json::from_str(&o).unwrap() serde_json::from_str(&o).unwrap()
} }
fn get_workspaces(stream: &UnixStream) -> Vec<Workspace> { fn get_workspaces(stream: &UnixStream) -> Vec<serde_json::Value> {
send_msg(&stream, GET_WORKSPACES, ""); send_msg(&stream, GET_WORKSPACES, "");
let ws = match read_msg(&stream) { let ws = match read_msg(&stream) {
Ok(msg) => msg, Ok(msg) => msg,
@ -167,7 +121,7 @@ fn get_workspaces(stream: &UnixStream) -> Vec<Workspace> {
fn get_current_output_name(stream: &UnixStream) -> String { fn get_current_output_name(stream: &UnixStream) -> String {
let outputs = get_outputs(&stream); let outputs = get_outputs(&stream);
let focused_output_index = match outputs.iter().position(|x| x.focused) { let focused_output_index = match outputs.iter().position(|x| x["focused"] == serde_json::Value::Bool(true)) {
Some(i) => i, Some(i) => i,
None => panic!("WTF! No focused output???"), None => panic!("WTF! No focused output???"),
}; };
@ -205,7 +159,7 @@ fn move_container_to_prev_output(stream: &UnixStream) {
fn move_container_to_next_or_prev_output(stream: &UnixStream, go_to_prev: bool) { fn move_container_to_next_or_prev_output(stream: &UnixStream, go_to_prev: bool) {
let outputs = get_outputs(&stream); let outputs = get_outputs(&stream);
let focused_output_index = match outputs.iter().position(|x| x.focused) { let focused_output_index = match outputs.iter().position(|x| x["focused"] == serde_json::Value::Bool(true)) {
Some(i) => i, Some(i) => i,
None => panic!("WTF! No focused output???"), None => panic!("WTF! No focused output???"),
}; };
@ -219,18 +173,18 @@ fn move_container_to_next_or_prev_output(stream: &UnixStream, go_to_prev: bool)
let workspaces = get_workspaces(&stream); let workspaces = get_workspaces(&stream);
let target_workspace = workspaces.iter() let target_workspace = workspaces.iter()
.filter(|x| x.output == target_output.name && x.visible) .filter(|x| x["output"] == target_output["name"] && x["visible"] == serde_json::Value::Bool(true))
.next().unwrap(); .next().unwrap();
// Move container to target workspace // Move container to target workspace
let mut cmd: String = "move container to workspace ".to_string(); let mut cmd: String = "move container to workspace ".to_string();
cmd.push_str(&target_workspace.name); cmd.push_str(&target_workspace["name"].as_str().unwrap());
send_msg(&stream, RUN_COMMAND, &cmd); send_msg(&stream, RUN_COMMAND, &cmd);
check_success(&stream); check_success(&stream);
// Focus that workspace to follow the container // Focus that workspace to follow the container
let mut cmd: String = "workspace ".to_string(); let mut cmd: String = "workspace ".to_string();
cmd.push_str(&target_workspace.name); cmd.push_str(&target_workspace["name"].as_str().unwrap());
send_msg(&stream, RUN_COMMAND, &cmd); send_msg(&stream, RUN_COMMAND, &cmd);
check_success(&stream); check_success(&stream);
} }
@ -241,7 +195,7 @@ fn init_workspaces(stream: &UnixStream) {
let cmd_prefix: String = "focus output ".to_string(); let cmd_prefix: String = "focus output ".to_string();
for output in outputs.iter().rev() { for output in outputs.iter().rev() {
let mut cmd = cmd_prefix.clone(); let mut cmd = cmd_prefix.clone();
cmd.push_str(&output.name); cmd.push_str(&output["name"].as_str().unwrap());
println!("Sending command: '{}'", &cmd); println!("Sending command: '{}'", &cmd);
send_msg(&stream, RUN_COMMAND, &cmd); send_msg(&stream, RUN_COMMAND, &cmd);
check_success(&stream); check_success(&stream);